From ca12c506e48821bdbca2169ab7147d43b3e9cf87 Mon Sep 17 00:00:00 2001 From: "Laszlo Boszormenyi (GCS)" Date: Sat, 18 Jul 2020 07:53:56 +0100 Subject: [PATCH] Import grpc_1.30.2.orig.tar.gz [dgit import orig grpc_1.30.2.orig.tar.gz] --- .bazelci/presubmit.yml | 23 + .bazelrc | 3 + .clang-format | 11 + .clang-tidy | 6 + .clang_complete | 19 + .editorconfig | 7 + .gitallowed | 2 + .github/CODEOWNERS | 8 + .github/ISSUE_TEMPLATE/bug_report.md | 41 + .github/ISSUE_TEMPLATE/cleanup_request.md | 19 + .github/ISSUE_TEMPLATE/feature_request.md | 30 + .github/ISSUE_TEMPLATE/question.md | 17 + .github/lock.yml | 2 + .github/mergeable.yml | 18 + .github/pull_request_template.md | 11 + .github/stale.yml | 60 + .gitignore | 153 + .gitmodules | 48 + .istanbul.yml | 6 + .pylintrc | 97 + .pylintrc-examples | 100 + .pylintrc-tests | 126 + .rspec | 6 + .travis.yml | 70 + .yapfignore | 35 + .yardopts | 1 + AUTHORS | 4 + BUILD | 2853 + BUILD.gn | 1357 + BUILDING.md | 270 + CMakeLists.txt | 15165 ++++ CODE-OF-CONDUCT.md | 3 + CONCEPTS.md | 63 + CONTRIBUTING.md | 134 + GOVERNANCE.md | 1 + Gemfile | 4 + LICENSE | 202 + MAINTAINERS.md | 84 + MANIFEST.md | 23 + Makefile | 20074 +++++ NOTICE.txt | 13 + OWNERS | 5 + PYTHON-MANIFEST.in | 24 + README.md | 87 + Rakefile | 163 + TROUBLESHOOTING.md | 43 + WORKSPACE | 77 + bazel/BUILD | 19 + bazel/OWNERS | 6 + bazel/cc_grpc_library.bzl | 105 + bazel/custom_exec_properties.bzl | 17 + bazel/cython_library.bzl | 77 + bazel/generate_cc.bzl | 187 + bazel/generate_objc.bzl | 224 + bazel/grpc_build_system.bzl | 353 + bazel/grpc_deps.bzl | 405 + bazel/grpc_extra_deps.bzl | 40 + bazel/grpc_python_deps.bzl | 67 + bazel/grpc_util.bzl | 46 + bazel/objc_grpc_library.bzl | 68 + bazel/protobuf.bzl | 248 + bazel/python_rules.bzl | 293 + bazel/test/python_test_repo/.gitignore | 2 + bazel/test/python_test_repo/BUILD | 114 + bazel/test/python_test_repo/README.md | 5 + bazel/test/python_test_repo/WORKSPACE | 12 + bazel/test/python_test_repo/dummy_plugin.py | 37 + bazel/test/python_test_repo/helloworld.proto | 43 + bazel/test/python_test_repo/helloworld.py | 76 + .../test/python_test_repo/helloworld_moved.py | 76 + bazel/test/python_test_repo/tools/bazel | 1 + bazel/update_mirror.sh | 63 + build_autogenerated.yaml | 7607 ++ build_config.rb | 17 + build_handwritten.yaml | 263 + cmake/OWNERS | 4 + cmake/abseil-cpp.cmake | 40 + cmake/address_sorting.cmake | 16 + cmake/benchmark.cmake | 37 + cmake/cares.cmake | 47 + cmake/gRPCConfig.cmake.in | 12 + cmake/gflags.cmake | 34 + cmake/modules/Findc-ares.cmake | 48 + cmake/msvc_static_runtime.cmake | 30 + cmake/pkg-config-template.pc.in | 12 + cmake/protobuf.cmake | 95 + cmake/ssl.cmake | 76 + cmake/upb.cmake | 20 + cmake/zlib.cmake | 61 + composer.json | 23 + config.m4 | 998 + config.w32 | 1046 + doc/.gitignore | 2 + doc/PROTOCOL-HTTP2.md | 259 + doc/PROTOCOL-WEB.md | 141 + doc/binary-logging.md | 59 + doc/c-style-guide.md | 92 + doc/command_line_tool.md | 209 + doc/compression.md | 118 + doc/compression_cookbook.md | 133 + ...ection-backoff-interop-test-description.md | 77 + doc/connection-backoff.md | 56 + doc/connectivity-semantics-and-api.md | 154 + doc/core/combiner-explainer.md | 158 + doc/core/epoll-polling-engine.md | 121 + ...grpc-client-server-polling-engine-usage.md | 32 + doc/core/grpc-cq.md | 64 + doc/core/grpc-error.md | 160 + doc/core/grpc-polling-engines.md | 152 + doc/core/images/new_epoll_impl.png | Bin 0 -> 53699 bytes doc/core/images/old_epoll_impl.png | Bin 0 -> 45342 bytes doc/core/moving-to-c++.md | 68 + doc/core/pending_api_cleanups.md | 18 + doc/core/transport_explainer.md | 197 + doc/cpp-style-guide.md | 8 + doc/cpp/pending_api_cleanups.md | 22 + doc/cpp/perf_notes.md | 29 + doc/csharp/server_reflection.md | 54 + doc/environment_variables.md | 165 + doc/fail_fast.md | 1 + doc/fork_support.md | 46 + doc/g_stands_for.md | 32 + doc/grpc_release_schedule.md | 32 + doc/grpc_security_audit.pdf | Bin 0 -> 177282 bytes doc/health-checking.md | 77 + doc/http-grpc-status-mapping.md | 30 + doc/http2-interop-test-descriptions.md | 271 + doc/images/compression_cookbook_incoming.png | Bin 0 -> 91427 bytes doc/images/compression_cookbook_outgoing.png | Bin 0 -> 122927 bytes doc/images/grpc-call-channel-cq.png | Bin 0 -> 46078 bytes doc/images/grpc-client-lb-pss.png | Bin 0 -> 56397 bytes doc/images/grpc-cq.png | Bin 0 -> 41659 bytes doc/images/grpc-epoll1.png | Bin 0 -> 36205 bytes doc/images/grpc-epollex.png | Bin 0 -> 52651 bytes doc/images/grpc-ps-pss-fd.png | Bin 0 -> 24969 bytes doc/images/grpc-pss.png | Bin 0 -> 31518 bytes doc/images/grpc-server-cq-fds.png | Bin 0 -> 42096 bytes doc/images/load-balancing.png | Bin 0 -> 28073 bytes doc/images/load-balancing.svg | 4 + doc/images/stress_test_framework.png | Bin 0 -> 63744 bytes doc/internationalization.md | 45 + doc/interop-test-descriptions.md | 1228 + doc/keepalive.md | 52 + doc/load-balancing.md | 146 + doc/naming.md | 77 + doc/python/server_reflection.md | 66 + doc/python/sphinx/_static/custom.css | 3 + doc/python/sphinx/conf.py | 110 + doc/python/sphinx/glossary.rst | 50 + doc/python/sphinx/grpc.rst | 188 + doc/python/sphinx/grpc_asyncio.rst | 132 + doc/python/sphinx/grpc_channelz.rst | 12 + doc/python/sphinx/grpc_health_checking.rst | 7 + doc/python/sphinx/grpc_reflection.rst | 19 + doc/python/sphinx/grpc_status.rst | 7 + doc/python/sphinx/grpc_testing.rst | 7 + doc/python/sphinx/index.rst | 27 + doc/security_audit.md | 70 + doc/server-reflection.md | 197 + doc/server_reflection_tutorial.md | 189 + doc/server_side_auth.md | 61 + doc/service_config.md | 92 + doc/ssl-performance.md | 41 + doc/status_ordering.md | 16 + doc/statuscodes.md | 74 + doc/unit_testing.md | 175 + doc/versioning.md | 45 + doc/wait-for-ready.md | 14 + doc/workarounds.md | 19 + doc/xds-test-descriptions.md | 293 + etc/README.md | 4 + etc/roots.pem | 4644 + examples/BUILD | 247 + examples/README.md | 27 + examples/android/helloworld/.gitignore | 9 + examples/android/helloworld/README.md | 24 + examples/android/helloworld/app/.gitignore | 1 + .../android/helloworld/app/CMakeLists.txt | 86 + examples/android/helloworld/app/build.gradle | 56 + .../android/helloworld/app/proguard-rules.pro | 21 + .../app/src/main/AndroidManifest.xml | 22 + .../app/src/main/cpp/grpc-helloworld.cc | 142 + .../cpp/HelloworldActivity.java | 167 + .../main/res/layout/activity_helloworld.xml | 86 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3418 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2206 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4842 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7718 bytes .../app/src/main/res/values/strings.xml | 3 + examples/android/helloworld/build.gradle | 24 + examples/android/helloworld/gradle.properties | 17 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53636 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + examples/android/helloworld/gradlew | 160 + examples/android/helloworld/gradlew.bat | 90 + examples/android/helloworld/settings.gradle | 1 + examples/cpp/README.md | 13 + examples/cpp/compression/Makefile | 110 + examples/cpp/compression/README.md | 84 + examples/cpp/compression/greeter_client.cc | 93 + examples/cpp/compression/greeter_server.cc | 76 + examples/cpp/helloworld/.gitignore | 8 + examples/cpp/helloworld/CMakeLists.txt | 160 + examples/cpp/helloworld/Makefile | 121 + examples/cpp/helloworld/README.md | 6 + .../cmake_externalproject/CMakeLists.txt | 129 + .../HelloWorldCpp.xcodeproj/project.pbxproj | 409 + .../cocoapods/HelloWorldCpp/AppDelegate.h | 23 + .../cocoapods/HelloWorldCpp/AppDelegate.mm | 22 + .../AppIcon.appiconset/Contents.json | 93 + .../Base.lproj/LaunchScreen.storyboard | 25 + .../HelloWorldCpp/Base.lproj/Main.storyboard | 24 + .../cocoapods/HelloWorldCpp/Info.plist | 45 + .../cocoapods/HelloWorldCpp/ViewController.h | 23 + .../cocoapods/HelloWorldCpp/ViewController.mm | 101 + .../helloworld/cocoapods/HelloWorldCpp/main.m | 26 + examples/cpp/helloworld/cocoapods/Podfile | 8 + .../cpp/helloworld/greeter_async_client.cc | 121 + .../cpp/helloworld/greeter_async_client2.cc | 147 + .../cpp/helloworld/greeter_async_server.cc | 171 + examples/cpp/helloworld/greeter_client.cc | 107 + examples/cpp/helloworld/greeter_server.cc | 76 + .../cpp/keyvaluestore/caching_interceptor.h | 134 + examples/cpp/keyvaluestore/client.cc | 99 + examples/cpp/keyvaluestore/server.cc | 97 + examples/cpp/load_balancing/Makefile | 110 + examples/cpp/load_balancing/README.md | 65 + examples/cpp/load_balancing/greeter_client.cc | 90 + examples/cpp/load_balancing/greeter_server.cc | 72 + examples/cpp/metadata/Makefile | 96 + examples/cpp/metadata/README.md | 67 + examples/cpp/metadata/greeter_client.cc | 95 + examples/cpp/metadata/greeter_server.cc | 94 + examples/cpp/route_guide/Makefile | 110 + examples/cpp/route_guide/README.md | 6 + examples/cpp/route_guide/helper.cc | 164 + examples/cpp/route_guide/helper.h | 35 + .../cpp/route_guide/route_guide_client.cc | 240 + examples/cpp/route_guide/route_guide_db.json | 601 + .../cpp/route_guide/route_guide_server.cc | 193 + examples/csharp/.gitignore | 7 + examples/csharp/Helloworld/Greeter.sln | 34 + .../csharp/Helloworld/Greeter/Greeter.csproj | 17 + .../GreeterClient/GreeterClient.csproj | 12 + .../Helloworld/GreeterClient/Program.cs | 38 + .../GreeterServer/GreeterServer.csproj | 12 + .../Helloworld/GreeterServer/Program.cs | 51 + examples/csharp/Helloworld/README.md | 39 + .../csharp/HelloworldLegacyCsproj/Greeter.sln | 37 + .../HelloworldLegacyCsproj/Greeter/.gitignore | 2 + .../Greeter/Greeter.csproj | 78 + .../Greeter/Properties/AssemblyInfo.cs | 40 + .../Greeter/packages.config | 11 + .../GreeterClient/.gitignore | 2 + .../GreeterClient/GreeterClient.csproj | 77 + .../GreeterClient/Program.cs | 38 + .../GreeterClient/Properties/AssemblyInfo.cs | 40 + .../GreeterClient/packages.config | 10 + .../GreeterServer/.gitignore | 2 + .../GreeterServer/GreeterServer.csproj | 77 + .../GreeterServer/Program.cs | 51 + .../GreeterServer/Properties/AssemblyInfo.cs | 40 + .../GreeterServer/packages.config | 10 + .../csharp/HelloworldLegacyCsproj/README.md | 74 + examples/csharp/HelloworldUnity/.gitignore | 52 + .../HelloworldUnity/Assets/Plugins.meta | 8 + .../csharp/HelloworldUnity/Assets/Scenes.meta | 8 + .../Assets/Scenes/SampleScene.unity | 586 + .../Assets/Scenes/SampleScene.unity.meta | 7 + .../HelloworldUnity/Assets/Scripts.meta | 8 + .../Assets/Scripts/HelloWorldScript.cs | 38 + .../Assets/Scripts/HelloWorldScript.cs.meta | 11 + .../Assets/Scripts/HelloWorldTest.cs | 81 + .../Assets/Scripts/HelloWorldTest.cs.meta | 11 + .../Assets/Scripts/Helloworld.cs | 286 + .../Assets/Scripts/Helloworld.cs.meta | 11 + .../Assets/Scripts/HelloworldGrpc.cs | 150 + .../Assets/Scripts/HelloworldGrpc.cs.meta | 11 + .../ProjectSettings/AudioManager.asset | 17 + .../ProjectSettings/ClusterInputManager.asset | 6 + .../ProjectSettings/DynamicsManager.asset | 29 + .../ProjectSettings/EditorBuildSettings.asset | 11 + .../ProjectSettings/EditorSettings.asset | 21 + .../ProjectSettings/GraphicsSettings.asset | 60 + .../ProjectSettings/InputManager.asset | 295 + .../ProjectSettings/NavMeshAreas.asset | 91 + .../ProjectSettings/NetworkManager.asset | 8 + .../ProjectSettings/Physics2DSettings.asset | 55 + .../ProjectSettings/PresetManager.asset | 13 + .../ProjectSettings/ProjectSettings.asset | 656 + .../ProjectSettings/ProjectVersion.txt | 1 + .../ProjectSettings/QualitySettings.asset | 191 + .../ProjectSettings/TagManager.asset | 43 + .../ProjectSettings/TimeManager.asset | 9 + .../UnityConnectSettings.asset | 34 + .../ProjectSettings/VFXManager.asset | 11 + examples/csharp/HelloworldUnity/README.md | 19 + .../UIElementsSchema/UIElements.xsd | 6 + .../UnityEditor.Experimental.UIElements.xsd | 228 + .../UnityEditor.PackageManager.UI.xsd | 116 + .../UnityEngine.Experimental.UIElements.xsd | 269 + examples/csharp/HelloworldXamarin/.gitignore | 41 + .../Droid/Assets/AboutAssets.txt | 19 + .../Droid/HelloworldXamarin.Droid.csproj | 103 + .../HelloworldXamarin/Droid/MainActivity.cs | 84 + .../Droid/Properties/AndroidManifest.xml | 5 + .../Droid/Properties/AssemblyInfo.cs | 45 + .../Droid/Resources/AboutResources.txt | 44 + .../Droid/Resources/Resource.designer.cs | 112 + .../Droid/Resources/layout/Main.axml | 4 + .../Droid/Resources/mipmap-hdpi/Icon.png | Bin 0 -> 2201 bytes .../Droid/Resources/mipmap-mdpi/Icon.png | Bin 0 -> 1410 bytes .../Droid/Resources/mipmap-xhdpi/Icon.png | Bin 0 -> 3237 bytes .../Droid/Resources/mipmap-xxhdpi/Icon.png | Bin 0 -> 5414 bytes .../Droid/Resources/mipmap-xxxhdpi/Icon.png | Bin 0 -> 7825 bytes .../Droid/Resources/values/Strings.xml | 5 + .../HelloworldXamarin/Droid/packages.config | 58 + .../HelloworldXamarin/HelloworldXamarin.sln | 57 + .../HelloworldXamarin/Helloworld.cs | 286 + .../HelloworldXamarin/HelloworldGrpc.cs | 150 + .../HelloworldXamarin.projitems | 15 + .../HelloworldXamarin.shproj | 11 + examples/csharp/HelloworldXamarin/README.md | 32 + .../HelloworldXamarin/iOS/AppDelegate.cs | 77 + .../AppIcon.appiconset/Contents.json | 202 + .../iOS/Assets.xcassets/Contents.json | 6 + .../HelloworldXamarin/iOS/Entitlements.plist | 6 + .../iOS/HelloworldXamarin.iOS.csproj | 151 + .../csharp/HelloworldXamarin/iOS/Info.plist | 48 + .../iOS/LaunchScreen.storyboard | 27 + examples/csharp/HelloworldXamarin/iOS/Main.cs | 38 + .../HelloworldXamarin/iOS/Main.storyboard | 40 + .../HelloworldXamarin/iOS/ViewController.cs | 91 + .../iOS/ViewController.designer.cs | 25 + .../HelloworldXamarin/iOS/packages.config | 58 + examples/csharp/RouteGuide/.gitignore | 5 + examples/csharp/RouteGuide/README.md | 6 + examples/csharp/RouteGuide/RouteGuide.sln | 34 + .../RouteGuide/RouteGuide/RouteGuide.csproj | 22 + .../RouteGuide/RouteGuide/RouteGuideUtil.cs | 139 + .../RouteGuide/RouteGuide/route_guide_db.json | 601 + .../RouteGuide/RouteGuideClient/Program.cs | 241 + .../RouteGuideClient/RouteGuideClient.csproj | 12 + .../RouteGuide/RouteGuideServer/Program.cs | 46 + .../RouteGuideServer/RouteGuideImpl.cs | 153 + .../RouteGuideServer/RouteGuideServer.csproj | 12 + examples/csharp/Xds/Greeter.sln | 34 + examples/csharp/Xds/Greeter/Greeter.csproj | 20 + .../Xds/GreeterClient/GreeterClient.csproj | 12 + examples/csharp/Xds/GreeterClient/Program.cs | 51 + .../Xds/GreeterServer/GreeterServer.csproj | 12 + examples/csharp/Xds/GreeterServer/Program.cs | 93 + examples/csharp/Xds/README.md | 99 + examples/node/.gitignore | 3 + examples/node/README.md | 50 + examples/node/dynamic_codegen/README.md | 1 + .../node/dynamic_codegen/greeter_client.js | 47 + .../node/dynamic_codegen/greeter_server.js | 51 + .../dynamic_codegen/route_guide/README.md | 5 + .../route_guide/route_guide_client.js | 237 + .../route_guide/route_guide_db.json | 601 + .../route_guide/route_guide_server.js | 244 + examples/node/package.json | 12 + examples/node/static_codegen/README.md | 8 + .../node/static_codegen/greeter_client.js | 40 + .../node/static_codegen/greeter_server.js | 44 + .../node/static_codegen/helloworld_grpc_pb.js | 61 + examples/node/static_codegen/helloworld_pb.js | 332 + .../node/static_codegen/route_guide/README.md | 5 + .../route_guide/route_guide_client.js | 237 + .../route_guide/route_guide_db.json | 601 + .../route_guide/route_guide_grpc_pb.js | 146 + .../route_guide/route_guide_pb.js | 1033 + .../route_guide/route_guide_server.js | 243 + examples/objective-c/BUILD | 119 + .../AuthSample.xcodeproj/project.pbxproj | 382 + .../contents.xcworkspacedata | 7 + .../xcschemes/AuthSample.xcscheme | 91 + .../auth_sample/AuthTestService.podspec | 66 + .../auth_sample/MakeRPCViewController.h | 25 + .../auth_sample/MakeRPCViewController.m | 94 + .../auth_sample/Misc/AppDelegate.h | 23 + .../auth_sample/Misc/AppDelegate.m | 46 + .../Misc/Base.lproj/Main.storyboard | 154 + .../auth_sample/Misc/GoogleService-Info.plist | 40 + .../AppIcon.appiconset/Contents.json | 68 + .../first.imageset/Contents.json | 12 + .../Images.xcassets/first.imageset/first.pdf | Bin 0 -> 2465 bytes .../second.imageset/Contents.json | 12 + .../second.imageset/second.pdf | Bin 0 -> 2423 bytes .../objective-c/auth_sample/Misc/Info.plist | 80 + examples/objective-c/auth_sample/Misc/main.m | 26 + examples/objective-c/auth_sample/Podfile | 12 + examples/objective-c/auth_sample/README.md | 3 + .../auth_sample/SelectUserViewController.h | 27 + .../auth_sample/SelectUserViewController.m | 71 + .../objective-c/helloworld/HelloWorld.podspec | 66 + .../HelloWorld.xcodeproj/project.pbxproj | 373 + .../contents.xcworkspacedata | 7 + .../xcschemes/HelloWorld.xcscheme | 91 + .../helloworld/HelloWorld/AppDelegate.h | 23 + .../helloworld/HelloWorld/AppDelegate.m | 22 + .../HelloWorld/Base.lproj/Main.storyboard | 25 + .../AppIcon.appiconset/Contents.json | 68 + .../helloworld/HelloWorld/Info.plist | 47 + .../helloworld/HelloWorld/ViewController.m | 25 + examples/objective-c/helloworld/Podfile | 9 + examples/objective-c/helloworld/README.md | 107 + examples/objective-c/helloworld/main.m | 68 + .../helloworld_macos/HelloWorld.podspec | 66 + .../HelloWorld.xcodeproj/project.pbxproj | 399 + .../helloworld_macos/HelloWorld/AppDelegate.h | 25 + .../helloworld_macos/HelloWorld/AppDelegate.m | 37 + .../AppIcon.appiconset/Contents.json | 58 + .../HelloWorld/Assets.xcassets/Contents.json | 6 + .../HelloWorld/Base.lproj/Main.storyboard | 717 + .../HelloWorld/HelloWorld.entitlements | 5 + .../helloworld_macos/HelloWorld/Info.plist | 32 + .../HelloWorld/ViewController.h | 25 + .../HelloWorld/ViewController.m | 37 + examples/objective-c/helloworld_macos/Podfile | 9 + .../objective-c/helloworld_macos/README.md | 6 + examples/objective-c/helloworld_macos/main.m | 69 + .../route_guide/Misc/AppDelegate.h | 23 + .../route_guide/Misc/AppDelegate.m | 22 + .../Misc/Base.lproj/Main.storyboard | 207 + .../AppIcon.appiconset/Contents.json | 68 + .../first.imageset/Contents.json | 12 + .../Images.xcassets/first.imageset/first.pdf | Bin 0 -> 2465 bytes .../second.imageset/Contents.json | 12 + .../second.imageset/second.pdf | Bin 0 -> 2423 bytes .../objective-c/route_guide/Misc/Info.plist | 57 + examples/objective-c/route_guide/Misc/main.m | 26 + examples/objective-c/route_guide/Podfile | 9 + examples/objective-c/route_guide/README.md | 4 + .../route_guide/RouteGuide.podspec | 66 + .../project.pbxproj | 382 + .../contents.xcworkspacedata | 7 + .../xcschemes/RouteGuideClient.xcscheme | 91 + .../objective-c/route_guide/ViewControllers.m | 374 + .../route_guide/route_guide_db.json | 121 + examples/php/.gitignore | 2 + examples/php/README.md | 56 + examples/php/composer.json | 15 + examples/php/echo/README.md | 86 + examples/php/echo/apache.Dockerfile | 51 + examples/php/echo/base.Dockerfile | 40 + examples/php/echo/cli.Dockerfile | 52 + examples/php/echo/client.php | 45 + examples/php/echo/composer.json | 12 + examples/php/echo/echo.proto | 100 + examples/php/echo/fpm.Dockerfile | 51 + examples/php/echo/nginx.conf | 23 + examples/php/greeter_client.php | 44 + examples/php/greeter_proto_gen.sh | 16 + examples/php/route_guide/README.md | 6 + .../php/route_guide/route_guide_client.php | 212 + .../php/route_guide/route_guide_proto_gen.sh | 16 + .../php/route_guide/run_route_guide_client.sh | 20 + examples/php/run_greeter_client.sh | 19 + examples/protos/README.md | 8 + examples/protos/auth_sample.proto | 42 + examples/protos/hellostreamingworld.proto | 39 + examples/protos/helloworld.proto | 38 + examples/protos/keyvaluestore.proto | 33 + examples/protos/route_guide.proto | 111 + examples/python/README.md | 1 + examples/python/auth/BUILD.bazel | 69 + examples/python/auth/README.md | 112 + examples/python/auth/_credentials.py | 31 + .../python/auth/credentials/localhost.crt | 19 + .../python/auth/credentials/localhost.key | 27 + examples/python/auth/credentials/root.crt | 20 + .../python/auth/customized_auth_client.py | 102 + .../python/auth/customized_auth_server.py | 105 + .../python/auth/test/_auth_example_test.py | 56 + examples/python/cancellation/BUILD.bazel | 85 + examples/python/cancellation/README.md | 127 + examples/python/cancellation/client.py | 100 + examples/python/cancellation/hash_name.proto | 56 + examples/python/cancellation/search.py | 148 + examples/python/cancellation/server.py | 123 + .../test/_cancellation_example_test.py | 87 + examples/python/compression/BUILD.bazel | 49 + examples/python/compression/README.md | 58 + examples/python/compression/client.py | 73 + examples/python/compression/server.py | 99 + .../test/compression_example_test.py | 62 + examples/python/data_transmission/BUILD | 49 + .../python/data_transmission/README.cn.md | 36 + .../python/data_transmission/README.en.md | 37 + .../python/data_transmission/alts_client.py | 39 + .../python/data_transmission/alts_server.py | 39 + examples/python/data_transmission/client.py | 123 + examples/python/data_transmission/demo.proto | 69 + examples/python/data_transmission/demo_pb2.py | 174 + .../python/data_transmission/demo_pb2_grpc.py | 106 + examples/python/data_transmission/server.py | 115 + examples/python/debug/BUILD.bazel | 65 + examples/python/debug/README.md | 68 + examples/python/debug/debug_server.py | 83 + examples/python/debug/get_stats.py | 49 + examples/python/debug/send_message.py | 62 + .../python/debug/test/_debug_example_test.py | 53 + examples/python/errors/BUILD.bazel | 59 + examples/python/errors/README.md | 107 + examples/python/errors/client.py | 56 + examples/python/errors/server.py | 82 + .../test/_error_handling_example_test.py | 54 + examples/python/helloworld/.gitignore | 1 + examples/python/helloworld/README.md | 1 + examples/python/helloworld/greeter_client.py | 37 + .../helloworld/greeter_client_with_options.py | 46 + examples/python/helloworld/greeter_server.py | 41 + .../greeter_server_with_reflection.py | 47 + examples/python/helloworld/helloworld_pb2.py | 134 + .../python/helloworld/helloworld_pb2_grpc.py | 46 + .../default_value_client_interceptor.py | 66 + .../default_value/greeter_client.py | 44 + .../default_value/helloworld_pb2.py | 134 + .../default_value/helloworld_pb2_grpc.py | 46 + .../headers/generic_client_interceptor.py | 56 + .../interceptors/headers/greeter_client.py | 42 + .../interceptors/headers/greeter_server.py | 46 + .../header_manipulator_client_interceptor.py | 46 + .../interceptors/headers/helloworld_pb2.py | 134 + .../headers/helloworld_pb2_grpc.py | 46 + .../request_header_validator_interceptor.py | 39 + examples/python/metadata/README.md | 6 + examples/python/metadata/helloworld_pb2.py | 134 + .../python/metadata/helloworld_pb2_grpc.py | 46 + examples/python/metadata/metadata_client.py | 48 + examples/python/metadata/metadata_server.py | 49 + examples/python/multiplex/.gitignore | 1 + examples/python/multiplex/README.md | 3 + examples/python/multiplex/helloworld_pb2.py | 134 + .../python/multiplex/helloworld_pb2_grpc.py | 46 + examples/python/multiplex/multiplex_client.py | 131 + examples/python/multiplex/multiplex_server.py | 134 + examples/python/multiplex/route_guide_db.json | 601 + examples/python/multiplex/route_guide_pb2.py | 331 + .../python/multiplex/route_guide_pb2_grpc.py | 113 + .../python/multiplex/route_guide_resources.py | 37 + examples/python/multiplex/run_codegen.py | 31 + examples/python/multiprocessing/BUILD | 76 + examples/python/multiprocessing/README.md | 74 + examples/python/multiprocessing/client.py | 93 + examples/python/multiprocessing/prime.proto | 35 + examples/python/multiprocessing/server.py | 117 + .../test/_multiprocessing_example_test.py | 74 + examples/python/route_guide/.gitignore | 1 + examples/python/route_guide/README.md | 1 + .../python/route_guide/route_guide_client.py | 120 + .../python/route_guide/route_guide_db.json | 601 + .../python/route_guide/route_guide_pb2.py | 331 + .../route_guide/route_guide_pb2_grpc.py | 113 + .../route_guide/route_guide_resources.py | 37 + .../python/route_guide/route_guide_server.py | 124 + examples/python/route_guide/run_codegen.py | 24 + examples/python/wait_for_ready/BUILD.bazel | 34 + examples/python/wait_for_ready/README.md | 32 + .../test/_wait_for_ready_example_test.py | 31 + .../wait_for_ready/wait_for_ready_example.py | 114 + examples/python/xds/README.md | 103 + examples/python/xds/client.py | 42 + examples/python/xds/helloworld_pb2.py | 134 + examples/python/xds/helloworld_pb2_grpc.py | 46 + examples/python/xds/requirements.txt | 5 + examples/python/xds/server.py | 94 + examples/ruby/.gitignore | 15 + examples/ruby/Gemfile | 6 + examples/ruby/README.md | 63 + .../ruby/errors_and_cancellation/README.md | 25 + .../error_examples_client.rb | 102 + .../error_examples_server.rb | 61 + examples/ruby/greeter_client.rb | 40 + examples/ruby/greeter_server.rb | 48 + examples/ruby/grpc-demo.gemspec | 23 + examples/ruby/lib/helloworld_pb.rb | 18 + examples/ruby/lib/helloworld_services_pb.rb | 39 + examples/ruby/lib/route_guide_pb.rb | 37 + examples/ruby/lib/route_guide_services_pb.rb | 61 + examples/ruby/pubsub/.gitignore | 15 + examples/ruby/pubsub/Gemfile | 4 + examples/ruby/pubsub/google/protobuf/empty.rb | 29 + examples/ruby/pubsub/pubsub_demo.rb | 241 + .../ruby/pubsub/tech/pubsub/proto/pubsub.rb | 159 + .../tech/pubsub/proto/pubsub_services.rb | 88 + examples/ruby/route_guide/README.md | 6 + .../ruby/route_guide/route_guide_client.rb | 164 + .../ruby/route_guide/route_guide_server.rb | 181 + examples/ruby/without_protobuf/README.md | 6 + examples/ruby/without_protobuf/echo_client.rb | 34 + examples/ruby/without_protobuf/echo_server.rb | 44 + .../echo_services_noprotobuf.rb | 34 + gRPC-C++.podspec | 1133 + gRPC-Core.podspec | 1625 + gRPC-ProtoRPC.podspec | 88 + gRPC-RxLibrary.podspec | 70 + gRPC.podspec | 184 + grpc.bzl | 113 + grpc.def | 273 + grpc.gemspec | 1695 + grpc.gyp | 1890 + include/grpc++/alarm.h | 28 + include/grpc++/channel.h | 28 + include/grpc++/client_context.h | 28 + include/grpc++/completion_queue.h | 28 + include/grpc++/create_channel.h | 28 + include/grpc++/create_channel_posix.h | 28 + ...alth_check_service_server_builder_option.h | 28 + .../ext/proto_server_reflection_plugin.h | 28 + .../grpc++/generic/async_generic_service.h | 28 + include/grpc++/generic/generic_stub.h | 28 + include/grpc++/grpc++.h | 28 + .../grpc++/health_check_service_interface.h | 28 + include/grpc++/impl/call.h | 28 + include/grpc++/impl/channel_argument_option.h | 28 + include/grpc++/impl/client_unary_call.h | 28 + include/grpc++/impl/codegen/async_stream.h | 28 + .../grpc++/impl/codegen/async_unary_call.h | 28 + include/grpc++/impl/codegen/byte_buffer.h | 28 + include/grpc++/impl/codegen/call.h | 28 + include/grpc++/impl/codegen/call_hook.h | 28 + .../grpc++/impl/codegen/channel_interface.h | 28 + include/grpc++/impl/codegen/client_context.h | 28 + .../grpc++/impl/codegen/client_unary_call.h | 28 + .../grpc++/impl/codegen/completion_queue.h | 28 + .../impl/codegen/completion_queue_tag.h | 28 + include/grpc++/impl/codegen/config.h | 28 + include/grpc++/impl/codegen/config_protobuf.h | 28 + include/grpc++/impl/codegen/core_codegen.h | 28 + .../impl/codegen/core_codegen_interface.h | 28 + .../grpc++/impl/codegen/create_auth_context.h | 28 + include/grpc++/impl/codegen/grpc_library.h | 28 + include/grpc++/impl/codegen/metadata_map.h | 28 + .../grpc++/impl/codegen/method_handler_impl.h | 28 + include/grpc++/impl/codegen/proto_utils.h | 28 + include/grpc++/impl/codegen/rpc_method.h | 28 + .../grpc++/impl/codegen/rpc_service_method.h | 28 + .../impl/codegen/security/auth_context.h | 28 + .../impl/codegen/serialization_traits.h | 28 + include/grpc++/impl/codegen/server_context.h | 28 + .../grpc++/impl/codegen/server_interface.h | 28 + include/grpc++/impl/codegen/service_type.h | 28 + include/grpc++/impl/codegen/slice.h | 28 + include/grpc++/impl/codegen/status.h | 28 + .../grpc++/impl/codegen/status_code_enum.h | 28 + include/grpc++/impl/codegen/string_ref.h | 28 + include/grpc++/impl/codegen/stub_options.h | 28 + include/grpc++/impl/codegen/sync_stream.h | 28 + include/grpc++/impl/codegen/time.h | 28 + include/grpc++/impl/grpc_library.h | 28 + include/grpc++/impl/method_handler_impl.h | 28 + include/grpc++/impl/rpc_method.h | 28 + include/grpc++/impl/rpc_service_method.h | 28 + include/grpc++/impl/serialization_traits.h | 28 + include/grpc++/impl/server_builder_option.h | 28 + include/grpc++/impl/server_builder_plugin.h | 28 + include/grpc++/impl/server_initializer.h | 28 + include/grpc++/impl/service_type.h | 28 + include/grpc++/resource_quota.h | 28 + include/grpc++/security/auth_context.h | 28 + .../grpc++/security/auth_metadata_processor.h | 28 + include/grpc++/security/credentials.h | 28 + include/grpc++/security/server_credentials.h | 28 + include/grpc++/server.h | 28 + include/grpc++/server_builder.h | 28 + include/grpc++/server_context.h | 28 + include/grpc++/server_posix.h | 28 + include/grpc++/support/async_stream.h | 28 + include/grpc++/support/async_unary_call.h | 28 + include/grpc++/support/byte_buffer.h | 28 + include/grpc++/support/channel_arguments.h | 28 + include/grpc++/support/config.h | 28 + include/grpc++/support/error_details.h | 28 + include/grpc++/support/slice.h | 28 + include/grpc++/support/status.h | 28 + include/grpc++/support/status_code_enum.h | 28 + include/grpc++/support/string_ref.h | 28 + include/grpc++/support/stub_options.h | 28 + include/grpc++/support/sync_stream.h | 28 + include/grpc++/support/time.h | 28 + include/grpc++/test/mock_stream.h | 28 + .../grpc++/test/server_context_test_spouse.h | 28 + include/grpc/byte_buffer.h | 27 + include/grpc/byte_buffer_reader.h | 26 + include/grpc/census.h | 40 + include/grpc/compression.h | 75 + include/grpc/fork.h | 26 + include/grpc/grpc.h | 540 + include/grpc/grpc_cronet.h | 38 + include/grpc/grpc_posix.h | 59 + include/grpc/grpc_security.h | 1019 + include/grpc/grpc_security_constants.h | 146 + include/grpc/impl/codegen/atm.h | 95 + include/grpc/impl/codegen/atm_gcc_atomic.h | 91 + include/grpc/impl/codegen/atm_gcc_sync.h | 85 + include/grpc/impl/codegen/atm_windows.h | 128 + include/grpc/impl/codegen/byte_buffer.h | 101 + .../grpc/impl/codegen/byte_buffer_reader.h | 42 + include/grpc/impl/codegen/compression_types.h | 108 + .../grpc/impl/codegen/connectivity_state.h | 44 + include/grpc/impl/codegen/fork.h | 48 + include/grpc/impl/codegen/gpr_slice.h | 69 + include/grpc/impl/codegen/gpr_types.h | 59 + include/grpc/impl/codegen/grpc_types.h | 785 + include/grpc/impl/codegen/log.h | 112 + include/grpc/impl/codegen/port_platform.h | 720 + include/grpc/impl/codegen/propagation_bits.h | 52 + include/grpc/impl/codegen/slice.h | 127 + include/grpc/impl/codegen/status.h | 154 + include/grpc/impl/codegen/sync.h | 65 + include/grpc/impl/codegen/sync_abseil.h | 36 + include/grpc/impl/codegen/sync_custom.h | 38 + include/grpc/impl/codegen/sync_generic.h | 48 + include/grpc/impl/codegen/sync_posix.h | 52 + include/grpc/impl/codegen/sync_windows.h | 36 + include/grpc/load_reporting.h | 48 + include/grpc/module.modulemap | 64 + include/grpc/slice.h | 172 + include/grpc/slice_buffer.h | 84 + include/grpc/status.h | 26 + include/grpc/support/alloc.h | 52 + include/grpc/support/atm.h | 26 + include/grpc/support/atm_gcc_atomic.h | 26 + include/grpc/support/atm_gcc_sync.h | 26 + include/grpc/support/atm_windows.h | 26 + include/grpc/support/cpu.h | 44 + include/grpc/support/log.h | 26 + include/grpc/support/log_windows.h | 38 + include/grpc/support/port_platform.h | 24 + include/grpc/support/string_util.h | 51 + include/grpc/support/sync.h | 282 + include/grpc/support/sync_abseil.h | 26 + include/grpc/support/sync_custom.h | 26 + include/grpc/support/sync_generic.h | 26 + include/grpc/support/sync_posix.h | 26 + include/grpc/support/sync_windows.h | 26 + include/grpc/support/thd_id.h | 44 + include/grpc/support/time.h | 92 + include/grpc/support/workaround_list.h | 31 + include/grpcpp/alarm.h | 29 + include/grpcpp/alarm_impl.h | 125 + include/grpcpp/channel.h | 37 + include/grpcpp/channel_impl.h | 130 + include/grpcpp/client_context.h | 39 + include/grpcpp/completion_queue.h | 24 + include/grpcpp/completion_queue_impl.h | 24 + include/grpcpp/create_channel.h | 57 + include/grpcpp/create_channel_impl.h | 78 + include/grpcpp/create_channel_posix.h | 57 + include/grpcpp/create_channel_posix_impl.h | 70 + include/grpcpp/ext/channelz_service_plugin.h | 36 + .../grpcpp/ext/channelz_service_plugin_impl.h | 41 + ...alth_check_service_server_builder_option.h | 47 + .../ext/proto_server_reflection_plugin.h | 37 + .../ext/proto_server_reflection_plugin_impl.h | 55 + include/grpcpp/ext/server_load_reporting.h | 43 + .../grpcpp/ext/server_load_reporting_impl.h | 54 + .../grpcpp/generic/async_generic_service.h | 24 + include/grpcpp/generic/generic_stub.h | 30 + include/grpcpp/generic/generic_stub_impl.h | 216 + include/grpcpp/grpcpp.h | 68 + .../grpcpp/health_check_service_interface.h | 41 + .../health_check_service_interface_impl.h | 55 + include/grpcpp/impl/README.md | 4 + include/grpcpp/impl/call.h | 24 + include/grpcpp/impl/channel_argument_option.h | 37 + include/grpcpp/impl/client_unary_call.h | 24 + .../impl/codegen/async_generic_service.h | 163 + include/grpcpp/impl/codegen/async_stream.h | 95 + .../grpcpp/impl/codegen/async_stream_impl.h | 1134 + .../grpcpp/impl/codegen/async_unary_call.h | 46 + .../impl/codegen/async_unary_call_impl.h | 314 + include/grpcpp/impl/codegen/byte_buffer.h | 233 + include/grpcpp/impl/codegen/call.h | 96 + include/grpcpp/impl/codegen/call_hook.h | 39 + include/grpcpp/impl/codegen/call_op_set.h | 1032 + .../impl/codegen/call_op_set_interface.h | 59 + include/grpcpp/impl/codegen/callback_common.h | 222 + .../grpcpp/impl/codegen/channel_interface.h | 176 + include/grpcpp/impl/codegen/client_callback.h | 76 + .../impl/codegen/client_callback_impl.h | 1080 + include/grpcpp/impl/codegen/client_context.h | 31 + .../grpcpp/impl/codegen/client_context_impl.h | 519 + .../grpcpp/impl/codegen/client_interceptor.h | 194 + .../grpcpp/impl/codegen/client_unary_call.h | 94 + .../grpcpp/impl/codegen/completion_queue.h | 31 + .../impl/codegen/completion_queue_impl.h | 454 + .../impl/codegen/completion_queue_tag.h | 54 + include/grpcpp/impl/codegen/config.h | 41 + include/grpcpp/impl/codegen/config_protobuf.h | 104 + include/grpcpp/impl/codegen/core_codegen.h | 127 + .../impl/codegen/core_codegen_interface.h | 164 + .../grpcpp/impl/codegen/create_auth_context.h | 33 + .../grpcpp/impl/codegen/delegating_channel.h | 87 + include/grpcpp/impl/codegen/grpc_library.h | 64 + .../grpcpp/impl/codegen/intercepted_channel.h | 87 + include/grpcpp/impl/codegen/interceptor.h | 229 + .../grpcpp/impl/codegen/interceptor_common.h | 556 + .../grpcpp/impl/codegen/message_allocator.h | 93 + include/grpcpp/impl/codegen/metadata_map.h | 105 + include/grpcpp/impl/codegen/method_handler.h | 73 + .../grpcpp/impl/codegen/method_handler_impl.h | 391 + .../grpcpp/impl/codegen/proto_buffer_reader.h | 149 + .../grpcpp/impl/codegen/proto_buffer_writer.h | 167 + include/grpcpp/impl/codegen/proto_utils.h | 119 + include/grpcpp/impl/codegen/rpc_method.h | 61 + .../grpcpp/impl/codegen/rpc_service_method.h | 156 + .../impl/codegen/security/auth_context.h | 95 + .../impl/codegen/serialization_traits.h | 62 + include/grpcpp/impl/codegen/server_callback.h | 56 + .../impl/codegen/server_callback_handlers.h | 880 + .../impl/codegen/server_callback_impl.h | 783 + include/grpcpp/impl/codegen/server_context.h | 42 + .../grpcpp/impl/codegen/server_context_impl.h | 602 + .../grpcpp/impl/codegen/server_interceptor.h | 143 + .../grpcpp/impl/codegen/server_interface.h | 403 + include/grpcpp/impl/codegen/service_type.h | 279 + include/grpcpp/impl/codegen/slice.h | 143 + include/grpcpp/impl/codegen/status.h | 133 + .../grpcpp/impl/codegen/status_code_enum.h | 143 + include/grpcpp/impl/codegen/string_ref.h | 146 + include/grpcpp/impl/codegen/stub_options.h | 29 + include/grpcpp/impl/codegen/sync.h | 151 + include/grpcpp/impl/codegen/sync_stream.h | 100 + .../grpcpp/impl/codegen/sync_stream_impl.h | 948 + include/grpcpp/impl/codegen/time.h | 87 + include/grpcpp/impl/grpc_library.h | 60 + include/grpcpp/impl/method_handler_impl.h | 24 + include/grpcpp/impl/rpc_method.h | 24 + include/grpcpp/impl/rpc_service_method.h | 24 + include/grpcpp/impl/serialization_traits.h | 24 + include/grpcpp/impl/server_builder_option.h | 30 + .../grpcpp/impl/server_builder_option_impl.h | 43 + include/grpcpp/impl/server_builder_plugin.h | 68 + include/grpcpp/impl/server_initializer.h | 30 + include/grpcpp/impl/server_initializer_impl.h | 57 + include/grpcpp/impl/service_type.h | 24 + include/grpcpp/opencensus.h | 51 + include/grpcpp/resource_quota.h | 29 + include/grpcpp/resource_quota_impl.h | 68 + include/grpcpp/security/alts_context.h | 67 + include/grpcpp/security/alts_util.h | 50 + include/grpcpp/security/auth_context.h | 24 + .../grpcpp/security/auth_metadata_processor.h | 30 + .../security/auth_metadata_processor_impl.h | 61 + include/grpcpp/security/credentials.h | 143 + include/grpcpp/security/credentials_impl.h | 358 + include/grpcpp/security/cronet_credentials.h | 33 + .../grpcpp/security/cronet_credentials_impl.h | 33 + include/grpcpp/security/server_credentials.h | 91 + .../grpcpp/security/server_credentials_impl.h | 90 + .../grpcpp/security/tls_credentials_options.h | 345 + include/grpcpp/server.h | 30 + include/grpcpp/server_builder.h | 30 + include/grpcpp/server_builder_impl.h | 418 + include/grpcpp/server_context.h | 24 + include/grpcpp/server_impl.h | 386 + include/grpcpp/server_posix.h | 36 + include/grpcpp/server_posix_impl.h | 42 + include/grpcpp/support/async_stream.h | 24 + include/grpcpp/support/async_stream_impl.h | 24 + include/grpcpp/support/async_unary_call.h | 24 + .../grpcpp/support/async_unary_call_impl.h | 24 + include/grpcpp/support/byte_buffer.h | 31 + include/grpcpp/support/channel_arguments.h | 36 + .../grpcpp/support/channel_arguments_impl.h | 152 + include/grpcpp/support/client_callback.h | 24 + include/grpcpp/support/client_callback_impl.h | 24 + include/grpcpp/support/client_interceptor.h | 24 + include/grpcpp/support/config.h | 24 + include/grpcpp/support/error_details.h | 44 + include/grpcpp/support/error_details_impl.h | 48 + include/grpcpp/support/interceptor.h | 24 + include/grpcpp/support/message_allocator.h | 24 + include/grpcpp/support/method_handler.h | 24 + include/grpcpp/support/proto_buffer_reader.h | 24 + include/grpcpp/support/proto_buffer_writer.h | 24 + include/grpcpp/support/server_callback.h | 24 + include/grpcpp/support/server_callback_impl.h | 24 + include/grpcpp/support/server_interceptor.h | 24 + include/grpcpp/support/slice.h | 26 + include/grpcpp/support/status.h | 24 + include/grpcpp/support/status_code_enum.h | 24 + include/grpcpp/support/string_ref.h | 24 + include/grpcpp/support/stub_options.h | 24 + include/grpcpp/support/sync_stream.h | 24 + include/grpcpp/support/sync_stream_impl.h | 24 + include/grpcpp/support/time.h | 24 + .../grpcpp/support/validate_service_config.h | 36 + include/grpcpp/test/channel_test_peer.h | 44 + .../grpcpp/test/default_reactor_test_peer.h | 58 + include/grpcpp/test/mock_stream.h | 150 + .../grpcpp/test/server_context_test_spouse.h | 64 + package.xml | 1953 + requirements.bazel.txt | 16 + requirements.txt | 7 + setup.cfg | 30 + setup.py | 422 + src/abseil-cpp/gen_build_yaml.py | 30 + src/abseil-cpp/preprocessed_builds.yaml | 1410 + .../preprocessed_builds.yaml.gen.py | 210 + src/android/test/interop/.gitignore | 9 + src/android/test/interop/README.md | 37 + src/android/test/interop/app/.gitignore | 1 + src/android/test/interop/app/CMakeLists.txt | 122 + src/android/test/interop/app/build.gradle | 55 + .../test/interop/app/proguard-rules.pro | 21 + .../java/io/grpc/interop/cpp/InteropTest.java | 77 + .../interop/app/src/main/AndroidManifest.xml | 22 + .../interop/app/src/main/cpp/grpc-interop.cc | 116 + .../io/grpc/interop/cpp/InteropActivity.java | 120 + .../src/main/res/layout/activity_interop.xml | 48 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3418 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2206 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4842 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7718 bytes .../app/src/main/res/values/strings.xml | 3 + src/android/test/interop/build.gradle | 24 + src/android/test/interop/gradle.properties | 17 + .../interop/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53636 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + src/android/test/interop/gradlew | 160 + src/android/test/interop/gradlew.bat | 90 + src/android/test/interop/settings.gradle | 1 + src/benchmark/gen_build_yaml.py | 46 + src/boringssl/boringssl_prefix_symbols.h | 3364 + src/boringssl/gen_build_yaml.py | 148 + src/c-ares/gen_build_yaml.py | 148 + src/compiler/BUILD | 120 + src/compiler/README.md | 4 + src/compiler/config.h | 63 + src/compiler/config_protobuf.h | 52 + src/compiler/cpp_generator.cc | 2596 + src/compiler/cpp_generator.h | 131 + src/compiler/cpp_generator_helpers.h | 63 + src/compiler/cpp_plugin.cc | 26 + src/compiler/cpp_plugin.h | 158 + src/compiler/csharp_generator.cc | 763 + src/compiler/csharp_generator.h | 34 + src/compiler/csharp_generator_helpers.h | 44 + src/compiler/csharp_plugin.cc | 81 + src/compiler/generator_helpers.h | 277 + src/compiler/node_generator.cc | 278 + src/compiler/node_generator.h | 37 + src/compiler/node_generator_helpers.h | 42 + src/compiler/node_plugin.cc | 82 + src/compiler/objective_c_generator.cc | 450 + src/compiler/objective_c_generator.h | 60 + src/compiler/objective_c_generator_helpers.h | 94 + src/compiler/objective_c_plugin.cc | 263 + src/compiler/php_generator.cc | 186 + src/compiler/php_generator.h | 32 + src/compiler/php_generator_helpers.h | 76 + src/compiler/php_plugin.cc | 81 + src/compiler/protobuf_plugin.h | 206 + src/compiler/python_generator.cc | 923 + src/compiler/python_generator.h | 60 + src/compiler/python_generator_helpers.h | 153 + src/compiler/python_plugin.cc | 29 + src/compiler/python_private_generator.h | 87 + src/compiler/ruby_generator.cc | 214 + src/compiler/ruby_generator.h | 30 + src/compiler/ruby_generator_helpers-inl.h | 58 + src/compiler/ruby_generator_map-inl.h | 57 + src/compiler/ruby_generator_string-inl.h | 149 + src/compiler/ruby_plugin.cc | 61 + src/compiler/schema_interface.h | 115 + src/core/README.md | 4 + src/core/ext/README.md | 5 + src/core/ext/filters/census/grpc_context.cc | 38 + src/core/ext/filters/client_channel/OWNERS | 2 + src/core/ext/filters/client_channel/README.md | 49 + .../filters/client_channel/backend_metric.cc | 81 + .../filters/client_channel/backend_metric.h | 36 + .../filters/client_channel/backup_poller.cc | 181 + .../filters/client_channel/backup_poller.h | 41 + .../client_channel/channel_connectivity.cc | 264 + .../filters/client_channel/client_channel.cc | 4059 + .../filters/client_channel/client_channel.h | 82 + .../client_channel/client_channel_channelz.cc | 95 + .../client_channel/client_channel_channelz.h | 78 + .../client_channel/client_channel_factory.cc | 55 + .../client_channel/client_channel_factory.h | 47 + .../client_channel/client_channel_plugin.cc | 70 + .../ext/filters/client_channel/connector.h | 79 + .../client_channel/global_subchannel_pool.cc | 179 + .../client_channel/global_subchannel_pool.h | 68 + .../health/health_check_client.cc | 606 + .../health/health_check_client.h | 175 + .../client_channel/http_connect_handshaker.cc | 389 + .../client_channel/http_connect_handshaker.h | 34 + .../ext/filters/client_channel/http_proxy.cc | 216 + .../ext/filters/client_channel/http_proxy.h | 28 + .../ext/filters/client_channel/lb_policy.cc | 138 + .../ext/filters/client_channel/lb_policy.h | 421 + .../lb_policy/address_filtering.cc | 83 + .../lb_policy/address_filtering.h | 99 + .../lb_policy/child_policy_handler.cc | 297 + .../lb_policy/child_policy_handler.h | 83 + .../grpclb/client_load_reporting_filter.cc | 157 + .../grpclb/client_load_reporting_filter.h | 29 + .../client_channel/lb_policy/grpclb/grpclb.cc | 1754 + .../client_channel/lb_policy/grpclb/grpclb.h | 43 + .../grpclb/grpclb_balancer_addresses.cc | 89 + .../grpclb/grpclb_balancer_addresses.h | 40 + .../lb_policy/grpclb/grpclb_channel.cc | 37 + .../lb_policy/grpclb/grpclb_channel.h | 45 + .../lb_policy/grpclb/grpclb_channel_secure.cc | 121 + .../lb_policy/grpclb/grpclb_client_stats.cc | 91 + .../lb_policy/grpclb/grpclb_client_stats.h | 75 + .../lb_policy/grpclb/load_balancer_api.cc | 193 + .../lb_policy/grpclb/load_balancer_api.h | 74 + .../lb_policy/pick_first/pick_first.cc | 509 + .../lb_policy/priority/priority.cc | 871 + .../lb_policy/round_robin/round_robin.cc | 504 + .../lb_policy/subchannel_list.h | 448 + .../weighted_target/weighted_target.cc | 734 + .../client_channel/lb_policy/xds/cds.cc | 417 + .../client_channel/lb_policy/xds/eds.cc | 938 + .../client_channel/lb_policy/xds/lrs.cc | 528 + .../client_channel/lb_policy/xds/xds.h | 32 + .../lb_policy/xds/xds_routing.cc | 834 + .../client_channel/lb_policy_factory.h | 47 + .../client_channel/lb_policy_registry.cc | 182 + .../client_channel/lb_policy_registry.h | 65 + .../client_channel/local_subchannel_pool.cc | 96 + .../client_channel/local_subchannel_pool.h | 57 + .../filters/client_channel/parse_address.cc | 238 + .../filters/client_channel/parse_address.h | 53 + .../ext/filters/client_channel/proxy_mapper.h | 54 + .../client_channel/proxy_mapper_registry.cc | 89 + .../client_channel/proxy_mapper_registry.h | 50 + .../ext/filters/client_channel/resolver.cc | 85 + .../ext/filters/client_channel/resolver.h | 144 + .../filters/client_channel/resolver/README.md | 4 + .../resolver/dns/c_ares/dns_resolver_ares.cc | 535 + .../dns/c_ares/grpc_ares_ev_driver.cc | 484 + .../resolver/dns/c_ares/grpc_ares_ev_driver.h | 104 + .../dns/c_ares/grpc_ares_ev_driver_libuv.cc | 177 + .../dns/c_ares/grpc_ares_ev_driver_posix.cc | 107 + .../dns/c_ares/grpc_ares_ev_driver_windows.cc | 897 + .../resolver/dns/c_ares/grpc_ares_wrapper.cc | 819 + .../resolver/dns/c_ares/grpc_ares_wrapper.h | 97 + .../dns/c_ares/grpc_ares_wrapper_fallback.cc | 68 + .../dns/c_ares/grpc_ares_wrapper_libuv.cc | 38 + .../dns/c_ares/grpc_ares_wrapper_posix.cc | 29 + .../dns/c_ares/grpc_ares_wrapper_windows.cc | 34 + .../resolver/dns/dns_resolver_selection.cc | 28 + .../resolver/dns/dns_resolver_selection.h | 29 + .../resolver/dns/native/README.md | 2 + .../resolver/dns/native/dns_resolver.cc | 318 + .../resolver/fake/fake_resolver.cc | 383 + .../resolver/fake/fake_resolver.h | 93 + .../resolver/sockaddr/README.md | 1 + .../resolver/sockaddr/sockaddr_resolver.cc | 188 + .../resolver/xds/xds_resolver.cc | 184 + .../filters/client_channel/resolver_factory.h | 73 + .../client_channel/resolver_registry.cc | 197 + .../client_channel/resolver_registry.h | 89 + .../client_channel/resolver_result_parsing.cc | 443 + .../client_channel/resolver_result_parsing.h | 127 + .../client_channel/resolving_lb_policy.cc | 348 + .../client_channel/resolving_lb_policy.h | 123 + .../filters/client_channel/retry_throttle.cc | 191 + .../filters/client_channel/retry_throttle.h | 77 + .../filters/client_channel/server_address.cc | 48 + .../filters/client_channel/server_address.h | 90 + .../filters/client_channel/service_config.cc | 221 + .../filters/client_channel/service_config.h | 123 + .../client_channel/service_config_call_data.h | 68 + .../client_channel/service_config_parser.cc | 87 + .../client_channel/service_config_parser.h | 89 + .../ext/filters/client_channel/subchannel.cc | 1127 + .../ext/filters/client_channel/subchannel.h | 427 + .../client_channel/subchannel_interface.h | 94 + .../subchannel_pool_interface.cc | 97 + .../subchannel_pool_interface.h | 91 + .../ext/filters/client_channel/xds/xds_api.cc | 1906 + .../ext/filters/client_channel/xds/xds_api.h | 280 + .../client_channel/xds/xds_bootstrap.cc | 342 + .../client_channel/xds/xds_bootstrap.h | 88 + .../filters/client_channel/xds/xds_channel.cc | 43 + .../filters/client_channel/xds/xds_channel.h | 46 + .../client_channel/xds/xds_channel_args.h | 26 + .../client_channel/xds/xds_channel_secure.cc | 106 + .../filters/client_channel/xds/xds_client.cc | 2367 + .../filters/client_channel/xds/xds_client.h | 309 + .../client_channel/xds/xds_client_stats.cc | 115 + .../client_channel/xds/xds_client_stats.h | 211 + .../filters/client_idle/client_idle_filter.cc | 440 + .../ext/filters/deadline/deadline_filter.cc | 386 + .../ext/filters/deadline/deadline_filter.h | 90 + .../filters/http/client/http_client_filter.cc | 596 + .../filters/http/client/http_client_filter.h | 31 + .../filters/http/client_authority_filter.cc | 159 + .../filters/http/client_authority_filter.h | 34 + .../ext/filters/http/http_filters_plugin.cc | 104 + .../message_compress_filter.cc | 546 + .../message_compress_filter.h | 53 + .../message_decompress_filter.cc | 358 + .../message_decompress_filter.h | 29 + .../filters/http/server/http_server_filter.cc | 528 + .../filters/http/server/http_server_filter.h | 29 + .../registered_opencensus_objects.h | 118 + .../server_load_reporting_filter.cc | 368 + .../server_load_reporting_filter.h | 120 + .../ext/filters/max_age/max_age_filter.cc | 556 + src/core/ext/filters/max_age/max_age_filter.h | 26 + .../message_size/message_size_filter.cc | 423 + .../message_size/message_size_filter.h | 59 + .../workaround_cronet_compression_filter.cc | 210 + .../workaround_cronet_compression_filter.h | 27 + .../filters/workarounds/workaround_utils.cc | 53 + .../filters/workarounds/workaround_utils.h | 39 + src/core/ext/transport/README.md | 1 + src/core/ext/transport/chttp2/README.md | 1 + src/core/ext/transport/chttp2/alpn/alpn.cc | 44 + src/core/ext/transport/chttp2/alpn/alpn.h | 36 + .../ext/transport/chttp2/client/authority.cc | 42 + .../ext/transport/chttp2/client/authority.h | 36 + .../chttp2/client/chttp2_connector.cc | 206 + .../chttp2/client/chttp2_connector.h | 58 + .../chttp2/client/insecure/README.md | 1 + .../chttp2/client/insecure/channel_create.cc | 112 + .../client/insecure/channel_create_posix.cc | 79 + .../transport/chttp2/client/secure/README.md | 1 + .../client/secure/secure_channel_create.cc | 225 + .../transport/chttp2/server/chttp2_server.cc | 451 + .../transport/chttp2/server/chttp2_server.h | 33 + .../chttp2/server/insecure/README.md | 1 + .../chttp2/server/insecure/server_chttp2.cc | 45 + .../server/insecure/server_chttp2_posix.cc | 75 + .../transport/chttp2/server/secure/README.md | 1 + .../server/secure/server_secure_chttp2.cc | 86 + .../ext/transport/chttp2/transport/README.md | 4 + .../transport/chttp2/transport/bin_decoder.cc | 250 + .../transport/chttp2/transport/bin_decoder.h | 56 + .../transport/chttp2/transport/bin_encoder.cc | 230 + .../transport/chttp2/transport/bin_encoder.h | 42 + .../chttp2/transport/chttp2_plugin.cc | 37 + .../chttp2/transport/chttp2_transport.cc | 3346 + .../chttp2/transport/chttp2_transport.h | 52 + .../chttp2/transport/context_list.cc | 69 + .../transport/chttp2/transport/context_list.h | 53 + .../chttp2/transport/flow_control.cc | 408 + .../transport/chttp2/transport/flow_control.h | 474 + .../ext/transport/chttp2/transport/frame.h | 47 + .../transport/chttp2/transport/frame_data.cc | 307 + .../transport/chttp2/transport/frame_data.h | 82 + .../chttp2/transport/frame_goaway.cc | 187 + .../transport/chttp2/transport/frame_goaway.h | 62 + .../transport/chttp2/transport/frame_ping.cc | 133 + .../transport/chttp2/transport/frame_ping.h | 44 + .../chttp2/transport/frame_rst_stream.cc | 122 + .../chttp2/transport/frame_rst_stream.h | 50 + .../chttp2/transport/frame_settings.cc | 242 + .../chttp2/transport/frame_settings.h | 60 + .../chttp2/transport/frame_window_update.cc | 123 + .../chttp2/transport/frame_window_update.h | 44 + .../chttp2/transport/hpack_encoder.cc | 900 + .../chttp2/transport/hpack_encoder.h | 107 + .../chttp2/transport/hpack_parser.cc | 1761 + .../transport/chttp2/transport/hpack_parser.h | 117 + .../transport/chttp2/transport/hpack_table.cc | 246 + .../transport/chttp2/transport/hpack_table.h | 148 + .../chttp2/transport/hpack_tables.txt | 66 + .../chttp2/transport/http2_settings.cc | 62 + .../chttp2/transport/http2_settings.h | 61 + .../transport/chttp2/transport/huffsyms.cc | 92 + .../ext/transport/chttp2/transport/huffsyms.h | 32 + .../chttp2/transport/incoming_metadata.cc | 66 + .../chttp2/transport/incoming_metadata.h | 58 + .../ext/transport/chttp2/transport/internal.h | 864 + .../ext/transport/chttp2/transport/parsing.cc | 803 + .../chttp2/transport/stream_lists.cc | 216 + .../transport/chttp2/transport/stream_map.cc | 177 + .../transport/chttp2/transport/stream_map.h | 67 + .../ext/transport/chttp2/transport/varint.cc | 56 + .../ext/transport/chttp2/transport/varint.h | 60 + .../ext/transport/chttp2/transport/writing.cc | 706 + src/core/ext/transport/cronet/BUILD | 65 + .../client/secure/cronet_channel_create.cc | 65 + .../client/secure/cronet_channel_create.h | 39 + .../grpc_cronet_plugin_registry.cc | 38 + .../cronet/transport/cronet_api_dummy.cc | 82 + .../cronet/transport/cronet_transport.cc | 1545 + .../cronet/transport/cronet_transport.h | 30 + .../ext/transport/inproc/inproc_plugin.cc | 28 + .../ext/transport/inproc/inproc_transport.cc | 1296 + .../ext/transport/inproc/inproc_transport.h | 35 + .../envoy/annotations/deprecation.upb.c | 17 + .../envoy/annotations/deprecation.upb.h | 30 + .../envoy/annotations/resource.upb.c | 27 + .../envoy/annotations/resource.upb.h | 54 + .../envoy/api/v2/auth/cert.upb.c | 21 + .../envoy/api/v2/auth/cert.upb.h | 35 + .../envoy/api/v2/auth/common.upb.c | 114 + .../envoy/api/v2/auth/common.upb.h | 418 + .../envoy/api/v2/auth/secret.upb.c | 72 + .../envoy/api/v2/auth/secret.upb.h | 197 + .../upb-generated/envoy/api/v2/auth/tls.upb.c | 105 + .../upb-generated/envoy/api/v2/auth/tls.upb.h | 378 + .../ext/upb-generated/envoy/api/v2/cds.upb.c | 28 + .../ext/upb-generated/envoy/api/v2/cds.upb.h | 53 + .../upb-generated/envoy/api/v2/cluster.upb.c | 403 + .../upb-generated/envoy/api/v2/cluster.upb.h | 1447 + .../api/v2/cluster/circuit_breaker.upb.c | 74 + .../api/v2/cluster/circuit_breaker.upb.h | 218 + .../envoy/api/v2/cluster/filter.upb.c | 35 + .../envoy/api/v2/cluster/filter.upb.h | 69 + .../api/v2/cluster/outlier_detection.upb.c | 55 + .../api/v2/cluster/outlier_detection.upb.h | 305 + .../envoy/api/v2/core/address.upb.c | 112 + .../envoy/api/v2/core/address.upb.h | 328 + .../envoy/api/v2/core/backoff.upb.c | 35 + .../envoy/api/v2/core/backoff.upb.h | 78 + .../envoy/api/v2/core/base.upb.c | 313 + .../envoy/api/v2/core/base.upb.h | 897 + .../envoy/api/v2/core/config_source.upb.c | 96 + .../envoy/api/v2/core/config_source.upb.h | 322 + .../api/v2/core/event_service_config.upb.c | 34 + .../api/v2/core/event_service_config.upb.h | 72 + .../envoy/api/v2/core/grpc_service.upb.c | 197 + .../envoy/api/v2/core/grpc_service.upb.h | 642 + .../envoy/api/v2/core/health_check.upb.c | 172 + .../envoy/api/v2/core/health_check.upb.h | 673 + .../envoy/api/v2/core/http_uri.upb.c | 36 + .../envoy/api/v2/core/http_uri.upb.h | 80 + .../envoy/api/v2/core/protocol.upb.c | 152 + .../envoy/api/v2/core/protocol.upb.h | 518 + .../envoy/api/v2/core/socket_option.upb.c | 34 + .../envoy/api/v2/core/socket_option.upb.h | 89 + .../envoy/api/v2/discovery.upb.c | 129 + .../envoy/api/v2/discovery.upb.h | 392 + .../ext/upb-generated/envoy/api/v2/eds.upb.c | 31 + .../ext/upb-generated/envoy/api/v2/eds.upb.h | 53 + .../upb-generated/envoy/api/v2/endpoint.upb.c | 92 + .../upb-generated/envoy/api/v2/endpoint.upb.h | 240 + .../envoy/api/v2/endpoint/endpoint.upb.c | 18 + .../envoy/api/v2/endpoint/endpoint.upb.h | 33 + .../api/v2/endpoint/endpoint_components.upb.c | 91 + .../api/v2/endpoint/endpoint_components.upb.h | 266 + .../envoy/api/v2/endpoint/load_report.upb.c | 112 + .../envoy/api/v2/endpoint/load_report.upb.h | 324 + .../ext/upb-generated/envoy/api/v2/lds.upb.c | 31 + .../ext/upb-generated/envoy/api/v2/lds.upb.h | 53 + .../upb-generated/envoy/api/v2/listener.upb.c | 109 + .../upb-generated/envoy/api/v2/listener.upb.h | 399 + .../envoy/api/v2/listener/listener.upb.c | 18 + .../envoy/api/v2/listener/listener.upb.h | 33 + .../api/v2/listener/listener_components.upb.c | 145 + .../api/v2/listener/listener_components.upb.h | 527 + .../api/v2/listener/udp_listener_config.upb.c | 43 + .../api/v2/listener/udp_listener_config.upb.h | 112 + .../ext/upb-generated/envoy/api/v2/rds.upb.c | 30 + .../ext/upb-generated/envoy/api/v2/rds.upb.h | 53 + .../upb-generated/envoy/api/v2/route.upb.c | 63 + .../upb-generated/envoy/api/v2/route.upb.h | 199 + .../envoy/api/v2/route/route.upb.c | 18 + .../envoy/api/v2/route/route.upb.h | 33 + .../envoy/api/v2/route/route_components.upb.c | 815 + .../envoy/api/v2/route/route_components.upb.h | 3032 + .../envoy/api/v2/scoped_route.upb.c | 59 + .../envoy/api/v2/scoped_route.upb.h | 134 + .../ext/upb-generated/envoy/api/v2/srds.upb.c | 28 + .../ext/upb-generated/envoy/api/v2/srds.upb.h | 53 + .../filter/accesslog/v2/accesslog.upb.c | 228 + .../filter/accesslog/v2/accesslog.upb.h | 725 + .../v2/http_connection_manager.upb.c | 316 + .../v2/http_connection_manager.upb.h | 1132 + .../config/listener/v2/api_listener.upb.c | 33 + .../config/listener/v2/api_listener.upb.h | 65 + .../envoy/config/trace/v2/http_tracer.upb.c | 51 + .../envoy/config/trace/v2/http_tracer.upb.h | 125 + .../envoy/service/discovery/v2/ads.upb.c | 24 + .../envoy/service/discovery/v2/ads.upb.h | 50 + .../envoy/service/load_stats/v2/lrs.upb.c | 54 + .../envoy/service/load_stats/v2/lrs.upb.h | 134 + .../ext/upb-generated/envoy/type/http.upb.c | 17 + .../ext/upb-generated/envoy/type/http.upb.h | 36 + .../envoy/type/matcher/regex.upb.c | 63 + .../envoy/type/matcher/regex.upb.h | 144 + .../envoy/type/matcher/string.upb.c | 53 + .../envoy/type/matcher/string.upb.h | 133 + .../envoy/type/metadata/v2/metadata.upb.c | 88 + .../envoy/type/metadata/v2/metadata.upb.h | 258 + .../upb-generated/envoy/type/percent.upb.c | 39 + .../upb-generated/envoy/type/percent.upb.h | 87 + .../ext/upb-generated/envoy/type/range.upb.c | 50 + .../ext/upb-generated/envoy/type/range.upb.h | 112 + .../envoy/type/semantic_version.upb.c | 29 + .../envoy/type/semantic_version.upb.h | 62 + .../envoy/type/tracing/v2/custom_tag.upb.c | 89 + .../envoy/type/tracing/v2/custom_tag.upb.h | 249 + .../ext/upb-generated/gogoproto/gogo.upb.c | 17 + .../ext/upb-generated/gogoproto/gogo.upb.h | 30 + .../google/api/annotations.upb.c | 18 + .../google/api/annotations.upb.h | 30 + .../ext/upb-generated/google/api/http.upb.c | 66 + .../ext/upb-generated/google/api/http.upb.h | 190 + .../upb-generated/google/protobuf/any.upb.c | 27 + .../upb-generated/google/protobuf/any.upb.h | 58 + .../google/protobuf/descriptor.upb.c | 486 + .../google/protobuf/descriptor.upb.h | 1696 + .../google/protobuf/duration.upb.c | 27 + .../google/protobuf/duration.upb.h | 58 + .../upb-generated/google/protobuf/empty.upb.c | 22 + .../upb-generated/google/protobuf/empty.upb.h | 50 + .../google/protobuf/struct.upb.c | 79 + .../google/protobuf/struct.upb.h | 215 + .../google/protobuf/timestamp.upb.c | 27 + .../google/protobuf/timestamp.upb.h | 58 + .../google/protobuf/wrappers.upb.c | 106 + .../google/protobuf/wrappers.upb.h | 238 + .../ext/upb-generated/google/rpc/status.upb.c | 33 + .../ext/upb-generated/google/rpc/status.upb.h | 74 + .../src/proto/grpc/gcp/altscontext.upb.c | 49 + .../src/proto/grpc/gcp/altscontext.upb.h | 126 + .../src/proto/grpc/gcp/handshaker.upb.c | 212 + .../src/proto/grpc/gcp/handshaker.upb.h | 693 + .../grpc/gcp/transport_security_common.upb.c | 42 + .../grpc/gcp/transport_security_common.upb.h | 109 + .../src/proto/grpc/health/v1/health.upb.c | 36 + .../src/proto/grpc/health/v1/health.upb.h | 84 + .../src/proto/grpc/lb/v1/load_balancer.upb.c | 141 + .../src/proto/grpc/lb/v1/load_balancer.upb.h | 393 + .../udpa/annotations/migrate.upb.c | 48 + .../udpa/annotations/migrate.upb.h | 104 + .../udpa/annotations/sensitive.upb.c | 17 + .../udpa/annotations/sensitive.upb.h | 30 + .../udpa/annotations/status.upb.c | 28 + .../udpa/annotations/status.upb.h | 65 + .../udpa/data/orca/v1/orca_load_report.upb.c | 58 + .../udpa/data/orca/v1/orca_load_report.upb.h | 144 + .../ext/upb-generated/validate/validate.upb.c | 448 + .../ext/upb-generated/validate/validate.upb.h | 2073 + src/core/lib/README.md | 6 + src/core/lib/avl/avl.cc | 306 + src/core/lib/avl/avl.h | 94 + src/core/lib/backoff/backoff.cc | 78 + src/core/lib/backoff/backoff.h | 89 + src/core/lib/channel/README.md | 4 + src/core/lib/channel/channel_args.cc | 380 + src/core/lib/channel/channel_args.h | 135 + src/core/lib/channel/channel_stack.cc | 252 + src/core/lib/channel/channel_stack.h | 304 + src/core/lib/channel/channel_stack_builder.cc | 323 + src/core/lib/channel/channel_stack_builder.h | 166 + src/core/lib/channel/channel_trace.cc | 194 + src/core/lib/channel/channel_trace.h | 134 + src/core/lib/channel/channelz.cc | 543 + src/core/lib/channel/channelz.h | 334 + src/core/lib/channel/channelz_registry.cc | 267 + src/core/lib/channel/channelz_registry.h | 97 + src/core/lib/channel/connected_channel.cc | 246 + src/core/lib/channel/connected_channel.h | 34 + src/core/lib/channel/context.h | 49 + src/core/lib/channel/handshaker.cc | 262 + src/core/lib/channel/handshaker.h | 179 + src/core/lib/channel/handshaker_factory.h | 42 + src/core/lib/channel/handshaker_registry.cc | 105 + src/core/lib/channel/handshaker_registry.h | 54 + src/core/lib/channel/status_util.cc | 99 + src/core/lib/channel/status_util.h | 58 + src/core/lib/compression/algorithm_metadata.h | 61 + src/core/lib/compression/compression.cc | 179 + src/core/lib/compression/compression_args.cc | 134 + src/core/lib/compression/compression_args.h | 56 + .../lib/compression/compression_internal.cc | 280 + .../lib/compression/compression_internal.h | 96 + src/core/lib/compression/message_compress.cc | 192 + src/core/lib/compression/message_compress.h | 40 + .../lib/compression/stream_compression.cc | 80 + src/core/lib/compression/stream_compression.h | 116 + .../compression/stream_compression_gzip.cc | 230 + .../lib/compression/stream_compression_gzip.h | 28 + .../stream_compression_identity.cc | 92 + .../compression/stream_compression_identity.h | 29 + src/core/lib/debug/stats.cc | 172 + src/core/lib/debug/stats.h | 70 + src/core/lib/debug/stats_data.cc | 687 + src/core/lib/debug/stats_data.h | 555 + src/core/lib/debug/stats_data.yaml | 300 + src/core/lib/debug/stats_data_bq_schema.sql | 98 + src/core/lib/debug/trace.cc | 154 + src/core/lib/debug/trace.h | 131 + src/core/lib/gpr/README.md | 8 + src/core/lib/gpr/alloc.cc | 74 + src/core/lib/gpr/alloc.h | 28 + src/core/lib/gpr/arena.h | 47 + src/core/lib/gpr/atm.cc | 35 + src/core/lib/gpr/cpu_iphone.cc | 36 + src/core/lib/gpr/cpu_linux.cc | 82 + src/core/lib/gpr/cpu_posix.cc | 83 + src/core/lib/gpr/cpu_windows.cc | 33 + src/core/lib/gpr/env.h | 40 + src/core/lib/gpr/env_linux.cc | 76 + src/core/lib/gpr/env_posix.cc | 47 + src/core/lib/gpr/env_windows.cc | 74 + src/core/lib/gpr/log.cc | 98 + src/core/lib/gpr/log_android.cc | 76 + src/core/lib/gpr/log_linux.cc | 97 + src/core/lib/gpr/log_posix.cc | 95 + src/core/lib/gpr/log_windows.cc | 102 + src/core/lib/gpr/murmur_hash.cc | 80 + src/core/lib/gpr/murmur_hash.h | 29 + src/core/lib/gpr/spinlock.h | 45 + src/core/lib/gpr/string.cc | 341 + src/core/lib/gpr/string.h | 111 + src/core/lib/gpr/string_posix.cc | 72 + src/core/lib/gpr/string_util_windows.cc | 82 + src/core/lib/gpr/string_windows.cc | 69 + src/core/lib/gpr/string_windows.h | 32 + src/core/lib/gpr/sync.cc | 124 + src/core/lib/gpr/sync_abseil.cc | 116 + src/core/lib/gpr/sync_posix.cc | 176 + src/core/lib/gpr/sync_windows.cc | 120 + src/core/lib/gpr/time.cc | 263 + src/core/lib/gpr/time_posix.cc | 186 + src/core/lib/gpr/time_precise.cc | 165 + src/core/lib/gpr/time_precise.h | 66 + src/core/lib/gpr/time_windows.cc | 98 + src/core/lib/gpr/tls.h | 68 + src/core/lib/gpr/tls_gcc.h | 52 + src/core/lib/gpr/tls_msvc.h | 52 + src/core/lib/gpr/tls_pthread.cc | 30 + src/core/lib/gpr/tls_pthread.h | 56 + src/core/lib/gpr/tmpfile.h | 32 + src/core/lib/gpr/tmpfile_msys.cc | 58 + src/core/lib/gpr/tmpfile_posix.cc | 70 + src/core/lib/gpr/tmpfile_windows.cc | 69 + src/core/lib/gpr/useful.h | 65 + src/core/lib/gpr/wrap_memcpy.cc | 42 + src/core/lib/gprpp/README.md | 12 + src/core/lib/gprpp/arena.cc | 103 + src/core/lib/gprpp/arena.h | 120 + src/core/lib/gprpp/atomic.h | 104 + src/core/lib/gprpp/debug_location.h | 53 + src/core/lib/gprpp/fork.cc | 242 + src/core/lib/gprpp/fork.h | 103 + src/core/lib/gprpp/global_config.h | 96 + src/core/lib/gprpp/global_config_custom.h | 29 + src/core/lib/gprpp/global_config_env.cc | 135 + src/core/lib/gprpp/global_config_env.h | 131 + src/core/lib/gprpp/global_config_generic.h | 44 + src/core/lib/gprpp/host_port.cc | 112 + src/core/lib/gprpp/host_port.h | 56 + src/core/lib/gprpp/manual_constructor.h | 213 + src/core/lib/gprpp/map.h | 53 + src/core/lib/gprpp/memory.h | 51 + src/core/lib/gprpp/mpscq.cc | 108 + src/core/lib/gprpp/mpscq.h | 98 + src/core/lib/gprpp/orphanable.h | 129 + src/core/lib/gprpp/ref_counted.h | 312 + src/core/lib/gprpp/ref_counted_ptr.h | 192 + src/core/lib/gprpp/sync.h | 135 + src/core/lib/gprpp/thd.h | 174 + src/core/lib/gprpp/thd_posix.cc | 204 + src/core/lib/gprpp/thd_windows.cc | 176 + src/core/lib/http/format_request.cc | 103 + src/core/lib/http/format_request.h | 34 + src/core/lib/http/httpcli.cc | 303 + src/core/lib/http/httpcli.h | 126 + .../lib/http/httpcli_security_connector.cc | 214 + src/core/lib/http/parser.cc | 372 + src/core/lib/http/parser.h | 113 + src/core/lib/iomgr/README.md | 6 + src/core/lib/iomgr/block_annotate.h | 57 + src/core/lib/iomgr/buffer_list.cc | 308 + src/core/lib/iomgr/buffer_list.h | 165 + src/core/lib/iomgr/call_combiner.cc | 256 + src/core/lib/iomgr/call_combiner.h | 217 + src/core/lib/iomgr/cfstream_handle.cc | 209 + src/core/lib/iomgr/cfstream_handle.h | 90 + src/core/lib/iomgr/closure.h | 255 + src/core/lib/iomgr/combiner.cc | 339 + src/core/lib/iomgr/combiner.h | 88 + src/core/lib/iomgr/dualstack_socket_posix.cc | 47 + src/core/lib/iomgr/dynamic_annotations.h | 67 + src/core/lib/iomgr/endpoint.cc | 67 + src/core/lib/iomgr/endpoint.h | 106 + src/core/lib/iomgr/endpoint_cfstream.cc | 376 + src/core/lib/iomgr/endpoint_cfstream.h | 49 + src/core/lib/iomgr/endpoint_pair.h | 33 + src/core/lib/iomgr/endpoint_pair_posix.cc | 73 + src/core/lib/iomgr/endpoint_pair_uv.cc | 40 + src/core/lib/iomgr/endpoint_pair_windows.cc | 87 + src/core/lib/iomgr/error.cc | 812 + src/core/lib/iomgr/error.h | 276 + src/core/lib/iomgr/error_cfstream.cc | 52 + src/core/lib/iomgr/error_cfstream.h | 31 + src/core/lib/iomgr/error_internal.h | 61 + src/core/lib/iomgr/ev_apple.cc | 356 + src/core/lib/iomgr/ev_apple.h | 43 + src/core/lib/iomgr/ev_epoll1_linux.cc | 1365 + src/core/lib/iomgr/ev_epoll1_linux.h | 31 + src/core/lib/iomgr/ev_epollex_linux.cc | 1656 + src/core/lib/iomgr/ev_epollex_linux.h | 30 + src/core/lib/iomgr/ev_poll_posix.cc | 1427 + src/core/lib/iomgr/ev_poll_posix.h | 29 + src/core/lib/iomgr/ev_posix.cc | 417 + src/core/lib/iomgr/ev_posix.h | 207 + src/core/lib/iomgr/ev_windows.cc | 30 + src/core/lib/iomgr/exec_ctx.cc | 224 + src/core/lib/iomgr/exec_ctx.h | 380 + src/core/lib/iomgr/executor.cc | 469 + src/core/lib/iomgr/executor.h | 122 + src/core/lib/iomgr/executor/mpmcqueue.cc | 183 + src/core/lib/iomgr/executor/mpmcqueue.h | 175 + src/core/lib/iomgr/executor/threadpool.cc | 137 + src/core/lib/iomgr/executor/threadpool.h | 149 + src/core/lib/iomgr/fork_posix.cc | 119 + src/core/lib/iomgr/fork_windows.cc | 41 + src/core/lib/iomgr/gethostname.h | 26 + src/core/lib/iomgr/gethostname_fallback.cc | 30 + .../lib/iomgr/gethostname_host_name_max.cc | 40 + src/core/lib/iomgr/gethostname_sysconf.cc | 40 + src/core/lib/iomgr/grpc_if_nametoindex.h | 30 + .../lib/iomgr/grpc_if_nametoindex_posix.cc | 42 + .../iomgr/grpc_if_nametoindex_unsupported.cc | 38 + src/core/lib/iomgr/internal_errqueue.cc | 67 + src/core/lib/iomgr/internal_errqueue.h | 191 + src/core/lib/iomgr/iocp_windows.cc | 157 + src/core/lib/iomgr/iocp_windows.h | 48 + src/core/lib/iomgr/iomgr.cc | 194 + src/core/lib/iomgr/iomgr.h | 60 + src/core/lib/iomgr/iomgr_custom.cc | 79 + src/core/lib/iomgr/iomgr_custom.h | 49 + src/core/lib/iomgr/iomgr_internal.cc | 57 + src/core/lib/iomgr/iomgr_internal.h | 73 + src/core/lib/iomgr/iomgr_posix.cc | 89 + src/core/lib/iomgr/iomgr_posix.h | 26 + src/core/lib/iomgr/iomgr_posix_cfstream.cc | 171 + src/core/lib/iomgr/iomgr_uv.cc | 43 + src/core/lib/iomgr/iomgr_windows.cc | 106 + .../lib/iomgr/is_epollexclusive_available.cc | 105 + .../lib/iomgr/is_epollexclusive_available.h | 36 + src/core/lib/iomgr/load_file.cc | 81 + src/core/lib/iomgr/load_file.h | 35 + src/core/lib/iomgr/lockfree_event.cc | 255 + src/core/lib/iomgr/lockfree_event.h | 72 + src/core/lib/iomgr/nameser.h | 106 + .../lib/iomgr/poller/eventmanager_interface.h | 35 + .../lib/iomgr/poller/eventmanager_libuv.cc | 87 + .../lib/iomgr/poller/eventmanager_libuv.h | 88 + src/core/lib/iomgr/polling_entity.cc | 96 + src/core/lib/iomgr/polling_entity.h | 68 + src/core/lib/iomgr/pollset.cc | 56 + src/core/lib/iomgr/pollset.h | 99 + src/core/lib/iomgr/pollset_custom.cc | 106 + src/core/lib/iomgr/pollset_custom.h | 35 + src/core/lib/iomgr/pollset_set.cc | 55 + src/core/lib/iomgr/pollset_set.h | 55 + src/core/lib/iomgr/pollset_set_custom.cc | 48 + src/core/lib/iomgr/pollset_set_custom.h | 26 + src/core/lib/iomgr/pollset_set_windows.cc | 51 + src/core/lib/iomgr/pollset_set_windows.h | 26 + src/core/lib/iomgr/pollset_uv.cc | 93 + src/core/lib/iomgr/pollset_uv.h | 32 + src/core/lib/iomgr/pollset_windows.cc | 243 + src/core/lib/iomgr/pollset_windows.h | 70 + src/core/lib/iomgr/port.h | 244 + src/core/lib/iomgr/python_util.h | 46 + src/core/lib/iomgr/resolve_address.cc | 50 + src/core/lib/iomgr/resolve_address.h | 81 + src/core/lib/iomgr/resolve_address_custom.cc | 173 + src/core/lib/iomgr/resolve_address_custom.h | 45 + src/core/lib/iomgr/resolve_address_posix.cc | 178 + src/core/lib/iomgr/resolve_address_windows.cc | 154 + src/core/lib/iomgr/resource_quota.cc | 1013 + src/core/lib/iomgr/resource_quota.h | 177 + src/core/lib/iomgr/sockaddr.h | 32 + src/core/lib/iomgr/sockaddr_custom.h | 54 + src/core/lib/iomgr/sockaddr_posix.h | 55 + src/core/lib/iomgr/sockaddr_utils.cc | 293 + src/core/lib/iomgr/sockaddr_utils.h | 79 + src/core/lib/iomgr/sockaddr_windows.h | 55 + src/core/lib/iomgr/socket_factory_posix.cc | 94 + src/core/lib/iomgr/socket_factory_posix.h | 68 + src/core/lib/iomgr/socket_mutator.cc | 83 + src/core/lib/iomgr/socket_mutator.h | 60 + src/core/lib/iomgr/socket_utils.h | 47 + .../lib/iomgr/socket_utils_common_posix.cc | 473 + src/core/lib/iomgr/socket_utils_linux.cc | 42 + src/core/lib/iomgr/socket_utils_posix.cc | 58 + src/core/lib/iomgr/socket_utils_posix.h | 163 + src/core/lib/iomgr/socket_utils_uv.cc | 49 + src/core/lib/iomgr/socket_utils_windows.cc | 47 + src/core/lib/iomgr/socket_windows.cc | 203 + src/core/lib/iomgr/socket_windows.h | 127 + src/core/lib/iomgr/sys_epoll_wrapper.h | 30 + src/core/lib/iomgr/tcp_client.cc | 36 + src/core/lib/iomgr/tcp_client.h | 52 + src/core/lib/iomgr/tcp_client_cfstream.cc | 215 + src/core/lib/iomgr/tcp_client_custom.cc | 163 + src/core/lib/iomgr/tcp_client_posix.cc | 360 + src/core/lib/iomgr/tcp_client_posix.h | 68 + src/core/lib/iomgr/tcp_client_windows.cc | 232 + src/core/lib/iomgr/tcp_custom.cc | 370 + src/core/lib/iomgr/tcp_custom.h | 84 + src/core/lib/iomgr/tcp_posix.cc | 1855 + src/core/lib/iomgr/tcp_posix.h | 60 + src/core/lib/iomgr/tcp_server.cc | 78 + src/core/lib/iomgr/tcp_server.h | 143 + src/core/lib/iomgr/tcp_server_custom.cc | 485 + src/core/lib/iomgr/tcp_server_posix.cc | 638 + src/core/lib/iomgr/tcp_server_utils_posix.h | 125 + .../iomgr/tcp_server_utils_posix_common.cc | 223 + .../iomgr/tcp_server_utils_posix_ifaddrs.cc | 181 + .../iomgr/tcp_server_utils_posix_noifaddrs.cc | 36 + src/core/lib/iomgr/tcp_server_windows.cc | 564 + src/core/lib/iomgr/tcp_uv.cc | 419 + src/core/lib/iomgr/tcp_windows.cc | 533 + src/core/lib/iomgr/tcp_windows.h | 53 + src/core/lib/iomgr/time_averaged_stats.cc | 64 + src/core/lib/iomgr/time_averaged_stats.h | 72 + src/core/lib/iomgr/timer.cc | 45 + src/core/lib/iomgr/timer.h | 127 + src/core/lib/iomgr/timer_custom.cc | 95 + src/core/lib/iomgr/timer_custom.h | 43 + src/core/lib/iomgr/timer_generic.cc | 747 + src/core/lib/iomgr/timer_generic.h | 39 + src/core/lib/iomgr/timer_heap.cc | 135 + src/core/lib/iomgr/timer_heap.h | 43 + src/core/lib/iomgr/timer_manager.cc | 363 + src/core/lib/iomgr/timer_manager.h | 41 + src/core/lib/iomgr/timer_uv.cc | 66 + src/core/lib/iomgr/udp_server.cc | 747 + src/core/lib/iomgr/udp_server.h | 101 + src/core/lib/iomgr/unix_sockets_posix.cc | 104 + src/core/lib/iomgr/unix_sockets_posix.h | 43 + src/core/lib/iomgr/unix_sockets_posix_noop.cc | 49 + src/core/lib/iomgr/wakeup_fd_eventfd.cc | 82 + src/core/lib/iomgr/wakeup_fd_nospecial.cc | 38 + src/core/lib/iomgr/wakeup_fd_pipe.cc | 100 + src/core/lib/iomgr/wakeup_fd_pipe.h | 28 + src/core/lib/iomgr/wakeup_fd_posix.cc | 69 + src/core/lib/iomgr/wakeup_fd_posix.h | 96 + src/core/lib/iomgr/work_serializer.cc | 155 + src/core/lib/iomgr/work_serializer.h | 65 + src/core/lib/json/json.h | 240 + src/core/lib/json/json_reader.cc | 855 + src/core/lib/json/json_writer.cc | 337 + src/core/lib/profiling/basic_timers.cc | 293 + src/core/lib/profiling/stap_probes.d | 7 + src/core/lib/profiling/stap_timers.cc | 50 + src/core/lib/profiling/timers.h | 94 + .../lib/security/context/security_context.cc | 321 + .../lib/security/context/security_context.h | 150 + .../credentials/alts/alts_credentials.cc | 110 + .../credentials/alts/alts_credentials.h | 109 + .../credentials/alts/check_gcp_environment.cc | 72 + .../credentials/alts/check_gcp_environment.h | 57 + .../alts/check_gcp_environment_linux.cc | 68 + .../alts/check_gcp_environment_no_op.cc | 33 + .../alts/check_gcp_environment_windows.cc | 102 + .../grpc_alts_credentials_client_options.cc | 127 + .../alts/grpc_alts_credentials_options.cc | 46 + .../alts/grpc_alts_credentials_options.h | 75 + .../grpc_alts_credentials_server_options.cc | 59 + .../composite/composite_credentials.cc | 229 + .../composite/composite_credentials.h | 106 + .../lib/security/credentials/credentials.cc | 162 + .../lib/security/credentials/credentials.h | 283 + .../credentials/credentials_metadata.cc | 62 + .../credentials/fake/fake_credentials.cc | 112 + .../credentials/fake/fake_credentials.h | 87 + .../google_default/credentials_generic.cc | 41 + .../google_default_credentials.cc | 383 + .../google_default_credentials.h | 87 + .../credentials/iam/iam_credentials.cc | 80 + .../credentials/iam/iam_credentials.h | 49 + .../security/credentials/jwt/json_token.cc | 288 + .../lib/security/credentials/jwt/json_token.h | 75 + .../credentials/jwt/jwt_credentials.cc | 172 + .../credentials/jwt/jwt_credentials.h | 80 + .../security/credentials/jwt/jwt_verifier.cc | 925 + .../security/credentials/jwt/jwt_verifier.h | 122 + .../credentials/local/local_credentials.cc | 64 + .../credentials/local/local_credentials.h | 61 + .../credentials/oauth2/oauth2_credentials.cc | 771 + .../credentials/oauth2/oauth2_credentials.h | 171 + .../credentials/plugin/plugin_credentials.cc | 269 + .../credentials/plugin/plugin_credentials.h | 72 + .../credentials/ssl/ssl_credentials.cc | 364 + .../credentials/ssl/ssl_credentials.h | 99 + .../tls/grpc_tls_credentials_options.cc | 245 + .../tls/grpc_tls_credentials_options.h | 313 + .../credentials/tls/tls_credentials.cc | 128 + .../credentials/tls/tls_credentials.h | 62 + .../alts/alts_security_connector.cc | 301 + .../alts/alts_security_connector.h | 76 + .../fake/fake_security_connector.cc | 324 + .../fake/fake_security_connector.h | 45 + .../security_connector/load_system_roots.h | 29 + .../load_system_roots_fallback.cc | 32 + .../load_system_roots_linux.cc | 171 + .../load_system_roots_linux.h | 44 + .../local/local_security_connector.cc | 281 + .../local/local_security_connector.h | 59 + .../security_connector/security_connector.cc | 129 + .../security_connector/security_connector.h | 176 + .../ssl/ssl_security_connector.cc | 439 + .../ssl/ssl_security_connector.h | 77 + .../security/security_connector/ssl_utils.cc | 563 + .../security/security_connector/ssl_utils.h | 184 + .../security_connector/ssl_utils_config.cc | 32 + .../security_connector/ssl_utils_config.h | 30 + .../tls/tls_security_connector.cc | 603 + .../tls/tls_security_connector.h | 183 + .../lib/security/transport/auth_filters.h | 35 + .../security/transport/client_auth_filter.cc | 466 + .../lib/security/transport/secure_endpoint.cc | 446 + .../lib/security/transport/secure_endpoint.h | 41 + .../security/transport/security_handshaker.cc | 574 + .../security/transport/security_handshaker.h | 45 + .../security/transport/server_auth_filter.cc | 326 + .../transport/target_authority_table.cc | 75 + .../transport/target_authority_table.h | 40 + src/core/lib/security/transport/tsi_error.cc | 29 + src/core/lib/security/transport/tsi_error.h | 29 + src/core/lib/security/util/json_util.cc | 73 + src/core/lib/security/util/json_util.h | 44 + src/core/lib/slice/b64.cc | 239 + src/core/lib/slice/b64.h | 50 + src/core/lib/slice/percent_encoding.cc | 169 + src/core/lib/slice/percent_encoding.h | 65 + src/core/lib/slice/slice.cc | 559 + src/core/lib/slice/slice_buffer.cc | 413 + src/core/lib/slice/slice_hash_table.h | 199 + src/core/lib/slice/slice_intern.cc | 375 + src/core/lib/slice/slice_internal.h | 364 + src/core/lib/slice/slice_string_helpers.cc | 127 + src/core/lib/slice/slice_string_helpers.h | 49 + src/core/lib/slice/slice_traits.h | 31 + src/core/lib/slice/slice_utils.h | 200 + src/core/lib/slice/slice_weak_hash_table.h | 102 + src/core/lib/surface/README.md | 4 + src/core/lib/surface/api_trace.cc | 24 + src/core/lib/surface/api_trace.h | 52 + src/core/lib/surface/byte_buffer.cc | 92 + src/core/lib/surface/byte_buffer_reader.cc | 101 + src/core/lib/surface/call.cc | 2044 + src/core/lib/surface/call.h | 125 + src/core/lib/surface/call_details.cc | 41 + src/core/lib/surface/call_log_batch.cc | 111 + src/core/lib/surface/call_test_only.h | 43 + src/core/lib/surface/channel.cc | 543 + src/core/lib/surface/channel.h | 158 + src/core/lib/surface/channel_init.cc | 109 + src/core/lib/surface/channel_init.h | 78 + src/core/lib/surface/channel_ping.cc | 64 + src/core/lib/surface/channel_stack_type.cc | 58 + src/core/lib/surface/channel_stack_type.h | 47 + src/core/lib/surface/completion_queue.cc | 1438 + src/core/lib/surface/completion_queue.h | 97 + .../lib/surface/completion_queue_factory.cc | 88 + .../lib/surface/completion_queue_factory.h | 38 + src/core/lib/surface/event_string.cc | 61 + src/core/lib/surface/event_string.h | 31 + src/core/lib/surface/init.cc | 250 + src/core/lib/surface/init.h | 27 + src/core/lib/surface/init_secure.cc | 81 + src/core/lib/surface/init_unsecure.cc | 27 + src/core/lib/surface/lame_client.cc | 191 + src/core/lib/surface/lame_client.h | 28 + src/core/lib/surface/metadata_array.cc | 36 + src/core/lib/surface/server.cc | 1800 + src/core/lib/surface/server.h | 99 + src/core/lib/surface/validate_metadata.cc | 105 + src/core/lib/surface/validate_metadata.h | 41 + src/core/lib/surface/version.cc | 28 + src/core/lib/transport/README.md | 7 + src/core/lib/transport/bdp_estimator.cc | 87 + src/core/lib/transport/bdp_estimator.h | 94 + src/core/lib/transport/byte_stream.cc | 158 + src/core/lib/transport/byte_stream.h | 165 + src/core/lib/transport/connectivity_state.cc | 180 + src/core/lib/transport/connectivity_state.h | 131 + src/core/lib/transport/error_utils.cc | 141 + src/core/lib/transport/error_utils.h | 46 + src/core/lib/transport/http2_errors.h | 41 + src/core/lib/transport/metadata.cc | 679 + src/core/lib/transport/metadata.h | 446 + src/core/lib/transport/metadata_batch.cc | 392 + src/core/lib/transport/metadata_batch.h | 191 + src/core/lib/transport/pid_controller.cc | 51 + src/core/lib/transport/pid_controller.h | 116 + src/core/lib/transport/static_metadata.cc | 1230 + src/core/lib/transport/static_metadata.h | 597 + src/core/lib/transport/status_conversion.cc | 92 + src/core/lib/transport/status_conversion.h | 38 + src/core/lib/transport/status_metadata.cc | 61 + src/core/lib/transport/status_metadata.h | 48 + src/core/lib/transport/timeout_encoding.cc | 151 + src/core/lib/transport/timeout_encoding.h | 38 + src/core/lib/transport/transport.cc | 259 + src/core/lib/transport/transport.h | 456 + src/core/lib/transport/transport_impl.h | 71 + src/core/lib/transport/transport_op_string.cc | 169 + src/core/lib/uri/uri_parser.cc | 314 + src/core/lib/uri/uri_parser.h | 49 + .../plugin_registry/grpc_plugin_registry.cc | 121 + .../grpc_unsecure_plugin_registry.cc | 121 + src/core/tsi/README.md | 2 + src/core/tsi/alts/crypt/aes_gcm.cc | 687 + src/core/tsi/alts/crypt/gsec.cc | 189 + src/core/tsi/alts/crypt/gsec.h | 454 + .../tsi/alts/frame_protector/alts_counter.cc | 118 + .../tsi/alts/frame_protector/alts_counter.h | 98 + .../tsi/alts/frame_protector/alts_crypter.cc | 66 + .../tsi/alts/frame_protector/alts_crypter.h | 255 + .../frame_protector/alts_frame_protector.cc | 407 + .../frame_protector/alts_frame_protector.h | 55 + .../alts_record_protocol_crypter_common.cc | 114 + .../alts_record_protocol_crypter_common.h | 114 + .../alts_seal_privacy_integrity_crypter.cc | 105 + .../alts_unseal_privacy_integrity_crypter.cc | 103 + .../tsi/alts/frame_protector/frame_handler.cc | 218 + .../tsi/alts/frame_protector/frame_handler.h | 236 + .../alts/handshaker/alts_handshaker_client.cc | 899 + .../alts/handshaker/alts_handshaker_client.h | 161 + .../alts/handshaker/alts_shared_resource.cc | 83 + .../alts/handshaker/alts_shared_resource.h | 73 + .../alts/handshaker/alts_tsi_handshaker.cc | 674 + .../tsi/alts/handshaker/alts_tsi_handshaker.h | 104 + .../handshaker/alts_tsi_handshaker_private.h | 88 + .../tsi/alts/handshaker/alts_tsi_utils.cc | 64 + src/core/tsi/alts/handshaker/alts_tsi_utils.h | 53 + .../alts/handshaker/proto/altscontext.proto | 41 + .../alts/handshaker/proto/handshaker.options | 2 + .../alts/handshaker/proto/handshaker.proto | 224 + .../proto/transport_security_common.proto | 40 + .../transport_security_common_api.cc | 223 + .../transport_security_common_api.h | 171 + ...lts_grpc_integrity_only_record_protocol.cc | 226 + ...alts_grpc_integrity_only_record_protocol.h | 54 + ..._grpc_privacy_integrity_record_protocol.cc | 144 + ...s_grpc_privacy_integrity_record_protocol.h | 49 + .../alts_grpc_record_protocol.h | 91 + .../alts_grpc_record_protocol_common.cc | 174 + .../alts_grpc_record_protocol_common.h | 99 + .../alts_iovec_record_protocol.cc | 476 + .../alts_iovec_record_protocol.h | 199 + .../alts_zero_copy_grpc_protector.cc | 307 + .../alts_zero_copy_grpc_protector.h | 57 + src/core/tsi/fake_transport_security.cc | 789 + src/core/tsi/fake_transport_security.h | 47 + src/core/tsi/local_transport_security.cc | 211 + src/core/tsi/local_transport_security.h | 51 + src/core/tsi/ssl/session_cache/ssl_session.h | 71 + .../session_cache/ssl_session_boringssl.cc | 57 + .../ssl/session_cache/ssl_session_cache.cc | 214 + .../tsi/ssl/session_cache/ssl_session_cache.h | 90 + .../ssl/session_cache/ssl_session_openssl.cc | 75 + src/core/tsi/ssl_transport_security.cc | 2124 + src/core/tsi/ssl_transport_security.h | 353 + src/core/tsi/ssl_types.h | 42 + src/core/tsi/test_creds/BUILD | 31 + src/core/tsi/test_creds/README | 89 + src/core/tsi/test_creds/badclient.key | 28 + src/core/tsi/test_creds/badclient.pem | 22 + src/core/tsi/test_creds/badserver.key | 28 + src/core/tsi/test_creds/badserver.pem | 22 + src/core/tsi/test_creds/ca-openssl.cnf | 17 + src/core/tsi/test_creds/ca.key | 28 + src/core/tsi/test_creds/ca.pem | 20 + src/core/tsi/test_creds/client.key | 28 + src/core/tsi/test_creds/client.pem | 20 + src/core/tsi/test_creds/multi-domain.key | 27 + src/core/tsi/test_creds/multi-domain.pem | 23 + src/core/tsi/test_creds/server0.key | 28 + src/core/tsi/test_creds/server0.pem | 20 + src/core/tsi/test_creds/server1-openssl.cnf | 26 + src/core/tsi/test_creds/server1.key | 28 + src/core/tsi/test_creds/server1.pem | 22 + src/core/tsi/transport_security.cc | 370 + src/core/tsi/transport_security.h | 127 + src/core/tsi/transport_security_grpc.cc | 73 + src/core/tsi/transport_security_grpc.h | 79 + src/core/tsi/transport_security_interface.h | 476 + src/cpp/Protobuf-C++.podspec | 42 + src/cpp/README.md | 180 + src/cpp/client/channel_cc.cc | 257 + src/cpp/client/channel_test_peer.cc | 40 + src/cpp/client/client_context.cc | 181 + src/cpp/client/client_interceptor.cc | 44 + src/cpp/client/create_channel.cc | 85 + src/cpp/client/create_channel_internal.cc | 36 + src/cpp/client/create_channel_internal.h | 40 + src/cpp/client/create_channel_posix.cc | 78 + src/cpp/client/credentials_cc.cc | 33 + src/cpp/client/cronet_credentials.cc | 64 + src/cpp/client/insecure_credentials.cc | 62 + src/cpp/client/secure_credentials.cc | 515 + src/cpp/client/secure_credentials.h | 119 + src/cpp/codegen/codegen_init.cc | 30 + src/cpp/common/alarm.cc | 161 + src/cpp/common/alts_context.cc | 108 + src/cpp/common/alts_util.cc | 80 + src/cpp/common/auth_property_iterator.cc | 70 + src/cpp/common/channel_arguments.cc | 217 + src/cpp/common/channel_filter.cc | 98 + src/cpp/common/channel_filter.h | 402 + src/cpp/common/completion_queue_cc.cc | 99 + src/cpp/common/core_codegen.cc | 240 + .../common/insecure_create_auth_context.cc | 30 + src/cpp/common/resource_quota_cc.cc | 40 + src/cpp/common/rpc_method.cc | 21 + src/cpp/common/secure_auth_context.cc | 97 + src/cpp/common/secure_auth_context.h | 60 + src/cpp/common/secure_channel_arguments.cc | 39 + src/cpp/common/secure_create_auth_context.cc | 36 + src/cpp/common/tls_credentials_options.cc | 343 + .../common/tls_credentials_options_util.cc | 149 + src/cpp/common/tls_credentials_options_util.h | 58 + src/cpp/common/validate_service_config.cc | 40 + src/cpp/common/version_cc.cc | 26 + src/cpp/ext/filters/census/channel_filter.cc | 30 + src/cpp/ext/filters/census/channel_filter.h | 36 + src/cpp/ext/filters/census/client_filter.cc | 186 + src/cpp/ext/filters/census/client_filter.h | 104 + src/cpp/ext/filters/census/context.cc | 155 + src/cpp/ext/filters/census/context.h | 136 + src/cpp/ext/filters/census/grpc_plugin.cc | 131 + src/cpp/ext/filters/census/grpc_plugin.h | 110 + src/cpp/ext/filters/census/measures.cc | 129 + src/cpp/ext/filters/census/measures.h | 46 + src/cpp/ext/filters/census/rpc_encoding.cc | 39 + src/cpp/ext/filters/census/rpc_encoding.h | 284 + src/cpp/ext/filters/census/server_filter.cc | 201 + src/cpp/ext/filters/census/server_filter.h | 101 + src/cpp/ext/filters/census/views.cc | 491 + src/cpp/ext/proto_server_reflection.cc | 212 + src/cpp/ext/proto_server_reflection.h | 80 + src/cpp/ext/proto_server_reflection_plugin.cc | 82 + src/cpp/server/async_generic_service.cc | 33 + src/cpp/server/channel_argument_option.cc | 65 + src/cpp/server/channelz/channelz_service.cc | 153 + src/cpp/server/channelz/channelz_service.h | 64 + .../channelz/channelz_service_plugin.cc | 88 + src/cpp/server/create_default_thread_pool.cc | 44 + src/cpp/server/dynamic_thread_pool.cc | 124 + src/cpp/server/dynamic_thread_pool.h | 68 + .../external_connection_acceptor_impl.cc | 96 + .../external_connection_acceptor_impl.h | 72 + .../health/default_health_check_service.cc | 501 + .../health/default_health_check_service.h | 285 + src/cpp/server/health/health_check_service.cc | 34 + ...lth_check_service_server_builder_option.cc | 35 + src/cpp/server/insecure_server_credentials.cc | 44 + src/cpp/server/load_reporter/constants.h | 81 + src/cpp/server/load_reporter/get_cpu_stats.h | 36 + .../load_reporter/get_cpu_stats_linux.cc | 48 + .../load_reporter/get_cpu_stats_macos.cc | 45 + .../get_cpu_stats_unsupported.cc | 40 + .../load_reporter/get_cpu_stats_windows.cc | 55 + .../server/load_reporter/load_data_store.cc | 338 + .../server/load_reporter/load_data_store.h | 348 + src/cpp/server/load_reporter/load_reporter.cc | 510 + src/cpp/server/load_reporter/load_reporter.h | 230 + .../load_reporter_async_service_impl.cc | 370 + .../load_reporter_async_service_impl.h | 195 + ...reporting_service_server_builder_option.cc | 42 + ...reporting_service_server_builder_plugin.cc | 60 + ..._reporting_service_server_builder_plugin.h | 62 + src/cpp/server/load_reporter/util.cc | 47 + src/cpp/server/secure_server_credentials.cc | 159 + src/cpp/server/secure_server_credentials.h | 88 + src/cpp/server/server_builder.cc | 449 + src/cpp/server/server_callback.cc | 84 + src/cpp/server/server_cc.cc | 1361 + src/cpp/server/server_context.cc | 380 + src/cpp/server/server_credentials.cc | 25 + src/cpp/server/server_posix.cc | 33 + src/cpp/server/thread_pool_interface.h | 43 + src/cpp/thread_manager/thread_manager.cc | 263 + src/cpp/thread_manager/thread_manager.h | 181 + src/cpp/util/byte_buffer_cc.cc | 46 + src/cpp/util/core_stats.cc | 90 + src/cpp/util/core_stats.h | 33 + src/cpp/util/error_details.cc | 50 + src/cpp/util/status.cc | 26 + src/cpp/util/string_ref.cc | 25 + src/cpp/util/time_cc.cc | 75 + src/csharp/.editorconfig | 31 + src/csharp/.gitignore | 17 + src/csharp/BUILD-INTEGRATION.md | 378 + src/csharp/Directory.Build.props | 3 + src/csharp/Grpc.Auth/.gitignore | 3 + .../Grpc.Auth/GoogleAuthInterceptors.cs | 85 + src/csharp/Grpc.Auth/GoogleGrpcCredentials.cs | 81 + src/csharp/Grpc.Auth/Grpc.Auth.csproj | 44 + .../Grpc.Auth/Properties/AssemblyInfo.cs | 29 + src/csharp/Grpc.Core.Api/.gitignore | 2 + .../Grpc.Core.Api/AsyncAuthInterceptor.cs | 69 + src/csharp/Grpc.Core.Api/AsyncCallState.cs | 98 + .../Grpc.Core.Api/AsyncClientStreamingCall.cs | 155 + .../Grpc.Core.Api/AsyncDuplexStreamingCall.cs | 145 + .../Grpc.Core.Api/AsyncServerStreamingCall.cs | 126 + .../AsyncStreamReaderExtensions.cs | 50 + src/csharp/Grpc.Core.Api/AsyncUnaryCall.cs | 136 + src/csharp/Grpc.Core.Api/AuthContext.cs | 112 + src/csharp/Grpc.Core.Api/AuthProperty.cs | 109 + .../BindServiceMethodAttribute.cs | 53 + src/csharp/Grpc.Core.Api/CallCredentials.cs | 90 + .../CallCredentialsConfiguratorBase.cs | 39 + src/csharp/Grpc.Core.Api/CallFlags.cs | 45 + src/csharp/Grpc.Core.Api/CallInvoker.cs | 67 + src/csharp/Grpc.Core.Api/CallOptions.cs | 230 + src/csharp/Grpc.Core.Api/ChannelBase.cs | 82 + .../Grpc.Core.Api/ChannelCredentials.cs | 117 + .../ChannelCredentialsConfiguratorBase.cs | 44 + src/csharp/Grpc.Core.Api/ClientBase.cs | 231 + .../ContextPropagationOptions.cs | 59 + .../Grpc.Core.Api/ContextPropagationToken.cs | 35 + .../Grpc.Core.Api/DeserializationContext.cs | 66 + src/csharp/Grpc.Core.Api/Grpc.Core.Api.csproj | 34 + .../Grpc.Core.Api/IAsyncStreamReader.cs | 66 + .../Grpc.Core.Api/IAsyncStreamWriter.cs | 47 + .../Grpc.Core.Api/IClientStreamWriter.cs | 38 + .../Grpc.Core.Api/IServerStreamWriter.cs | 34 + .../Interceptors/CallInvokerExtensions.cs | 143 + .../Interceptors/ChannelExtensions.cs | 87 + .../Interceptors/ClientInterceptorContext.cs | 64 + .../Interceptors/InterceptingCallInvoker.cs | 96 + .../Grpc.Core.Api/Interceptors/Interceptor.cs | 405 + .../Internal/UnimplementedCallInvoker.cs | 60 + .../Grpc.Core.Api/KeyCertificatePair.cs | 68 + src/csharp/Grpc.Core.Api/Marshaller.cs | 138 + src/csharp/Grpc.Core.Api/Metadata.cs | 487 + src/csharp/Grpc.Core.Api/Method.cs | 176 + .../Grpc.Core.Api/Properties/AssemblyInfo.cs | 63 + src/csharp/Grpc.Core.Api/RpcException.cs | 109 + .../Grpc.Core.Api/SerializationContext.cs | 69 + src/csharp/Grpc.Core.Api/ServerCallContext.cs | 163 + src/csharp/Grpc.Core.Api/ServerMethods.cs | 58 + .../Grpc.Core.Api/ServerServiceDefinition.cs | 161 + src/csharp/Grpc.Core.Api/ServiceBinderBase.cs | 98 + src/csharp/Grpc.Core.Api/SslCredentials.cs | 122 + src/csharp/Grpc.Core.Api/Status.cs | 95 + src/csharp/Grpc.Core.Api/StatusCode.cs | 125 + .../Grpc.Core.Api/Utils/EncodingExtensions.cs | 54 + .../Grpc.Core.Api/Utils/GrpcPreconditions.cs | 105 + src/csharp/Grpc.Core.Api/VerifyPeerContext.cs | 48 + src/csharp/Grpc.Core.Api/Version.cs | 23 + src/csharp/Grpc.Core.Api/VersionInfo.cs | 43 + src/csharp/Grpc.Core.Api/WriteOptions.cs | 74 + src/csharp/Grpc.Core.NativeDebug/.gitignore | 2 + .../Grpc.Core.NativeDebug.csproj | 41 + src/csharp/Grpc.Core.Testing/.gitignore | 2 + .../Grpc.Core.Testing.csproj | 39 + .../Properties/AssemblyInfo.cs | 29 + .../Grpc.Core.Testing/Settings.StyleCop | 10 + src/csharp/Grpc.Core.Testing/TestCalls.cs | 76 + .../TestServerCallContext.cs | 107 + src/csharp/Grpc.Core.Tests/.gitignore | 3 + .../Grpc.Core.Tests/AppDomainUnloadTest.cs | 77 + src/csharp/Grpc.Core.Tests/AuthContextTest.cs | 71 + .../Grpc.Core.Tests/AuthPropertyTest.cs | 67 + .../Grpc.Core.Tests/CallCancellationTest.cs | 193 + .../Grpc.Core.Tests/CallCredentialsTest.cs | 50 + src/csharp/Grpc.Core.Tests/CallOptionsTest.cs | 98 + .../ChannelConnectivityTest.cs | 90 + .../Grpc.Core.Tests/ChannelCredentialsTest.cs | 57 + .../Grpc.Core.Tests/ChannelOptionsTest.cs | 90 + src/csharp/Grpc.Core.Tests/ChannelTest.cs | 127 + .../Grpc.Core.Tests/ClientServerTest.cs | 397 + src/csharp/Grpc.Core.Tests/CompressionTest.cs | 153 + .../Grpc.Core.Tests/ContextPropagationTest.cs | 181 + .../ContextualMarshallerTest.cs | 121 + src/csharp/Grpc.Core.Tests/FakeCredentials.cs | 50 + .../Grpc.Core.Tests/Grpc.Core.Tests.csproj | 33 + .../Grpc.Core.Tests/GrpcEnvironmentTest.cs | 94 + src/csharp/Grpc.Core.Tests/HalfcloseTest.cs | 82 + .../Interceptors/ClientInterceptorTest.cs | 228 + .../Interceptors/ServerInterceptorTest.cs | 173 + .../Internal/AsyncCallServerTest.cs | 194 + .../Internal/AsyncCallStateTest.cs | 82 + .../Grpc.Core.Tests/Internal/AsyncCallTest.cs | 699 + .../Internal/ChannelArgsSafeHandleTest.cs | 60 + .../Internal/CompletionQueueEventTest.cs | 40 + .../Internal/CompletionQueueSafeHandleTest.cs | 52 + .../DefaultDeserializationContextTest.cs | 230 + .../Internal/DefaultObjectPoolTest.cs | 95 + .../DefaultSerializationContextTest.cs | 207 + .../Internal/FakeBufferReaderManager.cs | 118 + .../Internal/FakeBufferReaderManagerTest.cs | 121 + .../Internal/FakeNativeCall.cs | 192 + .../Internal/MetadataArraySafeHandleTest.cs | 69 + .../Internal/ReusableSliceBufferTest.cs | 140 + .../Internal/SliceBufferSafeHandleTest.cs | 163 + .../Grpc.Core.Tests/Internal/SliceTest.cs | 66 + .../Grpc.Core.Tests/Internal/TimespecTest.cs | 176 + .../Internal/WellKnownStringsTest.cs | 62 + src/csharp/Grpc.Core.Tests/MarshallerTest.cs | 102 + .../Grpc.Core.Tests/MarshallingErrorsTest.cs | 169 + src/csharp/Grpc.Core.Tests/MetadataTest.cs | 360 + .../Grpc.Core.Tests/MockServiceHelper.cs | 234 + src/csharp/Grpc.Core.Tests/NUnitMain.cs | 40 + src/csharp/Grpc.Core.Tests/PInvokeTest.cs | 121 + src/csharp/Grpc.Core.Tests/PerformanceTest.cs | 84 + .../Properties/AssemblyInfo.cs | 29 + .../Grpc.Core.Tests/ResponseHeadersTest.cs | 192 + src/csharp/Grpc.Core.Tests/SanityTest.cs | 116 + src/csharp/Grpc.Core.Tests/ServerTest.cs | 113 + .../Grpc.Core.Tests/ShutdownHookClientTest.cs | 42 + .../ShutdownHookPendingCallTest.cs | 54 + .../Grpc.Core.Tests/ShutdownHookServerTest.cs | 43 + src/csharp/Grpc.Core.Tests/ShutdownTest.cs | 65 + .../Grpc.Core.Tests/ThreadingModelTest.cs | 99 + src/csharp/Grpc.Core.Tests/TimeoutsTest.cs | 135 + .../Grpc.Core.Tests/UserAgentStringTest.cs | 87 + src/csharp/Grpc.Core/.gitignore | 2 + src/csharp/Grpc.Core/CallInvocationDetails.cs | 158 + src/csharp/Grpc.Core/Calls.cs | 143 + src/csharp/Grpc.Core/Channel.cs | 341 + src/csharp/Grpc.Core/ChannelOptions.cs | 258 + src/csharp/Grpc.Core/ChannelState.cs | 54 + src/csharp/Grpc.Core/Common.csproj.include | 29 + src/csharp/Grpc.Core/CompressionLevel.cs | 48 + src/csharp/Grpc.Core/DefaultCallInvoker.cs | 98 + src/csharp/Grpc.Core/ForwardedTypes.cs | 78 + src/csharp/Grpc.Core/Grpc.Core.csproj | 117 + src/csharp/Grpc.Core/GrpcEnvironment.cs | 490 + .../ServerServiceDefinitionExtensions.cs | 129 + src/csharp/Grpc.Core/Internal/AsyncCall.cs | 666 + .../Grpc.Core/Internal/AsyncCallBase.cs | 400 + .../Grpc.Core/Internal/AsyncCallServer.cs | 266 + .../Grpc.Core/Internal/AtomicCounter.cs | 71 + .../Internal/AuthContextSafeHandle.cs | 107 + .../Internal/BatchContextSafeHandle.cs | 191 + .../Grpc.Core/Internal/CStringSafeHandle.cs | 44 + .../Internal/CallCredentialsSafeHandle.cs | 45 + src/csharp/Grpc.Core/Internal/CallError.cs | 66 + .../Internal/CallOptionsExtensions.cs | 57 + .../Grpc.Core/Internal/CallSafeHandle.cs | 263 + .../Internal/ChannelArgsSafeHandle.cs | 59 + .../Internal/ChannelCredentialsSafeHandle.cs | 64 + .../Grpc.Core/Internal/ChannelSafeHandle.cs | 88 + .../Grpc.Core/Internal/ClientRequestStream.cs | 65 + .../Internal/ClientResponseStream.cs | 71 + .../Grpc.Core/Internal/ClientSideStatus.cs | 55 + src/csharp/Grpc.Core/Internal/ClockType.cs | 38 + .../Internal/CompletionQueueEvent.cs | 59 + .../Internal/CompletionQueueSafeHandle.cs | 137 + .../Grpc.Core/Internal/CompletionRegistry.cs | 129 + .../Internal/ContextPropagationFlags.cs | 34 + .../Internal/ContextPropagationTokenImpl.cs | 119 + .../Internal/CoreErrorDetailException.cs | 35 + src/csharp/Grpc.Core/Internal/DebugStats.cs | 45 + .../DefaultCallCredentialsConfigurator.cs | 85 + .../DefaultChannelCredentialsConfigurator.cs | 163 + .../Internal/DefaultDeserializationContext.cs | 76 + .../Grpc.Core/Internal/DefaultObjectPool.cs | 205 + .../Internal/DefaultSerializationContext.cs | 115 + .../Internal/DefaultServerCallContext.cs | 108 + .../Internal/DefaultSslRootsOverride.cs | 57 + .../Grpc.Core/Internal/GrpcThreadPool.cs | 244 + src/csharp/Grpc.Core/Internal/INativeCall.cs | 94 + src/csharp/Grpc.Core/Internal/IObjectPool.cs | 35 + .../Grpc.Core/Internal/IPooledObject.cs | 34 + .../Internal/IServerResponseStream.cs | 38 + src/csharp/Grpc.Core/Internal/MarshalUtils.cs | 73 + .../Internal/MetadataArraySafeHandle.cs | 93 + .../Internal/MonoPInvokeCallbackAttribute.cs | 40 + .../Internal/NativeCallbackDispatcher.cs | 91 + .../Grpc.Core/Internal/NativeExtension.cs | 234 + .../Grpc.Core/Internal/NativeLogRedirector.cs | 90 + .../NativeMetadataCredentialsPlugin.cs | 96 + .../Internal/NativeMethods.Generated.cs | 1219 + .../Grpc.Core/Internal/NativeMethods.cs | 68 + src/csharp/Grpc.Core/Internal/PlatformApis.cs | 208 + .../Internal/RequestCallContextSafeHandle.cs | 124 + .../Grpc.Core/Internal/ReusableSliceBuffer.cs | 106 + .../Internal/SafeHandleZeroIsInvalid.cs | 41 + .../Grpc.Core/Internal/ServerCallHandler.cs | 328 + src/csharp/Grpc.Core/Internal/ServerCalls.cs | 56 + .../Internal/ServerCredentialsSafeHandle.cs | 50 + .../Grpc.Core/Internal/ServerRequestStream.cs | 65 + .../Internal/ServerResponseStream.cs | 67 + src/csharp/Grpc.Core/Internal/ServerRpcNew.cs | 94 + .../Grpc.Core/Internal/ServerSafeHandle.cs | 96 + .../ServerServiceDefinitionExtensions.cs | 78 + src/csharp/Grpc.Core/Internal/Slice.cs | 59 + .../Internal/SliceBufferSafeHandle.cs | 166 + .../Grpc.Core/Internal/SliceMemoryManager.cs | 65 + src/csharp/Grpc.Core/Internal/Timespec.cs | 287 + .../Internal/UnimplementedCallInvoker.cs | 60 + .../Grpc.Core/Internal/UnmanagedLibrary.cs | 255 + .../Grpc.Core/Internal/WellKnownStrings.cs | 92 + src/csharp/Grpc.Core/Logging/ConsoleLogger.cs | 50 + src/csharp/Grpc.Core/Logging/ILogger.cs | 60 + src/csharp/Grpc.Core/Logging/LogLevel.cs | 48 + .../Grpc.Core/Logging/LogLevelFilterLogger.cs | 188 + src/csharp/Grpc.Core/Logging/NullLogger.cs | 107 + .../Grpc.Core/Logging/TextWriterLogger.cs | 161 + .../Grpc.Core/NativeDeps.Linux.csproj.include | 9 + .../Grpc.Core/NativeDeps.Mac.csproj.include | 9 + .../NativeDeps.Windows.csproj.include | 9 + .../Grpc.Core/NativeDeps.csproj.include | 27 + src/csharp/Grpc.Core/Profiling/IProfiler.cs | 34 + .../Grpc.Core/Profiling/ProfilerEntry.cs | 73 + .../Grpc.Core/Profiling/ProfilerScope.cs | 45 + src/csharp/Grpc.Core/Profiling/Profilers.cs | 119 + .../Grpc.Core/Properties/AssemblyInfo.cs | 57 + src/csharp/Grpc.Core/Server.cs | 479 + src/csharp/Grpc.Core/ServerCredentials.cs | 221 + src/csharp/Grpc.Core/ServerPort.cs | 105 + .../Grpc.Core/SourceLink.csproj.include | 14 + .../Grpc.Core/Utils/AsyncStreamExtensions.cs | 85 + src/csharp/Grpc.Core/Utils/BenchmarkUtil.cs | 57 + src/csharp/Grpc.Core/Utils/TaskUtils.cs | 44 + .../build/MonoAndroid10/Grpc.Core.targets | 25 + .../build/Xamarin.iOS10/Grpc.Core.targets | 15 + .../Grpc.Core/build/net45/Grpc.Core.targets | 44 + .../Grpc.Examples.MathClient/.gitignore | 2 + .../Grpc.Examples.MathClient.csproj | 24 + .../Grpc.Examples.MathClient/MathClient.cs | 44 + .../Properties/AssemblyInfo.cs | 29 + .../Grpc.Examples.MathServer/.gitignore | 2 + .../Grpc.Examples.MathServer.csproj | 24 + .../Grpc.Examples.MathServer/MathServer.cs | 46 + .../Properties/AssemblyInfo.cs | 29 + src/csharp/Grpc.Examples.Tests/.gitignore | 3 + .../Grpc.Examples.Tests.csproj | 31 + .../MathClientMockableTest.cs | 101 + .../MathClientServerTests.cs | 177 + .../MathServiceImplTestabilityTest.cs | 47 + src/csharp/Grpc.Examples.Tests/NUnitMain.cs | 40 + .../Properties/AssemblyInfo.cs | 29 + src/csharp/Grpc.Examples/.gitignore | 3 + src/csharp/Grpc.Examples/Grpc.Examples.csproj | 27 + src/csharp/Grpc.Examples/Math.cs | 755 + src/csharp/Grpc.Examples/MathExamples.cs | 136 + src/csharp/Grpc.Examples/MathGrpc.cs | 305 + src/csharp/Grpc.Examples/MathServiceImpl.cs | 97 + .../Grpc.Examples/Properties/AssemblyInfo.cs | 29 + src/csharp/Grpc.Examples/Settings.StyleCop | 10 + src/csharp/Grpc.HealthCheck.Tests/.gitignore | 2 + .../Grpc.HealthCheck.Tests.csproj | 34 + .../HealthClientServerTest.cs | 83 + .../HealthServiceImplTest.cs | 260 + .../Grpc.HealthCheck.Tests/NUnitMain.cs | 40 + .../Properties/AssemblyInfo.cs | 29 + .../TestResponseStreamWriter.cs | 72 + .../TestServerCallContext.cs | 57 + src/csharp/Grpc.HealthCheck/.gitignore | 2 + .../Grpc.HealthCheck/Grpc.HealthCheck.csproj | 51 + src/csharp/Grpc.HealthCheck/Health.cs | 329 + src/csharp/Grpc.HealthCheck/HealthGrpc.cs | 249 + .../Grpc.HealthCheck/HealthServiceImpl.cs | 277 + .../Properties/AssemblyInfo.cs | 39 + src/csharp/Grpc.HealthCheck/Settings.StyleCop | 10 + .../Grpc.IntegrationTesting.Client/.gitignore | 3 + .../Grpc.IntegrationTesting.Client.csproj | 24 + .../Grpc.IntegrationTesting.Client/Program.cs | 31 + .../Properties/AssemblyInfo.cs | 29 + .../.gitignore | 3 + .../Grpc.IntegrationTesting.QpsWorker.csproj | 25 + .../Program.cs | 31 + .../Properties/AssemblyInfo.cs | 29 + .../Grpc.IntegrationTesting.Server/.gitignore | 3 + .../Grpc.IntegrationTesting.Server.csproj | 24 + .../Grpc.IntegrationTesting.Server/Program.cs | 30 + .../Properties/AssemblyInfo.cs | 29 + .../.gitignore | 3 + ...rpc.IntegrationTesting.StressClient.csproj | 24 + .../Program.cs | 30 + .../Properties/AssemblyInfo.cs | 29 + .../.gitignore | 3 + .../Grpc.IntegrationTesting.XdsClient.csproj | 24 + .../Program.cs | 31 + .../Properties/AssemblyInfo.cs | 29 + src/csharp/Grpc.IntegrationTesting/.gitignore | 2 + .../BenchmarkService.cs | 48 + .../BenchmarkServiceGrpc.cs | 343 + .../BenchmarkServiceImpl.cs | 58 + .../Grpc.IntegrationTesting/ClientRunners.cs | 364 + src/csharp/Grpc.IntegrationTesting/Control.cs | 4858 ++ .../ControlExtensions.cs | 43 + .../CoreStats/Stats.cs | 673 + .../CustomErrorDetailsTest.cs | 129 + .../Grpc.IntegrationTesting/EchoMessages.cs | 1549 + src/csharp/Grpc.IntegrationTesting/Empty.cs | 153 + .../Grpc.IntegrationTesting/EmptyService.cs | 38 + .../EmptyServiceGrpc.cs | 94 + .../ExternalDnsClientServerTest.cs | 74 + .../ExternalDnsWithTracingClientServerTest.cs | 176 + .../GeneratedClientTest.cs | 67 + .../GeneratedServiceBaseTest.cs | 101 + .../Grpc.IntegrationTesting/GenericService.cs | 56 + .../Grpc.IntegrationTesting.csproj | 47 + .../Grpc.IntegrationTesting/Histogram.cs | 165 + .../Grpc.IntegrationTesting/HistogramTest.cs | 113 + .../Grpc.IntegrationTesting/IClientRunner.cs | 52 + .../Grpc.IntegrationTesting/IServerRunner.cs | 57 + .../InterarrivalTimers.cs | 133 + .../Grpc.IntegrationTesting/InteropClient.cs | 744 + .../InteropClientServerTest.cs | 146 + .../Grpc.IntegrationTesting/InteropServer.cs | 90 + .../Grpc.IntegrationTesting/Messages.cs | 2841 + .../MetadataCredentialsTest.cs | 269 + src/csharp/Grpc.IntegrationTesting/Metrics.cs | 535 + .../Grpc.IntegrationTesting/MetricsGrpc.cs | 209 + .../Grpc.IntegrationTesting/NUnitMain.cs | 40 + .../Grpc.IntegrationTesting/Payloads.cs | 715 + .../Properties/AssemblyInfo.cs | 29 + .../Grpc.IntegrationTesting/QpsWorker.cs | 87 + .../ReportQpsScenarioService.cs | 41 + .../ReportQpsScenarioServiceGrpc.cs | 158 + .../RunnerClientServerTest.cs | 95 + .../Grpc.IntegrationTesting/ServerRunners.cs | 163 + .../Grpc.IntegrationTesting/Settings.StyleCop | 14 + .../SslCredentialsTest.cs | 287 + src/csharp/Grpc.IntegrationTesting/Stats.cs | 1291 + .../StressTestClient.cs | 289 + src/csharp/Grpc.IntegrationTesting/Test.cs | 63 + .../TestCredentials.cs | 82 + .../Grpc.IntegrationTesting/TestGrpc.cs | 954 + .../TestServiceImpl.cs | 122 + .../Grpc.IntegrationTesting/TimeStats.cs | 90 + .../UnobservedTaskExceptionTest.cs | 100 + .../Grpc.IntegrationTesting/WorkerService.cs | 45 + .../WorkerServiceGrpc.cs | 339 + .../WorkerServiceImpl.cs | 99 + .../XdsInteropClient.cs | 300 + .../XdsInteropClientTest.cs | 134 + .../Grpc.IntegrationTesting/data/README | 1 + .../Grpc.IntegrationTesting/data/ca.pem | 20 + .../Grpc.IntegrationTesting/data/server1.key | 28 + .../Grpc.IntegrationTesting/data/server1.pem | 22 + src/csharp/Grpc.Microbenchmarks/.gitignore | 2 + .../AtomicCounterBenchmark.cs | 52 + .../CommonThreadedBase.cs | 129 + .../CompletionRegistryBenchmark.cs | 55 + .../Grpc.Microbenchmarks.csproj | 28 + .../PInvokeByteArrayBenchmark.cs | 54 + .../Grpc.Microbenchmarks/PingBenchmark.cs | 102 + src/csharp/Grpc.Microbenchmarks/Program.cs | 33 + .../ScalabityExampleBenchmark.cs | 56 + .../SendMessageBenchmark.cs | 91 + .../UnaryCallOverheadBenchmark.cs | 104 + src/csharp/Grpc.Microbenchmarks/Utf8Decode.cs | 70 + src/csharp/Grpc.Microbenchmarks/Utf8Encode.cs | 126 + src/csharp/Grpc.Reflection.Tests/.gitignore | 2 + .../Grpc.Reflection.Tests.csproj | 30 + src/csharp/Grpc.Reflection.Tests/NUnitMain.cs | 40 + .../Properties/AssemblyInfo.cs | 29 + .../ReflectionClientServerTest.cs | 140 + .../SymbolRegistryTest.cs | 48 + src/csharp/Grpc.Reflection/.gitignore | 2 + .../Grpc.Reflection/Grpc.Reflection.csproj | 43 + .../Properties/AssemblyInfo.cs | 29 + src/csharp/Grpc.Reflection/Reflection.cs | 1669 + src/csharp/Grpc.Reflection/ReflectionGrpc.cs | 138 + .../Grpc.Reflection/ReflectionServiceImpl.cs | 161 + src/csharp/Grpc.Reflection/Settings.StyleCop | 10 + src/csharp/Grpc.Reflection/SymbolRegistry.cs | 145 + .../Grpc.Tools.Tests/CSharpGeneratorTest.cs | 88 + .../Grpc.Tools.Tests/CppGeneratorTest.cs | 88 + .../Grpc.Tools.Tests/DepFileUtilTest.cs | 146 + src/csharp/Grpc.Tools.Tests/GeneratorTest.cs | 55 + .../Grpc.Tools.Tests/Grpc.Tools.Tests.csproj | 73 + src/csharp/Grpc.Tools.Tests/NUnitMain.cs | 29 + .../Grpc.Tools.Tests/ProtoCompileBasicTest.cs | 84 + .../ProtoCompileCommandLineGeneratorTest.cs | 260 + .../ProtoCompileCommandLinePrinterTest.cs | 51 + .../ProtoToolsPlatformTaskTest.cs | 139 + src/csharp/Grpc.Tools.Tests/Utils.cs | 46 + src/csharp/Grpc.Tools/Common.cs | 114 + src/csharp/Grpc.Tools/DepFileUtil.cs | 273 + src/csharp/Grpc.Tools/GeneratorServices.cs | 213 + src/csharp/Grpc.Tools/Grpc.Tools.csproj | 97 + src/csharp/Grpc.Tools/ProtoCompile.cs | 571 + src/csharp/Grpc.Tools/ProtoCompilerOutputs.cs | 86 + .../Grpc.Tools/ProtoReadDependencies.cs | 78 + src/csharp/Grpc.Tools/ProtoToolsPlatform.cs | 63 + src/csharp/Grpc.Tools/build/Grpc.Tools.props | 11 + .../Grpc.Tools/build/Grpc.Tools.targets | 11 + .../Grpc.Tools/build/_grpc/Grpc.CSharp.xml | 30 + src/csharp/Grpc.Tools/build/_grpc/README | 3 + .../Grpc.Tools/build/_grpc/_Grpc.Tools.props | 6 + .../build/_grpc/_Grpc.Tools.targets | 47 + .../_protobuf/Google.Protobuf.Tools.props | 24 + .../_protobuf/Google.Protobuf.Tools.targets | 394 + .../build/_protobuf/Protobuf.CSharp.xml | 99 + src/csharp/Grpc.Tools/build/_protobuf/README | 1 + .../Grpc.Tools/build/native/Grpc.Tools.props | 17 + src/csharp/Grpc.sln | 151 + src/csharp/Grpc/.gitignore | 2 + src/csharp/Grpc/Grpc.csproj | 27 + src/csharp/README.md | 129 + src/csharp/Settings.StyleCop | 509 + src/csharp/build/dependencies.props | 7 + src/csharp/build_packages_dotnetcli.bat | 57 + src/csharp/build_unitypackage.bat | 85 + .../doc/integration.md-fig.1-classic.png | Bin 0 -> 15266 bytes src/csharp/doc/integration.md-fig.2-sdk.png | Bin 0 -> 15863 bytes src/csharp/docfx/.gitignore | 2 + src/csharp/docfx/README.md | 28 + src/csharp/docfx/docfx.json | 38 + src/csharp/docfx/generate_reference_docs.sh | 38 + src/csharp/docfx/toc.yml | 3 + src/csharp/expand_dev_version.sh | 25 + src/csharp/experimental/README.md | 39 + .../build_native_ext_for_android.sh | 52 + .../experimental/build_native_ext_for_ios.sh | 63 + src/csharp/ext/grpc_csharp_ext.c | 1305 + src/csharp/generate_proto_csharp.sh | 48 + src/csharp/install_dotnet_sdk.ps1 | 16 + src/csharp/keys/Grpc.public.snk | Bin 0 -> 160 bytes src/csharp/keys/Grpc.snk | Bin 0 -> 596 bytes src/csharp/keys/README.md | 9 + src/csharp/tests.json | 90 + src/csharp/unitypackage/README.md | 13 + .../Plugins/Google.Protobuf.meta | 8 + .../Plugins/Google.Protobuf/lib.meta | 8 + .../Plugins/Google.Protobuf/lib/net45.meta | 8 + .../lib/net45/Google.Protobuf.dll.meta | 30 + .../lib/net45/Google.Protobuf.xml.meta | 7 + .../Plugins/Grpc.Core.Api.meta | 10 + .../Plugins/Grpc.Core.Api/lib.meta | 10 + .../Plugins/Grpc.Core.Api/lib/net45.meta | 10 + .../lib/net45/Grpc.Core.Api.dll.meta | 32 + .../lib/net45/Grpc.Core.Api.pdb.meta | 9 + .../lib/net45/Grpc.Core.Api.xml.meta | 9 + .../Plugins/Grpc.Core.meta | 10 + .../Plugins/Grpc.Core/lib.meta | 10 + .../Plugins/Grpc.Core/lib/net45.meta | 10 + .../Grpc.Core/lib/net45/Grpc.Core.dll.meta | 32 + .../Grpc.Core/lib/net45/Grpc.Core.pdb.meta | 9 + .../Grpc.Core/lib/net45/Grpc.Core.xml.meta | 9 + .../Plugins/Grpc.Core/runtimes.meta | 10 + .../Plugins/Grpc.Core/runtimes/android.meta | 10 + .../Grpc.Core/runtimes/android/arm64-v8a.meta | 8 + .../arm64-v8a/libgrpc_csharp_ext.so.meta | 102 + .../runtimes/android/armeabi-v7a.meta | 10 + .../armeabi-v7a/libgrpc_csharp_ext.so.meta | 102 + .../Grpc.Core/runtimes/android/x86.meta | 8 + .../android/x86/libgrpc_csharp_ext.so.meta | 102 + .../runtimes/grpc_csharp_ext_dummy_stubs.c | 440 + .../grpc_csharp_ext_dummy_stubs.c.meta | 93 + .../Plugins/Grpc.Core/runtimes/ios.meta | 10 + .../Grpc.Core/runtimes/ios/libgrpc.a.meta | 95 + .../runtimes/ios/libgrpc_csharp_ext.a.meta | 117 + .../Plugins/Grpc.Core/runtimes/linux.meta | 10 + .../Plugins/Grpc.Core/runtimes/linux/x64.meta | 10 + .../linux/x64/libgrpc_csharp_ext.so.meta | 117 + .../Plugins/Grpc.Core/runtimes/linux/x86.meta | 10 + .../linux/x86/libgrpc_csharp_ext.so.meta | 117 + .../Plugins/Grpc.Core/runtimes/osx.meta | 10 + .../Plugins/Grpc.Core/runtimes/osx/x64.meta | 10 + .../osx/x64/grpc_csharp_ext.bundle.meta | 117 + .../Plugins/Grpc.Core/runtimes/osx/x86.meta | 10 + .../osx/x86/grpc_csharp_ext.bundle.meta | 117 + .../Plugins/Grpc.Core/runtimes/win.meta | 10 + .../Plugins/Grpc.Core/runtimes/win/x64.meta | 10 + .../runtimes/win/x64/grpc_csharp_ext.dll.meta | 117 + .../Plugins/Grpc.Core/runtimes/win/x86.meta | 10 + .../runtimes/win/x86/grpc_csharp_ext.dll.meta | 117 + .../Plugins/System.Buffers/lib.meta | 10 + .../Plugins/System.Buffers/lib/net45.meta | 10 + .../lib/net45/System.Buffers.dll.meta | 32 + .../lib/net45/System.Buffers.xml.meta | 9 + .../Plugins/System.Memory/lib.meta | 10 + .../Plugins/System.Memory/lib/net45.meta | 10 + .../lib/net45/System.Memory.dll.meta | 32 + .../lib/net45/System.Memory.xml.meta | 9 + .../lib.meta | 10 + .../lib/net45.meta | 10 + ...m.Runtime.CompilerServices.Unsafe.dll.meta | 32 + ...m.Runtime.CompilerServices.Unsafe.xml.meta | 9 + .../!ProtoCompiler-gRPCCppPlugin.podspec | 117 + .../!ProtoCompiler-gRPCPlugin.podspec | 128 + src/objective-c/!ProtoCompiler.podspec | 133 + src/objective-c/BUILD | 264 + src/objective-c/BoringSSL-GRPC.podspec | 705 + src/objective-c/CronetFramework.podspec | 77 + .../GRPCClient/GRPCCall+ChannelArg.h | 43 + .../GRPCClient/GRPCCall+ChannelArg.m | 83 + .../GRPCClient/GRPCCall+ChannelCredentials.h | 35 + .../GRPCClient/GRPCCall+ChannelCredentials.m | 50 + src/objective-c/GRPCClient/GRPCCall+Cronet.h | 36 + src/objective-c/GRPCClient/GRPCCall+Cronet.m | 41 + src/objective-c/GRPCClient/GRPCCall+GID.h | 29 + src/objective-c/GRPCClient/GRPCCall+GID.m | 28 + .../GRPCClient/GRPCCall+Interceptor.h | 46 + .../GRPCClient/GRPCCall+Interceptor.m | 61 + src/objective-c/GRPCClient/GRPCCall+OAuth2.h | 33 + src/objective-c/GRPCClient/GRPCCall+OAuth2.m | 59 + src/objective-c/GRPCClient/GRPCCall+Tests.h | 32 + src/objective-c/GRPCClient/GRPCCall+Tests.m | 60 + src/objective-c/GRPCClient/GRPCCall.h | 195 + src/objective-c/GRPCClient/GRPCCall.m | 264 + src/objective-c/GRPCClient/GRPCCallLegacy.h | 131 + src/objective-c/GRPCClient/GRPCCallLegacy.m | 678 + src/objective-c/GRPCClient/GRPCCallOptions.h | 371 + src/objective-c/GRPCClient/GRPCCallOptions.m | 576 + src/objective-c/GRPCClient/GRPCDispatchable.h | 30 + src/objective-c/GRPCClient/GRPCInterceptor.h | 280 + src/objective-c/GRPCClient/GRPCInterceptor.m | 376 + src/objective-c/GRPCClient/GRPCTransport.h | 86 + src/objective-c/GRPCClient/GRPCTransport.m | 149 + src/objective-c/GRPCClient/GRPCTypes.h | 194 + src/objective-c/GRPCClient/GRPCTypes.m | 24 + src/objective-c/GRPCClient/README.md | 4 + .../internal/GRPCCallOptions+Internal.h | 39 + .../internal_testing/GRPCCall+InternalTests.h | 46 + .../internal_testing/GRPCCall+InternalTests.m | 37 + .../private/GRPCCore/ChannelArgsUtil.h | 38 + .../private/GRPCCore/ChannelArgsUtil.m | 94 + .../private/GRPCCore/GRPCCall+V2API.h | 30 + .../private/GRPCCore/GRPCCallInternal.h | 44 + .../private/GRPCCore/GRPCCallInternal.m | 302 + .../GRPCClient/private/GRPCCore/GRPCChannel.h | 87 + .../GRPCClient/private/GRPCCore/GRPCChannel.m | 279 + .../private/GRPCCore/GRPCChannelFactory.h | 34 + .../private/GRPCCore/GRPCChannelPool+Test.h | 51 + .../private/GRPCCore/GRPCChannelPool.h | 99 + .../private/GRPCCore/GRPCChannelPool.m | 267 + .../private/GRPCCore/GRPCCompletionQueue.h | 39 + .../private/GRPCCore/GRPCCompletionQueue.m | 89 + .../GRPCCoreCronet/GRPCCoreCronetFactory.h | 32 + .../GRPCCoreCronet/GRPCCoreCronetFactory.m | 58 + .../GRPCCoreCronet/GRPCCronetChannelFactory.h | 36 + .../GRPCCoreCronet/GRPCCronetChannelFactory.m | 59 + .../private/GRPCCore/GRPCCoreFactory.h | 45 + .../private/GRPCCore/GRPCCoreFactory.m | 98 + .../GRPCClient/private/GRPCCore/GRPCHost.h | 73 + .../GRPCClient/private/GRPCCore/GRPCHost.m | 144 + .../GRPCCore/GRPCInsecureChannelFactory.h | 35 + .../GRPCCore/GRPCInsecureChannelFactory.m | 43 + .../private/GRPCCore/GRPCOpBatchLog.h | 44 + .../private/GRPCCore/GRPCOpBatchLog.m | 57 + .../GRPCReachabilityFlagNames.xmacro.h | 54 + .../private/GRPCCore/GRPCRequestHeaders.h | 30 + .../private/GRPCCore/GRPCRequestHeaders.m | 127 + .../GRPCCore/GRPCSecureChannelFactory.h | 43 + .../GRPCCore/GRPCSecureChannelFactory.m | 113 + .../private/GRPCCore/GRPCWrappedCall.h | 93 + .../private/GRPCCore/GRPCWrappedCall.m | 336 + .../GRPCClient/private/GRPCCore/NSData+GRPC.h | 26 + .../GRPCClient/private/GRPCCore/NSData+GRPC.m | 93 + .../private/GRPCCore/NSDictionary+GRPC.h | 26 + .../private/GRPCCore/NSDictionary+GRPC.m | 112 + .../private/GRPCCore/NSError+GRPC.h | 30 + .../private/GRPCCore/NSError+GRPC.m | 42 + .../private/GRPCTransport+Private.h | 77 + .../private/GRPCTransport+Private.m | 147 + src/objective-c/GRPCClient/version.h | 25 + src/objective-c/NetworkTransitionBehavior.md | 92 + src/objective-c/ProtoRPC/ProtoMethod.h | 46 + src/objective-c/ProtoRPC/ProtoMethod.m | 47 + src/objective-c/ProtoRPC/ProtoRPC.h | 193 + src/objective-c/ProtoRPC/ProtoRPC.m | 339 + src/objective-c/ProtoRPC/ProtoRPCLegacy.h | 64 + src/objective-c/ProtoRPC/ProtoRPCLegacy.m | 105 + src/objective-c/ProtoRPC/ProtoService.h | 76 + src/objective-c/ProtoRPC/ProtoService.m | 107 + src/objective-c/ProtoRPC/ProtoServiceLegacy.h | 23 + src/objective-c/ProtoRPC/ProtoServiceLegacy.m | 72 + src/objective-c/README-CFSTREAM.md | 40 + src/objective-c/README.md | 253 + src/objective-c/RxLibrary/GRXBufferedPipe.h | 46 + src/objective-c/RxLibrary/GRXBufferedPipe.m | 127 + .../RxLibrary/GRXConcurrentWriteable.h | 71 + .../RxLibrary/GRXConcurrentWriteable.m | 122 + .../RxLibrary/GRXForwardingWriter.h | 32 + .../RxLibrary/GRXForwardingWriter.m | 118 + .../RxLibrary/GRXImmediateSingleWriter.h | 37 + .../RxLibrary/GRXImmediateSingleWriter.m | 74 + .../RxLibrary/GRXImmediateWriter.h | 79 + .../RxLibrary/GRXImmediateWriter.m | 138 + src/objective-c/RxLibrary/GRXMappingWriter.h | 26 + src/objective-c/RxLibrary/GRXMappingWriter.m | 46 + src/objective-c/RxLibrary/GRXWriteable.h | 55 + src/objective-c/RxLibrary/GRXWriteable.m | 107 + .../RxLibrary/GRXWriter+Immediate.h | 63 + .../RxLibrary/GRXWriter+Immediate.m | 50 + .../RxLibrary/GRXWriter+Transformations.h | 29 + .../RxLibrary/GRXWriter+Transformations.m | 32 + src/objective-c/RxLibrary/GRXWriter.h | 106 + src/objective-c/RxLibrary/GRXWriter.m | 33 + .../RxLibrary/NSEnumerator+GRXUtil.h | 42 + .../RxLibrary/NSEnumerator+GRXUtil.m | 39 + src/objective-c/RxLibrary/README.md | 8 + .../RxLibrary/private/GRXNSBlockEnumerator.h | 31 + .../RxLibrary/private/GRXNSBlockEnumerator.m | 46 + .../RxLibrary/private/GRXNSFastEnumerator.h | 32 + .../RxLibrary/private/GRXNSFastEnumerator.m | 72 + .../RxLibrary/private/GRXNSScalarEnumerator.h | 28 + .../RxLibrary/private/GRXNSScalarEnumerator.m | 42 + src/objective-c/change-comments.py | 106 + src/objective-c/examples/BUILD | 172 + .../project.pbxproj | 416 + .../InterceptorSample/AppDelegate.h | 25 + .../InterceptorSample/AppDelegate.m | 23 + .../AppIcon.appiconset/Contents.json | 98 + .../Assets.xcassets/Contents.json | 6 + .../Base.lproj/LaunchScreen.storyboard | 25 + .../Base.lproj/Main.storyboard | 38 + .../InterceptorSample/CacheInterceptor.h | 92 + .../InterceptorSample/CacheInterceptor.m | 306 + .../InterceptorSample/Info.plist | 45 + .../InterceptorSample/ViewController.h | 23 + .../InterceptorSample/ViewController.m | 91 + .../InterceptorSample/main.m | 26 + .../examples/InterceptorSample/Podfile | 36 + .../RemoteTestClient/RemoteTest.podspec | 74 + .../examples/RemoteTestClient/messages.proto | 118 + .../examples/RemoteTestClient/test.proto | 57 + src/objective-c/examples/Sample/Podfile | 51 + src/objective-c/examples/Sample/README.md | 1 + .../Sample/Sample.xcodeproj/project.pbxproj | 372 + .../contents.xcworkspacedata | 7 + .../xcshareddata/xcschemes/Sample.xcscheme | 91 + .../examples/Sample/Sample/AppDelegate.h | 23 + .../examples/Sample/Sample/AppDelegate.m | 22 + .../Sample/Sample/Base.lproj/Main.storyboard | 57 + .../AppIcon.appiconset/Contents.json | 68 + .../examples/Sample/Sample/Info.plist | 47 + .../examples/Sample/Sample/ViewController.h | 22 + .../examples/Sample/Sample/ViewController.m | 85 + src/objective-c/examples/Sample/Sample/main.m | 26 + .../examples/SwiftSample/AppDelegate.swift | 24 + .../SwiftSample/Base.lproj/Main.storyboard | 25 + .../AppIcon.appiconset/Contents.json | 68 + .../examples/SwiftSample/Info.plist | 47 + src/objective-c/examples/SwiftSample/Podfile | 48 + .../SwiftSample.xcodeproj/project.pbxproj | 394 + .../contents.xcworkspacedata | 7 + .../xcschemes/SwiftSample.xcscheme | 91 + .../examples/SwiftSample/ViewController.swift | 87 + src/objective-c/examples/tvOS-sample/Podfile | 33 + .../tvOS-sample.xcodeproj/project.pbxproj | 417 + .../xcschemes/tvOS-sample.xcscheme | 93 + .../tvOS-sample/tvOS-sample/AppDelegate.h | 25 + .../tvOS-sample/tvOS-sample/AppDelegate.m | 27 + .../tvOS-sample/Base.lproj/Main.storyboard | 43 + .../tvOS-sample/tvOS-sample/Info.plist | 32 + .../tvOS-sample/tvOS-sample/ViewController.h | 23 + .../tvOS-sample/tvOS-sample/ViewController.m | 67 + .../examples/tvOS-sample/tvOS-sample/main.m | 26 + .../examples/watchOS-sample/Podfile | 43 + .../AppIcon.appiconset/Contents.json | 81 + .../Base.lproj/Interface.storyboard | 27 + .../watchOS-sample/WatchKit-App/Info.plist | 33 + .../WatchKit-Extension/ExtensionDelegate.h | 23 + .../WatchKit-Extension/ExtensionDelegate.m | 23 + .../WatchKit-Extension/Info.plist | 36 + .../WatchKit-Extension/InterfaceController.h | 24 + .../WatchKit-Extension/InterfaceController.m | 68 + .../watchOS-sample.xcodeproj/project.pbxproj | 783 + .../watchOS-sample-WatchKit-App.xcscheme | 129 + .../watchOS-sample/AppDelegate.h | 25 + .../watchOS-sample/AppDelegate.m | 27 + .../AppIcon.appiconset/Contents.json | 93 + .../Base.lproj/LaunchScreen.storyboard | 25 + .../watchOS-sample/Base.lproj/Main.storyboard | 24 + .../watchOS-sample/watchOS-sample/Info.plist | 45 + .../watchOS-sample/ViewController.h | 23 + .../watchOS-sample/ViewController.m | 27 + .../watchOS-sample/watchOS-sample/main.m | 26 + src/objective-c/format-all-comments.sh | 16 + .../grpc_objc_internal_library.bzl | 173 + src/objective-c/manual_tests/AppDelegate.h | 25 + src/objective-c/manual_tests/AppDelegate.m | 23 + .../GrpcIosTest.xcodeproj/project.pbxproj | 509 + .../xcschemes/GrpcIosTest.xcscheme | 101 + .../GrpcIosTestUITests/GrpcIosTestUITests.m | 331 + .../GrpcIosTestUITests/Info.plist | 22 + src/objective-c/manual_tests/Info.plist | 43 + src/objective-c/manual_tests/Main.storyboard | 93 + src/objective-c/manual_tests/Podfile | 100 + src/objective-c/manual_tests/ViewController.m | 173 + src/objective-c/manual_tests/main.m | 26 + src/objective-c/tests/BUILD | 227 + src/objective-c/tests/ConfigureCronet.h | 31 + src/objective-c/tests/ConfigureCronet.m | 37 + .../project.pbxproj | 395 + .../contents.xcworkspacedata | 7 + .../AppIcon.appiconset/Contents.json | 93 + .../Base.lproj/LaunchScreen.storyboard | 41 + .../Base.lproj/Main.storyboard | 46 + .../ConnectivityTestingApp/Info.plist | 45 + .../ConnectivityTestingApp/ViewController.m | 96 + .../ConnectivityTestingApp/main.m | 31 + src/objective-c/tests/Connectivity/Podfile | 32 + src/objective-c/tests/Connectivity/README.md | 14 + .../CronetTests/CoreCronetEnd2EndTests.mm | 378 + .../tests/CronetTests/CronetUnitTests.mm | 422 + .../InteropTestsRemoteWithCronet.m | 67 + .../CronetTests/TransportRegistryTests.m | 41 + .../tests/Hosts/ios-host/AppDelegate.h | 25 + .../tests/Hosts/ios-host/AppDelegate.m | 27 + .../tests/Hosts/ios-host/Info.plist | 41 + src/objective-c/tests/Hosts/ios-host/main.m | 26 + src/objective-c/tests/Info.plist | 24 + .../tests/InteropTests/InteropTests.h | 31 + .../tests/InteropTests/InteropTests.m | 2024 + .../InteropTests/InteropTestsBlockCallbacks.h | 33 + .../InteropTests/InteropTestsBlockCallbacks.m | 80 + .../InteropTests/InteropTestsLocalCleartext.m | 68 + .../tests/InteropTests/InteropTestsLocalSSL.m | 85 + .../InteropTestsMultipleChannels.m | 290 + .../tests/InteropTests/InteropTestsRemote.m | 64 + src/objective-c/tests/MacTests/Info.plist | 22 + src/objective-c/tests/MacTests/StressTests.h | 25 + src/objective-c/tests/MacTests/StressTests.m | 249 + .../tests/MacTests/StressTestsCleartext.m | 68 + .../tests/MacTests/StressTestsSSL.m | 71 + src/objective-c/tests/PerfTests/PerfTests.h | 27 + src/objective-c/tests/PerfTests/PerfTests.m | 392 + .../tests/PerfTests/PerfTestsBlockCallbacks.h | 33 + .../tests/PerfTests/PerfTestsBlockCallbacks.m | 80 + .../PerfTests/PerfTestsCFStreamCleartext.m | 74 + .../tests/PerfTests/PerfTestsCFStreamSSL.m | 80 + .../tests/PerfTests/PerfTestsCronet.m | 63 + .../PerfTests/PerfTestsNoCFStreamCleartext.m | 74 + .../tests/PerfTests/PerfTestsNoCFStreamSSL.m | 80 + .../tests/PluginTest/imported-with-dash.proto | 22 + .../tests/PluginTest/test-dash-filename.proto | 27 + src/objective-c/tests/Podfile | 133 + .../tests/RemoteTestClient/RemoteTest.podspec | 56 + .../tests/RemoteTestClient/messages.proto | 170 + .../tests/RemoteTestClient/test.proto | 57 + src/objective-c/tests/TestBase.h | 69 + src/objective-c/tests/TestBase.m | 54 + .../test-certificates.pem | 20 + .../tests/Tests.xcodeproj/project.pbxproj | 2121 + .../contents.xcworkspacedata | 7 + .../xcschemes/CronetTests.xcscheme | 95 + .../xcschemes/InteropTests.xcscheme | 100 + .../xcshareddata/xcschemes/MacTests.xcscheme | 103 + .../xcshareddata/xcschemes/PerfTests.xcscheme | 130 + .../xcschemes/PerfTestsPosix.xcscheme | 85 + .../xcshareddata/xcschemes/TvTests.xcscheme | 100 + .../xcshareddata/xcschemes/UnitTests.xcscheme | 95 + src/objective-c/tests/TvTests/Info.plist | 22 + src/objective-c/tests/UnitTests/APIv2Tests.m | 779 + .../tests/UnitTests/ChannelPoolTest.m | 63 + .../tests/UnitTests/ChannelTests.m | 115 + .../tests/UnitTests/GRPCClientTests.m | 639 + .../tests/UnitTests/NSErrorUnitTests.m | 63 + .../tests/UnitTests/RxLibraryUnitTests.m | 292 + .../tests/UnitTests/TransportRegistryTests.m | 51 + .../tests/UnitTests/TransportTests.m | 247 + src/objective-c/tests/build_one_example.sh | 70 + .../tests/build_one_example_bazel.sh | 35 + src/objective-c/tests/build_tests.sh | 40 + src/objective-c/tests/examples_build_test.sh | 22 + src/objective-c/tests/run_one_test.sh | 93 + src/objective-c/tests/run_one_test_bazel.sh | 51 + src/objective-c/tests/run_plugin_tests.sh | 69 + src/objective-c/tests/verbose_time.sh | 20 + src/objective-c/tests/version.h | 26 + src/php/.gitignore | 25 + src/php/README.md | 394 + src/php/bin/build_all_docker_images.sh | 40 + src/php/bin/determine_extension_dir.sh | 32 + src/php/bin/generate_proto_php.sh | 64 + src/php/bin/interop_client.sh | 21 + src/php/bin/run_all_docker_images.sh | 40 + src/php/bin/run_gen_code_test.sh | 23 + src/php/bin/run_php_cs_fixer.sh | 25 + src/php/bin/run_tests.sh | 50 + src/php/bin/stress_client.sh | 20 + src/php/composer.json | 20 + src/php/docker/README.md | 196 + src/php/docker/alpine/Dockerfile | 37 + src/php/docker/centos7/Dockerfile | 51 + src/php/docker/fork-support/Dockerfile | 27 + src/php/docker/fork-support/fork.php | 35 + src/php/docker/grpc-ext/Dockerfile | 39 + src/php/docker/grpc-src/Dockerfile | 46 + src/php/docker/php-future/Dockerfile | 39 + src/php/docker/php-src/Dockerfile | 61 + src/php/docker/php-zts/Dockerfile | 39 + src/php/docker/php5/Dockerfile | 39 + src/php/ext/grpc/CREDITS | 3 + src/php/ext/grpc/LICENSE | 186 + src/php/ext/grpc/byte_buffer.c | 82 + src/php/ext/grpc/byte_buffer.h | 33 + src/php/ext/grpc/call.c | 655 + src/php/ext/grpc/call.h | 57 + src/php/ext/grpc/call_credentials.c | 262 + src/php/ext/grpc/call_credentials.h | 61 + src/php/ext/grpc/channel.c | 801 + src/php/ext/grpc/channel.h | 72 + src/php/ext/grpc/channel_credentials.c | 287 + src/php/ext/grpc/channel_credentials.h | 46 + src/php/ext/grpc/completion_queue.c | 30 + src/php/ext/grpc/completion_queue.h | 35 + src/php/ext/grpc/config.m4 | 153 + src/php/ext/grpc/php7_wrapper.h | 288 + src/php/ext/grpc/php_grpc.c | 483 + src/php/ext/grpc/php_grpc.h | 98 + src/php/ext/grpc/server.c | 242 + src/php/ext/grpc/server.h | 41 + src/php/ext/grpc/server_credentials.c | 110 + src/php/ext/grpc/server_credentials.h | 44 + src/php/ext/grpc/tests/grpc-basic.phpt | 10 + src/php/ext/grpc/tests/grpc-default-ini.phpt | 15 + src/php/ext/grpc/tests/grpc-set-ini.phpt | 24 + src/php/ext/grpc/timeval.c | 299 + src/php/ext/grpc/timeval.h | 47 + src/php/ext/grpc/version.h | 25 + src/php/lib/Grpc/AbstractCall.php | 147 + src/php/lib/Grpc/BaseStub.php | 614 + src/php/lib/Grpc/BidiStreamingCall.php | 105 + src/php/lib/Grpc/CallInvoker.php | 33 + src/php/lib/Grpc/ClientStreamingCall.php | 80 + src/php/lib/Grpc/DefaultCallInvoker.php | 47 + src/php/lib/Grpc/Interceptor.php | 92 + .../lib/Grpc/Internal/InterceptorChannel.php | 76 + src/php/lib/Grpc/RpcServer.php | 168 + src/php/lib/Grpc/ServerStreamingCall.php | 100 + src/php/lib/Grpc/UnaryCall.php | 85 + src/php/phpunit.xml | 22 + .../tests/MemoryLeakTest/MemoryLeakTest.php | 78 + src/php/tests/bootstrap.php | 21 + src/php/tests/data/README | 1 + src/php/tests/data/ca.pem | 20 + src/php/tests/data/server1.key | 28 + src/php/tests/data/server1.pem | 22 + .../AbstractGeneratedCodeTest.php | 306 + .../tests/generated_code/GPBMetadata/Math.php | 24 + .../generated_code/GeneratedCodeTest.php | 35 + .../GeneratedCodeWithCallbackTest.php | 42 + src/php/tests/generated_code/Math/DivArgs.php | 85 + .../tests/generated_code/Math/DivReply.php | 85 + src/php/tests/generated_code/Math/FibArgs.php | 58 + .../tests/generated_code/Math/FibReply.php | 58 + .../tests/generated_code/Math/MathClient.php | 95 + src/php/tests/generated_code/Math/Num.php | 58 + src/php/tests/generated_code/math_client.php | 91 + src/php/tests/generated_code/math_server.js | 127 + src/php/tests/generated_code/package.json | 8 + .../Src/Proto/Grpc/Testing/Messages.php | 24 + .../Src/Proto/Grpc/Testing/PBEmpty.php | 24 + .../Src/Proto/Grpc/Testing/Test.php | 26 + .../tests/interop/Grpc/Testing/BoolValue.php | 69 + .../tests/interop/Grpc/Testing/EchoStatus.php | 88 + .../interop/Grpc/Testing/EmptyMessage.php | 38 + .../Grpc/Testing/EmptyMessageMessage.php | 38 + .../interop/Grpc/Testing/GrpclbRouteType.php | 66 + .../Grpc/Testing/LoadBalancerStatsRequest.php | 99 + .../Testing/LoadBalancerStatsResponse.php | 99 + .../LoadBalancerStatsServiceClient.php | 53 + .../Testing/LoadBalancerStatsServiceStub.php | 6 + .../tests/interop/Grpc/Testing/Payload.php | 101 + .../interop/Grpc/Testing/PayloadType.php | 47 + .../interop/Grpc/Testing/ReconnectInfo.php | 89 + .../interop/Grpc/Testing/ReconnectParams.php | 61 + .../Grpc/Testing/ReconnectServiceClient.php | 66 + .../Grpc/Testing/ResponseParameters.php | 151 + .../interop/Grpc/Testing/SimpleRequest.php | 389 + .../interop/Grpc/Testing/SimpleResponse.php | 245 + .../Testing/StreamingInputCallRequest.php | 113 + .../Testing/StreamingInputCallResponse.php | 67 + .../Testing/StreamingOutputCallRequest.php | 181 + .../Testing/StreamingOutputCallResponse.php | 67 + .../Grpc/Testing/TestServiceClient.php | 160 + .../Testing/UnimplementedServiceClient.php | 54 + src/php/tests/interop/interop_client.php | 806 + src/php/tests/interop/metrics_client.php | 34 + src/php/tests/interop/stress_client.php | 104 + src/php/tests/interop/xds_client.php | 158 + src/php/tests/qps/client.php | 179 + src/php/tests/qps/composer.json | 11 + .../GPBMetadata/Src/Proto/Grpc/Core/Stats.php | 24 + .../Proto/Grpc/Testing/BenchmarkService.php | 25 + .../Src/Proto/Grpc/Testing/CompilerTest.php | 24 + .../Src/Proto/Grpc/Testing/Control.php | 26 + .../Src/Proto/Grpc/Testing/EchoMessages.php | 24 + .../Src/Proto/Grpc/Testing/EmptyService.php | 24 + .../Src/Proto/Grpc/Testing/Messages.php | 24 + .../Src/Proto/Grpc/Testing/PBEmpty.php | 24 + .../Src/Proto/Grpc/Testing/Payloads.php | 24 + .../Src/Proto/Grpc/Testing/ProxyService.php | 26 + .../Grpc/Testing/ReportQpsScenarioService.php | 25 + .../Src/Proto/Grpc/Testing/Stats.php | 25 + .../Src/Proto/Grpc/Testing/Test.php | 26 + .../Src/Proto/Grpc/Testing/WorkerService.php | 25 + .../qps/generated_code/Grpc/Core/Bucket.php | 85 + .../generated_code/Grpc/Core/Histogram.php | 58 + .../qps/generated_code/Grpc/Core/Metric.php | 113 + .../qps/generated_code/Grpc/Core/Stats.php | 58 + .../Grpc/Testing/BenchmarkServiceClient.php | 108 + .../generated_code/Grpc/Testing/BoolValue.php | 69 + .../Grpc/Testing/ByteBufferParams.php | 85 + .../Grpc/Testing/ChannelArg.php | 113 + .../Grpc/Testing/ClientArgs.php | 86 + .../Grpc/Testing/ClientConfig.php | 640 + .../Grpc/Testing/ClientStats.php | 255 + .../Grpc/Testing/ClientStatus.php | 58 + .../Grpc/Testing/ClientType.php | 63 + .../Grpc/Testing/ClosedLoopParams.php | 34 + .../Grpc/Testing/ComplexProtoParams.php | 34 + .../Grpc/Testing/CoreRequest.php | 31 + .../Grpc/Testing/CoreResponse.php | 65 + .../generated_code/Grpc/Testing/DebugInfo.php | 87 + .../Grpc/Testing/EchoRequest.php | 85 + .../Grpc/Testing/EchoResponse.php | 85 + .../Grpc/Testing/EchoStatus.php | 88 + .../Grpc/Testing/EmptyMessage.php | 38 + .../Grpc/Testing/EmptyServiceClient.php | 36 + .../Grpc/Testing/ErrorStatus.php | 114 + .../Grpc/Testing/GrpclbRouteType.php | 66 + .../Grpc/Testing/HistogramData.php | 195 + .../Grpc/Testing/HistogramParams.php | 101 + .../Grpc/Testing/LoadBalancerStatsRequest.php | 99 + .../Testing/LoadBalancerStatsResponse.php | 99 + .../LoadBalancerStatsServiceClient.php | 53 + .../Grpc/Testing/LoadParams.php | 86 + .../qps/generated_code/Grpc/Testing/Mark.php | 67 + .../generated_code/Grpc/Testing/PBVoid.php | 31 + .../generated_code/Grpc/Testing/Payload.php | 101 + .../Grpc/Testing/PayloadConfig.php | 109 + .../Grpc/Testing/PayloadType.php | 47 + .../Grpc/Testing/PoissonParams.php | 68 + .../Grpc/Testing/ProxyClientServiceClient.php | 70 + .../generated_code/Grpc/Testing/ProxyStat.php | 58 + .../Grpc/Testing/ReconnectInfo.php | 89 + .../Grpc/Testing/ReconnectParams.php | 61 + .../Grpc/Testing/ReconnectServiceClient.php | 66 + .../ReportQpsScenarioServiceClient.php | 51 + .../generated_code/Grpc/Testing/Request.php | 31 + .../Grpc/Testing/RequestParams.php | 545 + .../Grpc/Testing/RequestResultCount.php | 85 + .../generated_code/Grpc/Testing/Response.php | 31 + .../Grpc/Testing/ResponseParameters.php | 151 + .../Grpc/Testing/ResponseParams.php | 112 + .../generated_code/Grpc/Testing/RpcType.php | 63 + .../generated_code/Grpc/Testing/Scenario.php | 305 + .../Grpc/Testing/ScenarioResult.php | 332 + .../Grpc/Testing/ScenarioResultSummary.php | 617 + .../generated_code/Grpc/Testing/Scenarios.php | 60 + .../Grpc/Testing/SecurityParams.php | 114 + .../Grpc/Testing/ServerArgs.php | 86 + .../Grpc/Testing/ServerConfig.php | 430 + .../Grpc/Testing/ServerStats.php | 273 + .../Grpc/Testing/ServerStatus.php | 126 + .../Grpc/Testing/ServerType.php | 65 + .../Grpc/Testing/ServiceAClient.php | 101 + .../Grpc/Testing/ServiceBClient.php | 55 + .../Grpc/Testing/SimpleProtoParams.php | 85 + .../Grpc/Testing/SimpleRequest.php | 389 + .../Grpc/Testing/SimpleResponse.php | 245 + .../Testing/StreamingInputCallRequest.php | 113 + .../Testing/StreamingInputCallResponse.php | 67 + .../Testing/StreamingOutputCallRequest.php | 181 + .../Testing/StreamingOutputCallResponse.php | 67 + .../Grpc/Testing/TestServiceClient.php | 160 + .../Testing/UnimplementedServiceClient.php | 54 + .../Grpc/Testing/WorkerServiceClient.php | 100 + src/php/tests/qps/histogram.php | 93 + .../tests/unit_tests/CallCredentials2Test.php | 185 + .../tests/unit_tests/CallCredentialsTest.php | 161 + src/php/tests/unit_tests/CallInvokerTest.php | 227 + src/php/tests/unit_tests/CallTest.php | 186 + .../unit_tests/ChannelCredentialsTest.php | 75 + src/php/tests/unit_tests/ChannelTest.php | 699 + src/php/tests/unit_tests/EndToEndTest.php | 590 + src/php/tests/unit_tests/InterceptorTest.php | 458 + .../PersistentChannelTest.php | 489 + .../tests/unit_tests/SecureEndToEndTest.php | 209 + src/php/tests/unit_tests/ServerTest.php | 155 + src/php/tests/unit_tests/TimevalTest.php | 196 + src/proto/gen_build_yaml.py | 80 + src/proto/grpc/binary_log/v1alpha/log.proto | 93 + src/proto/grpc/channelz/BUILD | 48 + src/proto/grpc/channelz/channelz.proto | 564 + src/proto/grpc/core/BUILD | 38 + src/proto/grpc/core/stats.proto | 38 + src/proto/grpc/gcp/BUILD | 27 + src/proto/grpc/gcp/altscontext.proto | 50 + src/proto/grpc/gcp/handshaker.proto | 243 + .../grpc/gcp/transport_security_common.proto | 46 + src/proto/grpc/health/v1/BUILD | 40 + src/proto/grpc/health/v1/health.options | 1 + src/proto/grpc/health/v1/health.proto | 63 + src/proto/grpc/http_over_grpc/BUILD | 31 + .../grpc/http_over_grpc/http_over_grpc.proto | 51 + src/proto/grpc/lb/v1/BUILD | 47 + src/proto/grpc/lb/v1/load_balancer.options | 5 + src/proto/grpc/lb/v1/load_balancer.proto | 157 + src/proto/grpc/lb/v1/load_reporter.proto | 184 + src/proto/grpc/reflection/v1alpha/BUILD | 40 + .../grpc/reflection/v1alpha/reflection.proto | 136 + src/proto/grpc/status/BUILD | 29 + src/proto/grpc/status/README | 2 + src/proto/grpc/status/status.proto | 92 + src/proto/grpc/testing/BUILD | 287 + .../grpc/testing/benchmark_service.proto | 44 + src/proto/grpc/testing/compiler_test.proto | 71 + src/proto/grpc/testing/control.proto | 289 + src/proto/grpc/testing/duplicate/BUILD | 28 + .../testing/duplicate/echo_duplicate.proto | 27 + src/proto/grpc/testing/echo.proto | 68 + src/proto/grpc/testing/echo_messages.proto | 70 + src/proto/grpc/testing/empty.proto | 28 + src/proto/grpc/testing/empty_service.proto | 23 + src/proto/grpc/testing/messages.proto | 209 + src/proto/grpc/testing/metrics.proto | 49 + src/proto/grpc/testing/payloads.proto | 40 + src/proto/grpc/testing/proto2/BUILD.bazel | 29 + src/proto/grpc/testing/proto2/empty2.proto | 22 + .../testing/proto2/empty2_extensions.proto | 28 + src/proto/grpc/testing/proxy-service.proto | 31 + .../testing/report_qps_scenario_service.proto | 26 + src/proto/grpc/testing/simple_messages.proto | 24 + src/proto/grpc/testing/stats.proto | 83 + src/proto/grpc/testing/test.proto | 92 + src/proto/grpc/testing/worker_service.proto | 45 + src/proto/grpc/testing/xds/BUILD | 74 + src/proto/grpc/testing/xds/ads_for_test.proto | 51 + src/proto/grpc/testing/xds/cds_for_test.proto | 157 + src/proto/grpc/testing/xds/eds_for_test.proto | 574 + .../grpc/testing/xds/lds_rds_for_test.proto | 166 + src/proto/grpc/testing/xds/lrs_for_test.proto | 189 + .../xds/orca_load_report_for_test.proto | 58 + src/proto/math/math.proto | 65 + src/python/.gitignore | 4 + src/python/grpcio/.gitignore | 16 + src/python/grpcio/README.rst | 115 + src/python/grpcio/_parallel_compile_patch.py | 63 + src/python/grpcio/_spawn_patch.py | 60 + src/python/grpcio/commands.py | 292 + src/python/grpcio/grpc/BUILD.bazel | 93 + src/python/grpcio/grpc/__init__.py | 2103 + src/python/grpcio/grpc/_auth.py | 58 + src/python/grpcio/grpc/_channel.py | 1460 + src/python/grpcio/grpc/_common.py | 146 + src/python/grpcio/grpc/_compression.py | 55 + src/python/grpcio/grpc/_cython/.gitignore | 6 + src/python/grpcio/grpc/_cython/BUILD.bazel | 23 + src/python/grpcio/grpc/_cython/README.rst | 52 + src/python/grpcio/grpc/_cython/__init__.py | 13 + .../grpcio/grpc/_cython/_cygrpc/__init__.py | 13 + .../grpc/_cython/_cygrpc/_hooks.pxd.pxi | 16 + .../grpc/_cython/_cygrpc/_hooks.pyx.pxi | 35 + .../grpc/_cython/_cygrpc/aio/call.pxd.pxi | 47 + .../grpc/_cython/_cygrpc/aio/call.pyx.pxi | 505 + .../_cygrpc/aio/callback_common.pxd.pxi | 57 + .../_cygrpc/aio/callback_common.pyx.pxi | 182 + .../grpc/_cython/_cygrpc/aio/channel.pxd.pxi | 27 + .../grpc/_cython/_cygrpc/aio/channel.pyx.pxi | 134 + .../grpc/_cython/_cygrpc/aio/common.pyx.pxi | 167 + .../_cygrpc/aio/completion_queue.pxd.pxi | 69 + .../_cygrpc/aio/completion_queue.pyx.pxi | 136 + .../grpc/_cython/_cygrpc/aio/grpc_aio.pxd.pxi | 43 + .../grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi | 136 + .../_cython/_cygrpc/aio/iomgr/iomgr.pyx.pxi | 256 + .../_cygrpc/aio/iomgr/resolver.pxd.pxi | 24 + .../_cygrpc/aio/iomgr/resolver.pyx.pxi | 56 + .../_cython/_cygrpc/aio/iomgr/socket.pxd.pxi | 63 + .../_cython/_cygrpc/aio/iomgr/socket.pyx.pxi | 225 + .../_cython/_cygrpc/aio/iomgr/timer.pxd.pxi | 25 + .../_cython/_cygrpc/aio/iomgr/timer.pyx.pxi | 48 + .../_cython/_cygrpc/aio/rpc_status.pxd.pxi | 29 + .../_cython/_cygrpc/aio/rpc_status.pyx.pxi | 44 + .../grpc/_cython/_cygrpc/aio/server.pxd.pxi | 83 + .../grpc/_cython/_cygrpc/aio/server.pyx.pxi | 953 + .../grpc/_cython/_cygrpc/arguments.pxd.pxi | 36 + .../grpc/_cython/_cygrpc/arguments.pyx.pxi | 85 + .../grpcio/grpc/_cython/_cygrpc/call.pxd.pxi | 20 + .../grpcio/grpc/_cython/_cygrpc/call.pyx.pxi | 97 + .../grpc/_cython/_cygrpc/channel.pxd.pxi | 74 + .../grpc/_cython/_cygrpc/channel.pyx.pxi | 518 + .../grpc/_cython/_cygrpc/channelz.pyx.pxi | 71 + .../_cython/_cygrpc/completion_queue.pxd.pxi | 28 + .../_cython/_cygrpc/completion_queue.pyx.pxi | 118 + .../grpc/_cython/_cygrpc/credentials.pxd.pxi | 110 + .../grpc/_cython/_cygrpc/credentials.pyx.pxi | 382 + .../grpcio/grpc/_cython/_cygrpc/event.pxd.pxi | 45 + .../grpcio/grpc/_cython/_cygrpc/event.pyx.pxi | 55 + .../grpc/_cython/_cygrpc/fork_posix.pxd.pxi | 29 + .../grpc/_cython/_cygrpc/fork_posix.pyx.pxi | 206 + .../grpc/_cython/_cygrpc/fork_windows.pyx.pxi | 61 + .../grpcio/grpc/_cython/_cygrpc/grpc.pxi | 670 + .../grpc/_cython/_cygrpc/grpc_gevent.pxd.pxi | 41 + .../grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi | 418 + .../grpc/_cython/_cygrpc/grpc_string.pyx.pxi | 51 + .../grpcio/grpc/_cython/_cygrpc/iomgr.pxd.pxi | 129 + .../grpcio/grpc/_cython/_cygrpc/iomgr.pyx.pxi | 63 + .../grpc/_cython/_cygrpc/metadata.pxd.pxi | 26 + .../grpc/_cython/_cygrpc/metadata.pyx.pxi | 73 + .../grpc/_cython/_cygrpc/operation.pxd.pxi | 111 + .../grpc/_cython/_cygrpc/operation.pyx.pxi | 250 + .../_cython/_cygrpc/propagation_bits.pxd.pxi | 20 + .../_cython/_cygrpc/propagation_bits.pyx.pxi | 20 + .../grpc/_cython/_cygrpc/records.pxd.pxi | 34 + .../grpc/_cython/_cygrpc/records.pyx.pxi | 197 + .../grpc/_cython/_cygrpc/security.pxd.pxi | 17 + .../grpc/_cython/_cygrpc/security.pyx.pxi | 91 + .../grpc/_cython/_cygrpc/server.pxd.pxi | 29 + .../grpc/_cython/_cygrpc/server.pyx.pxi | 157 + .../grpcio/grpc/_cython/_cygrpc/tag.pxd.pxi | 58 + .../grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi | 88 + .../grpcio/grpc/_cython/_cygrpc/time.pxd.pxi | 19 + .../grpcio/grpc/_cython/_cygrpc/time.pyx.pxi | 29 + .../grpc/_cython/_cygrpc/vtable.pxd.pxi | 23 + .../grpc/_cython/_cygrpc/vtable.pyx.pxi | 36 + src/python/grpcio/grpc/_cython/cygrpc.pxd | 54 + src/python/grpcio/grpc/_cython/cygrpc.pyx | 97 + src/python/grpcio/grpc/_grpcio_metadata.py | 17 + src/python/grpcio/grpc/_interceptor.py | 562 + src/python/grpcio/grpc/_plugin_wrapping.py | 101 + src/python/grpcio/grpc/_server.py | 992 + src/python/grpcio/grpc/_simple_stubs.py | 439 + src/python/grpcio/grpc/_utilities.py | 169 + src/python/grpcio/grpc/beta/__init__.py | 13 + .../grpcio/grpc/beta/_client_adaptations.py | 706 + src/python/grpcio/grpc/beta/_metadata.py | 52 + .../grpcio/grpc/beta/_server_adaptations.py | 385 + .../grpcio/grpc/beta/implementations.py | 310 + src/python/grpcio/grpc/beta/interfaces.py | 165 + src/python/grpcio/grpc/beta/utilities.py | 149 + .../grpcio/grpc/experimental/BUILD.bazel | 35 + .../grpcio/grpc/experimental/__init__.py | 125 + .../grpcio/grpc/experimental/aio/__init__.py | 81 + .../grpc/experimental/aio/_base_call.py | 244 + .../grpc/experimental/aio/_base_channel.py | 348 + .../grpc/experimental/aio/_base_server.py | 254 + .../grpcio/grpc/experimental/aio/_call.py | 630 + .../grpcio/grpc/experimental/aio/_channel.py | 460 + .../grpc/experimental/aio/_interceptor.py | 986 + .../grpcio/grpc/experimental/aio/_metadata.py | 105 + .../grpcio/grpc/experimental/aio/_server.py | 206 + .../grpcio/grpc/experimental/aio/_typing.py | 31 + .../grpcio/grpc/experimental/aio/_utils.py | 22 + src/python/grpcio/grpc/experimental/gevent.py | 27 + .../grpcio/grpc/experimental/session_cache.py | 45 + src/python/grpcio/grpc/framework/BUILD.bazel | 11 + src/python/grpcio/grpc/framework/__init__.py | 13 + .../grpcio/grpc/framework/common/BUILD.bazel | 28 + .../grpcio/grpc/framework/common/__init__.py | 13 + .../grpc/framework/common/cardinality.py | 26 + .../grpcio/grpc/framework/common/style.py | 24 + .../grpc/framework/foundation/BUILD.bazel | 63 + .../grpc/framework/foundation/__init__.py | 13 + .../grpc/framework/foundation/abandonment.py | 22 + .../framework/foundation/callable_util.py | 96 + .../grpc/framework/foundation/future.py | 221 + .../grpc/framework/foundation/logging_pool.py | 72 + .../grpc/framework/foundation/stream.py | 45 + .../grpc/framework/foundation/stream_util.py | 148 + .../grpc/framework/interfaces/BUILD.bazel | 10 + .../grpc/framework/interfaces/__init__.py | 13 + .../framework/interfaces/base/BUILD.bazel | 31 + .../framework/interfaces/base/__init__.py | 13 + .../grpc/framework/interfaces/base/base.py | 330 + .../framework/interfaces/base/utilities.py | 71 + .../framework/interfaces/face/BUILD.bazel | 33 + .../framework/interfaces/face/__init__.py | 13 + .../grpc/framework/interfaces/face/face.py | 1052 + .../framework/interfaces/face/utilities.py | 168 + src/python/grpcio/grpc_core_dependencies.py | 865 + src/python/grpcio/grpc_version.py | 17 + src/python/grpcio/support.py | 111 + src/python/grpcio_channelz/.gitignore | 6 + src/python/grpcio_channelz/MANIFEST.in | 4 + src/python/grpcio_channelz/README.rst | 17 + .../grpcio_channelz/channelz_commands.py | 67 + .../grpcio_channelz/grpc_channelz/__init__.py | 13 + .../grpc_channelz/v1/BUILD.bazel | 26 + .../grpc_channelz/v1/__init__.py | 13 + .../grpc_channelz/v1/_async.py | 66 + .../grpc_channelz/v1/_servicer.py | 120 + .../grpc_channelz/v1/channelz.py | 73 + src/python/grpcio_channelz/grpc_version.py | 17 + src/python/grpcio_channelz/setup.py | 102 + src/python/grpcio_health_checking/.gitignore | 6 + src/python/grpcio_health_checking/MANIFEST.in | 4 + src/python/grpcio_health_checking/README.rst | 17 + .../grpc_health/__init__.py | 13 + .../grpc_health/v1/BUILD.bazel | 29 + .../grpc_health/v1/__init__.py | 13 + .../grpc_health/v1/_async.py | 113 + .../grpc_health/v1/health.py | 172 + .../grpcio_health_checking/grpc_version.py | 17 + .../grpcio_health_checking/health_commands.py | 66 + src/python/grpcio_health_checking/setup.py | 100 + src/python/grpcio_reflection/.gitignore | 5 + src/python/grpcio_reflection/MANIFEST.in | 4 + src/python/grpcio_reflection/README.rst | 18 + .../grpc_reflection/__init__.py | 13 + .../grpc_reflection/v1alpha/BUILD.bazel | 28 + .../grpc_reflection/v1alpha/__init__.py | 13 + .../grpc_reflection/v1alpha/_async.py | 57 + .../grpc_reflection/v1alpha/_base.py | 110 + .../grpc_reflection/v1alpha/reflection.py | 98 + src/python/grpcio_reflection/grpc_version.py | 17 + .../grpcio_reflection/reflection_commands.py | 68 + src/python/grpcio_reflection/setup.py | 101 + src/python/grpcio_status/.gitignore | 3 + src/python/grpcio_status/MANIFEST.in | 5 + src/python/grpcio_status/README.rst | 17 + .../grpcio_status/grpc_status/BUILD.bazel | 14 + .../grpcio_status/grpc_status/__init__.py | 13 + .../grpcio_status/grpc_status/_async.py | 56 + .../grpcio_status/grpc_status/_common.py | 27 + .../grpcio_status/grpc_status/rpc_status.py | 89 + src/python/grpcio_status/grpc_version.py | 17 + src/python/grpcio_status/setup.py | 97 + src/python/grpcio_status/status_commands.py | 49 + src/python/grpcio_testing/MANIFEST.in | 4 + src/python/grpcio_testing/README.rst | 18 + .../grpcio_testing/grpc_testing/__init__.py | 697 + .../grpc_testing/_channel/__init__.py | 25 + .../grpc_testing/_channel/_channel.py | 87 + .../grpc_testing/_channel/_channel_rpc.py | 119 + .../grpc_testing/_channel/_channel_state.py | 47 + .../grpc_testing/_channel/_invocation.py | 324 + .../grpc_testing/_channel/_multi_callable.py | 118 + .../grpc_testing/_channel/_rpc_state.py | 193 + .../grpcio_testing/grpc_testing/_common.py | 162 + .../grpc_testing/_server/__init__.py | 20 + .../grpc_testing/_server/_handler.py | 217 + .../grpc_testing/_server/_rpc.py | 155 + .../grpc_testing/_server/_server.py | 154 + .../grpc_testing/_server/_server_rpc.py | 93 + .../grpc_testing/_server/_service.py | 89 + .../grpc_testing/_server/_servicer_context.py | 88 + .../grpcio_testing/grpc_testing/_time.py | 229 + src/python/grpcio_testing/grpc_version.py | 17 + src/python/grpcio_testing/setup.py | 80 + src/python/grpcio_testing/testing_commands.py | 39 + src/python/grpcio_tests/.gitignore | 1 + src/python/grpcio_tests/commands.py | 338 + src/python/grpcio_tests/grpc_version.py | 17 + src/python/grpcio_tests/setup.py | 110 + src/python/grpcio_tests/tests/BUILD.bazel | 9 + src/python/grpcio_tests/tests/__init__.py | 21 + src/python/grpcio_tests/tests/_loader.py | 106 + src/python/grpcio_tests/tests/_result.py | 439 + src/python/grpcio_tests/tests/_runner.py | 240 + .../grpcio_tests/tests/_sanity/__init__.py | 13 + .../tests/_sanity/_sanity_test.py | 48 + .../tests/bazel_namespace_package_hack.py | 40 + .../grpcio_tests/tests/channelz/BUILD.bazel | 17 + .../grpcio_tests/tests/channelz/__init__.py | 13 + .../tests/channelz/_channelz_servicer_test.py | 469 + .../grpcio_tests/tests/fork/__init__.py | 13 + .../tests/fork/_fork_interop_test.py | 151 + src/python/grpcio_tests/tests/fork/client.py | 72 + src/python/grpcio_tests/tests/fork/methods.py | 451 + .../tests/health_check/BUILD.bazel | 18 + .../tests/health_check/__init__.py | 13 + .../health_check/_health_servicer_test.py | 282 + .../tests/http2/negative_http2_client.py | 158 + .../grpcio_tests/tests/interop/BUILD.bazel | 117 + .../grpcio_tests/tests/interop/__init__.py | 13 + .../tests/interop/_insecure_intraop_test.py | 44 + .../tests/interop/_intraop_test_case.py | 51 + .../tests/interop/_secure_intraop_test.py | 54 + .../grpcio_tests/tests/interop/client.py | 149 + .../tests/interop/credentials/BUILD.bazel | 8 + .../tests/interop/credentials/README | 1 + .../tests/interop/credentials/ca.pem | 20 + .../tests/interop/credentials/server1.key | 28 + .../tests/interop/credentials/server1.pem | 22 + .../grpcio_tests/tests/interop/methods.py | 478 + .../grpcio_tests/tests/interop/resources.py | 42 + .../grpcio_tests/tests/interop/server.py | 76 + .../grpcio_tests/tests/interop/service.py | 96 + .../tests/protoc_plugin/__init__.py | 13 + .../protoc_plugin/_python_plugin_test.py | 622 + .../protoc_plugin/_split_definitions_test.py | 332 + .../protoc_plugin/beta_python_plugin_test.py | 662 + .../tests/protoc_plugin/protos/__init__.py | 13 + .../protos/invocation_testing/__init__.py | 13 + .../protos/invocation_testing/same.proto | 24 + .../split_messages/sub/messages.proto | 20 + .../split_services/services.proto | 23 + .../protoc_plugin/protos/payload/__init__.py | 13 + .../protos/payload/test_payload.proto | 36 + .../protoc_plugin/protos/requests/__init__.py | 13 + .../protos/requests/r/__init__.py | 13 + .../protos/requests/r/test_requests.proto | 62 + .../protos/responses/__init__.py | 13 + .../protos/responses/test_responses.proto | 32 + .../protoc_plugin/protos/service/__init__.py | 13 + .../protos/service/test_service.proto | 49 + src/python/grpcio_tests/tests/qps/BUILD.bazel | 90 + src/python/grpcio_tests/tests/qps/__init__.py | 13 + .../tests/qps/benchmark_client.py | 202 + .../tests/qps/benchmark_server.py | 44 + .../grpcio_tests/tests/qps/client_runner.py | 90 + .../grpcio_tests/tests/qps/histogram.py | 80 + .../grpcio_tests/tests/qps/qps_worker.py | 46 + .../grpcio_tests/tests/qps/worker_server.py | 186 + .../grpcio_tests/tests/reflection/BUILD.bazel | 21 + .../grpcio_tests/tests/reflection/__init__.py | 13 + .../reflection/_reflection_servicer_test.py | 195 + .../grpcio_tests/tests/status/BUILD.bazel | 21 + .../grpcio_tests/tests/status/__init__.py | 13 + .../tests/status/_grpc_status_test.py | 180 + .../grpcio_tests/tests/stress/BUILD.bazel | 31 + .../grpcio_tests/tests/stress/__init__.py | 13 + .../grpcio_tests/tests/stress/client.py | 159 + .../tests/stress/metrics_server.py | 45 + .../grpcio_tests/tests/stress/test_runner.py | 58 + .../tests/stress/unary_stream_benchmark.proto | 27 + .../tests/stress/unary_stream_benchmark.py | 102 + .../grpcio_tests/tests/testing/BUILD.bazel | 27 + .../grpcio_tests/tests/testing/__init__.py | 13 + .../tests/testing/_application_common.py | 43 + .../testing/_application_testing_common.py | 33 + .../tests/testing/_client_application.py | 236 + .../tests/testing/_client_test.py | 308 + .../tests/testing/_server_application.py | 95 + .../tests/testing/_server_test.py | 207 + .../grpcio_tests/tests/testing/_time_test.py | 165 + .../tests/testing/proto/__init__.py | 13 + .../tests/testing/proto/requests.proto | 29 + .../tests/testing/proto/services.proto | 42 + src/python/grpcio_tests/tests/tests.json | 84 + .../grpcio_tests/tests/unit/BUILD.bazel | 112 + .../grpcio_tests/tests/unit/__init__.py | 13 + .../grpcio_tests/tests/unit/_abort_test.py | 154 + .../grpcio_tests/tests/unit/_api_test.py | 115 + .../tests/unit/_auth_context_test.py | 193 + .../grpcio_tests/tests/unit/_auth_test.py | 82 + .../tests/unit/_channel_args_test.py | 65 + .../tests/unit/_channel_close_test.py | 220 + .../tests/unit/_channel_connectivity_test.py | 155 + .../tests/unit/_channel_ready_future_test.py | 97 + .../tests/unit/_compression_test.py | 382 + .../tests/unit/_credentials_test.py | 70 + .../tests/unit/_cython/.gitignore | 7 + .../tests/unit/_cython/BUILD.bazel | 46 + .../tests/unit/_cython/__init__.py | 13 + .../unit/_cython/_cancel_many_calls_test.py | 223 + .../tests/unit/_cython/_channel_test.py | 70 + .../tests/unit/_cython/_common.py | 123 + .../tests/unit/_cython/_fork_test.py | 72 + ...s_server_completion_queue_per_call_test.py | 132 + ...ges_single_server_completion_queue_test.py | 126 + .../_read_some_but_not_all_responses_test.py | 240 + .../tests/unit/_cython/_server_test.py | 49 + .../tests/unit/_cython/cygrpc_test.py | 422 + .../tests/unit/_cython/test_utilities.py | 52 + .../tests/unit/_dns_resolver_test.py | 63 + .../tests/unit/_empty_message_test.py | 124 + .../unit/_error_message_encoding_test.py | 87 + .../tests/unit/_exit_scenarios.py | 236 + .../grpcio_tests/tests/unit/_exit_test.py | 205 + .../tests/unit/_from_grpc_import_star.py | 23 + .../tests/unit/_grpc_shutdown_test.py | 54 + .../tests/unit/_interceptor_test.py | 712 + .../tests/unit/_invalid_metadata_test.py | 140 + .../tests/unit/_invocation_defects_test.py | 266 + .../tests/unit/_local_credentials_test.py | 77 + .../grpcio_tests/tests/unit/_logging_test.py | 99 + .../tests/unit/_metadata_code_details_test.py | 663 + .../tests/unit/_metadata_flags_test.py | 260 + .../grpcio_tests/tests/unit/_metadata_test.py | 242 + .../tests/unit/_reconnect_test.py | 69 + .../tests/unit/_resource_exhausted_test.py | 259 + .../grpcio_tests/tests/unit/_rpc_test.py | 1006 + .../tests/unit/_server_shutdown_scenarios.py | 97 + .../tests/unit/_server_shutdown_test.py | 89 + .../unit/_server_ssl_cert_config_test.py | 505 + .../grpcio_tests/tests/unit/_server_test.py | 53 + .../unit/_server_wait_for_termination_test.py | 91 + .../tests/unit/_session_cache_test.py | 140 + .../grpcio_tests/tests/unit/_signal_client.py | 119 + .../tests/unit/_signal_handling_test.py | 198 + .../grpcio_tests/tests/unit/_tcp_proxy.py | 141 + .../grpcio_tests/tests/unit/_version_test.py | 30 + .../grpcio_tests/tests/unit/beta/__init__.py | 13 + .../tests/unit/beta/_beta_features_test.py | 354 + .../unit/beta/_connectivity_channel_test.py | 32 + .../tests/unit/beta/_implementations_test.py | 55 + .../tests/unit/beta/_not_found_test.py | 59 + .../tests/unit/beta/_utilities_test.py | 93 + .../tests/unit/beta/test_utilities.py | 40 + .../tests/unit/credentials/BUILD.bazel | 8 + .../tests/unit/credentials/README.md | 15 + .../tests/unit/credentials/ca.pem | 20 + .../certificate_hierarchy_1/certs/ca.cert.pem | 31 + .../intermediate/certs/client.cert.pem | 28 + .../intermediate/certs/intermediate.cert.pem | 31 + .../intermediate/certs/localhost-1.cert.pem | 30 + .../intermediate/private/client.key.pem | 27 + .../intermediate/private/localhost-1.key.pem | 27 + .../certificate_hierarchy_2/certs/ca.cert.pem | 31 + .../intermediate/certs/client.cert.pem | 28 + .../intermediate/certs/intermediate.cert.pem | 31 + .../intermediate/certs/localhost-1.cert.pem | 30 + .../intermediate/private/client.key.pem | 27 + .../intermediate/private/localhost-1.key.pem | 27 + .../tests/unit/credentials/server1.key | 28 + .../tests/unit/credentials/server1.pem | 22 + .../tests/unit/framework/__init__.py | 13 + .../tests/unit/framework/common/BUILD.bazel | 11 + .../tests/unit/framework/common/__init__.py | 102 + .../unit/framework/common/test_constants.py | 45 + .../unit/framework/common/test_control.py | 97 + .../unit/framework/common/test_coverage.py | 101 + .../unit/framework/foundation/BUILD.bazel | 18 + .../unit/framework/foundation/__init__.py | 13 + .../foundation/_logging_pool_test.py | 73 + .../framework/foundation/stream_testing.py | 57 + .../grpcio_tests/tests/unit/resources.py | 113 + .../grpcio_tests/tests/unit/test_common.py | 134 + .../grpcio_tests/tests/unit/thread_pool.py | 34 + src/python/grpcio_tests/tests_aio/__init__.py | 21 + .../tests_aio/_sanity/__init__.py | 13 + .../tests_aio/_sanity/_sanity_test.py | 27 + .../tests_aio/benchmark/BUILD.bazel | 83 + .../tests_aio/benchmark/benchmark_client.py | 155 + .../tests_aio/benchmark/benchmark_servicer.py | 55 + .../tests_aio/benchmark/server.py | 46 + .../tests_aio/benchmark/worker.py | 59 + .../tests_aio/benchmark/worker_servicer.py | 367 + .../tests_aio/channelz/BUILD.bazel | 29 + .../tests_aio/channelz/__init__.py | 13 + .../channelz/channelz_servicer_test.py | 474 + .../tests_aio/health_check/BUILD.bazel | 29 + .../tests_aio/health_check/__init__.py | 13 + .../health_check/health_servicer_test.py | 282 + .../tests_aio/interop/BUILD.bazel | 76 + .../tests_aio/interop/__init__.py | 13 + .../grpcio_tests/tests_aio/interop/client.py | 61 + .../tests_aio/interop/local_interop_test.py | 134 + .../grpcio_tests/tests_aio/interop/methods.py | 449 + .../grpcio_tests/tests_aio/interop/server.py | 49 + .../tests_aio/reflection/BUILD.bazel | 30 + .../tests_aio/reflection/__init__.py | 13 + .../reflection/reflection_servicer_test.py | 193 + .../grpcio_tests/tests_aio/status/BUILD.bazel | 30 + .../grpcio_tests/tests_aio/status/__init__.py | 13 + .../tests_aio/status/grpc_status_test.py | 175 + src/python/grpcio_tests/tests_aio/tests.json | 39 + .../grpcio_tests/tests_aio/unit/BUILD.bazel | 86 + .../grpcio_tests/tests_aio/unit/__init__.py | 13 + .../grpcio_tests/tests_aio/unit/_common.py | 97 + .../grpcio_tests/tests_aio/unit/_constants.py | 16 + .../tests_aio/unit/_metadata_test.py | 125 + .../grpcio_tests/tests_aio/unit/_test_base.py | 69 + .../tests_aio/unit/_test_server.py | 143 + .../grpcio_tests/tests_aio/unit/abort_test.py | 151 + .../tests_aio/unit/aio_rpc_error_test.py | 49 + .../grpcio_tests/tests_aio/unit/call_test.py | 814 + .../tests_aio/unit/channel_argument_test.py | 176 + .../tests_aio/unit/channel_ready_test.py | 69 + .../tests_aio/unit/channel_test.py | 230 + .../client_stream_stream_interceptor_test.py | 202 + .../client_stream_unary_interceptor_test.py | 517 + .../client_unary_stream_interceptor_test.py | 395 + .../client_unary_unary_interceptor_test.py | 690 + .../tests_aio/unit/close_channel_test.py | 138 + .../tests_aio/unit/compatibility_test.py | 379 + .../tests_aio/unit/compression_test.py | 196 + .../tests_aio/unit/connectivity_test.py | 112 + .../tests_aio/unit/done_callback_test.py | 124 + .../grpcio_tests/tests_aio/unit/init_test.py | 52 + .../tests_aio/unit/metadata_test.py | 283 + .../tests_aio/unit/secure_call_test.py | 130 + .../tests_aio/unit/server_interceptor_test.py | 330 + .../tests_aio/unit/server_test.py | 470 + .../tests_aio/unit/timeout_test.py | 178 + .../unit/wait_for_connection_test.py | 159 + .../tests_aio/unit/wait_for_ready_test.py | 146 + .../grpcio_tests/tests_py3_only/__init__.py | 21 + .../tests_py3_only/interop/BUILD.bazel | 12 + .../interop/xds_interop_client.py | 254 + .../tests_py3_only/unit/BUILD.bazel | 41 + .../tests_py3_only/unit/__init__.py | 13 + .../tests_py3_only/unit/_leak_test.py | 98 + .../tests_py3_only/unit/_simple_stubs_test.py | 269 + src/ruby/.gitignore | 15 + src/ruby/.rubocop.yml | 21 + src/ruby/.rubocop_todo.yml | 569 + src/ruby/CHANGELOG.md | 11 + src/ruby/README.md | 78 + src/ruby/bin/math_client.rb | 140 + src/ruby/bin/math_pb.rb | 34 + src/ruby/bin/math_server.rb | 191 + src/ruby/bin/math_services_pb.rb | 51 + src/ruby/bin/noproto_client.rb | 93 + src/ruby/bin/noproto_server.rb | 97 + src/ruby/end2end/README.md | 18 + .../call_credentials_timeout_driver.rb | 153 + src/ruby/end2end/channel_closing_client.rb | 69 + src/ruby/end2end/channel_closing_driver.rb | 55 + src/ruby/end2end/channel_state_client.rb | 39 + src/ruby/end2end/channel_state_driver.rb | 49 + .../end2end/client_memory_usage_client.rb | 44 + .../end2end/client_memory_usage_driver.rb | 36 + src/ruby/end2end/end2end_common.rb | 101 + .../end2end/errors_load_before_grpc_lib.rb | 51 + src/ruby/end2end/forking_client_client.rb | 54 + src/ruby/end2end/forking_client_driver.rb | 48 + src/ruby/end2end/gen_protos.sh | 17 + .../end2end/graceful_sig_handling_client.rb | 61 + .../end2end/graceful_sig_handling_driver.rb | 83 + src/ruby/end2end/graceful_sig_stop_client.rb | 78 + src/ruby/end2end/graceful_sig_stop_driver.rb | 62 + src/ruby/end2end/grpc_class_init_client.rb | 128 + src/ruby/end2end/grpc_class_init_driver.rb | 63 + .../end2end/killed_client_thread_client.rb | 43 + .../end2end/killed_client_thread_driver.rb | 89 + src/ruby/end2end/lib/client_control_pb.rb | 17 + .../end2end/lib/client_control_services_pb.rb | 38 + src/ruby/end2end/lib/echo_pb.rb | 18 + src/ruby/end2end/lib/echo_services_pb.rb | 37 + .../load_grpc_with_gc_stress_driver.rb | 32 + .../end2end/logger_load_before_grpc_lib.rb | 33 + ...multiple_killed_watching_threads_driver.rb | 63 + .../package_with_underscore_checker.rb | 54 + src/ruby/end2end/protos/client_control.proto | 28 + src/ruby/end2end/protos/echo.proto | 31 + .../protos/package_with_underscore/data.proto | 23 + .../package_with_underscore/service.proto | 23 + src/ruby/end2end/sig_handling_client.rb | 86 + src/ruby/end2end/sig_handling_driver.rb | 71 + .../sig_int_during_channel_watch_client.rb | 57 + .../sig_int_during_channel_watch_driver.rb | 55 + .../status_codes_load_before_grpc_lib.rb | 32 + src/ruby/ext/grpc/ext-export.clang | 1 + src/ruby/ext/grpc/ext-export.gcc | 6 + src/ruby/ext/grpc/extconf.rb | 107 + src/ruby/ext/grpc/rb_byte_buffer.c | 64 + src/ruby/ext/grpc/rb_byte_buffer.h | 35 + src/ruby/ext/grpc/rb_call.c | 1050 + src/ruby/ext/grpc/rb_call.h | 53 + src/ruby/ext/grpc/rb_call_credentials.c | 297 + src/ruby/ext/grpc/rb_call_credentials.h | 31 + src/ruby/ext/grpc/rb_channel.c | 835 + src/ruby/ext/grpc/rb_channel.h | 34 + src/ruby/ext/grpc/rb_channel_args.c | 155 + src/ruby/ext/grpc/rb_channel_args.h | 38 + src/ruby/ext/grpc/rb_channel_credentials.c | 267 + src/ruby/ext/grpc/rb_channel_credentials.h | 32 + src/ruby/ext/grpc/rb_completion_queue.c | 100 + src/ruby/ext/grpc/rb_completion_queue.h | 36 + src/ruby/ext/grpc/rb_compression_options.c | 470 + src/ruby/ext/grpc/rb_compression_options.h | 29 + src/ruby/ext/grpc/rb_enable_cpp.cc | 22 + src/ruby/ext/grpc/rb_event_thread.c | 143 + src/ruby/ext/grpc/rb_event_thread.h | 21 + src/ruby/ext/grpc/rb_grpc.c | 328 + src/ruby/ext/grpc/rb_grpc.h | 76 + src/ruby/ext/grpc/rb_grpc_imports.generated.c | 573 + src/ruby/ext/grpc/rb_grpc_imports.generated.h | 865 + src/ruby/ext/grpc/rb_loader.c | 57 + src/ruby/ext/grpc/rb_loader.h | 25 + src/ruby/ext/grpc/rb_server.c | 372 + src/ruby/ext/grpc/rb_server.h | 32 + src/ruby/ext/grpc/rb_server_credentials.c | 243 + src/ruby/ext/grpc/rb_server_credentials.h | 32 + src/ruby/lib/grpc.rb | 37 + src/ruby/lib/grpc/core/status_codes.rb | 135 + src/ruby/lib/grpc/core/time_consts.rb | 56 + src/ruby/lib/grpc/errors.rb | 277 + src/ruby/lib/grpc/generic/active_call.rb | 669 + src/ruby/lib/grpc/generic/bidi_call.rb | 233 + src/ruby/lib/grpc/generic/client_stub.rb | 501 + .../lib/grpc/generic/interceptor_registry.rb | 53 + src/ruby/lib/grpc/generic/interceptors.rb | 186 + src/ruby/lib/grpc/generic/rpc_desc.rb | 204 + src/ruby/lib/grpc/generic/rpc_server.rb | 551 + src/ruby/lib/grpc/generic/service.rb | 211 + src/ruby/lib/grpc/google_rpc_status_utils.rb | 40 + src/ruby/lib/grpc/grpc.rb | 24 + src/ruby/lib/grpc/logconfig.rb | 44 + src/ruby/lib/grpc/notifier.rb | 45 + src/ruby/lib/grpc/structs.rb | 15 + src/ruby/lib/grpc/version.rb | 18 + src/ruby/pb/README.md | 42 + src/ruby/pb/generate_proto_ruby.sh | 51 + src/ruby/pb/grpc/health/checker.rb | 75 + src/ruby/pb/grpc/health/v1/health_pb.rb | 31 + .../pb/grpc/health/v1/health_services_pb.rb | 62 + .../duplicate/echo_duplicate_services_pb.rb | 44 + src/ruby/pb/grpc/testing/metrics_pb.rb | 28 + .../pb/grpc/testing/metrics_services_pb.rb | 49 + .../pb/src/proto/grpc/testing/empty_pb.rb | 17 + .../pb/src/proto/grpc/testing/messages_pb.rb | 105 + src/ruby/pb/src/proto/grpc/testing/test_pb.rb | 16 + .../proto/grpc/testing/test_services_pb.rb | 118 + src/ruby/pb/test/client.rb | 769 + src/ruby/pb/test/server.rb | 252 + src/ruby/pb/test/xds_client.rb | 213 + src/ruby/qps/client.rb | 158 + src/ruby/qps/histogram.rb | 88 + src/ruby/qps/proxy-worker.rb | 179 + src/ruby/qps/qps-common.rb | 77 + src/ruby/qps/server.rb | 74 + src/ruby/qps/src/proto/grpc/core/stats_pb.rb | 35 + .../grpc/testing/benchmark_service_pb.rb | 15 + .../testing/benchmark_service_services_pb.rb | 56 + .../qps/src/proto/grpc/testing/control_pb.rb | 190 + .../qps/src/proto/grpc/testing/messages_pb.rb | 105 + .../qps/src/proto/grpc/testing/payloads_pb.rb | 35 + .../proto/grpc/testing/proxy-service_pb.rb | 18 + .../grpc/testing/proxy-service_services_pb.rb | 41 + .../testing/report_qps_scenario_service_pb.rb | 15 + ...report_qps_scenario_service_services_pb.rb | 42 + .../qps/src/proto/grpc/testing/stats_pb.rb | 54 + .../proto/grpc/testing/worker_service_pb.rb | 15 + .../testing/worker_service_services_pb.rb | 58 + src/ruby/qps/worker.rb | 121 + src/ruby/spec/call_credentials_spec.rb | 42 + src/ruby/spec/call_spec.rb | 180 + src/ruby/spec/channel_connection_spec.rb | 126 + src/ruby/spec/channel_credentials_spec.rb | 82 + src/ruby/spec/channel_spec.rb | 234 + src/ruby/spec/client_auth_spec.rb | 126 + src/ruby/spec/client_server_spec.rb | 664 + src/ruby/spec/compression_options_spec.rb | 149 + src/ruby/spec/debug_message_spec.rb | 134 + src/ruby/spec/error_sanity_spec.rb | 49 + src/ruby/spec/errors_spec.rb | 142 + src/ruby/spec/generic/active_call_spec.rb | 672 + .../spec/generic/client_interceptors_spec.rb | 153 + src/ruby/spec/generic/client_stub_spec.rb | 1083 + .../spec/generic/interceptor_registry_spec.rb | 65 + src/ruby/spec/generic/rpc_desc_spec.rb | 374 + src/ruby/spec/generic/rpc_server_pool_spec.rb | 127 + src/ruby/spec/generic/rpc_server_spec.rb | 748 + .../spec/generic/server_interceptors_spec.rb | 218 + src/ruby/spec/generic/service_spec.rb | 263 + src/ruby/spec/google_rpc_status_utils_spec.rb | 282 + .../grpc/testing/package_options.proto | 28 + .../grpc/testing/package_options_import.proto | 22 + .../testing/package_options_import2.proto | 23 + .../testing/package_options_ruby_style.proto | 41 + .../spec/pb/codegen/package_option_spec.rb | 82 + src/ruby/spec/pb/duplicate/codegen_spec.rb | 57 + src/ruby/spec/pb/health/checker_spec.rb | 236 + src/ruby/spec/server_credentials_spec.rb | 79 + src/ruby/spec/server_spec.rb | 209 + src/ruby/spec/spec_helper.rb | 61 + src/ruby/spec/support/helpers.rb | 107 + src/ruby/spec/support/services.rb | 160 + src/ruby/spec/testdata/README | 1 + src/ruby/spec/testdata/ca.pem | 20 + src/ruby/spec/testdata/client.key | 28 + src/ruby/spec/testdata/client.pem | 20 + src/ruby/spec/testdata/server1.key | 28 + src/ruby/spec/testdata/server1.pem | 22 + src/ruby/spec/time_consts_spec.rb | 74 + src/ruby/stress/metrics_server.rb | 68 + src/ruby/stress/stress_client.rb | 140 + src/ruby/tools/README.md | 12 + src/ruby/tools/bin/grpc_tools_ruby_protoc | 33 + .../tools/bin/grpc_tools_ruby_protoc_plugin | 26 + src/ruby/tools/grpc-tools.gemspec | 22 + src/ruby/tools/platform_check.rb | 39 + src/ruby/tools/version.rb | 19 + src/upb/gen_build_yaml.py | 55 + src/zlib/gen_build_yaml.py | 61 + summerofcode/2016/siddharth_shukla.md | 65 + summerofcode/2018/naresh.md | 191 + summerofcode/ideas.md | 36 + templates/BUILD.gn.template | 205 + templates/CMakeLists.txt.template | 774 + templates/Makefile.template | 1944 + templates/README.md | 154 + templates/build_config.rb.template | 19 + templates/composer.json.template | 25 + templates/config.m4.template | 67 + templates/config.w32.template | 61 + .../php/echo/apache.Dockerfile.template | 43 + .../php/echo/base.Dockerfile.template | 42 + .../examples/php/echo/cli.Dockerfile.template | 44 + .../php/echo/copy_from_grpc_base.include | 10 + .../examples/php/echo/fpm.Dockerfile.template | 43 + templates/gRPC-C++.podspec.template | 209 + templates/gRPC-Core.podspec.template | 243 + templates/gRPC-ProtoRPC.podspec.template | 90 + templates/gRPC-RxLibrary.podspec.template | 72 + templates/gRPC.podspec.template | 186 + templates/grpc.def.template | 6 + templates/grpc.gemspec.template | 67 + templates/grpc.gyp.template | 160 + .../include/grpc/module.modulemap.template | 58 + templates/package.xml.template | 382 + .../src/core/lib/surface/version.cc.template | 30 + .../src/cpp/common/version_cc.cc.template | 28 + .../Grpc.Core.Api/VersionInfo.cs.template | 45 + .../NativeMethods.Generated.cs.template | 102 + .../Grpc.Core/Internal/native_methods.include | 118 + .../csharp/build/dependencies.props.template | 9 + .../csharp/build_unitypackage.bat.template | 87 + .../grpc_csharp_ext_dummy_stubs.c.template | 32 + ...otoCompiler-gRPCCppPlugin.podspec.template | 119 + ...!ProtoCompiler-gRPCPlugin.podspec.template | 130 + .../BoringSSL-GRPC.podspec.template | 258 + .../objective-c/GRPCClient/version.h.template | 27 + .../src/objective-c/tests/version.h.template | 28 + templates/src/php/composer.json.template | 22 + .../src/php/docker/alpine/Dockerfile.template | 30 + .../php/docker/centos7/Dockerfile.template | 44 + .../src/php/docker/download_phpunit.include | 3 + .../php/docker/grpc-ext/Dockerfile.template | 32 + .../php/docker/grpc-src/Dockerfile.template | 45 + .../src/php/docker/pecl_ext_build_src.include | 6 + .../php/docker/php-future/Dockerfile.template | 32 + .../php/docker/php-src/Dockerfile.template | 54 + .../php/docker/php-zts/Dockerfile.template | 32 + .../src/php/docker/php5/Dockerfile.template | 32 + templates/src/php/ext/grpc/version.h.template | 27 + .../grpcio/grpc/_grpcio_metadata.py.template | 19 + .../grpcio/grpc_core_dependencies.py.template | 30 + .../python/grpcio/grpc_version.py.template | 19 + .../grpcio_channelz/grpc_version.py.template | 19 + .../grpc_version.py.template | 19 + .../grpc_version.py.template | 19 + .../grpcio_status/grpc_version.py.template | 19 + .../grpcio_testing/grpc_version.py.template | 19 + .../grpcio_tests/grpc_version.py.template | 19 + .../grpc/rb_grpc_imports.generated.c.template | 37 + .../grpc/rb_grpc_imports.generated.h.template | 44 + .../src/ruby/lib/grpc/version.rb.template | 20 + templates/src/ruby/tools/version.rb.template | 21 + .../test/core/end2end/end2end_defs.include | 69 + .../end2end/end2end_nosec_tests.cc.template | 4 + .../core/end2end/end2end_tests.cc.template | 4 + .../public_headers_must_be_c89.c.template | 62 + .../resolver_component_tests_defs.include | 147 + ...esolver_component_tests_runner.py.template | 4 + .../grpcio_tools/grpc_version.py.template | 19 + .../tools/dockerfile/apt_get_basic.include | 34 + .../tools/dockerfile/apt_get_pyenv.include | 23 + .../dockerfile/apt_get_python_27.include | 3 + templates/tools/dockerfile/bazel.include | 13 + templates/tools/dockerfile/buildifier.include | 4 + .../tools/dockerfile/clang_update.include | 30 + .../dockerfile/cmake_jessie_backports.include | 8 + .../dockerfile/compile_python_36.include | 19 + .../dockerfile/compile_python_38.include | 19 + .../csharp_build_interop.sh.include | 32 + .../tools/dockerfile/csharp_deps.include | 15 + .../dockerfile/csharp_dotnetcli_deps.include | 25 + templates/tools/dockerfile/cxx_deps.include | 3 + .../dockerfile/debian_jessie_header.include | 1 + .../dockerfile/gcp_api_libraries.include | 2 + .../dockerfile/go_build_interop.sh.include | 32 + templates/tools/dockerfile/go_path.include | 2 + .../grpc_clang_format/Dockerfile.template | 28 + .../grpc_clang_tidy/Dockerfile.template | 35 + .../Dockerfile.template | 23 + .../build_interop.sh.template | 44 + .../grpc_interop_csharp/Dockerfile.template | 26 + .../build_interop.sh.template | 3 + .../Dockerfile.template | 26 + .../build_interop.sh.template | 3 + .../grpc_interop_cxx/Dockerfile.template | 25 + .../grpc_interop_dart/Dockerfile.template | 20 + .../build_interop.sh.template | 28 + .../grpc_interop_go/Dockerfile.template | 23 + .../grpc_interop_go/build_interop.sh.template | 3 + .../grpc_interop_go1.11/Dockerfile.template | 23 + .../build_interop.sh.template | 3 + .../grpc_interop_go1.7/Dockerfile.template | 23 + .../build_interop.sh.template | 3 + .../grpc_interop_go1.8/Dockerfile.template | 23 + .../build_interop.sh.template | 3 + .../grpc_interop_http2/Dockerfile.template | 25 + .../grpc_interop_java/Dockerfile.include | 24 + .../grpc_interop_java/Dockerfile.template | 3 + .../build_interop.sh.template | 3 + .../grpc_interop_node/Dockerfile.template | 25 + .../Dockerfile.template | 23 + .../grpc_interop_php/Dockerfile.template | 23 + .../grpc_interop_php7/Dockerfile.template | 21 + .../grpc_interop_python/Dockerfile.template | 20 + .../build_interop.sh.template | 3 + .../Dockerfile.template | 20 + .../build_interop.sh.template | 3 + .../grpc_interop_ruby/Dockerfile.template | 25 + .../dockerfile/java_build_interop.sh.include | 45 + templates/tools/dockerfile/java_deps.include | 17 + .../tools/dockerfile/libuv_install.include | 7 + templates/tools/dockerfile/node_deps.include | 14 + templates/tools/dockerfile/php7_deps.include | 45 + .../tools/dockerfile/php_common_deps.include | 6 + templates/tools/dockerfile/php_deps.include | 11 + .../tools/dockerfile/php_valgrind.include | 5 + .../python_build_interop.sh.include | 32 + .../tools/dockerfile/python_debian10.include | 6 + .../tools/dockerfile/python_deps.include | 15 + .../tools/dockerfile/python_stretch.include | 9 + templates/tools/dockerfile/ruby_deps.include | 15 + .../tools/dockerfile/run_tests_addons.include | 2 + .../dockerfile/test/bazel/Dockerfile.template | 47 + .../csharp_stretch_x64/Dockerfile.template | 27 + .../test/cxx_alpine_x64/Dockerfile.template | 58 + .../test/cxx_buster_x64/Dockerfile.template | 26 + .../test/cxx_jessie_x64/Dockerfile.template | 31 + .../test/cxx_jessie_x86/Dockerfile.template | 31 + .../Dockerfile.template | 32 + .../cxx_ubuntu1404_x64/Dockerfile.template | 25 + .../cxx_ubuntu1604_x64/Dockerfile.template | 31 + .../cxx_ubuntu1804_x64/Dockerfile.template | 26 + .../test/fuzzer/Dockerfile.template | 31 + .../test/node_jessie_x64/Dockerfile.template | 39 + .../test/php7_jessie_x64/Dockerfile.template | 25 + .../test/php_jessie_x64/Dockerfile.template | 25 + .../Dockerfile.template | 17 + .../Dockerfile.template | 20 + .../Dockerfile.template | 18 + .../Dockerfile.template | 23 + .../Dockerfile.template | 19 + .../Dockerfile.template | 28 + .../test/ruby_jessie_x64/Dockerfile.template | 25 + .../test/sanity/Dockerfile.template | 51 + .../doxygen/Doxyfile.c++.internal.template | 4 + templates/tools/doxygen/Doxyfile.c++.template | 4 + .../doxygen/Doxyfile.core.internal.template | 4 + .../tools/doxygen/Doxyfile.core.template | 4 + templates/tools/doxygen/Doxyfile.include | 2404 + templates/tools/doxygen/Doxyfile.objc.include | 2396 + .../doxygen/Doxyfile.objc.internal.template | 4 + .../tools/doxygen/Doxyfile.objc.template | 4 + templates/tools/fuzzer/runners.template | 39 + .../run_tests/generated/configs.json.template | 17 + .../lb_interop_test_scenarios.json.template | 6 + .../run_tests/generated/tests.json.template | 32 + test/.clang-tidy | 6 + test/build/boringssl.c | 36 + test/build/c-ares.c | 32 + test/build/check_epollexclusive.c | 23 + test/build/empty.c | 19 + test/build/extra-semi.c | 19 + test/build/no-c++14-compat.cc | 19 + test/build/no-maybe-uninitialized.c | 19 + test/build/no-shift-negative-value.c | 19 + test/build/no-unknown-warning-option.c | 19 + test/build/no-unused-but-set-variable.c | 19 + test/build/openssl-alpn.c | 28 + test/build/perftools.c | 25 + test/build/protobuf.cc | 26 + test/build/shadow.c | 28 + test/build/systemtap.c | 25 + test/build/zlib.c | 27 + test/build_test/BUILD | 28 + test/core/avl/BUILD | 31 + test/core/avl/avl_test.cc | 300 + test/core/backoff/BUILD | 39 + test/core/backoff/backoff_test.cc | 181 + test/core/bad_client/BUILD | 23 + test/core/bad_client/bad_client.cc | 337 + test/core/bad_client/bad_client.h | 96 + test/core/bad_client/generate_tests.bzl | 56 + .../core/bad_client/tests/bad_streaming_id.cc | 132 + .../core/bad_client/tests/bad_timeout.headers | 2 + test/core/bad_client/tests/badreq.cc | 134 + .../bad_client/tests/badreq_2path.headers | 13 + .../bad_client/tests/badreq_algorithm.headers | 11 + .../tests/badreq_content_type.headers | 11 + .../bad_client/tests/badreq_encoding.headers | 12 + test/core/bad_client/tests/badreq_te.headers | 11 + .../bad_client/tests/connection_prefix.cc | 64 + .../core/bad_client/tests/duplicate_header.cc | 136 + .../bad_client/tests/head_of_line_blocking.cc | 140 + test/core/bad_client/tests/headers.cc | 341 + .../tests/initial_settings_frame.cc | 112 + test/core/bad_client/tests/large_metadata.cc | 175 + .../bad_client/tests/large_metadata.headers | 106 + test/core/bad_client/tests/out_of_bounds.cc | 112 + .../tests/server_registered_method.cc | 129 + .../tests/server_registered_method.headers | 12 + test/core/bad_client/tests/simple_request.cc | 173 + .../bad_client/tests/simple_request.headers | 12 + .../tests/simple_request_unusual.headers | 13 + .../tests/simple_request_unusual2.headers | 13 + test/core/bad_client/tests/unknown_frame.cc | 65 + test/core/bad_client/tests/window_overflow.cc | 103 + test/core/bad_connection/BUILD | 33 + test/core/bad_connection/close_fd_test.cc | 758 + test/core/bad_ssl/BUILD | 23 + test/core/bad_ssl/bad_ssl_test.cc | 163 + test/core/bad_ssl/generate_tests.bzl | 57 + test/core/bad_ssl/server_common.cc | 104 + test/core/bad_ssl/server_common.h | 27 + test/core/bad_ssl/servers/alpn.cc | 85 + test/core/bad_ssl/servers/cert.cc | 65 + test/core/channel/BUILD | 128 + test/core/channel/channel_args_test.cc | 213 + .../channel/channel_stack_builder_test.cc | 131 + test/core/channel/channel_stack_test.cc | 156 + test/core/channel/channel_trace_test.cc | 332 + test/core/channel/channelz_registry_test.cc | 153 + test/core/channel/channelz_test.cc | 568 + .../channel/minimal_stack_is_minimal_test.cc | 211 + test/core/channel/status_util_test.cc | 49 + test/core/client_channel/BUILD | 112 + .../core/client_channel/parse_address_test.cc | 118 + .../parse_address_with_named_scope_id_test.cc | 125 + test/core/client_channel/resolvers/BUILD | 92 + .../dns_resolver_connectivity_test.cc | 194 + .../resolvers/dns_resolver_cooldown_test.cc | 338 + .../resolvers/dns_resolver_test.cc | 96 + .../resolvers/fake_resolver_test.cc | 209 + .../resolvers/sockaddr_resolver_test.cc | 107 + .../client_channel/retry_throttle_test.cc | 142 + .../client_channel/service_config_test.cc | 1039 + .../02d156dc5e6f2c11c90c2e06fcee04adf036a342 | 2 + .../042dc4512fa3d391c5170cf3aa61e6a638f84342 | 1 + .../0e9bbe975f2027e8c39c89f85f667530368e7d11 | 1 + .../1155aa6ea7ef262a81a63692513ea395f84dad6f | 2 + .../13856a5569ffd085a4d5c07af5f8e9310835a118 | 1 + .../14b57bcbf1e17b1db1de491ef2ba3768f704b7dc | 1 + .../1794310671a060eead6e5ee66ac978a18ec7e84f | 2 + .../1d30b2a79afbaf2828ff42b9a9647e942ba1ab80 | 1 + .../1fcf5d9c333b70596cf5ba04d1f7affdf445b971 | 3 + .../23162c8a8936e20b195404c21337ee734d02a6bc | 1 + .../23f3198b815ca60bdadcaae682b9f965dda387f1 | 1 + .../2ef3893b43f1f60b77b59ce06a6bce9815d78eaf | 2 + .../356c3c129e203b5c74550b4209764d74b9caefce | 1 + .../396568fc41c8ccb31ec925b4a862e4d29ead1327 | 1 + .../3b1e7526a99918006b87e499d2beb6c4ac9c3c0c | 1 + .../3b58860f3451d3e7aad99690a8d39782ca5116fc | 4 + .../41963cc10752f70c3af7e3d85868efb097a0ea9c | 1 + .../47b5228404451fc9d4071fa69192514bb4ce33c1 | 1 + .../56a2da4b2e6fb795243901023ed8d0aa083d1aab | 1 + .../574c2f13858a9a6d724654bd913ede9ae3abf822 | 2 + .../582f789c19033a152094cbf8565f14154a778ddb | 1 + .../636c5606fc23713a1bae88c8899c0541cfad4fd8 | 4 + .../63fe493b270b17426d77a27cbf3abac5b2c2794a | 1 + .../655300a902b62662296a8e46bfb04fbcb07182cb | 1 + .../6ae3acd9d8507b61bf235748026080a4138dba58 | 1 + .../6b70979a70a038ff6607d6cf85485ee95baf58e6 | 1 + .../7314ab3545a7535a26e0e8aad67caea5534d68b1 | 2 + .../7ff4d8b8d1ffd0d42c48bbb91e5856a9ec31aecb | 1 + .../87daa131e0973b77a232a870ed749ef29cf58e6d | 2 + .../884dcaee2908ffe5f12b65b8eba81016099c4266 | 1 + .../8d7e944fd5d0ede94097fcc98b47b09a3f9c76cb | 1 + .../9671149af0b444f59bbdf71340d3441dadd8a7b4 | 1 + .../96c8d266b7dc037288ef305c996608270f72e7fb | 2 + .../975536c71ade4800415a7e9c2f1b45c35a6d5ea8 | 1 + .../99750aa67d30beaea8af565c829d4999aa8cb91b | 1 + .../a1140f3f8b5cffc1010221b9a4084a25fb75c1f6 | 1 + .../a1f0f9b75bb354eb063d7cba4fcfa2d0b88d63de | 1 + .../a296eb3d1d436ed7df7195b10aa3c4de3896f98d | 1 + .../a8b8e66050b424f1b8c07d46f868199fb7f60e38 | 1 + .../aba1472880406a318ce207ee79815b7acf087757 | 1 + .../af55baf8c8855e563befdf1eefbcbd46c5ddb8d2 | 1 + .../b3c0bf66c2bf5d24ef1daf4cc5a9d6d5bd0e8bfd | 1 + .../c28a47409cf5d95bb372238d01e73d8b831408e4 | 1 + .../c3ef1d41888063a08700c3add1e4465aabcf8807 | 2 + .../c550a76af21f9b9cc92a386d5c8998b26f8f2e4d | 1 + .../c79721406d0ab80495f186fd88e37fba98637ae9 | 1 + .../ceb4e2264ba7a8d5be47d276b37ec09489e00245 | 1 + .../cf4395958f5bfb46fd6f535a39657d016c75114c | 1 + .../d46668372b7e20154a89409a7430a28e642afdca | 1 + .../d6fe7412a0a1d1c733160246f3fa425f4f97682a | 1 + test/core/client_channel/uri_corpus/dns.txt | 1 + .../e241f29957b0e30ec11aaaf91b2339f7015fa5fd | 1 + .../ea02d9fea9bad5b89cf353a0169238f584177e71 | 4 + .../ec4731dddf94ed3ea92ae4d5a71f145ab6e3f6ee | 1 + .../ed2f78646f19fc47dd85ff0877c232b71913ece2 | 1 + .../f6889f4a6350fea1596a3adea5cdac02bd5d1ff3 | 2 + .../f6f3bd030f0d321efe7c51ca3f057de23509af67 | 1 + .../f97598cff03306af3c70400608fec47268b5075d | 2 + .../f9e1ec1fc642b575bc9955618b7065747f56b101 | 1 + .../fe0630a3aeed2ec6f474f362e4c839478290d5c4 | 1 + test/core/client_channel/uri_corpus/ipv4.txt | 1 + test/core/client_channel/uri_corpus/ipv6.txt | 1 + test/core/client_channel/uri_corpus/unix.txt | 1 + test/core/client_channel/uri_fuzzer_test.cc | 51 + test/core/client_channel/uri_parser_test.cc | 153 + .../core/client_channel/xds_bootstrap_test.cc | 301 + test/core/compression/BUILD | 112 + test/core/compression/algorithm_test.cc | 116 + test/core/compression/compression_test.cc | 349 + .../compression/message_compress_corpus/dummy | 1 + .../compression/message_compress_fuzzer.cc | 56 + .../core/compression/message_compress_test.cc | 354 + .../message_decompress_corpus/dummy | 1 + .../compression/message_decompress_fuzzer.cc | 56 + .../stream_compression_corpus/dummy | 1 + .../compression/stream_compression_fuzzer.cc | 52 + .../compression/stream_compression_test.cc | 301 + .../stream_decompression_corpus/dummy | 1 + .../stream_decompression_fuzzer.cc | 53 + test/core/debug/BUILD | 34 + test/core/debug/stats_test.cc | 159 + test/core/end2end/BUILD | 211 + test/core/end2end/README | 7 + test/core/end2end/bad_server_response_test.cc | 351 + test/core/end2end/connection_refused_test.cc | 146 + test/core/end2end/cq_verifier.cc | 310 + test/core/end2end/cq_verifier.h | 66 + test/core/end2end/cq_verifier_internal.h | 32 + test/core/end2end/cq_verifier_native.cc | 60 + test/core/end2end/cq_verifier_uv.cc | 97 + test/core/end2end/data/client_certs.cc | 522 + test/core/end2end/data/server1_cert.cc | 132 + test/core/end2end/data/server1_key.cc | 162 + test/core/end2end/data/ssl_test_data.h | 34 + test/core/end2end/data/test_root_cert.cc | 122 + test/core/end2end/dualstack_socket_test.cc | 365 + test/core/end2end/end2end_nosec_tests.cc | 676 + test/core/end2end/end2end_test.sh | 22 + test/core/end2end/end2end_test_utils.cc | 50 + test/core/end2end/end2end_tests.cc | 684 + test/core/end2end/end2end_tests.h | 83 + test/core/end2end/engine_passthrough.cc | 73 + test/core/end2end/fixtures/h2_census.cc | 130 + test/core/end2end/fixtures/h2_compress.cc | 134 + test/core/end2end/fixtures/h2_fakesec.cc | 153 + test/core/end2end/fixtures/h2_fd.cc | 124 + test/core/end2end/fixtures/h2_full+pipe.cc | 124 + test/core/end2end/fixtures/h2_full+trace.cc | 139 + .../end2end/fixtures/h2_full+workarounds.cc | 124 + test/core/end2end/fixtures/h2_full.cc | 110 + test/core/end2end/fixtures/h2_http_proxy.cc | 133 + test/core/end2end/fixtures/h2_local_ipv4.cc | 70 + test/core/end2end/fixtures/h2_local_ipv6.cc | 70 + test/core/end2end/fixtures/h2_local_uds.cc | 72 + test/core/end2end/fixtures/h2_oauth2.cc | 250 + test/core/end2end/fixtures/h2_proxy.cc | 137 + .../end2end/fixtures/h2_sockpair+trace.cc | 168 + test/core/end2end/fixtures/h2_sockpair.cc | 140 + .../end2end/fixtures/h2_sockpair_1byte.cc | 154 + test/core/end2end/fixtures/h2_ssl.cc | 179 + .../end2end/fixtures/h2_ssl_cred_reload.cc | 209 + test/core/end2end/fixtures/h2_ssl_proxy.cc | 234 + test/core/end2end/fixtures/h2_tls.cc | 311 + test/core/end2end/fixtures/h2_uds.cc | 115 + .../end2end/fixtures/http_proxy_fixture.cc | 667 + .../end2end/fixtures/http_proxy_fixture.h | 43 + test/core/end2end/fixtures/inproc.cc | 96 + test/core/end2end/fixtures/local_util.cc | 112 + test/core/end2end/fixtures/local_util.h | 41 + test/core/end2end/fixtures/proxy.cc | 448 + test/core/end2end/fixtures/proxy.h | 43 + test/core/end2end/fuzzers/BUILD | 47 + test/core/end2end/fuzzers/client_fuzzer.cc | 161 + .../001946397b463a3562c5951f6325069d8a3a2ded | Bin 0 -> 14 bytes .../0083d5addbeca55271ed7ef93c8016bf7ca76903 | Bin 0 -> 249 bytes .../00c8446b230bebbae2b473552b174a06b446337a | Bin 0 -> 60 bytes .../01b05a9eaa95950f697627264bbd5006060f68e5 | Bin 0 -> 639 bytes .../01c9569f5835a576fc50ea03141662c7ef1aa088 | 1 + .../025215e11687c7d2e0055e5b2b902d08e0436f78 | Bin 0 -> 11 bytes .../02ba99615d1d69eb328adce99670f659959c1bc1 | Bin 0 -> 391 bytes .../03abf728ac1d833c2d4a9ff7e0c912b949edc04c | Bin 0 -> 181 bytes .../03beeae554ed6952e94a0bf32cdbe9f97eb3ba43 | Bin 0 -> 38 bytes .../0458afa7b507195f5d2cb51e887324d6361eb0c4 | Bin 0 -> 323 bytes .../04bef86965e816c0cd330896ecd981dd3b14275c | Bin 0 -> 303 bytes .../050b79c8bf73ec690aca18072cdf95810c2efe8f | Bin 0 -> 266 bytes .../05b4eaa1e1a759aa6b23521c06d915174e8fec88 | Bin 0 -> 37 bytes .../05cfa5deaead322efce84b710758a24440cef16e | Bin 0 -> 64 bytes .../07048654244e377ddf246e8cc18f71443035cd2b | Bin 0 -> 66 bytes .../078232947d7ff25557e836b4e9e907214e99b320 | Bin 0 -> 12 bytes .../07b0bed3226eefac4a84000ec584e4ce06ebf1bf | Bin 0 -> 524 bytes .../07c4d3b37e850941d04ee067fcd356cf9bb4e0d7 | Bin 0 -> 1110 bytes .../07cec5c8d9c856a910c6fb57da2ae954f44beed0 | Bin 0 -> 52 bytes .../08a8a647b6a8f47ae10852322d14832fc15021f1 | Bin 0 -> 95 bytes .../0949f4ac376808482be6ab2dcb18a2ecb08d9a52 | 1 + .../0b6fa6330bce65dfe7f758bcbfca2a2844dd07a6 | Bin 0 -> 67 bytes .../0c0169947924a15b1b5fbe8f9013fd94d1931a36 | Bin 0 -> 51 bytes .../0c27c9999302b39bf2256a90b0cdb767fb2b6fe3 | Bin 0 -> 224 bytes .../0c30868720d5e1a19ff23c53740749c37a43540d | Bin 0 -> 22 bytes .../0c5e0660ddf5f14af8f3fbcc754a967506994c9b | 1 + .../0c6f2e0a2232788cb20c4f52ffa18d7ab8f0b938 | Bin 0 -> 50 bytes .../0d36da88698737ec1ca7b55b30fe2b2036de7e19 | Bin 0 -> 16 bytes .../0d407f099f8418de3dd94bd2146c858a8c6575ad | Bin 0 -> 22 bytes .../0d4d486aa9fd6e9c10cc9ca8967e922cadddb2fe | Bin 0 -> 305 bytes .../0d8c547f1d261ba07c2648bae009636c17709600 | Bin 0 -> 167 bytes .../0d9ba07b57eb0e076b187c4455f662db085e730b | Bin 0 -> 147 bytes .../0dd33527db106a3e84172e8f2189734b00ced4ed | 1 + .../0e354d89d02c6c5cbba2f140dab7b609bf00793e | Bin 0 -> 330 bytes .../0e3a18f0f08dcb9dd174627bc997f74a5c7a1390 | Bin 0 -> 63 bytes .../0f6b989cec08ef9da603dc83704d85900bd22f1f | Bin 0 -> 326 bytes .../0f7480eb0099b7706b221f610d2613b401d6d3eb | Bin 0 -> 653 bytes .../0f83cbec19c834f534f353f4fce20c0cd88231f5 | Bin 0 -> 435 bytes .../0f98d7d56e9a99b97e5dc7eb122ef22e9684077b | Bin 0 -> 362 bytes .../0fd8859246740606c498755ab00d6147abcfec00 | Bin 0 -> 378 bytes .../100bb8f2e6a0b41da13f4edb5c15d4a04e564840 | Bin 0 -> 45 bytes .../101305ccd08c7a8bd0c2913c37d3dd0d39d4bb64 | Bin 0 -> 70 bytes .../10b25b0726cb6d820165699e5a453691c7a9c343 | Bin 0 -> 51 bytes .../10f5d1937cb068fee7f85e2654be2bfe77498bb9 | Bin 0 -> 33 bytes .../110074f658208166d52897c9266fc46cbaa8af36 | Bin 0 -> 422 bytes .../1160214cdb23e8fc187078a8d6796656c1ade925 | Bin 0 -> 294 bytes .../118ffddb43ccf9dae8bdb4702232d1dc39b021f7 | Bin 0 -> 384 bytes .../1231c6d007d9e43d169122348363e20d9f25ee93 | Bin 0 -> 136 bytes .../1306c4c6ea714d4db0e4d814c944d8d40335e0fa | Bin 0 -> 344 bytes .../13a9b61e431c20734c19bb36d85883b6a501284e | Bin 0 -> 15 bytes .../1402bbcac6fa24eeb0475250e33f704096e2fb45 | Bin 0 -> 184 bytes .../143e0d4f546bbb984a7c3ac1c60a37dcf85ea58d | Bin 0 -> 305 bytes .../1526ac4266e152b029b7c283255fe4fb6507f726 | Bin 0 -> 1153 bytes .../1576c915ee38f5bd19f285ed0ed47e36026518f2 | Bin 0 -> 64 bytes .../15c8bfec99ff18b11211d464c824fc139cc791fd | Bin 0 -> 51 bytes .../1602788cf33d0354d6d48ead549e5137cd211979 | Bin 0 -> 138 bytes .../1698ec182fad9d973b84615da3a683ecdf2d0b3b | Bin 0 -> 38 bytes .../169f579e66b4b8ff423891a40380e648e8d45247 | Bin 0 -> 62 bytes .../16c85fba7b4510ac26c0fb91886d8bd166a7e780 | Bin 0 -> 442 bytes .../175f16901997fdee41ac9ec88f7e018d46d774e7 | Bin 0 -> 257 bytes .../17b1758fc7cd69a00d140f113b1ac894023ff20b | Bin 0 -> 161 bytes .../18185cbf9e9cfc1fd28d27ed0d651d7cee6a2c06 | 2 + .../1859e2ee759e20fe195f67615a1576ce2b7d5bbd | Bin 0 -> 74 bytes .../1875a4acdcffe505ca92ea8af8d9d6b174736e80 | Bin 0 -> 300 bytes .../18850965807039500c7f5450a907e86825cf823d | Bin 0 -> 113 bytes .../18926cdc608599e8df6b0f4df99d4ad856ef4373 | Bin 0 -> 201 bytes .../1965cd58fc41578a837231c69075994da2e871d9 | Bin 0 -> 64 bytes .../19876f91bd6e71eb4caf6748425ac645f3e73c5d | Bin 0 -> 1858 bytes .../19e984af62c36fe982284c87421d8ee46173e9f0 | Bin 0 -> 56 bytes .../1a9017db5ad8a9dc6cfe72305da1683a87a73452 | Bin 0 -> 511 bytes .../1aee32faadffa3c2ec508e8fd30006423665488f | Bin 0 -> 184 bytes .../1ba08b63181066ffab948eb301a6a2363a81872d | Bin 0 -> 384 bytes .../1bd90335afc9e0a1e6a9296e3cc27c03c1201886 | Bin 0 -> 51 bytes .../1be157b0fc79f0e7e1e05dfa3cbbe1ad71528bc2 | Bin 0 -> 52 bytes .../1c222dae4e2cde1fca9f9bf6226200f70d625342 | Bin 0 -> 294 bytes .../1ca51ab2fefef4f549c4a8e7f4910c6b5a4b4b1d | 1 + .../1cbcaad71950c62d41bab50f9c242d014cc0d904 | Bin 0 -> 384 bytes .../1d19042e6db2a90c52fcc3cb0aa76f2fd335014e | Bin 0 -> 178 bytes .../1d458954e8174bbb5dd4d0053df47d6b7adf290a | Bin 0 -> 51 bytes .../1dc86d0febe4adc5353230cea24b5f7cce829283 | Bin 0 -> 665 bytes .../1dfbb6d67ad8d2513a1841ca6f82faacc3783b61 | Bin 0 -> 948 bytes .../1e64080289ea4168304417f3fbd86b01d7d6f431 | Bin 0 -> 229 bytes .../1e84d42fcf18bbf81ef6e8a16a0c57abbf8d292a | Bin 0 -> 35 bytes .../1f040e756f76357979f317e0c6541f72fd93df06 | Bin 0 -> 39 bytes .../1fe7d16ffc2084d5d3c5f23d16902ae8810a5393 | Bin 0 -> 185 bytes .../1ffc4952225dda41de59603e487ff7fd3026b958 | Bin 0 -> 31 bytes .../20216d27af2b3dcc83d944e5f7a489ed2eff98fd | Bin 0 -> 157 bytes .../204093594b568ada9c7857a971f2a4b42123ee1c | Bin 0 -> 51 bytes .../20539e464ced1a0a63d74bae731ca0a75db05967 | 1 + .../205cf2b6994f10b783aa0a06938a5e47cb581126 | Bin 0 -> 99 bytes .../207e12d6a84dc8fa020b3a60b3f75932ca4f8fa5 | Bin 0 -> 178 bytes .../2086f83879663d7fd7fbd9a5b96ab6b5a555858e | Bin 0 -> 549 bytes .../20ea73876cc9cd5b3d3efa1bda21deb5eac2d61e | Bin 0 -> 32 bytes .../20ee437b7f456ebb19d98d94d9feb1d5e9174c65 | Bin 0 -> 142 bytes .../20f43d29547f865e9832fd567c2a5a5899512c4d | Bin 0 -> 862 bytes .../2166c7093c424a2136c4cb8b10d0b124047320d4 | Bin 0 -> 420 bytes .../2185f411bdb1edc610f16ffc86836ae366193e03 | Bin 0 -> 690 bytes .../2197f63b9ae90f5374726d0c5b252e729014a9cd | Bin 0 -> 1012 bytes .../21a6a133f3d1e06c077032ba56a7df4161f62efe | Bin 0 -> 67 bytes .../224fa2e83fd8ecaa9059ad37a55238f74b8e0829 | Bin 0 -> 194 bytes .../22661803bd1c7198df4be6e08924ef6a48af9cd4 | Bin 0 -> 760 bytes .../22741b8aa6129655a8130305da40ae1d1500b844 | Bin 0 -> 1070 bytes .../230527b90b0179139c961aca426187893191fdf2 | Bin 0 -> 67 bytes .../23066692f06a4802954b513a98546b3ac9b9ab85 | Bin 0 -> 184 bytes .../23e8c1377addaf67019ea36a084e0b68ca7a33db | Bin 0 -> 24 bytes .../2467fa0f8a9f4bd121f544892f0782498b2df533 | Bin 0 -> 422 bytes .../246dcf347eba7f4d4e04d97dabc002f0acf2164e | Bin 0 -> 50 bytes .../252de25a5237c830ad8c5e4732c176e03785042b | Bin 0 -> 67 bytes .../25761748660a64111a8daa46f72ea1f336c2046a | Bin 0 -> 294 bytes .../2585dc7b6c095e978b56e0249fe9b5c61a4840af | Bin 0 -> 64 bytes .../25949b623930511f9d43fea4aa56a4389a28e11a | Bin 0 -> 98 bytes .../25d2969baf8bd256e15b2ab72707682b2d18b40a | Bin 0 -> 480 bytes .../26110f21dcb0fde99942e631366ebbd9d895860d | Bin 0 -> 591 bytes .../2663ce44ca5832381cbbdf7b252e39d6df021a93 | Bin 0 -> 51 bytes .../269afce3bfff993c05c2a3b28c6cf3dfb3f461d7 | Bin 0 -> 24 bytes .../26b8a9d27cef1ce4c3c5aefa2dee50001aab4b13 | Bin 0 -> 67 bytes .../26f250ae38865f030176a8801ce992536351a326 | Bin 0 -> 808 bytes .../2717067bbc0e9bfc1d90d15cddf6154800a25ec6 | Bin 0 -> 337 bytes .../27bb1ffec59d4475dd9076b408b2cc4e4e17d229 | Bin 0 -> 1011 bytes .../27f37037525aac7a41ffbadd6ce52e5a1851a2b7 | Bin 0 -> 69 bytes .../2825cfc19c9371f4fe70851283c68d49470d4d55 | Bin 0 -> 440 bytes .../2862adc802092f1a422416a1666a5142f71d5d7f | Bin 0 -> 13 bytes .../28680d04887f96a1167dd913573ec8daa2a39625 | Bin 0 -> 59 bytes .../289cdf83f89f70a13e9078259f764a339617c827 | Bin 0 -> 51 bytes .../28ee8cae75efa07da9649933a9482d00643b5395 | Bin 0 -> 22 bytes .../28f54e558b181e294e101447c7a79d976fe36fcb | Bin 0 -> 64 bytes .../29303c16f3afa18c2c0b84e77e587535a705a74c | Bin 0 -> 52 bytes .../299034b9e0cc8d91c049c489dca6d1a2b8b08959 | Bin 0 -> 32 bytes .../29952a15459cce9c647255ab5d7486df0507eff4 | Bin 0 -> 9 bytes .../299faa82b90ef12421d160148dfb6cd0077b57c0 | Bin 0 -> 737 bytes .../29be7d33920998bae7329d77d4c81989eae91647 | Bin 0 -> 535 bytes .../2a8260b23460f90f770cedcafa14868d24db201e | 2 + .../2b230a7b55b17f2f8e89c4be73a662d781f7fb3c | Bin 0 -> 1476 bytes .../2b5eb5aac77af905877bd98ec2c4d746b247abb6 | Bin 0 -> 51 bytes .../2b71439e9ebf611a92386b9f21ad44bde7926184 | 2 + .../2c1c3047f9ca95e64cb158c09eac2ba17455e918 | Bin 0 -> 387 bytes .../2c1ecf05c5dde692ed16502294e9570ac3b02600 | Bin 0 -> 22 bytes .../2c342f8715556398d49bcf3343b5a249d968e19e | Bin 0 -> 188 bytes .../2c452818a10ddef09b90c89a53db14b9b56b21f3 | Bin 0 -> 52 bytes .../2c6e69067c68c145dc5d3a60b86d8081fdf95d0d | Bin 0 -> 64 bytes .../2c79128c697b53256c56b9c57c7259866e0e2347 | Bin 0 -> 67 bytes .../2cc43573f271ecd332551c1fb34ebc8645eaefe8 | Bin 0 -> 735 bytes .../2d83097b3cbd2245b085e749fe923fb590790e0c | Bin 0 -> 385 bytes .../2dce4a1fc4bb00bfcd43d549a3785913c9280369 | Bin 0 -> 84 bytes .../2deb1aeb93c2abca4177b1fe886eb354c83fe8af | Bin 0 -> 113 bytes .../2e888bda20346a2e19379e72ff04aa063897bf0c | Bin 0 -> 554 bytes .../2e9860242d55a74cec244bb5c5445eb2797a3157 | Bin 0 -> 153 bytes .../2f288409c5f3cf2a10b3e1970a9c3d037dabe080 | Bin 0 -> 364 bytes .../2f5f6d281a3d0473a04a17cbcbc6fd06cb73fd8b | 2 + .../2feb41037f5dd34e9f3465a2fbf1a6d355c8ce9d | Bin 0 -> 328 bytes .../300998021c7f743ff49d9cc192343ffd43eb47f2 | Bin 0 -> 147 bytes .../301e10bb6d9f60d91efde4e0c48893203a5b8b88 | Bin 0 -> 376 bytes .../302a11eb9b9687464b88c9a670da371f6a6c57e7 | Bin 0 -> 63 bytes .../3104e3fcf2fe43d5a748772a04ae32a1c828e6d9 | Bin 0 -> 273 bytes .../310b2aff5e2ec78b6004630bed39d49f8d13bb21 | Bin 0 -> 37 bytes .../3128887b8e02f1873ed6b36766a870543269ea00 | Bin 0 -> 21 bytes .../31545e9fe4c6aa43329dc0d4a735842574fcaaed | Bin 0 -> 21 bytes .../31d12a2b1378120d15b4097371d792daa95de0a9 | Bin 0 -> 57 bytes .../320dc10f64b59b0eb0ae140912eded1ef9276556 | Bin 0 -> 24 bytes .../3233f2ab3b6c9431289ef7dc4f40676d0128bcad | Bin 0 -> 806 bytes .../330dd22142ff48078b189f4533ccc56878d88f92 | Bin 0 -> 826 bytes .../3336748264594689041e4080b51bc56f716d0689 | Bin 0 -> 58 bytes .../333d0554d91872e693d118d6988132d95b7920ae | Bin 0 -> 15 bytes .../337d579ab5eb157d7d58e9287d447976062cbd8d | Bin 0 -> 64 bytes .../33c32a80db0ec311ee8744991c5b19345bfd8fe9 | Bin 0 -> 15 bytes .../35fbd748458e3fd6068957d46a9fbb2b0113d2b3 | Bin 0 -> 22 bytes .../3608078afee69879bcdbc2278e6f314469426bde | Bin 0 -> 1310 bytes .../361c6f4374443671f039fd9659577e4460178020 | Bin 0 -> 139 bytes .../3656614c7b0dc11d4dd7e1826f77fa96a88c420f | Bin 0 -> 1115 bytes .../368c75135a7341a96627d0dcfc4b2081003d8979 | Bin 0 -> 69 bytes .../370b2c16cc353621091eda4964d4c4329205ffc3 | Bin 0 -> 141 bytes .../370f893353f792c99754ece93baed2105decd71e | Bin 0 -> 52 bytes .../375c2462d6ae891222686f9519294811fa5de010 | Bin 0 -> 153 bytes .../379b177d55b1eb86ddb66dc3a037fd8283ee07c0 | Bin 0 -> 12 bytes .../37c4aa3ff3947065ea7850574a82a29af35c1a39 | Bin 0 -> 505 bytes .../3a01c85934363bd2067f76d0d40c491f9f846c8a | Bin 0 -> 10 bytes .../3a3eb65d51f30f4cd16cc6f8436a5b00702a5712 | Bin 0 -> 64 bytes .../3ae87e3150628c422ada13002b08f2d9c5a9d78e | Bin 0 -> 178 bytes .../3afbc4c35885b79c6e6628afce93ce852d7767de | Bin 0 -> 181 bytes .../3b3b4f9a985ec49f6c54bae798208625e5adb777 | Bin 0 -> 77 bytes .../3bb052abecc1b916cc869b9aad29c9dd55a95068 | Bin 0 -> 759 bytes .../3c01b1f89d50fa37fcb3457cd3dd6502fe84e25b | Bin 0 -> 16 bytes .../3c5fa483ebfabe6e684831ce7c413176bc998c33 | Bin 0 -> 254 bytes .../3c6444b64ace5cd6c145614ad4412382271a6120 | Bin 0 -> 360 bytes .../3c7b516e302ad3503a933b5dcfb8c58acaea07a0 | 2 + .../3d4d961511c1de95a81b129f2fe96390209de2e7 | Bin 0 -> 415 bytes .../3da7577acd806e1d92d48211b22fd9db352fd834 | Bin 0 -> 14 bytes .../3dec1981e8677ec6ad2517feba29869d53f8d884 | Bin 0 -> 301 bytes .../3e8f531043a07df2280bca73fe4a7987d82ce67e | Bin 0 -> 64 bytes .../3fc7331ba0cf4e65fd120c9925ec0134fe683b22 | Bin 0 -> 25 bytes .../3fcc2da89f438b247cb5b4b41e15aceccfa75b36 | Bin 0 -> 47 bytes .../400e6759ebf559748bde92047368f7c612457edd | Bin 0 -> 234 bytes .../4040224f3df361afe45bce682d56d26f13829413 | Bin 0 -> 12 bytes .../4045d25f065bb1d70a8b9c3751f7453d4b0625b9 | Bin 0 -> 307 bytes .../407cedf992b14edac6e19f7d440ab73c88e72465 | Bin 0 -> 115 bytes .../40948412b61caddaf558a73661caa8c1d2f858a4 | Bin 0 -> 818 bytes .../4097094277bc09981f428280fc0cc0f590f20ded | Bin 0 -> 51 bytes .../411966ea7d9164fc432eeab55a55248ad808bb01 | Bin 0 -> 108 bytes .../415dde26637ed3c0e803111c532a1a9ea9c49092 | Bin 0 -> 53 bytes .../41aad2f11a7ab418213352e84de872d9997db8d2 | 1 + .../41b499e86caed7b48c59aaaf51360c3c71029400 | Bin 0 -> 48 bytes .../42554ddbe59429d30d718282ca606ed8b5a90eb3 | Bin 0 -> 416 bytes .../42c395ab373346fb283ace021bdc1f6428f92f80 | Bin 0 -> 303 bytes .../42ead79c94eccdf8a8c3d8036be73e14fa260dd5 | Bin 0 -> 64 bytes .../43202ad9b1a689d919ab9ae91c2d0223394867bf | Bin 0 -> 42 bytes .../438789ebe8a5d676f6f03ef8329c3d77579aeba4 | Bin 0 -> 5 bytes .../44153f8b7af5a3b27625a46af89e1712daa3ae8a | Bin 0 -> 55 bytes .../4492f9d9339873fc83bf248e392b0dcbe28c0f6f | Bin 0 -> 802 bytes .../44b6be630161765a3de5872629602ca14789c3bd | Bin 0 -> 19 bytes .../44d64196fb2e8d9506734a81304f6ef17b9bc29d | Bin 0 -> 13 bytes .../44f0973ec77d6fb9eac931e84fa7ec6fdadccca6 | 2 + .../450f9f56c80c8b71e37302a254ba7c3f7298dfd7 | Bin 0 -> 10 bytes .../451e69ab65e0fe0a5731622ed21ab2b5380df677 | Bin 0 -> 34 bytes .../46dcb1c399e5a514267fbbd5a50939f34e0ad6be | Bin 0 -> 160 bytes .../4740e1ad2320dc991596716087180e2965a38863 | Bin 0 -> 607 bytes .../47e8aee44c2c7bd870f15b50fc085c5a8030edfc | Bin 0 -> 51 bytes .../48521eae3d7e3f60237d1ed792a3c0f141919a19 | Bin 0 -> 913 bytes .../489e9830136adcc53f4b191199c33504685b3737 | Bin 0 -> 41 bytes .../48a3f2938fe5c8e383cbb028a36a943a64800f03 | Bin 0 -> 66 bytes .../49112bf1277d93601eb6526fe9ee9d45864d759e | Bin 0 -> 45 bytes .../49c5568cb0de363bc9f9298f1eacaace6c8a268a | Bin 0 -> 70 bytes .../4a11af9ef42aeb36691185520be281c4760ad27b | Bin 0 -> 403 bytes .../4a4553c2e939cd50981bc38e8ddb1f2109ddb3a4 | Bin 0 -> 444 bytes .../4b2ce115b15082ed951f4dc0b432da6a9d37bf85 | Bin 0 -> 48 bytes .../4b585eb75ebca2187c0aa5a6abe4c8125aa80127 | Bin 0 -> 270 bytes .../4b611a3748757e2fa89fcd2fb22d34444fbf5b42 | Bin 0 -> 31 bytes .../4bed84590a55b06d7eb30d8faa4b00a881ba9b2c | Bin 0 -> 318 bytes .../4e05d6cf1c3f0c04f6ee92d09a53ee0fe35c085a | Bin 0 -> 64 bytes .../4e21c4b5c454df51c102f09ea1ba78c42133ee16 | 1 + .../4eaff3c3515a1ca019d46b9be0b7318eaffb63d1 | 1 + .../4ec113a0126fc5746fa3f955727d009040e8377f | 1 + .../4f5b9d5c707a35084918c272efd1295d301ca0b5 | Bin 0 -> 392 bytes .../4f8b5b7489cca36225acec0f9aa7f5c556d79d8d | Bin 0 -> 35 bytes .../4fc34239f220392581520aa8cebc659daa65a7a6 | Bin 0 -> 135 bytes .../50ece7ea16659b4e1a2284cea963fab662c19e6b | Bin 0 -> 362 bytes .../514c9cd7b6519b596900d924ff2caa173d688f4b | Bin 0 -> 58 bytes .../51c6c5297acebf9d21a8a7d6261d0a17c2adfb56 | Bin 0 -> 444 bytes .../52939682304314f04897deddfbc9c7afa8ee50a9 | Bin 0 -> 747 bytes .../52c00bde7f4af95a86deb0a6717d1faf2828a939 | Bin 0 -> 145 bytes .../5323af7bd1b45a816c8f8e5c689f5a44fbb14a01 | Bin 0 -> 296 bytes .../534c900ade27c8f7fccb1f3b7e7703f77f13a8f5 | Bin 0 -> 398 bytes .../5360327e8bc8969f31b364df3081b51a1e03900c | Bin 0 -> 32 bytes .../5369926a559827d08bccf264876d592c7cae660d | Bin 0 -> 137 bytes .../53ef530f65b0cff2e338a51b469c224f53b628d7 | Bin 0 -> 51 bytes .../542c958c84d1e319b9ba23c52de2c4bca08a8dc7 | Bin 0 -> 75 bytes .../54555ceac4403855f4cf20367f7be05714c46c51 | Bin 0 -> 486 bytes .../5482dc4af170def9c183315efaa48f9c186926a1 | Bin 0 -> 151 bytes .../54d1bf3559344653a4f758f7360c46307cdad159 | Bin 0 -> 574 bytes .../54e67ed1036f3f5b315e0e3c02948c30eba900fd | Bin 0 -> 115 bytes .../55ca8f6d9928c239a7abb32554463e6e1e1ee084 | Bin 0 -> 21 bytes .../560c1057487e6b0d2d457748c3ad8434423eb263 | Bin 0 -> 222 bytes .../564f203f678fb333c7b1f8f4df79237589ce346d | Bin 0 -> 108 bytes .../569d50f1d1307e63a549a8a8fa677c2a77acc0ac | Bin 0 -> 64 bytes .../56b0ac0636c57838f63415082b3ae2ec7a93f017 | Bin 0 -> 472 bytes .../570ca8d2555dde94aa3b3121e8f5256e83eabe5e | Bin 0 -> 16 bytes .../578ef036a0278e79f7b935293be37bc8c0467269 | Bin 0 -> 493 bytes .../57e7cb796ac65d2e3ea2255b162da4b9873c83f4 | Bin 0 -> 136 bytes .../57ee6efc38f4c544a3ea3e5e73987e825bdf2980 | Bin 0 -> 442 bytes .../5821752bf8923fdaebc8484662624d8acd382716 | Bin 0 -> 21 bytes .../58a067ec6eda7191a5a910d8120633271d3af074 | Bin 0 -> 10 bytes .../58bcbd601894835bb3312d2a0bc56f2e0f65984c | Bin 0 -> 57 bytes .../58d6dffb65a1fe1bc4e3fa970a15459587a32f77 | Bin 0 -> 35 bytes .../58f6d7756d89ac2eaebb50c6d1d0b9f5fa0ce357 | Bin 0 -> 523 bytes .../591d46b83d2e6babc0ce3c753c4606a10c46d7ce | Bin 0 -> 1565 bytes .../591ef436ef8cc982b48fd827a4555b57cd9780e5 | Bin 0 -> 179 bytes .../593792bfb0489b02828c93278cf869e6fc8bc230 | Bin 0 -> 67 bytes .../598d346f284bcff26d1de997c4ba5c4794c90b68 | Bin 0 -> 37 bytes .../59d28886db21f371ac9d999b68b116bcf425d971 | Bin 0 -> 10 bytes .../59d78f6397f0483d139f5bd0a9f264156f34acc4 | Bin 0 -> 334 bytes .../5a2447fdfdbf123f4592c1284007b7d50a01750b | Bin 0 -> 287 bytes .../5a52d683c9342dd301b0e699db36175aad715e1d | Bin 0 -> 1125 bytes .../5a8cbd42a033b7899383d48c3929e517dafbb995 | Bin 0 -> 62 bytes .../5b7ff7c113c2bcf125271d22c937f758a0cd2ee4 | Bin 0 -> 1089 bytes .../5c14b48da74ab06b3cc20c4fe355e24f7dd7852a | Bin 0 -> 332 bytes .../5ca233a53e3e425cc12e04b466a49789291eaa00 | Bin 0 -> 358 bytes .../5dc7b2086a39f56d8b9135f524d34a01fcabafd8 | Bin 0 -> 479 bytes .../5de72e607205dc17a45df703ec4e9b63c36821ec | Bin 0 -> 83 bytes .../5e1659e7cd840ab3f958273ebffdd215f2c81da6 | Bin 0 -> 292 bytes .../5e25cf639ba8ea37543d944f5efa94824c6272ff | Bin 0 -> 217 bytes .../5f247d7b6753f7a8798cf952f49f303c532e017c | Bin 0 -> 135 bytes .../5f3fc3d381f07c2593cd70d9889182fe67ded2cf | Bin 0 -> 447 bytes .../605e474e9d9436488dfe084d348908e4dfab81a3 | Bin 0 -> 12 bytes .../6066fc9e28b4ce704230f0e8cf21e7c3195aa2a3 | Bin 0 -> 165 bytes .../607dac8012f188cb035b189fc3637028137023e0 | Bin 0 -> 52 bytes .../60ece7fac04e244655a6091a7fc6eb76f07c7192 | Bin 0 -> 1390 bytes .../611343a6b8879b393ba2f38ed41c7f5355355920 | Bin 0 -> 156 bytes .../616e55354ba3517ce6762d6cd56600f97915e646 | Bin 0 -> 638 bytes .../622d46854c2d38b5fe632649d58a69b7da0803c0 | Bin 0 -> 479 bytes .../629dd62ac0c44a5bb49a5b4b5e4d3f15852a0991 | Bin 0 -> 309 bytes .../62c843359941660da3fc9eea62a5732aaa3be283 | Bin 0 -> 110 bytes .../6353376941f932ad6ea7620be8673c27ec106aba | Bin 0 -> 266 bytes .../636a19b8f50c4efccccea83ab78a933d999e41fa | Bin 0 -> 300 bytes .../63a1cb41d219394c9bab947202921506f3574ad0 | Bin 0 -> 690 bytes .../64696e93ead18265cdac3fb37dae29ad3be6d764 | Bin 0 -> 68 bytes .../64af31c3b16ccf2e182998ef7739bc3d33781d8f | Bin 0 -> 234 bytes .../64c0e0b4d9c2d25fdcb1e2bdcb999487fc096dad | Bin 0 -> 384 bytes .../64cad305e1858eae27cd723778fb9f4b7052eaa5 | Bin 0 -> 120 bytes .../64d27dc9f984c49d421a5b0cb0391992d5aac1a4 | Bin 0 -> 114 bytes .../650f74738d3961af2d1fe85ad8fc8212ea13cbbf | Bin 0 -> 306 bytes .../653ec14661c40ea25bdbab4a7cb9371c669d10d9 | Bin 0 -> 124 bytes .../65c7a3ead9676f7669f0e93c432af714c232e5d1 | Bin 0 -> 184 bytes .../65cc92868683dcf3c5d1bd1a73db9473d6594bcf | Bin 0 -> 864 bytes .../65dff388749da6a44926b491cdc555f61d708171 | Bin 0 -> 265 bytes .../66145518601b1405361df12570f6e0b2b9a2e5b3 | Bin 0 -> 14 bytes .../662d81374a2c96f867ccd88a4295190827c45453 | Bin 0 -> 51 bytes .../667ce3f1c874125b7106bd5520e60e865442a712 | Bin 0 -> 60 bytes .../669256f857011c32f5757ec19b2e5b9a372f6c23 | Bin 0 -> 51 bytes .../6749752b02f7d14fff9ac35f6b68dd62f5b49fcd | Bin 0 -> 388 bytes .../676adbb1e5b3f4f9e3cba51d3d4ef963ba4ea7e3 | Bin 0 -> 498 bytes .../67e72cea2b7042f08e8dfba5191d27bb390e4d00 | Bin 0 -> 64 bytes .../67f160446ded73c408f4e5a0665731b642b6edd4 | Bin 0 -> 119 bytes .../6856c7cb02d2ba74a60fd47140f042701dda63b3 | Bin 0 -> 37 bytes .../685fbddd9ea612b25e325a50bd659997b4d77da1 | Bin 0 -> 20 bytes .../690158fb146f7f3b3ea820979307a8d8e6f38314 | Bin 0 -> 353 bytes .../69542ed81b00a5ec8daaf4e8d509201eecd502c5 | Bin 0 -> 69 bytes .../69be4179b28e408a0574935e893c6986bbca0de9 | Bin 0 -> 51 bytes .../69e14b73af03e8f2d998cfcf16215f65bf589efb | Bin 0 -> 658 bytes .../69e52eef5dd0c51012b5c974cf70f4074ba814a9 | Bin 0 -> 64 bytes .../6b1698d096095d4035ce67a8680b52eada00cce2 | Bin 0 -> 51 bytes .../6bfd3679f4e30aaaa1808e96c980edcfa9cac1c0 | Bin 0 -> 355 bytes .../6ca3910d5f4f7967311853724b072750716dcb48 | Bin 0 -> 20 bytes .../6d054bad0bd3c522d23221d71e3987a0e6875150 | Bin 0 -> 147 bytes .../6d1509889d26c2ea16f5d12d5f6490dba7f1565a | Bin 0 -> 172 bytes .../6e2796549e29e5066f780a5e926fd6e3bb362450 | Bin 0 -> 14 bytes .../6e71553967212dfea2c9995f3641e582d8c2105b | Bin 0 -> 16 bytes .../6f30de3096eb71f697885fdd9cbddd9ee6ce46c4 | Bin 0 -> 35 bytes .../70b8a3a8621ae1ede2b8a4a263060fc2e277bf2e | Bin 0 -> 63 bytes .../71106770243ccca03f5025aadb298ee3a825824b | Bin 0 -> 459 bytes .../717695057d76b81c344ed8c23cc024195caa9405 | Bin 0 -> 67 bytes .../7353a7b2ea9f61325728b2f118416549e89dd79b | Bin 0 -> 94 bytes .../739228a1400cd69c47f110002c34dbe1661e8c41 | 1 + .../7465a4955a064e8f1bb777d4b0de5b3df8469831 | Bin 0 -> 15 bytes .../748c538708f0a2f586d7ff5f662643b8f9137a01 | Bin 0 -> 136 bytes .../74e6831be67485fb59b8e226fb8a48d88faf57d6 | Bin 0 -> 415 bytes .../74f8cfb3d1b8422927edac90107aa280a8a2a19c | Bin 0 -> 385 bytes .../753efc088d6023ca113a12acc54015a22f7daf9f | Bin 0 -> 51 bytes .../759a1e2e34cad14321a5e5790b1e6a783312fea1 | Bin 0 -> 669 bytes .../77cff7548cafe87410e4a0dde3ba6892b25594d3 | Bin 0 -> 753 bytes .../77ea9180617391d8503427a1c060538182f7729f | Bin 0 -> 216 bytes .../7885df741c88ca4b539798d9985c445f41cc2929 | Bin 0 -> 401 bytes .../78abacff5d3a1e826a30f278ad52237661018a67 | Bin 0 -> 23 bytes .../7a7e42cad11ed5ac39966d23efd04777265fc50f | Bin 0 -> 494 bytes .../7a9a12b15c798b88f1a599779f52d14edf9f4ef5 | Bin 0 -> 625 bytes .../7af3156d286a32a6a6fede46d93ec12ded1ac138 | Bin 0 -> 11 bytes .../7af41e5391204f4596cb1461792e2e23f9390b7b | Bin 0 -> 300 bytes .../7b8922ed2aef31167d305571a4ebbf7c182c502a | Bin 0 -> 173 bytes .../7beeb19272131701f3a0d1dd633f1b1969899366 | Bin 0 -> 329 bytes .../7c2e48b0d08aaeb95b5ca26036384aa2cec9de77 | Bin 0 -> 51 bytes .../7c73c0671308e37a8075a20863e70e180ef8b6ea | Bin 0 -> 86 bytes .../7e0e459a0794d4f91954eb6e0b6a09685fa71c78 | Bin 0 -> 224 bytes .../7e18989175bba8d9aea34413d6f328549e1c6825 | Bin 0 -> 67 bytes .../7f1530d4b702e68d043f89d9e63d314319dcd803 | Bin 0 -> 52 bytes .../8021c689f0078c5c59419c9959f5c58472245bc7 | Bin 0 -> 20 bytes .../807b8c4ca068cff4bc0fc8e854c1215a2fe65960 | Bin 0 -> 185 bytes .../80bd4827db81a1da28fae8c150f5e2d46651c598 | Bin 0 -> 113 bytes .../813d2c34c0df8d4a918e68e58cf0ae3703d0d46f | Bin 0 -> 342 bytes .../822cae715352b8551c840be2c7e2f98df455c9c4 | Bin 0 -> 486 bytes .../824152f7bd022996b41327002f6971cd9900b265 | Bin 0 -> 51 bytes .../829a1dc2bcb22a230df8aa20540def0e16864983 | Bin 0 -> 51 bytes .../82c0e02a867a5fdfb805e01ebf1a008220311e27 | Bin 0 -> 137 bytes .../83019387566fd48738546cdae398f750cccdc437 | Bin 0 -> 234 bytes .../831248cea079b629bf0ef6d9d02c159d6f8ed41b | Bin 0 -> 294 bytes .../834527ef0bc1572c584938ca7fe5336961754708 | Bin 0 -> 15 bytes .../8382c249fc9c7a248833d89de554e63807c475f7 | Bin 0 -> 207 bytes .../83baac5cfbec61ec277114aae4384a11a576b8f7 | Bin 0 -> 1565 bytes .../83baaee9b46770d9eef0e161a6e52cda76e3b043 | Bin 0 -> 51 bytes .../842cea88bccc41d7e2625dae8ff7268ee79e9f57 | Bin 0 -> 47 bytes .../850c639595eae3cc9c2cfef473e28fd4e8174dc8 | Bin 0 -> 167 bytes .../857ce08213a5106c746767352c6863d7bd134208 | Bin 0 -> 83 bytes .../85a7e47ef707d3b31cad924ed6c697c3678ab569 | Bin 0 -> 31 bytes .../86eb156ff8ddd7edc535840d412342ada6f3b184 | Bin 0 -> 153 bytes .../871a2e4d73a7fbb50f71558517a2f704b7fdb868 | Bin 0 -> 177 bytes .../8795e24f23db36e4f9ab609c9faff601b984eb6f | Bin 0 -> 63 bytes .../87967bf3b1412ff60c5bec8815f4b031aec26b4c | Bin 0 -> 1310 bytes .../87c8549a5e524609c29e6a6ae32a3a301b72c286 | Bin 0 -> 39 bytes .../87e97b460042d045629263ad10ff3de7b000f0a1 | 1 + .../89cf42c02d7135afa6c81d8a0c2bc4c3df557769 | Bin 0 -> 64 bytes .../8b0cf53ac17015fe066002cb3814933df9ee96be | Bin 0 -> 694 bytes .../8b5c4543923da5e468aca1de1ab880aed2ac4451 | Bin 0 -> 119 bytes .../8b7b914723bfc23ec650cb91d209141641fba09f | Bin 0 -> 51 bytes .../8b8b9fcdfff1f891b1694614b7309cb4a2098f4b | 1 + .../8b8f6d58dff9ab0c37183ec93c9a600d5ba5d9e6 | Bin 0 -> 244 bytes .../8ba00963037c9ff548b7a702497441799075f14b | Bin 0 -> 53 bytes .../8bacacba71bfa5c74fd74cb6577a49a7aec9cf1f | Bin 0 -> 571 bytes .../8c527bdf0f304a31866f71cdb298511041ecd320 | Bin 0 -> 179 bytes .../8d352ea63259e26e1bb61f5a8f78254be4e3e7b1 | 1 + .../8d9784f85e9662734e180ca8bec2164425ae8a87 | Bin 0 -> 250 bytes .../8dfc4e78007040009f37109f9ca928c31b3ebb49 | Bin 0 -> 398 bytes .../8e3f138d163022d6e105ab595788f4cfdd9b9db3 | Bin 0 -> 411 bytes .../8ea624983d766ed45780378a3eec24eb2faeb229 | Bin 0 -> 67 bytes .../8ecf066a6728b30e1153ad875562165db07b0d0a | Bin 0 -> 1122 bytes .../8eeb8cf054ebd546ca0555ef1cd4ac6a08628917 | Bin 0 -> 64 bytes .../8f05b8da748cc04e64b688c4b435fe64699bd481 | Bin 0 -> 301 bytes .../8f980dd25f1c77e3536131c2c620aa32e8c13180 | Bin 0 -> 14 bytes .../8fd4873d307af2d217f5d2bf02b495ba681fad74 | Bin 0 -> 974 bytes .../8fd758e2603f1e3772cfcd295ff0f951988d7648 | Bin 0 -> 948 bytes .../9018925b5e791ae4b3ae9c84b8a4d47d86671c2d | Bin 0 -> 1436 bytes .../90a9c3390752b94ca19a58cb2fe6267bc818f718 | Bin 0 -> 389 bytes .../911e2ea20b6c10431e48f70d9933987815926a9d | Bin 0 -> 35 bytes .../9125277ed9ec5d59e51f3e1a8d97d25ef88a5d4f | Bin 0 -> 873 bytes .../914464d372dcccf31ed5331293d84121e17616bb | Bin 0 -> 307 bytes .../91916df7c8f04d8c2b6b8f4aeaeee6972ce0de74 | Bin 0 -> 53 bytes .../92cce6dc5c31acd62347b15d89d52ab94b507e0f | 1 + .../92ea0d3200665e1836ac12bed0837425cb9f43de | 1 + .../9329b80d0125cc994d7ad36540c7a8265d76983c | Bin 0 -> 15 bytes .../934a41b5027d1c5cca27ebda57560c38cb9e09ea | Bin 0 -> 120 bytes .../9354652806d96b09c8e7082b1b7d22e7c3fb9f0b | Bin 0 -> 265 bytes .../9398ac1c2b4015792661266a9c84b6d7a68c3155 | Bin 0 -> 148 bytes .../93ac93b7deabdfb4f86eb37a1e9f6669957d14a6 | Bin 0 -> 11 bytes .../94108ac8420347598c7cee743b2a158b1270fb8f | Bin 0 -> 13 bytes .../94cb0b9e26e4a800f3d413f3617111bde2438009 | Bin 0 -> 860 bytes .../954ea72fdbeaf5b46d18c6d5bb77fc1a0f97569d | 2 + .../9552c3f6304af40224b800f3a3a5df3887a530f6 | Bin 0 -> 154 bytes .../96e5126447131d3d59cc6547f6b91d3433ce37c8 | Bin 0 -> 456 bytes .../970fccda0b34b59ade44d52e1212699b4d2419a8 | 1 + .../97c4b73f72b248b4ebf4bf30892d0db828a85297 | Bin 0 -> 11 bytes .../98c0c0a3c8c05aec3082755a4635e65baecf4752 | Bin 0 -> 29 bytes .../98da5edafac67704810f093b38c86e4c77b75349 | Bin 0 -> 11 bytes .../98dddd3f679af150e9933bd864ae20e20b7aa25a | Bin 0 -> 178 bytes .../99099024a3f3e389f57cb7b697eb34485846f316 | Bin 0 -> 360 bytes .../9912de197918ac0e305f0c0107f863823e8ae818 | Bin 0 -> 1565 bytes .../998a54dc94ab6e7d6a6066415fb0dd9b52356171 | Bin 0 -> 554 bytes .../999d0995c2f09beda8783eac95d7643a11d5c89a | 1 + .../9a21cda420d50994a8ed56e147f8316b75514db1 | Bin 0 -> 50 bytes .../9a3f9531b10e8e0874699ce3e35031a35feee5d5 | Bin 0 -> 449 bytes .../9a43f48d4f6219618f8cc9e876880fe81109ad72 | Bin 0 -> 146 bytes .../9a4da2a37a26c114e1226bfbe1cf80ec5ca99a66 | Bin 0 -> 184 bytes .../9abf980e8909aeb31936553ca22ccfd8680c4dab | 1 + .../9ad011d38bed7470e7f60780faf64d8f008b9b04 | Bin 0 -> 296 bytes .../9b1355c6e2c43ce83001bbead09a79852e04feef | Bin 0 -> 720 bytes .../9b4d4ce0457f5300d6b4b309762acfdbc41e3965 | Bin 0 -> 201 bytes .../9bd059ff0a90e86ada1ba7e5b90ae04637ae9e90 | Bin 0 -> 67 bytes .../9c4eac3dd734a74673c76e6b21fd9c18cdfa831c | Bin 0 -> 63 bytes .../9d2dd744ba59c1e8ec091e23938e46d1bb5ee519 | 1 + .../9d362d2aaeee243a5b54621d8187c4b16f87c9f5 | Bin 0 -> 158 bytes .../9d43a08a964c82abba4a47246b1955d9e3609f6e | Bin 0 -> 856 bytes .../9d6947df24c9ebcbec72c568d9708d7b1ecae63c | Bin 0 -> 113 bytes .../9dfdce1b090a559a14f9a5852f78547413b1d1ed | Bin 0 -> 442 bytes .../9e2ab07030bd35a4c31df32c79aca5e76c1d04f8 | Bin 0 -> 52 bytes .../9eaf2ad607a943141c29f334b2c66c2e59e99980 | Bin 0 -> 54 bytes .../9f0ab521c728be21e93112b2730c52bc1d6c0021 | Bin 0 -> 1153 bytes .../9f2316ddcea948c947fbbf35ae87b767b8c1dc55 | Bin 0 -> 51 bytes .../9f8e14ee5b4a2095f917084b60b5fda33f21d9fd | Bin 0 -> 644 bytes .../9f9ed47f98b4905f1f6ef2b552a66905bdf79b1b | Bin 0 -> 804 bytes .../9fee3212240d4bccfdab3696dbbc579b06d39982 | Bin 0 -> 11 bytes .../a09ef34c93fe0ffc13045f67b7ecec683fb72e98 | Bin 0 -> 50 bytes .../a210d629c305b89a34b7ff3c41ae4566cd22186b | Bin 0 -> 393 bytes .../a25b31398669b585ccab97bceadc31994de7ead7 | Bin 0 -> 520 bytes .../a29a547671badd3154789e1a02bdb87332fcd6a4 | Bin 0 -> 60 bytes .../a30fc2605f4e74f7003f902ea4a4c994e3ce9bfd | Bin 0 -> 371 bytes .../a33e1b28074a41fc5c2611a67161ae5638a47dd5 | Bin 0 -> 287 bytes .../a39ac9e92b41d1889096ed415b4c2eb1aba6ed50 | Bin 0 -> 104 bytes .../a3cd54d43d3b3bdfcf224d636dc11ce1b5ee4d30 | Bin 0 -> 283 bytes .../a4874327383ca168f9d9d59cffe327f61e9a6610 | Bin 0 -> 15 bytes .../a4e4a0473ac1f2b8de86efdf00fcb382a343126d | Bin 0 -> 38 bytes .../a502dbaf3c842bd86e9ae513e8782eb23c70ad7a | Bin 0 -> 51 bytes .../a5592f15d5424ab7e16a18e77027ab91c846d90a | Bin 0 -> 414 bytes .../a5c2fdae1a1c0487d00db0eec6e3429b12244b1f | Bin 0 -> 265 bytes .../a5cf80b996b2ba8c9580f8ecd22720c48de41044 | Bin 0 -> 51 bytes .../a60ae4e21a913e84405814f18555f0c179c24167 | Bin 0 -> 10 bytes .../a649093880c2a2f143f861893eaff5d30be95eb7 | Bin 0 -> 27 bytes .../a6603e797695274d10bce000f66ca0a715f7d8c0 | Bin 0 -> 180 bytes .../a6d4b6043d86c376e9b166d5ca395f3e099ae229 | Bin 0 -> 51 bytes .../a6f0d1ed80393ec0a884718b44fe2dc9f852d38a | Bin 0 -> 53 bytes .../a706f2067bfbda7837eaad68972d60547e2957c3 | Bin 0 -> 639 bytes .../a814c5743d492b96d2b402f9e819bf8406262224 | Bin 0 -> 59 bytes .../a8249ebfe91327806446f14a6b2e7d9c8440257f | Bin 0 -> 645 bytes .../a8e306820fb76566b522c23ec68bdce0ad0536f2 | Bin 0 -> 108 bytes .../a8e67676784506d2e6eab3a0dfa25e53a80b40a0 | Bin 0 -> 368 bytes .../a97dbb159ef9bc6e39c9c25e04315752e871e739 | Bin 0 -> 401 bytes .../a9d71e1ff2912d8874e38fc61cbd9a8ef28af4a9 | 1 + .../aa878edb0100e876e00e310ae221b220fdb5e028 | Bin 0 -> 131 bytes .../aaada46c7f3bff58c2dd6f4a8394135ed5f253ee | Bin 0 -> 180 bytes .../ab27fb527771c7d86f74afb6864e95402328ec0e | Bin 0 -> 245 bytes .../ab8d6e1ecbd80c6223b8623a386c61023502a57c | Bin 0 -> 569 bytes .../ab90bebd4c017827a6d5de61511445df81169eb6 | Bin 0 -> 295 bytes .../abd52da5882855a63632a6917df3639538928cd3 | Bin 0 -> 44 bytes .../ac38a6572f8420b4df37d9e39088d1905fced71d | Bin 0 -> 21 bytes .../ac727124e46a249419f088c8665324a11b357b84 | Bin 0 -> 51 bytes .../adb9bf315315338bcad85929917b9def2aa098cb | Bin 0 -> 22 bytes .../ade2d2f0e120a9527487e9b92458ee6844800e4e | Bin 0 -> 154 bytes .../ae448bfe17f9a3a6eff074d4caa9f7261c94d2d5 | Bin 0 -> 110 bytes .../ae8c538d4ad7f2996ac724bad7a075e1aea32556 | Bin 0 -> 733 bytes .../ae8cdc02275a1436bc131bee52a17ee797e2e6c9 | Bin 0 -> 306 bytes .../aef36c49d7dec0dcf8cdc224d9e9221fa2cb1db0 | Bin 0 -> 53 bytes .../af8b24ffaecdfaf96c0cd7c76f31dc9e1b4d0935 | Bin 0 -> 582 bytes .../afcce9e02e0696a2af073855a386f589cc12c94d | Bin 0 -> 36 bytes .../b00a32e8bfb75e75f31410dfe3592da6248275c6 | Bin 0 -> 155 bytes .../b09f98e13e5b67a4dd7f74eff00bb247b9967844 | Bin 0 -> 300 bytes .../b0af44b49dd7c2b2e02ed4fbc7658975338e352d | Bin 0 -> 373 bytes .../b10353c265bef989d8909055fd6cd52e49eef3e6 | Bin 0 -> 77 bytes .../b24a0dd1bc0bfabb832f0d1c8410c018c4ddaf4e | Bin 0 -> 185 bytes .../b24c25c6d4b57a5f3d64a0adb205bf4f150c9138 | Bin 0 -> 14 bytes .../b26a3a83d0b319ce13a9ae164e90fa6da1b05a57 | Bin 0 -> 301 bytes .../b283eb8884c98dd50523995ce221aa1ecb3ca182 | Bin 0 -> 408 bytes .../b2a79b262ee3966c5ce7c7b42dcffd55d7d0956b | Bin 0 -> 66 bytes .../b2aa4861b5104e8bb8bb173f4b023a2172a7b9a2 | Bin 0 -> 138 bytes .../b306bbbf43b343ce3ea91f3ecf08501411c57e9d | Bin 0 -> 37 bytes .../b3376cb338d9ff88fdef2f8670a09e973f28f6c6 | Bin 0 -> 136 bytes .../b33eb7e1bde4c69671dbbf9489b4d4b87c5d23fd | Bin 0 -> 50 bytes .../b387e46c23912785e6c353ab49b8ea4a92c2c2e5 | Bin 0 -> 37 bytes .../b39bfaf6a3072d8a50984dcc54967e9246f8d3e5 | Bin 0 -> 51 bytes .../b3cfcd55b0331ab0c931b8c61d4df41464587f10 | Bin 0 -> 120 bytes .../b3f33b78433af7f607bc99b569b0cef95a1a6ca0 | Bin 0 -> 669 bytes .../b46e762671a5e28c7061da3baee6fc41dcc0122b | Bin 0 -> 22 bytes .../b6d86bedf3cf19441114e463458a454709e627b4 | Bin 0 -> 244 bytes .../b755933ad6e318ee9e0c430ff69be7a515d44def | Bin 0 -> 45 bytes .../b758f5c019696f33c50895168219c0e6cb04e11d | Bin 0 -> 284 bytes .../b7b664a39372dd6142b8ef7906857e4ab3f1fc84 | Bin 0 -> 46 bytes .../b7c31bb5f6acc65b88e31400dcae71f7be392c86 | 1 + .../b93fd0a15287dd035eac86e547e3ce42183bdb28 | Bin 0 -> 638 bytes .../ba25be123c630bd3e4aeb9bda6304dd1a7e51365 | Bin 0 -> 625 bytes .../ba3566735888b53712c6b2e6d52ff5f2197afd6a | Bin 0 -> 83 bytes .../ba942f8fb244b60561a067129c242c4bc4fdd5e1 | 1 + .../baa28a5baedb645f4430940a4b4b1142f4b03e0f | Bin 0 -> 11 bytes .../baf7839388e10ff0c410a58797482cb83693b309 | Bin 0 -> 49 bytes .../bbc03bf6274a79528d43e200e8f1aaa770a155d6 | Bin 0 -> 64 bytes .../bc9e17fed43c5d0668a87e8d6354c344c5b4d00b | Bin 0 -> 384 bytes .../bcc7340f8876a7dff381ca676efc39d30eed9f48 | Bin 0 -> 57 bytes .../bd0bef14e73aa1073eb5acb6e4cc901c976335f5 | Bin 0 -> 51 bytes .../bd275178fd473028a5cedf7d5780b27e809882ee | Bin 0 -> 594 bytes .../be1208404991b11ef9e246d2f3537ffd65a57824 | Bin 0 -> 401 bytes .../be3237e72b3d8d56eec0520145dd7d1a5064eede | Bin 0 -> 376 bytes .../be8cc5bab95e0ea7af538ca11175d710da6207d9 | 2 + .../be988fc0c00a8422020dea3dc72451b09e25e1ad | Bin 0 -> 353 bytes .../beabbe93f1e9b2e56f729af30559ec03a00f53fa | Bin 0 -> 660 bytes .../c0deaead93c9b3f2fc211fb7f0711ac192715a40 | Bin 0 -> 386 bytes .../c24143cf5f6f77f002e0ab82e3060906e2e7d062 | Bin 0 -> 169 bytes .../c2f666569d0c6fbec701fc6772433afa22a1dad0 | Bin 0 -> 863 bytes .../c3afa705dab02fea4d892134e7c01c3af270cb6e | Bin 0 -> 49 bytes .../c3de41124a14ea562360aabc9e12666851bff2fe | Bin 0 -> 63 bytes .../c4c53b4727e9e1f040c5d7870639dd3daa184ddb | Bin 0 -> 136 bytes .../c4e60ae7c05b12a90dd7c43fbc85ae4be7540f18 | Bin 0 -> 16 bytes .../c5d0c169d326d79fc4ee8521b282dbcbf33c1d5c | 1 + .../c5dc5f5ba9c2a2af7e91e200a8e82ea2c44f3a56 | Bin 0 -> 1310 bytes .../c5dfb4a82f91d07041d4b0ca6cc34cfa1e9c7199 | Bin 0 -> 379 bytes .../c685689a9d5b259afe237d857b7c6551dc95c176 | Bin 0 -> 69 bytes .../c77087b4651f4c62a780d77a3b4c233490244e8a | Bin 0 -> 42 bytes .../c77ee0b6cb21ab7b7cf222c7f6563b3b1b1b6eed | Bin 0 -> 37 bytes .../c784ad2e205ba49b5bb1302746723dbc57320981 | Bin 0 -> 290 bytes .../c7b17d6ae5f3b155532a5a9bf0239c098c35eec1 | Bin 0 -> 411 bytes .../c84da54dacf04445b50448a70fb0ecdd08e9234a | Bin 0 -> 18 bytes .../c8b79e05649da58817a10ee6160a00d80b4a217c | Bin 0 -> 474 bytes .../c8cb20176e427d2e108187924f570ef1df6d440c | Bin 0 -> 50 bytes .../c916ea9c6901c1e77af764773bd2843baa2ebdc6 | Bin 0 -> 10 bytes .../c97ebf43d8a5ce5cdb8e93a5d0362239c284ab4d | Bin 0 -> 53 bytes .../c9b92995f282262c51aa7106608eee6cade3245b | Bin 0 -> 1389 bytes .../c9e2cf8be8a4dc2294020026c62840ef1fb4853b | Bin 0 -> 255 bytes .../ca0db313bf949ba3f87a5254646a7a7dc8a7f89d | Bin 0 -> 12 bytes .../caaf9a7751c0eccc34f0fc00a048012ab5ed2f37 | Bin 0 -> 52 bytes .../cae3827ca308a477c16852cf8a435881a4058719 | Bin 0 -> 828 bytes .../cb49955601d171fd14c9ac21137b221392c7dab1 | Bin 0 -> 121 bytes .../cbaabef34763f2fd922e67ff5f2ea283347e9823 | Bin 0 -> 253 bytes .../cbe59c62c6d36c7307c438159327e320cd2fcf57 | Bin 0 -> 38 bytes .../cc4197d2381a75b674fe4944b8c690fe69a0b3b1 | Bin 0 -> 51 bytes .../ccc36ee2c6a0daad65a4d929599fda5cd38b8fd1 | Bin 0 -> 331 bytes .../cceb4c620c02337138e489383db0d4f4e2c7a722 | Bin 0 -> 20 bytes .../cd4be18b1ae872c40580edc4fe8cbdf1fe2a3881 | Bin 0 -> 392 bytes .../cd76ed6aff7e074b0cfdcc6305ec4e453d8304bb | 1 + .../cdb000a2d87e073efc9491c59707289f6bc18fd9 | Bin 0 -> 494 bytes .../cdd1a4e358ee2396ece54b32c1f0a8d0a2e3f3dc | Bin 0 -> 125 bytes .../ce1c326f3b0147841550ce3b5126390764bae8e8 | Bin 0 -> 583 bytes .../ce990633c0f2b2a2ddb66144ed942d4bc9bcd8fb | Bin 0 -> 138 bytes .../ceb297908903ba0fc24982ad4e6010e79dfbdd5e | 2 + .../cedd54df6d34491dbf7843c2621d6818418aca02 | 2 + .../cf75632ee185df2cbbbe148e2e1ad5410f11d361 | Bin 0 -> 64 bytes .../cf922d44bf08d223d3ebcd37a7e77d3e43555d08 | Bin 0 -> 254 bytes .../cfa40fccc5ea4304e83ca26f4e567765c2c08627 | 1 + ...imized-grpc_client_fuzzer-5765697914404864 | Bin 0 -> 1066 bytes ...h-12b69708d452b3cefe2da4a708a1030a661d37fc | Bin 0 -> 11 bytes ...h-133500314833c9037b34a4c34ad779dd78a0fa8d | Bin 0 -> 885 bytes ...h-14ed70cd9ea7987cdd0c8f6e39398ee7c60ee2ff | Bin 0 -> 719 bytes ...h-17d5b79ce495f7d3f2e33d95588457281a5e8965 | Bin 0 -> 52 bytes ...h-3bd02c98286bfa7be8e13c5500ddb587bba74fbb | Bin 0 -> 31 bytes ...h-3e52af52deb0ed5d6ef06487d7e475e8fb616972 | Bin 0 -> 37 bytes ...h-53e93a1906d8442d058500e7107929cdd3e84ff8 | Bin 0 -> 41 bytes ...h-570c79624a2e4d36be107745d2b25e74464553af | Bin 0 -> 55 bytes ...h-8e546795782dffa5d5f5e94c9510aac178fcee39 | Bin 0 -> 369 bytes ...h-d5af12c391b7bf0ce63ee3dc656ee4410fe496eb | Bin 0 -> 470 bytes ...h-d92bb454bbbd415175df541661e3696453ce3e43 | 1 + ...h-e470e9fd09a5c9ef303813a40361c897650289fd | Bin 0 -> 134 bytes ...h-ff53a3d713e83ae945b8dd1782e21f5b51aa649a | Bin 0 -> 747 bytes .../d10f52ffae7857c5989e16960942179856f308f6 | Bin 0 -> 1104 bytes .../d17e9507af1855fcf9eca78e2d25c8fb2c40a34c | Bin 0 -> 51 bytes .../d194592e6f471dd487ca2625e6c3da7802ea372f | Bin 0 -> 63 bytes .../d1b1863b478e1ea71eafac9e03256080c8f0d1c5 | Bin 0 -> 109 bytes .../d1cabc19ce0f9fbe365d96db68eda9f86e005eef | Bin 0 -> 136 bytes .../d21ca2b01baa21a666257d1a1e0275587eeb565d | Bin 0 -> 361 bytes .../d24d1b9d754391fd0b11b0456a2e8c6050cadee6 | Bin 0 -> 62 bytes .../d250e525e8ff2ae4a9bddb2e478a90a1242155f0 | Bin 0 -> 33 bytes .../d257c41db22b60cd937de16b9d90a44b9fa8e426 | Bin 0 -> 355 bytes .../d2b5fa141432c1894be8b8242c27c248fd55cddd | Bin 0 -> 819 bytes .../d2df8e95436cf98ef2189191a75a3d9c78b1be6c | Bin 0 -> 51 bytes .../d2f71a800612876010558ce804c9a72ad0a1b9fc | Bin 0 -> 52 bytes .../d3141a71cdaa7a0915c8c55abf2c940b0fd00172 | Bin 0 -> 1479 bytes .../d3386702918881101368cdba2c4967e86ff3a7b9 | Bin 0 -> 50 bytes .../d363f288f48fba8fde401978b7e764295735645e | Bin 0 -> 48 bytes .../d36e015b1e14ecb9559d67bb09c2851699f0aa35 | 1 + .../d3d7a110638c6814e7bc8b388d25891349de14e4 | Bin 0 -> 816 bytes .../d46c3dcede830286dd9f4a1ba02a20a0b1430664 | Bin 0 -> 231 bytes .../d49450b97f489f0dea74a9f83c71abeba1066d3c | Bin 0 -> 15 bytes .../d4a72650e8218ec551fef6560ddd136d52828a4e | Bin 0 -> 51 bytes .../d4a744ef6dcef5cf08d5289e167b26270d39e9f2 | Bin 0 -> 456 bytes .../d5a85ad91cfde27a96960b2e783d2ee43c50dcb9 | Bin 0 -> 83 bytes .../d60440ebffe00597bedf89a47b7cac3346823a20 | Bin 0 -> 223 bytes .../d60469c0b5b385f20d55aa5cca55bc2c801f3b95 | Bin 0 -> 489 bytes .../d637cc9387087de633b9db535d19f64795c43be1 | Bin 0 -> 40 bytes .../d70b2046ee62676b525490b70812c2157e5a3585 | Bin 0 -> 53 bytes .../d727b7edb460c549d7b12b90f581048c9f4747e5 | Bin 0 -> 113 bytes .../d86820c738718311fc75191b5a35cbe7029aaf18 | Bin 0 -> 278 bytes .../d88bb0b7ff687af84f33e6af22d3516fcdac5534 | Bin 0 -> 121 bytes .../d89026894e6c5f8b5c88dec12950f56c4b6924ba | Bin 0 -> 245 bytes .../d895ece988ad4712b87de8aa9bc273eee315e8b8 | Bin 0 -> 222 bytes .../d90c312791129dee8c5f85cb3308323d0c39b70d | Bin 0 -> 290 bytes .../d91281daad9b821294db204dfc244b2d0d5496e4 | Bin 0 -> 156 bytes .../da2ec14db88e6f93bb19ba2f0a7306408de37cf9 | Bin 0 -> 401 bytes .../da322a6b88da87babb52d1527fe54cb4ac214b32 | Bin 0 -> 22 bytes .../da424090e1b94c5d0e91e26f3f3dd6c4af18fcd5 | Bin 0 -> 159 bytes .../da4d300d0a8e6f803ec053e3e7689c4b91eaef90 | Bin 0 -> 67 bytes .../da538941f1613c627523cb1be71eb220d1ca2579 | Bin 0 -> 178 bytes .../da8d4c7f02dbeaa543c159b3a4e527059978a429 | Bin 0 -> 202 bytes .../daa680dc94232de7a6949ca6610eddcdbf13152c | Bin 0 -> 1729 bytes .../client_fuzzer_corpus/data_frame.bin | Bin 0 -> 10 bytes .../db3a30a6d8e605dd587e51b214c42f68bc43cf19 | Bin 0 -> 51 bytes .../dbe415d09cd20abd88c858b8c9b2a9e552fbd8d8 | Bin 0 -> 802 bytes .../dc45008d5a94beeb4aba87c4b26ac6f87df1490e | Bin 0 -> 789 bytes .../dc4a248fa4c903ce3a571dd18aea575019445740 | Bin 0 -> 653 bytes .../dc7ebba06558484af10b5aafd01ec4fd59276b12 | 1 + .../dc815fd6d5e817898238481472f359bc50b510c4 | Bin 0 -> 359 bytes .../dcb06a6e34cbed15515e5b3581ca666f704777bd | Bin 0 -> 238 bytes .../dccd1fd6d3394f5f68c87950ed7356a2e9ef0f6f | Bin 0 -> 368 bytes .../dd5ac34f5b220970447b2733848de78570c47883 | Bin 0 -> 18 bytes .../dd662353bad317cee7d16191a39e094bfa4898f2 | Bin 0 -> 165 bytes .../ddb283529bf32a85a79a57ac2f2f2d5f18631d92 | Bin 0 -> 61 bytes .../de06dde2c760a56f63bafe6ff102663bf2d9339b | Bin 0 -> 21 bytes .../de9b9a35e1e7040e842b597b8d2fe4cd602e67f1 | Bin 0 -> 257 bytes .../df20bbbb854cb997a73285ef30d227aa12d90e4e | Bin 0 -> 566 bytes .../df684493457bc8d87dec2ca0825f7b43978fecfd | Bin 0 -> 64 bytes .../e0375839ce86fa191b85662247d9b0598ec35a5d | Bin 0 -> 65 bytes .../e0aa94f5a63cea106ff86739ff2bd85115fd3df0 | Bin 0 -> 763 bytes .../e0d1ee5e2e169dcae87f790f5c27e84a3453cedb | Bin 0 -> 362 bytes .../e13b774309bbdec8e9d3b1d3f6dbf7d6851e30ac | Bin 0 -> 803 bytes .../e18cab69ad5cc17c88f8b56ca9929ca8af3eed30 | Bin 0 -> 52 bytes .../e1bd70aa5c802cd4462ff4833c09ed432ce4c9fa | Bin 0 -> 56 bytes .../e1f2e203d39ab2509d4a67f7a44265b1e6364334 | Bin 0 -> 67 bytes .../e262f378a3d27bc519d472ce3650bdffcd48a055 | Bin 0 -> 14 bytes .../e309e21c69e4b96ab37f675f4e87a52453512ef8 | Bin 0 -> 350 bytes .../e30c4ef6423bd4d872792fbd6954ff8e47d31a97 | Bin 0 -> 433 bytes .../e3422e8f5d63a9ef180aab552353955c7aba90b0 | Bin 0 -> 302 bytes .../e3d12a2385b75443fe38d989e77c252e1f3cdb6d | Bin 0 -> 257 bytes .../e40b0fa5d814be8f2081ca2c8e0a4090d4893831 | Bin 0 -> 184 bytes .../e442f9fd63bc5345de1c14803d4ca4bb6f1152cf | Bin 0 -> 384 bytes .../e4c0e27cfd3690b8255a8214d6dd055385d1d24e | Bin 0 -> 548 bytes .../e4dc0a111e77dc495c5db07df5e2917adb674697 | Bin 0 -> 291 bytes .../e4f55281c481484bd9edc28fd10df0c2e0f7d546 | Bin 0 -> 360 bytes .../e5319a8570a762bbdd67135b49579097324e369a | Bin 0 -> 892 bytes .../e5a7c086208248a15ee6fa5195fc4ce22469de15 | Bin 0 -> 84 bytes .../e5ac3394971400b6636d029aec7ec665a94ecf29 | Bin 0 -> 15 bytes .../e5e276acd665ccb47f868fe3bc36e647bbb840bd | Bin 0 -> 234 bytes .../e61f728210ce72ed8b2c066bd1b1ecf9e6824b77 | Bin 0 -> 12 bytes .../e6a08259a7d47601eab5c0249cb6547024e002c7 | Bin 0 -> 53 bytes .../e6b3c920b47e00055226d49b9f715c5d4353e3e5 | Bin 0 -> 748 bytes .../e6c52f2f31db7595d1ecde2939a7390777f15182 | Bin 0 -> 136 bytes .../e6f5cc0702a5f38b9e7339849e1dd2e4001e547d | Bin 0 -> 160 bytes .../e7c26599fb2e2b031346ff1ba09294fd758f7abe | Bin 0 -> 362 bytes .../e8323c817d18f0c920d3cf53be41a9bc0fd64b76 | Bin 0 -> 67 bytes .../e969affd8af10a1b87dc63afd3b29cce3e58fbb2 | Bin 0 -> 64 bytes .../e9f7f7f258c72222397a960652c01d2a37e2afe3 | Bin 0 -> 245 bytes .../ea46b684f1e67a27c231f2d536c41da631189b9c | Bin 0 -> 696 bytes .../eb591d069d89f44150c17082e83c48c66c8e7fe3 | Bin 0 -> 817 bytes .../eb969b9ab1b0d6b5d197795223ba7a091ebd8460 | 1 + .../ebb0786acc21c6185356eae9a62490a03fddd1f2 | Bin 0 -> 293 bytes .../ec180175f0edea0a6c3eea2ae719b006bc029ff8 | Bin 0 -> 136 bytes .../ed6358fbe6721c9ac01a6f4cab4d2df377eb1f11 | Bin 0 -> 50 bytes .../edee7f771a04e8ced659e7a5ddd6139e75055a7f | Bin 0 -> 863 bytes .../ee436743977b8e31feec22a91b1ce23dee96665e | 1 + .../ef1984d6146670122c7a7246374bca460e7284e5 | Bin 0 -> 11 bytes .../ef2ae7dd190fdf0bd4cc2ae53c5cf1ea7db877fc | Bin 0 -> 892 bytes .../efdf3f43fb29720dde23c3335cce7be48b761fb7 | Bin 0 -> 148 bytes .../eff9ad9144a2953fadc019fe72eb1cc3447c33fb | Bin 0 -> 25 bytes .../fuzzers/client_fuzzer_corpus/empty | 1 + .../client_fuzzer_corpus/error_refcount | Bin 0 -> 190 bytes .../f03120d1a8376638e071735bf4746454b6ede389 | Bin 0 -> 86 bytes .../f09410ab7bc19ee1ff206f94e8eec2931faef15f | 1 + .../f09cd3e3a16658174717668e51e7382e491df1da | Bin 0 -> 123 bytes .../f11abb090bae8cdac1f7d9a2e344f2def0e50066 | Bin 0 -> 568 bytes .../f1a5f3011be9748fb83e392e334e46c629a04379 | Bin 0 -> 64 bytes .../f1b9b6803e41beabb1a762d511fc148116e09e78 | Bin 0 -> 64 bytes .../f24f925945aaf5e8b5ee470935e5aa7f847e7a72 | Bin 0 -> 362 bytes .../f2a6bb4e0137541e2b140b976764377d07d822d6 | Bin 0 -> 71 bytes .../f391771de2dfbf761a3eb70af7aa5f0af4446116 | Bin 0 -> 762 bytes .../f41f9319bda14ef21b925c46945b30728503dfaf | 2 + .../f4499e3d4bf60ae3ae929c485a13ea4dc2713369 | Bin 0 -> 362 bytes .../f4ae2a2b692bfa83cdde75d007813426e14daef7 | Bin 0 -> 107 bytes .../f4da422d640232e22f2613ebdacff33cecd61aea | Bin 0 -> 71 bytes .../f5a629c8fd5720236b66a875e96ea22e29c45965 | Bin 0 -> 212 bytes .../f5b1eab444efb2664a295d4e6d087eb209c0c480 | Bin 0 -> 51 bytes .../f6627c55881fe4f0c8e6999980fb226836e6f5ce | Bin 0 -> 456 bytes .../f66305230042fa83fcd1b98c469d90ffef3ff6da | Bin 0 -> 462 bytes .../f69aa5666fd60c1b6814198f12d049abb0e9f148 | Bin 0 -> 607 bytes .../f6af3f46aacee395877d7f7909f8e412a6538efb | Bin 0 -> 375 bytes .../f74143e8160754e40eb4d21a182c970210707979 | Bin 0 -> 20 bytes .../f7812b2aca4d12ffbdac67bcacc41b34524de6cb | Bin 0 -> 52 bytes .../f7aeceaf0b6d971038a677994b5d080fa0e18011 | Bin 0 -> 134 bytes .../f803c87a92662898e2c8c847787b56d2c31f63b3 | Bin 0 -> 52 bytes .../f81814b5f0191729c62ee5717775e1bb532efe7e | Bin 0 -> 64 bytes .../f8467d9574de94b9bb904f75a6a7e2405c36f105 | Bin 0 -> 1157 bytes .../f84f5d6188cf099465f0b70337b87ad8aa8efb78 | Bin 0 -> 69 bytes .../f8981798dab237ea34051d18b5e903f2300a0653 | Bin 0 -> 870 bytes .../f89ad475ff51a5a9fe18603df833453bed320f36 | Bin 0 -> 268 bytes .../f8fb1348ec3ceeb75c2a03df6a2ead0de6f4127a | Bin 0 -> 51 bytes .../f91f76fa45a23adfed48a10ec9512cf16bfb6636 | Bin 0 -> 332 bytes .../f9583b3a39c1aecbba6e81d71e7fe9b9519c8b08 | Bin 0 -> 18 bytes .../f96843fdf2d6fdd661c26201d96ae7bec72c6c3d | Bin 0 -> 43 bytes .../f9940356ee9b212849fbdf0d818b17af1a4f3c6c | 1 + .../f9c875c00b7327df5bf21c3e051b55b0d2ed3cc8 | Bin 0 -> 188 bytes .../fb340fff42a4d7ebf6b82adb9345655ffeeb05d9 | Bin 0 -> 15 bytes .../fc3ef8b3cb43e4d2721b252e7fb578d83ed6605f | Bin 0 -> 51 bytes .../fcc557c9844892675be823fac8788eb694a3a118 | Bin 0 -> 63 bytes .../fcefef90833e6ba74d3e74756105e1f32d985162 | Bin 0 -> 762 bytes .../fda07f0de15cac77ccc54ec221d81cdade189bfd | Bin 0 -> 179 bytes .../fdb553b8d82e68270a7345b048772bf8367b1224 | Bin 0 -> 99 bytes .../fe1390762579b5c335bbdea73e251b95b979c3c9 | Bin 0 -> 12 bytes .../fea99272cd661a5fde2707e350d67a683a7c21a2 | Bin 0 -> 66 bytes .../fecccfc70b1cf1a524b9f28a9ba2c153c8e14d0e | Bin 0 -> 13 bytes .../fef80aa34c31700ac8e53bede4a97131176ceef0 | Bin 0 -> 421 bytes .../ffd52d31f9c59a346aa195a683f077dda5ecef6b | Bin 0 -> 59 bytes .../client_fuzzer_corpus/hdr_frame.bin | Bin 0 -> 10 bytes .../server_hanging_response_1_header | Bin 0 -> 18 bytes .../server_hanging_response_2_header2 | Bin 0 -> 27 bytes .../client_fuzzer_corpus/settings_frame_1.bin | Bin 0 -> 18 bytes ...t-2b505c78b53599040622864c18644b32c345884f | Bin 0 -> 504 bytes ...t-53cf4d25741d5f6e7ad9147b286ff0b40cb500a9 | Bin 0 -> 25 bytes ...t-82794c7583f365eece6a10ce776d59874490a2e7 | Bin 0 -> 46 bytes ...t-96939ec880829d76392ba9de2c6ac5b3ff78d20a | Bin 0 -> 761 bytes ...t-bf008b5bfe748d33669c905f9b84be60856e57c8 | Bin 0 -> 505 bytes ...t-d446c0fd59ce5bd844a954f0c4f7e40a891135d9 | Bin 0 -> 46 bytes ...t-ff38df2c9451c2fd00fd746c53adef87a495da9d | Bin 0 -> 761 bytes ...t-6b847dcc217d2c51134ddf8939e3fe5153153ba5 | Bin 0 -> 268 bytes ...t-76a0fb5e7896bbc694a45e713f9729248455aec5 | Bin 0 -> 306 bytes ...t-e4cc5c1a9ab8c5f3f7ae3ca97e395beb682d65b0 | Bin 0 -> 862 bytes ..._client_examples_of_bad_closing_streams.py | 34 + test/core/end2end/fuzzers/hpack.dictionary | 194 + test/core/end2end/fuzzers/server_fuzzer.cc | 136 + .../fuzzers/server_fuzzer_corpus/01c008fa.bin | Bin 0 -> 252 bytes .../fuzzers/server_fuzzer_corpus/021ec59f.bin | Bin 0 -> 46 bytes .../023517819bc642abe41d8735112fcacaf018c0cc | Bin 0 -> 52 bytes .../02918e4ad9e8928845f232c0cb043057add3c9a9 | Bin 0 -> 60 bytes .../0336e1ff71939de9e2007fdb4aba891e35a37488 | Bin 0 -> 45 bytes .../fuzzers/server_fuzzer_corpus/033dd2f6.bin | Bin 0 -> 28 bytes .../fuzzers/server_fuzzer_corpus/0384345c.bin | Bin 0 -> 286 bytes .../03a304b82629155af693978c2b53439e553f6450 | Bin 0 -> 225 bytes .../03a72675e1969f836094f1ecfec2a7b34418e306 | Bin 0 -> 286 bytes .../03b9be1fa172dff5d1543be079b9c64fa2c9a278 | Bin 0 -> 60 bytes .../0416afd6875d9ba55f1e5f86a6456a5445d5e576 | Bin 0 -> 651 bytes .../052c8f28e5884bb48f0d504461272cd3a5893215 | Bin 0 -> 286 bytes .../05551028437699c8650f5d08eb5f95ee25adf436 | Bin 0 -> 49 bytes .../05c3a0390d0f52d241728926fa901599a47e4606 | Bin 0 -> 49 bytes .../05efe6d81ce606557691432634e81f61e68b0b81 | Bin 0 -> 289 bytes .../06285b50669cc16463db009ac821f99cf1ec2e24 | Bin 0 -> 650 bytes .../06bd2f82fefb9943787d63ea359f9b77072380c2 | Bin 0 -> 67 bytes .../0766afc7c27c06ea18d896083470d587a380de3c | Bin 0 -> 46 bytes .../07ad7e0ea2aaecba37f2429a64e946fc6e2556f1 | Bin 0 -> 855 bytes .../07c96c06eddbed5a3ce050436bc805f6821cbc9b | Bin 0 -> 60 bytes .../081e56ce6f6b1c57adb806fbc5baa9f93f87513a | Bin 0 -> 44 bytes .../08492d3d0994005206d1d3213b8747d1026ae1eb | Bin 0 -> 60 bytes .../084e9e02b8f2ed41ff9c22fef80e522e491227c5 | Bin 0 -> 288 bytes .../08c42ef29eff83052c5887855f2fa3e07ebe470c | Bin 0 -> 650 bytes .../09938e3256d06a8e168eb038d8a58b8462f7f697 | Bin 0 -> 61 bytes .../0aa599e20761777c2cb9b41cd89e5c2e18f82d9e | Bin 0 -> 64 bytes .../fuzzers/server_fuzzer_corpus/0aa7b949.bin | 1 + .../0ab8698b211ee696f35f20a25c27e9429235fa41 | Bin 0 -> 2046 bytes .../fuzzers/server_fuzzer_corpus/0abd533e.bin | 2 + .../fuzzers/server_fuzzer_corpus/0b275a7f.bin | Bin 0 -> 45 bytes .../0c129f78eacfb0d0d3c89dd4e578724096a3cea0 | Bin 0 -> 63 bytes .../0c413d2b361b2221585026d42f3046ff4135d2ff | Bin 0 -> 248 bytes .../fuzzers/server_fuzzer_corpus/0d10bb63.bin | Bin 0 -> 236 bytes .../0e349b8762703d080b3a696600e21d64c23a2ed3 | Bin 0 -> 60 bytes .../fuzzers/server_fuzzer_corpus/0f700e05.bin | Bin 0 -> 46 bytes .../fuzzers/server_fuzzer_corpus/0ff4d220.bin | Bin 0 -> 42 bytes .../fuzzers/server_fuzzer_corpus/10724098.bin | Bin 0 -> 51 bytes .../108e270a272e312fc97ec23004b80fdc7bad3906 | Bin 0 -> 53 bytes .../fuzzers/server_fuzzer_corpus/11516d58.bin | Bin 0 -> 48 bytes .../11cda3f70be4b507ea936bca93af9ce5aaab3be7 | Bin 0 -> 60 bytes .../11e90d0f3ecbf72ad5027051d476a31b8d7e0671 | Bin 0 -> 54 bytes .../129382aa11fa2922053fa47ba691dddb98901260 | Bin 0 -> 70 bytes .../13501419f349b7855d2e94060bd08b28923d1f37 | Bin 0 -> 2047 bytes .../1353e447b7b10fb3eabb02863a1fc5bc9bb50460 | Bin 0 -> 264 bytes .../1421a8e9f045ac65a0f6938fae93fece1060c41d | Bin 0 -> 963 bytes .../146b7d66ad932c4b623eec8004e286d3705697d3 | Bin 0 -> 48 bytes .../14f9a0cda0d64590430218aaf6dedd9be2a3533f | Bin 0 -> 64 bytes .../15ae78a8543a4794a27e6c79b0d34540322b97fd | Bin 0 -> 259 bytes .../15afdcf2cadb93f56dbe36233d8cd7ea9d2bd6fe | Bin 0 -> 286 bytes .../1650b19093c56a1e86ee192bd9cd8d2266a9e353 | Bin 0 -> 64 bytes .../16753235697083ecc45c117287f1d8ce6ad1ad1a | Bin 0 -> 286 bytes .../1703a8f0c3b3c9dda9eba8d3850e69536436d57a | Bin 0 -> 57 bytes .../17d7c718ec2597353a5dd2c78d6717a3d6aabfae | Bin 0 -> 64 bytes .../18d8d274aa7c163fd6d0084d5c25c8623e10c541 | Bin 0 -> 64 bytes .../fuzzers/server_fuzzer_corpus/18f00b5f.bin | 1 + .../1928c455f3685f4abe7a04697f571ab864cae02e | Bin 0 -> 310 bytes .../1939a9021aba59ea2e49d3d0909e6fdf86ac3f9e | Bin 0 -> 39 bytes .../fuzzers/server_fuzzer_corpus/1a69d5fc.bin | Bin 0 -> 46 bytes .../1aa6897b6eebb8c68c972cc5025b39c7e60c17fe | Bin 0 -> 34 bytes .../1ba889ea1543297824e99e641e6ca8b91f45732e | Bin 0 -> 650 bytes .../1cf17783de9e662f3720847f2d83d86dcdcab500 | Bin 0 -> 63 bytes .../fuzzers/server_fuzzer_corpus/1cfdde7a.bin | Bin 0 -> 252 bytes .../1d614f3d6b826f844178a77094bedb534748a362 | Bin 0 -> 102 bytes .../fuzzers/server_fuzzer_corpus/1e92aaa5.bin | Bin 0 -> 39 bytes .../fuzzers/server_fuzzer_corpus/1ea5651f.bin | 1 + .../fuzzers/server_fuzzer_corpus/1f992057.bin | Bin 0 -> 48 bytes .../20fd12d3670571283dc0c5dbb3fc139a8e943790 | Bin 0 -> 262 bytes .../fuzzers/server_fuzzer_corpus/21475569.bin | Bin 0 -> 29 bytes .../218c1b123428a07622570947e9b7cdb48c310ca5 | Bin 0 -> 46 bytes .../fuzzers/server_fuzzer_corpus/21a2dcda.bin | Bin 0 -> 36 bytes .../fuzzers/server_fuzzer_corpus/22ad891a.bin | Bin 0 -> 33 bytes .../23c582f6e23c7bbc9ae7b039b3b4e2ccdea3d5d2 | Bin 0 -> 1106 bytes .../23f261e44d54a2736f6e288128d98db9e5015206 | Bin 0 -> 100 bytes .../2463aea879c5ab49f8409d0e5c062c7e086b034b | Bin 0 -> 64 bytes .../24ed80095e58199c52997f174046272f61ce4a8d | Bin 0 -> 33 bytes .../fuzzers/server_fuzzer_corpus/25ab638f.bin | Bin 0 -> 252 bytes .../26048c58bd5f2a94843f6fd1e4ab0be04b232636 | Bin 0 -> 60 bytes .../26870785fd0564f552af4e0ca418738a85b21086 | Bin 0 -> 64 bytes .../2701d1669c2996c097a74c5255d569615357b916 | Bin 0 -> 51 bytes .../fuzzers/server_fuzzer_corpus/27ac2ae2.bin | Bin 0 -> 45 bytes .../fuzzers/server_fuzzer_corpus/2814d70c.bin | 1 + .../fuzzers/server_fuzzer_corpus/282b6585.bin | Bin 0 -> 44 bytes .../29a8346696d6f0962072714b9626966c81dcef0c | Bin 0 -> 100 bytes .../2a688fd507072e1cfa2e3bc58652a7cd82dface3 | Bin 0 -> 286 bytes .../2abe64b96e5e72adcf2dcc43444a69d0fb664b66 | Bin 0 -> 50 bytes .../2ad6cedd32cd646ba8e25226c7c13a107c1d6447 | Bin 0 -> 635 bytes .../2b14c6e618ec95754ea7e24fe6bc5a3a97df6897 | Bin 0 -> 60 bytes .../2b40aa21723c7e67e92e74a3083df008461d591c | Bin 0 -> 63 bytes .../2bf69fe6b40734cc3f0abdd765757809b14b0b88 | Bin 0 -> 44 bytes .../2c4c7e2ed6d977ec119b040b328ad09808909a70 | Bin 0 -> 287 bytes .../fuzzers/server_fuzzer_corpus/2c6660ba.bin | Bin 0 -> 49 bytes .../2cc6d1f3ee8933518e91b8410781fa6e105b3a15 | Bin 0 -> 60 bytes .../fuzzers/server_fuzzer_corpus/2e4805c3.bin | 3 + .../2f20e2decd09b6f211a5469c67efbada355e6c04 | Bin 0 -> 64 bytes .../2f3b1cd6780fe475f76f17e9e36541963d993165 | Bin 0 -> 60 bytes .../2fb017cd4c34f4af183d03c4a219d2bb36ee2dd6 | Bin 0 -> 60 bytes .../30bba77d0f420c4f454011476f3c94e31c50c161 | Bin 0 -> 50 bytes .../fuzzers/server_fuzzer_corpus/3224e6cd.bin | Bin 0 -> 32 bytes .../fuzzers/server_fuzzer_corpus/326ec4d5.bin | 1 + .../3292129aa7f6eba86b70fff64408f18fff895c12 | Bin 0 -> 289 bytes .../fuzzers/server_fuzzer_corpus/32b11997.bin | Bin 0 -> 44 bytes .../32cecacca27b249bd764f852168036c5f962bd16 | Bin 0 -> 546 bytes .../fuzzers/server_fuzzer_corpus/330ad4b6.bin | Bin 0 -> 43 bytes .../33b4cf1ac251f0ba0c014005ef8207afe1dea623 | Bin 0 -> 60 bytes .../33e2ecd5c9bbc1f1dcab29d00195e0ab6d04642d | Bin 0 -> 42 bytes .../340b032d39e2b212828a2bd1a97e2b6b81dcd41b | Bin 0 -> 47 bytes .../fuzzers/server_fuzzer_corpus/34bba9e4.bin | Bin 0 -> 49 bytes .../374262a5acf9cde1f480e7b7254c788e1936a4de | Bin 0 -> 61 bytes .../fuzzers/server_fuzzer_corpus/37ec9df8.bin | Bin 0 -> 101 bytes .../38df7e63181cbd045e5af9dbee463360c8254618 | Bin 0 -> 289 bytes .../395aea4fcfea081fc0d2733fff2d14405439fa72 | Bin 0 -> 2047 bytes .../fuzzers/server_fuzzer_corpus/39ea47bb.bin | 1 + .../3aa82376296ab5a33f2921d7705b75b78b683c2d | Bin 0 -> 58 bytes .../3b09bf453c6f93983c24c4d5481e55d66213f93a | Bin 0 -> 650 bytes .../3b55d09b98e3982d6f80913a792463c3974766db | Bin 0 -> 665 bytes .../fuzzers/server_fuzzer_corpus/3ca5da2f.bin | 3 + .../3d7ef8c7b05f26e914c479dedb1bef5e378d2d94 | Bin 0 -> 289 bytes .../3dc665f93db294b9ccb8fcec94bcc2a91f3a04e7 | Bin 0 -> 44 bytes .../fuzzers/server_fuzzer_corpus/3de41f3f.bin | Bin 0 -> 260 bytes .../3e2077a4fd2def7b11e618d46245d0aa85824317 | Bin 0 -> 322 bytes .../fuzzers/server_fuzzer_corpus/3e3ae35a.bin | Bin 0 -> 60 bytes .../fuzzers/server_fuzzer_corpus/3e787760.bin | Bin 0 -> 50 bytes .../3efcff3d4ca529a89061c05ef9e8035f36d564b1 | Bin 0 -> 1143 bytes .../3f3069cf26f761366f947e025f7049254d555e7f | Bin 0 -> 46 bytes .../3fd914fc88fbf1a8804c6715100793d27fefd21d | Bin 0 -> 53 bytes .../3ff171516486f77dda57bec1f757da1691547b9c | Bin 0 -> 60 bytes .../404e234751b01dd0b51f9e7610f787253b074528 | Bin 0 -> 650 bytes .../fuzzers/server_fuzzer_corpus/407607d2.bin | Bin 0 -> 47 bytes .../40af8d589c76d7912bec06c2ae1f2466065018e7 | Bin 0 -> 36 bytes .../4123bd764c04385191342ea64918408140313714 | Bin 0 -> 47 bytes .../416160124b3b64fc9355f24dd789b3d1fd097b8b | Bin 0 -> 656 bytes .../418f392319c44d06a018ce4c62569d527829177a | Bin 0 -> 44 bytes .../fuzzers/server_fuzzer_corpus/41b31ef0.bin | Bin 0 -> 259 bytes .../fuzzers/server_fuzzer_corpus/422708b4.bin | 1 + .../fuzzers/server_fuzzer_corpus/422fa704.bin | Bin 0 -> 47 bytes .../4271fbb36e03cee79b21a4a5a65f37ceef58a8cd | Bin 0 -> 1091 bytes .../fuzzers/server_fuzzer_corpus/42b0afca.bin | Bin 0 -> 27 bytes .../43fc6abab9840be5ee614211f17395b5966f6070 | Bin 0 -> 71 bytes .../44516839d35af9ccaf8a2c62f3ce6a723482445e | Bin 0 -> 248 bytes .../fuzzers/server_fuzzer_corpus/44f342a6.bin | Bin 0 -> 39 bytes .../fuzzers/server_fuzzer_corpus/4558ddeb.bin | Bin 0 -> 45 bytes .../fuzzers/server_fuzzer_corpus/459c0bf6.bin | Bin 0 -> 30 bytes .../468cf8bf3e31e1013c7c6d2288baac47ff90aa63 | Bin 0 -> 49 bytes .../47563391b73b6ef4bf987014c3e631fe2555a377 | Bin 0 -> 382 bytes .../49cb33cbb60f041e8e99dd718993acd2c3354416 | Bin 0 -> 357 bytes .../fuzzers/server_fuzzer_corpus/4aa883d0.bin | Bin 0 -> 67 bytes .../4b7bcb4ae6c0222a1a24d1fb1a5d96519750ca5e | Bin 0 -> 832 bytes .../4c412cc1a775cea041fa270483d610afb72f463b | Bin 0 -> 62 bytes .../fuzzers/server_fuzzer_corpus/4d55d5ae.bin | 1 + .../4d982c41efad2242f8c06630c23c68146153b47b | Bin 0 -> 287 bytes .../4db3d4075ed27f2a2311f85dd1d6df028cc5d083 | Bin 0 -> 404 bytes .../fuzzers/server_fuzzer_corpus/4eb269c3.bin | Bin 0 -> 259 bytes .../4ecfe1be695df0d2489dddb52da8bcdeb6ed779d | Bin 0 -> 49 bytes .../4f96a5fba4d11401eb22d4b1e365fbbb2d684f24 | Bin 0 -> 315 bytes .../4f97bd97ab5dc6b4c0f62f8459be8a9593dc83b3 | Bin 0 -> 60 bytes .../4ff50e49865768323f94116bd98d2314455273cc | Bin 0 -> 48 bytes .../508def44e4d60f237f18a40d7058e58a752a74e1 | Bin 0 -> 286 bytes .../fuzzers/server_fuzzer_corpus/51a1abd1.bin | Bin 0 -> 27 bytes .../52b5478161de7b2eba0f7bfbc29aea985c8d9ee7 | Bin 0 -> 286 bytes .../52ecfedca3b2b26e6999b6afc846f3dbd5d35130 | Bin 0 -> 61 bytes .../53d18398c0d484de00afd8d583fe802d55d4da44 | Bin 0 -> 59 bytes .../fuzzers/server_fuzzer_corpus/53de507f.bin | 5 + .../fuzzers/server_fuzzer_corpus/540ada69.bin | Bin 0 -> 39 bytes .../5413b531fe06923ddf2c9e3eb958769374bc2445 | Bin 0 -> 42 bytes .../fuzzers/server_fuzzer_corpus/5429f0da.bin | Bin 0 -> 252 bytes .../fuzzers/server_fuzzer_corpus/5435005f.bin | Bin 0 -> 34 bytes .../546367bfdd2b9464fbfe5d74f55d8cd220accbab | Bin 0 -> 628 bytes .../54aca6c103dbdf019a2bf45506786c095e470de1 | Bin 0 -> 832 bytes .../fuzzers/server_fuzzer_corpus/54d0fc6c.bin | 4 + .../552199651d942e7220141a93ec33dd8256210a18 | Bin 0 -> 46 bytes .../55af20415ead0ddd417f37fa91a4c767b749ee34 | 1 + .../fuzzers/server_fuzzer_corpus/55f6fb1a.bin | Bin 0 -> 41 bytes .../fuzzers/server_fuzzer_corpus/5780565e.bin | Bin 0 -> 33 bytes .../fuzzers/server_fuzzer_corpus/57918260.bin | 1 + .../5841d898d2cd804f2d6373538e341dfba8a4dfab | Bin 0 -> 101 bytes .../fuzzers/server_fuzzer_corpus/58b88a24.bin | Bin 0 -> 33 bytes .../59743fe120be6ae1aed1c02230ee1bb460f621ee | Bin 0 -> 628 bytes .../fuzzers/server_fuzzer_corpus/597fdab5.bin | Bin 0 -> 256 bytes .../59ce7091c00075943d79e857c01ad1af5f38c78e | Bin 0 -> 51 bytes .../59d0b24d1acd01c749fb4bd6802a5f4dd003ce75 | Bin 0 -> 322 bytes .../fuzzers/server_fuzzer_corpus/59dcfde4.bin | 3 + .../5ac92c4a7fb476393f8275fe4b79a2b13e3bcad9 | Bin 0 -> 50 bytes .../5d43ac923d7607a16e3d7bf8b838f52622871251 | Bin 0 -> 64 bytes .../fuzzers/server_fuzzer_corpus/5d817877.bin | Bin 0 -> 38 bytes .../5db8b96291c7ee12141eafc925be845c4f5ea069 | Bin 0 -> 255 bytes .../5e2508e15c79fbe9c2e6c1a393b490356a17efbc | Bin 0 -> 49 bytes .../fuzzers/server_fuzzer_corpus/5f758756.bin | 2 + .../5f820fa8d44229219d0b7c4724e3e40a2ace97f4 | Bin 0 -> 257 bytes .../609706c57e848ea58d7ca14fe6cc253322f3e8ce | Bin 0 -> 59 bytes .../61e798bdd49b339983fea4ccfe18efe44afbd69b | Bin 0 -> 290 bytes .../62d05f336176a10a2c339c04d818f23b6e9a2637 | Bin 0 -> 64 bytes .../fuzzers/server_fuzzer_corpus/6499e2db.bin | Bin 0 -> 46 bytes .../64cdbb31d5eda779d07885fa7881812db7800c05 | Bin 0 -> 527 bytes .../65077d2946cfb822cf92c9dfc44517a34589f277 | Bin 0 -> 64 bytes .../fuzzers/server_fuzzer_corpus/65099066.bin | Bin 0 -> 261 bytes .../fuzzers/server_fuzzer_corpus/652bfdce.bin | Bin 0 -> 50 bytes .../65d5ae42e6acb429459a1e1a5fb35f09c0f95de2 | Bin 0 -> 63 bytes .../65fd6cb3058ee0baae854cc7859b7c0c1e1c1166 | Bin 0 -> 44 bytes .../6652f7be83a876214affc3f230040757f7db4ea8 | Bin 0 -> 64 bytes .../fuzzers/server_fuzzer_corpus/67b04816.bin | Bin 0 -> 43 bytes .../67ebf074c7f928c4fe32fef44e5c958cf441c93c | Bin 0 -> 50 bytes .../68f564fd8064233897ff704b5955b33a2e29293a | Bin 0 -> 61 bytes .../fuzzers/server_fuzzer_corpus/69891e9f.bin | Bin 0 -> 252 bytes .../6c0ec181e81b915071766762f5d78e9b1ccc9128 | Bin 0 -> 321 bytes .../6c5bb78b51cf5006c92258292de19550985c00ba | Bin 0 -> 702 bytes .../6c66271b74a11f4e7065a6acbc86e4611e7e0dcc | Bin 0 -> 925 bytes .../6db42d0c5471ac697d82e882c01867b73f71c71f | Bin 0 -> 59 bytes .../fuzzers/server_fuzzer_corpus/6dc4455c.bin | Bin 0 -> 33 bytes .../fuzzers/server_fuzzer_corpus/6e050e98.bin | Bin 0 -> 243 bytes .../6f3bd9f33ca05bebe3811f7b3ae6ed112e1e45b9 | Bin 0 -> 286 bytes .../6f9d75e1af7ae7010d32872da888a582a25fddb4 | Bin 0 -> 46 bytes .../70ebe7f32c63ca8940017eb83e6db4d8b39ee03c | Bin 0 -> 43 bytes .../712300b98afdb5f0d15c657c13cea76841164b13 | Bin 0 -> 60 bytes .../71ab07577909ca4b766f8ea0c6b8ec2bc395fc66 | Bin 0 -> 39 bytes .../72296cf9e1052ced4b60e2053aba9f1a569144e9 | Bin 0 -> 60 bytes .../72db978194609ac138bca393650740a3eae8f448 | Bin 0 -> 649 bytes .../7342b3febb07521e39abdf4ee976d16199d51239 | Bin 0 -> 50 bytes .../fuzzers/server_fuzzer_corpus/746715fe.bin | Bin 0 -> 252 bytes .../76294f12a5974e9f87d8f092d0df5429cf6c0466 | Bin 0 -> 59 bytes .../769f5d079151d1b5cab388c47a74f3c297c18d58 | Bin 0 -> 60 bytes .../7839f12a8410a73d66e191cb5183d36d09a375e8 | Bin 0 -> 43 bytes .../7a946bf3cd91b63001f2cf3f40c515c747f2ecde | Bin 0 -> 696 bytes .../7b453adcb9c4bf31dbc448ff32c2bc90ebcbdf0f | Bin 0 -> 61 bytes .../7d25c28298fb4d0fe41209d0d14307e4aa67c59e | Bin 0 -> 47 bytes .../7ddfac7d7845b424bf670070781ca6ff8586c63b | Bin 0 -> 287 bytes .../7df75412d12894fc501bd2d8493fe9e5a753ad88 | Bin 0 -> 286 bytes .../fuzzers/server_fuzzer_corpus/7f15bbce.bin | 1 + .../fuzzers/server_fuzzer_corpus/7ffd05db.bin | Bin 0 -> 264 bytes .../8138b18a9a743659befc2f2b23d23cb9c3086a09 | Bin 0 -> 348 bytes .../8164d3c4af043c47cfd6966873bccd2353d072bf | Bin 0 -> 357 bytes .../81fb19dfcb3c3a18fd9e7c177356479503e75e6f | Bin 0 -> 61 bytes .../82dda42ddde662192ebaa96788945b7673bb486b | Bin 0 -> 63 bytes .../830e3f794c53f7b284eb5c635b2943db9ee9aaee | Bin 0 -> 287 bytes .../fuzzers/server_fuzzer_corpus/8338ebee.bin | Bin 0 -> 43 bytes .../84a3c6cf853ff318ae163231ce295171a59d5871 | Bin 0 -> 1106 bytes .../86478f200fa3602b9859597fd1ae56a04027d7e9 | Bin 0 -> 261 bytes .../8694fdefd4ed3d3fdb30fe1d7595f6ea6f5f5054 | Bin 0 -> 58 bytes .../86a19d13cc65790696299c819cac17b14e337647 | Bin 0 -> 50 bytes .../fuzzers/server_fuzzer_corpus/86e6dbf2.bin | Bin 0 -> 263 bytes .../87155c97c3fc6276f7b8f13b50a50e2307b2d397 | Bin 0 -> 58 bytes .../87e6640111fb02fa4cda7db9c1d51432b3b06212 | Bin 0 -> 101 bytes .../88017b0894db1e6f4e3a6640ffe2876d31a54723 | Bin 0 -> 322 bytes .../8846918f967dd6513040c6d382fcd68ff7099873 | Bin 0 -> 342 bytes .../885fe25a0b441ef46ab176b88771c133e530cb73 | Bin 0 -> 248 bytes .../fuzzers/server_fuzzer_corpus/88e1329b.bin | Bin 0 -> 44 bytes .../89cd90fb47bb9eb289e8126b26021ee00d572d95 | Bin 0 -> 48 bytes .../fuzzers/server_fuzzer_corpus/8b186384.bin | Bin 0 -> 42 bytes .../8c04817a75fddd71f13779f2ad5b994f45c333a2 | Bin 0 -> 44 bytes .../8c72c3f35e9b9fd168ad9024c953a703f33ae3c1 | Bin 0 -> 60 bytes .../8c760938a2a72fa92b27e00e05005e2e4c429359 | Bin 0 -> 257 bytes .../fuzzers/server_fuzzer_corpus/8da521d9.bin | Bin 0 -> 26 bytes .../fuzzers/server_fuzzer_corpus/8de81717.bin | Bin 0 -> 42 bytes .../8ec00f45afb097066f47d0bad256a8b856b1efe8 | Bin 0 -> 287 bytes .../fuzzers/server_fuzzer_corpus/90224b8e.bin | Bin 0 -> 46 bytes .../fuzzers/server_fuzzer_corpus/90240c7c.bin | Bin 0 -> 47 bytes .../9099ac4e83f6460c80b5557c87f653e4c65aa091 | Bin 0 -> 636 bytes .../914ed07570b6441365a3636d05850f7316c7f2a8 | Bin 0 -> 49 bytes .../916b825da0ffc46fdb6120b1044e98ae158fce70 | Bin 0 -> 43 bytes .../925011abb99fd56bb0f425ae5e0d92e6d341f804 | Bin 0 -> 49 bytes .../92f1df2266f34a097e96dd22188d8633832d37b1 | Bin 0 -> 61 bytes .../fuzzers/server_fuzzer_corpus/93beeba2.bin | Bin 0 -> 266 bytes .../93c3ffcb7e3bcb5ed7e37a5b3dfb97b43ca42718 | Bin 0 -> 60 bytes .../947f53c0978672e59be452395670fa949a33cb4f | Bin 0 -> 64 bytes .../9540d3ad3fa75bfb95c0d57cefd737611c7069a5 | Bin 0 -> 236 bytes .../fuzzers/server_fuzzer_corpus/954337ef.bin | Bin 0 -> 25 bytes .../95d25ba2e190fafa2b3ca1e1c467b9ef64868962 | Bin 0 -> 46 bytes .../9764015f89a0b7a59f3b5359b0a037b38d6e39d7 | Bin 0 -> 61 bytes .../fuzzers/server_fuzzer_corpus/97aed4bd.bin | Bin 0 -> 48 bytes .../984886f71bcbb9e5c224ca15165d5c21d9daf13e | Bin 0 -> 650 bytes .../986c9ca7db83b2cddbae2a0db2dca87f52277074 | Bin 0 -> 101 bytes .../9953eb28aa1ed661612a4710a9d16a15de4ae353 | Bin 0 -> 45 bytes .../99a1acc96512c1155f91afa378e2345726d307c3 | Bin 0 -> 660 bytes .../9a176b6f7e0dc5f681a1788d8954f76fabd08cad | Bin 0 -> 2047 bytes .../9a6963b0d0fcb0e91a31748c47c6f0e1e842fea9 | Bin 0 -> 605 bytes .../fuzzers/server_fuzzer_corpus/9bf7553a.bin | 1 + .../9d2d18fce18c790035d8f67ed798703bdda0a949 | Bin 0 -> 513 bytes .../9d7b307bf4ef07f46b2c99311b4486bf40884b1a | Bin 0 -> 60 bytes .../a112d484b70e778835fcd478fd651828720791e5 | Bin 0 -> 63 bytes .../fuzzers/server_fuzzer_corpus/a24bf2dc.bin | Bin 0 -> 31 bytes .../a32be0653ccc65463445b4aaf24a7a1164d5c642 | Bin 0 -> 101 bytes .../fuzzers/server_fuzzer_corpus/a357658d.bin | 1 + .../fuzzers/server_fuzzer_corpus/a3a2b1af.bin | Bin 0 -> 40 bytes .../a40c3ba87b4206142b134f67485859b7c9b7c75c | Bin 0 -> 663 bytes .../fuzzers/server_fuzzer_corpus/a5348197.bin | Bin 0 -> 262 bytes .../a5b529754606b96a8c801615ac12a1f6ee5c3f54 | Bin 0 -> 289 bytes .../a5cc3762cb2b2cac316c60ddee794016057fb4ff | Bin 0 -> 60 bytes .../a5ccb8f124d8ddb5350b90bc0d6b96db280cb7c9 | Bin 0 -> 651 bytes .../fuzzers/server_fuzzer_corpus/a7e64803.bin | Bin 0 -> 114966 bytes .../a7fac1265a384fe9e45a9ee3d708b79c4e80505e | Bin 0 -> 286 bytes .../a8305e9bb4a544eaef27e8bd21b4faabf524a84e | Bin 0 -> 101 bytes .../a8b4049240b53947a8bc76cadf8d4ff9a802c783 | Bin 0 -> 257 bytes .../a8d229374635fa6f2a75ca1669892e1bc244e719 | Bin 0 -> 60 bytes .../a8f2345b2c949e9e32a434c99accf771f405eb65 | Bin 0 -> 261 bytes .../a9463428cdc47d37efb6e3c5633d1e5e78911f16 | Bin 0 -> 48 bytes .../a9966f7181d08f6a9ff8158736ad77a285d743a6 | Bin 0 -> 100 bytes .../fuzzers/server_fuzzer_corpus/a9e22d93.bin | Bin 0 -> 39 bytes .../a9fc296cc61d020bc9afbdd0e7e5e3031e884176 | Bin 0 -> 285 bytes .../fuzzers/server_fuzzer_corpus/aa3c8974.bin | Bin 0 -> 45 bytes .../fuzzers/server_fuzzer_corpus/aa825693.bin | Bin 0 -> 29 bytes .../fuzzers/server_fuzzer_corpus/aa8729d7.bin | Bin 0 -> 44 bytes .../aaafca90a7f59184f3d768a1d6f9093e8f737b8a | Bin 0 -> 287 bytes .../aaf049720c707d4e14e47e7eb31d6a2dda60e66a | Bin 0 -> 651 bytes .../ab41d96d82d2dd3f41cd495c53ea031d7979b47a | Bin 0 -> 286 bytes .../ac4e19c9fe290afc54bbb1e5f6cfe84a9c1f3c29 | Bin 0 -> 236 bytes .../fuzzers/server_fuzzer_corpus/ad810f7f.bin | Bin 0 -> 33 bytes .../ae297426638eb5a0611324f403c3189515274f1b | Bin 0 -> 262 bytes .../aedefcd9bd7fc10b7bf60372da54c43e953523bd | Bin 0 -> 48 bytes .../aefcbc29f2caea5038cda4dbc927cdadd9b844c4 | Bin 0 -> 102 bytes .../fuzzers/server_fuzzer_corpus/b06ce623.bin | Bin 0 -> 43 bytes .../fuzzers/server_fuzzer_corpus/b1128694.bin | Bin 0 -> 257 bytes .../b220d23a13d98d4815b1f7a3e4fe7dd8672b1c83 | Bin 0 -> 60 bytes .../fuzzers/server_fuzzer_corpus/b28959dd.bin | 1 + .../fuzzers/server_fuzzer_corpus/b431df13.bin | Bin 0 -> 26 bytes .../fuzzers/server_fuzzer_corpus/b5acaa52.bin | Bin 0 -> 45 bytes .../b74dcd9c2780f145e09a27d2e03119576889a301 | Bin 0 -> 650 bytes .../b7ce4a4f6eea20c0b83d9f7fa8406a0730ee0040 | Bin 0 -> 347 bytes .../fuzzers/server_fuzzer_corpus/b829143b.bin | Bin 0 -> 245 bytes .../b887097732b9c30719f6c7ea7a7cbac531512a31 | Bin 0 -> 61 bytes .../fuzzers/server_fuzzer_corpus/b924c842.bin | Bin 0 -> 42 bytes .../fuzzers/server_fuzzer_corpus/bad4f467.bin | Bin 0 -> 45 bytes .../bc9545cebdcb3af82406a5f0c1b286d28f9d4f5a | Bin 0 -> 356 bytes .../bd63e44a3b004e7ed471c2367c3efae2c58a676d | Bin 0 -> 61 bytes .../fuzzers/server_fuzzer_corpus/be9b6e78.bin | Bin 0 -> 265 bytes .../bf5e21c32becb5839deeb81e9174cf6478a25473 | Bin 0 -> 45 bytes .../bfb55acd5b66521eb5bd8ce6b57b3b6895883675 | Bin 0 -> 43 bytes .../fuzzers/server_fuzzer_corpus/bfcbffa9.bin | Bin 0 -> 42 bytes .../c004455e9d60bc2fff094e79cd0b38507023e018 | Bin 0 -> 60 bytes .../c039ac9a5a570f8fd9064df9320890b885edf9c3 | Bin 0 -> 63 bytes .../fuzzers/server_fuzzer_corpus/c1188b44.bin | Bin 0 -> 29 bytes .../c12835aa9f3513d3f7179ee4f9976292713f7cb9 | Bin 0 -> 262 bytes .../c13188118af1634061b6a3947b81618891aeb6a3 | Bin 0 -> 60 bytes .../c2d2aa1977b17d6e38f906968aa756e98dd09ffa | Bin 0 -> 357 bytes .../fuzzers/server_fuzzer_corpus/c35968bf.bin | 1 + .../c39c0192d0d4f2b24f05c25a9e669cc091bff9e9 | Bin 0 -> 345 bytes .../fuzzers/server_fuzzer_corpus/c43d97f2.bin | Bin 0 -> 252 bytes .../fuzzers/server_fuzzer_corpus/c4534867.bin | Bin 0 -> 42 bytes .../c4a71cdd29759b51f9cc54175ad69c44b4ab6eb6 | Bin 0 -> 213 bytes .../c4e4c7572e005e18d56eac407033da058737a5ab | Bin 0 -> 651 bytes .../fuzzers/server_fuzzer_corpus/c559f565.bin | 3 + .../c56fada76f5c198232201a608072a1a63e3d3785 | Bin 0 -> 60 bytes .../c5ff50ae447ac7a0c8fb3363b2458824d405e64c | Bin 0 -> 287 bytes .../fuzzers/server_fuzzer_corpus/c66e84d1.bin | Bin 0 -> 45 bytes .../c6a1d2cc8935808b6e317a69baec1c3cb87cac94 | Bin 0 -> 61 bytes .../c7c44b98faa21c8f0645a818a65b60d956d15952 | Bin 0 -> 39 bytes .../c8073f5f41970fab4738215e42ec97a4383855e5 | Bin 0 -> 49 bytes .../fuzzers/server_fuzzer_corpus/c81dec02.bin | Bin 0 -> 38 bytes .../c8812dc8a1ab1592a2d7b71300e1a0a5da6a6382 | Bin 0 -> 60 bytes .../ca843c66c4c4807ccb1615b472c79bc459e5c6cb | Bin 0 -> 61 bytes .../cbb04be69714f81f5cd09e36e8ea4e69ea73d618 | Bin 0 -> 60 bytes .../cc97ece92b72cc2a4d045e16c0e2f2021bc014f8 | Bin 0 -> 258 bytes .../fuzzers/server_fuzzer_corpus/cca29902.bin | Bin 0 -> 60 bytes .../fuzzers/server_fuzzer_corpus/cdba6c45.bin | Bin 0 -> 264 bytes .../clusterfuzz-testcase-5417405008314368 | Bin 0 -> 58 bytes .../clusterfuzz-testcase-5595941564317696 | Bin 0 -> 92 bytes .../clusterfuzz-testcase-6312731374256128 | Bin 0 -> 26793 bytes ...h-0f4b135c0242669ce425d2662168e9440f8a628d | Bin 0 -> 48 bytes ...h-239cc27a23827ea53b60ccbaee0ecc64dad2bff0 | Bin 0 -> 53 bytes ...h-41ab0e868e84612275f77118f9e832bc94ff45c5 | Bin 0 -> 605 bytes ...h-73923add5066617ae08f187b79d2639b4fd96138 | Bin 0 -> 1488 bytes ...h-7af5da2a8da23d197d9336e32da72c9ff64c15b3 | Bin 0 -> 31 bytes ...h-7e121dd3be057176369bea160d873040b32a03dc | Bin 0 -> 61 bytes ...h-901723090ff2042ecc5a008ccd7ae0845c1681cb | Bin 0 -> 664 bytes ...h-c1f66840627e3bfdedf2e4c225bc4de0c267ed37 | Bin 0 -> 100 bytes ...h-ccf36bef9318fe6d5e5e1560c5485cdc87d0a701 | Bin 0 -> 104 bytes ...h-dae0f07934a527989f23f06e630710ff6ca8c809 | Bin 0 -> 104 bytes ...h-e097bf07afa8e55d7dd5f5df3569e34903ccf9a7 | Bin 0 -> 1186 bytes ...h-e34b0a9a428001cb4094a9ebca76329f578811a4 | 2 + .../fuzzers/server_fuzzer_corpus/d0f7eebc.bin | 1 + .../d2031009d3783fcf083963fa30bb493f7f935541 | Bin 0 -> 101 bytes .../d28155c6c92642c61dfb097f7b2eb1d6ced272c0 | Bin 0 -> 46 bytes .../d297b3f84e3dee9f74bf1162718aff66a11a7f5c | Bin 0 -> 439 bytes .../d44d94764e1761cb7278ffe5cb17871abab7ed89 | Bin 0 -> 56 bytes .../fuzzers/server_fuzzer_corpus/d6979f0f.bin | Bin 0 -> 42 bytes .../d6bed9cc3c10338a8c5f41064ff8bec0bbc267ce | Bin 0 -> 48 bytes .../d8a1d141a9e3876b71c7decbe6e3affccf6de397 | Bin 0 -> 286 bytes .../fuzzers/server_fuzzer_corpus/d9074e68.bin | Bin 0 -> 46 bytes .../d95556cac07e720909aaf2ac09d876106420463f | Bin 0 -> 59 bytes .../d96da249094db51ea92b1413907abfd27a4f2426 | Bin 0 -> 290 bytes .../fuzzers/server_fuzzer_corpus/da7e44a9.bin | 4 + .../fuzzers/server_fuzzer_corpus/dab172ff.bin | Bin 0 -> 45 bytes .../dad922e2daf84cf039f50cf8636eaa9dbd01ff83 | Bin 0 -> 356 bytes .../db33559d4afb4c32e68525c000fde16a4c3300f5 | Bin 0 -> 64 bytes .../dcabac1ef8b197ef39b188bcf5dc470f9749e903 | Bin 0 -> 260 bytes .../dda9643679f8c8b796e64232a7d153e447d64991 | Bin 0 -> 650 bytes .../df5d3cf5f05eab65ef9d385e263780ae73c42b19 | Bin 0 -> 289 bytes .../df80b527a003e47a26099088a283228ec62a61c7 | Bin 0 -> 265 bytes .../e021c5b9815f02ee9d1e5a003cbf3500e19db13c | Bin 0 -> 264 bytes .../fuzzers/server_fuzzer_corpus/e0d9a9a7.bin | Bin 0 -> 265 bytes .../fuzzers/server_fuzzer_corpus/e2652fbb.bin | Bin 0 -> 33 bytes .../fuzzers/server_fuzzer_corpus/e2c954e1.bin | Bin 0 -> 43 bytes .../fuzzers/server_fuzzer_corpus/e3bab014.bin | Bin 0 -> 287 bytes .../e7ad0c4b7d0f289c90a3988309e9e03b78f7eea3 | Bin 0 -> 60 bytes .../e7b08e36420fa107f0aee652e62158af85a4ef15 | Bin 0 -> 1091 bytes .../e96ad9c17795e52edc810a08d4fc61fe8790002a | Bin 0 -> 651 bytes .../e9bbe2fe47b7b9c2683e7f17f4a33625c6ffbd8c | Bin 0 -> 289 bytes .../fuzzers/server_fuzzer_corpus/e9d96662.bin | Bin 0 -> 33 bytes .../fuzzers/server_fuzzer_corpus/eb66106b.bin | Bin 0 -> 43 bytes .../fuzzers/server_fuzzer_corpus/eba8472a.bin | Bin 0 -> 46 bytes .../ec4949487fa84f0cead39521b51f837af9dc784a | Bin 0 -> 46 bytes .../fuzzers/server_fuzzer_corpus/ed8da77f.bin | 1 + .../ee64e1ba4897bfd7c6baa1fb72d4c5f83b5654e4 | Bin 0 -> 75 bytes .../f0387dfdd6b8c925d958113e669ec4a1897034b4 | Bin 0 -> 60 bytes .../f1121b952e75463cc71137683dc2528f9cbc19b7 | Bin 0 -> 60 bytes .../fuzzers/server_fuzzer_corpus/f3220426.bin | Bin 0 -> 46 bytes .../f3a092425c89f49b50469d522c99abbdb1b6dedf | Bin 0 -> 101 bytes .../f3d084cf20b92a5f026fe7cc6e5af49bde28693d | Bin 0 -> 45 bytes .../fuzzers/server_fuzzer_corpus/f4024b01.bin | Bin 0 -> 39 bytes .../fuzzers/server_fuzzer_corpus/f541d27e.bin | Bin 0 -> 264 bytes .../f5424a9d7bd14317b6de7b15587df28bfde8362d | Bin 0 -> 832 bytes .../fuzzers/server_fuzzer_corpus/f5c877c4.bin | Bin 0 -> 45 bytes .../f5f0615030439dda162e8862b6bbd09f81f14d81 | Bin 0 -> 67 bytes .../fuzzers/server_fuzzer_corpus/f74b9428.bin | Bin 0 -> 48 bytes .../f7bf0d7bb0dd6e1866ccef9fafc3cb295db2f07f | Bin 0 -> 61 bytes .../fuzzers/server_fuzzer_corpus/f826100f.bin | Bin 0 -> 33 bytes .../f88ffb7f3066f2706cfcd9be077595e07834cc15 | Bin 0 -> 60 bytes .../f8b46e92c7ceb4c2f2cdcb3452a6d8c58768eaa2 | Bin 0 -> 47 bytes .../fa202a5f51cd49f8ea5af60c5f403f797c01c504 | Bin 0 -> 651 bytes .../fa36b4280d9e28edd81c5e4d192d1a5c2765e5e4 | Bin 0 -> 47 bytes .../fuzzers/server_fuzzer_corpus/fb3b0d80.bin | Bin 0 -> 38 bytes .../fb84edfa9e8cbddba26a7184e7fdc219bde556c0 | Bin 0 -> 67 bytes .../fc162db40f87facb73cff20751e23af2e1f5296e | Bin 0 -> 491 bytes .../fcb1dea251d1ce74e30351f13a3f71e3debec3d2 | Bin 0 -> 651 bytes .../fd14bea45ecaf13af0053900edb2f17b71a0bf09 | Bin 0 -> 832 bytes .../fuzzers/server_fuzzer_corpus/fd26e0a6.bin | Bin 0 -> 51 bytes .../fd943e69304dffebf47e1e40b0849e12abeee287 | Bin 0 -> 60 bytes .../fdf67df81857577361d319e76559c5e85a257b07 | Bin 0 -> 50 bytes .../fe17c07ffbaa67f1165938d2578038637b93cf57 | Bin 0 -> 55 bytes .../fe1957b9bc7c6bf9d8b6089c422d72a0f444da6e | Bin 0 -> 62 bytes .../fuzzers/server_fuzzer_corpus/fe66893c.bin | Bin 0 -> 35 bytes .../fe69ddfa5827dd560bb0b5d4da7d982273f17ef9 | Bin 0 -> 286 bytes .../fe740f8c4ffd07f79456c8cee24ef556ee348f55 | Bin 0 -> 656 bytes .../fuzzers/server_fuzzer_corpus/ff227015.bin | Bin 0 -> 252 bytes .../fuzzers/server_fuzzer_corpus/ff898c08.bin | Bin 0 -> 37 bytes .../ff902ef808e01b0b2d167c1c7e8e263d6f561941 | Bin 0 -> 286 bytes .../fuzzers/server_fuzzer_corpus/hope.bin | Bin 0 -> 407 bytes ...t-0292270056246b7a4ccd2e7d0356665cef307ef2 | Bin 0 -> 2046 bytes ...t-03c6f209b2f144734c83d81ed452839d9e244fe9 | Bin 0 -> 2048 bytes ...t-082763e16153cb6b8f3f5308cd060e822f475e5a | Bin 0 -> 2047 bytes ...t-098ec93ded3a20e6043d11e9cc6066351e257f8e | Bin 0 -> 2047 bytes ...t-0aa52e00ddd54f8e129430852c2da95650c354b0 | Bin 0 -> 2048 bytes ...t-129ecb5e7b80616f36791e3580844e520f2ba7d3 | Bin 0 -> 2048 bytes ...t-13501419f349b7855d2e94060bd08b28923d1f37 | Bin 0 -> 2047 bytes ...t-14862768a1fe076896fd37e2543ddd23192a9e3c | Bin 0 -> 2048 bytes ...t-1a3ebf8f8bb0b5a0109a5ef44734cc64170377f9 | Bin 0 -> 2047 bytes ...t-1ae0ed17a042aab8a3c3199c83a809b0243d1424 | Bin 0 -> 2047 bytes ...t-1b6c4b5c1949adae3efd5e3264bb32a40eea524e | Bin 0 -> 2047 bytes ...t-1dc659f500e7bee41a4fee4423ade8332c162cc0 | Bin 0 -> 2046 bytes ...t-30408c9d13f29804168fc62a0818cc894c6375ae | Bin 0 -> 2047 bytes ...t-33d8bf197de7131be78244e10fbb0da5055cf266 | Bin 0 -> 2047 bytes ...t-350b5da741597222c98fe86768432507850317f5 | Bin 0 -> 2047 bytes ...t-395aea4fcfea081fc0d2733fff2d14405439fa72 | Bin 0 -> 2047 bytes ...t-3991c873ba814d0cd03a67d25fff0c8fe8713aca | Bin 0 -> 2046 bytes ...t-3cec540a680b108dda1e0a8e0bfb2d44e5a4a4e8 | Bin 0 -> 2047 bytes ...t-45cf8ac5faa9c7b15baf9281e8d7e0b4e103f0e0 | Bin 0 -> 2046 bytes ...t-4c6da955e4c101b81a62b2f8e934d94a62ae534b | Bin 0 -> 2046 bytes ...t-51cdbfa3e97a46ceefde405e6ab087a109c26907 | Bin 0 -> 2045 bytes ...t-523cb1bca5ad56690c618b4ceac7fceca1113b9d | Bin 0 -> 2047 bytes ...t-58f116dfba8d428a01ca596174fca63f4ac523f0 | Bin 0 -> 2048 bytes ...t-59f6edc7cf4aeed49b4dc024052db4846d5d7fc8 | Bin 0 -> 2047 bytes ...t-60a9f77951c5059616764894e1963d83d478edfe | Bin 0 -> 2047 bytes ...t-63ebf780ee6c2003eba622686a4bf94c503ad96e | Bin 0 -> 1813 bytes ...t-68ed2d33c9d32f73343c097303c3d5a6a3467c83 | Bin 0 -> 2048 bytes ...t-6d37c5e6d7efee56319b1316725fdc5aee5a52c3 | Bin 0 -> 2048 bytes ...t-6e980a9d12c392175b5f66683e608626ae983276 | Bin 0 -> 2047 bytes ...t-7233d53f94386b0339b2c2b01ef2d348f5862f1f | Bin 0 -> 43 bytes ...t-7281d9eaed0d20b0b6b5e7709c57e78fefe9c315 | Bin 0 -> 2046 bytes ...t-73e0a41066bc09c8e3fbd0dd7628445bcdaabb4a | Bin 0 -> 2046 bytes ...t-84f22ffca68c6e1590a44aa9f6dd0cef1f680c77 | Bin 0 -> 2048 bytes ...t-93cd6b3f9786ee107a0e2d135b40d13f96e652ed | Bin 0 -> 2047 bytes ...t-97a338fa892093ed5013a76b96b35dd112df3342 | Bin 0 -> 2047 bytes ...t-9a176b6f7e0dc5f681a1788d8954f76fabd08cad | Bin 0 -> 2047 bytes ...t-9de2e92150e54982d4e502b18f374f8cd8fd453b | Bin 0 -> 2047 bytes ...t-a1b2cfcf0997acb13a32fc5c004f57d9e9bc4275 | Bin 0 -> 2047 bytes ...t-a1ed26e6f82ca0e81e3f415bd8b0b8b520d3927b | Bin 0 -> 2046 bytes ...t-a61a28cf78149518466b87e5463ec5c771dc504e | Bin 0 -> 2047 bytes ...t-a877fe99fd0e92721d162bc252bf72a4f67ba1ea | Bin 0 -> 2046 bytes ...t-aa23c18f6badd88a7bec65e8b04f7801ba624ec6 | Bin 0 -> 2047 bytes ...t-adaac86cf1aa1e98e95240c5f92c3708456c3624 | Bin 0 -> 2047 bytes ...t-b281f018cc919301131cf3ed28449cfbd24b6bbf | Bin 0 -> 2047 bytes ...t-ba0016a62a8576a57f000b90c364847ef6b12dcc | Bin 0 -> 2046 bytes ...t-ba17346b8e46e6a05aaa7342a959a7c5ab0f1471 | Bin 0 -> 2048 bytes ...t-ba2b1fde90cc70d9abae22c4c4cb051aae8aa148 | Bin 0 -> 2047 bytes ...t-bd9d24f5c7c915174b6ca9d1a3573e16e0edee12 | Bin 0 -> 2047 bytes ...t-bda43d420a3e5d5228a5f5130207a1f11fc1c81f | Bin 0 -> 2045 bytes ...t-c05c239719a7beeca2c126b7e5ef7251fa615b54 | Bin 0 -> 2047 bytes ...t-c151762e5f37e233142059c1b269ce55434cf6a6 | Bin 0 -> 2045 bytes ...t-cacd0e0c5f7d4169085735400100da4d36397185 | Bin 0 -> 2047 bytes ...t-ccafab6afdc6474610023b47bd7b3e1b9ea4647b | Bin 0 -> 2047 bytes ...t-d3c3cba3897fafec97665411ea1f94a89bb4de7b | Bin 0 -> 2046 bytes ...t-d3fcd80cd6f1bb05f5e5084ebb2ee801067863fb | Bin 0 -> 2048 bytes ...t-dc57e96cd02ba32fa4a99c97b6490e9879d30be5 | Bin 0 -> 2047 bytes ...t-ddfe613d8791b2d377e14fbdffb18b84a89d49b6 | Bin 0 -> 2047 bytes ...t-f3c688876395bf7a529f29f7b91532726cf5cbce | Bin 0 -> 2045 bytes ...t-f412afea6b01aa53da919a41a65ffbf9885f2d65 | Bin 0 -> 2047 bytes ...t-f67be653815f6c2c10eea55c8009e1167ac9c20b | Bin 0 -> 2048 bytes ...t-f6c1042f96e15183dcc13b9658d971cc29426d53 | Bin 0 -> 2047 bytes ...t-f9a2773d6502fd4b1ffa73df3c550b0da63af833 | Bin 0 -> 2046 bytes test/core/end2end/gen_build_yaml.py | 49 + test/core/end2end/generate_tests.bzl | 561 + test/core/end2end/goaway_server_test.cc | 390 + test/core/end2end/h2_ssl_cert_test.cc | 404 + .../core/end2end/h2_ssl_session_reuse_test.cc | 299 + test/core/end2end/inproc_callback_test.cc | 512 + .../end2end/invalid_call_argument_test.cc | 636 + .../end2end/multiple_server_queues_test.cc | 71 + test/core/end2end/no_server_test.cc | 115 + .../end2end/tests/authority_not_supported.cc | 188 + test/core/end2end/tests/bad_hostname.cc | 171 + test/core/end2end/tests/bad_ping.cc | 388 + test/core/end2end/tests/binary_metadata.cc | 319 + test/core/end2end/tests/call_creds.cc | 490 + test/core/end2end/tests/call_host_override.cc | 230 + .../core/end2end/tests/cancel_after_accept.cc | 270 + .../end2end/tests/cancel_after_client_done.cc | 237 + .../core/end2end/tests/cancel_after_invoke.cc | 195 + .../end2end/tests/cancel_after_round_trip.cc | 305 + .../end2end/tests/cancel_before_invoke.cc | 188 + test/core/end2end/tests/cancel_in_a_vacuum.cc | 122 + test/core/end2end/tests/cancel_test_helpers.h | 40 + test/core/end2end/tests/cancel_with_status.cc | 182 + test/core/end2end/tests/channelz.cc | 325 + test/core/end2end/tests/client_streaming.cc | 273 + test/core/end2end/tests/compressed_payload.cc | 697 + test/core/end2end/tests/connectivity.cc | 247 + test/core/end2end/tests/default_host.cc | 225 + .../core/end2end/tests/disappearing_server.cc | 218 + test/core/end2end/tests/empty_batch.cc | 124 + .../end2end/tests/filter_call_init_fails.cc | 521 + .../core/end2end/tests/filter_causes_close.cc | 279 + test/core/end2end/tests/filter_context.cc | 318 + test/core/end2end/tests/filter_latency.cc | 350 + test/core/end2end/tests/filter_status_code.cc | 404 + .../end2end/tests/graceful_server_shutdown.cc | 204 + test/core/end2end/tests/high_initial_seqno.cc | 236 + test/core/end2end/tests/hpack_size.cc | 395 + test/core/end2end/tests/idempotent_request.cc | 240 + .../end2end/tests/invoke_large_request.cc | 285 + test/core/end2end/tests/keepalive_timeout.cc | 444 + test/core/end2end/tests/large_metadata.cc | 251 + .../core/end2end/tests/load_reporting_hook.cc | 313 + .../end2end/tests/max_concurrent_streams.cc | 832 + test/core/end2end/tests/max_connection_age.cc | 363 + .../core/end2end/tests/max_connection_idle.cc | 239 + test/core/end2end/tests/max_message_length.cc | 505 + test/core/end2end/tests/negative_deadline.cc | 170 + .../core/end2end/tests/no_error_on_hotpath.cc | 246 + test/core/end2end/tests/no_logging.cc | 293 + test/core/end2end/tests/no_op.cc | 94 + test/core/end2end/tests/payload.cc | 286 + test/core/end2end/tests/ping.cc | 117 + .../core/end2end/tests/ping_pong_streaming.cc | 280 + test/core/end2end/tests/proxy_auth.cc | 233 + test/core/end2end/tests/registered_call.cc | 223 + test/core/end2end/tests/request_with_flags.cc | 206 + .../end2end/tests/request_with_payload.cc | 228 + .../end2end/tests/resource_quota_server.cc | 381 + test/core/end2end/tests/retry.cc | 321 + test/core/end2end/tests/retry_cancellation.cc | 275 + test/core/end2end/tests/retry_disabled.cc | 258 + ...ry_exceeds_buffer_size_in_initial_batch.cc | 262 + ...exceeds_buffer_size_in_subsequent_batch.cc | 275 + .../tests/retry_non_retriable_status.cc | 253 + ...s_before_recv_trailing_metadata_started.cc | 266 + .../tests/retry_recv_initial_metadata.cc | 264 + test/core/end2end/tests/retry_recv_message.cc | 257 + .../tests/retry_server_pushback_delay.cc | 314 + .../tests/retry_server_pushback_disabled.cc | 302 + test/core/end2end/tests/retry_streaming.cc | 444 + .../tests/retry_streaming_after_commit.cc | 350 + ...reaming_succeeds_before_replay_finished.cc | 396 + test/core/end2end/tests/retry_throttled.cc | 260 + .../end2end/tests/retry_too_many_attempts.cc | 295 + .../end2end/tests/server_finishes_request.cc | 203 + .../end2end/tests/shutdown_finishes_calls.cc | 192 + .../end2end/tests/shutdown_finishes_tags.cc | 109 + .../end2end/tests/simple_cacheable_request.cc | 278 + .../end2end/tests/simple_delayed_request.cc | 232 + test/core/end2end/tests/simple_metadata.cc | 271 + test/core/end2end/tests/simple_request.cc | 292 + .../stream_compression_compressed_payload.cc | 619 + .../tests/stream_compression_payload.cc | 302 + .../stream_compression_ping_pong_streaming.cc | 296 + .../end2end/tests/streaming_error_response.cc | 295 + test/core/end2end/tests/trailing_metadata.cc | 281 + .../tests/workaround_cronet_compression.cc | 417 + test/core/end2end/tests/write_buffering.cc | 284 + .../end2end/tests/write_buffering_at_end.cc | 273 + test/core/fling/BUILD | 79 + test/core/fling/client.cc | 246 + test/core/fling/fling_stream_test.cc | 80 + test/core/fling/fling_test.cc | 81 + test/core/fling/server.cc | 327 + test/core/gpr/BUILD | 151 + test/core/gpr/alloc_test.cc | 40 + test/core/gpr/arena_test.cc | 131 + test/core/gpr/cpu_test.cc | 152 + test/core/gpr/env_test.cc | 63 + test/core/gpr/log_test.cc | 115 + test/core/gpr/murmur_hash_test.cc | 73 + test/core/gpr/spinlock_test.cc | 156 + test/core/gpr/string_test.cc | 313 + test/core/gpr/sync_test.cc | 474 + test/core/gpr/time_test.cc | 267 + test/core/gpr/tls_test.cc | 68 + test/core/gpr/useful_test.cc | 59 + test/core/gprpp/BUILD | 147 + test/core/gprpp/fork_test.cc | 139 + test/core/gprpp/global_config_env_test.cc | 130 + test/core/gprpp/global_config_test.cc | 65 + test/core/gprpp/host_port_test.cc | 84 + test/core/gprpp/manual_constructor_test.cc | 97 + test/core/gprpp/mpscq_test.cc | 188 + test/core/gprpp/orphanable_test.cc | 120 + test/core/gprpp/ref_counted_ptr_test.cc | 261 + test/core/gprpp/ref_counted_test.cc | 121 + test/core/gprpp/thd_test.cc | 101 + test/core/handshake/BUILD | 101 + test/core/handshake/client_ssl.cc | 329 + .../readahead_handshaker_server_ssl.cc | 89 + test/core/handshake/server_ssl.cc | 57 + test/core/handshake/server_ssl_common.cc | 278 + test/core/handshake/server_ssl_common.h | 36 + test/core/handshake/verify_peer_options.cc | 277 + test/core/http/BUILD | 129 + test/core/http/format_request_test.cc | 151 + test/core/http/httpcli_test.cc | 218 + test/core/http/httpscli_test.cc | 230 + test/core/http/parser_test.cc | 308 + test/core/http/python_wrapper.sh | 1 + .../0299ca2580e4398d170c4a336e0c33eb2cd9d427 | 2 + .../05e613853d64a9669ea3cf41b0de777dc24931ba | 2 + .../069352518a1d1baa05f317c677d275cefda2ac97 | 2 + .../0925527c9358b1e10ec0f0387cd99f35204d9a34 | 2 + .../0c5b7c2569410b526605e308309a7f36574e530d | 4 + .../0ef3d0a84360bb5ad66274f1226f5cb273ecdbcf | 3 + .../1e1273f90187fdf5df3625764245610f86af6aa4 | 3 + .../1fbc57d118f3733287e9a9d808bb8947b3260e55 | 3 + .../24756c396bc72894fd720092bb6f9c03e66b469f | 2 + .../276def41311933421ae7a9ee42e906c85b6a4d3f | 2 + .../29daa75432381937fd005cb25e314e328de6e9f9 | 2 + .../2a75204bc492084ad853682f8de3fb137d5907bc | 2 + .../2d34ba249b755a880525cf53c665633a5e359305 | 2 + .../33f4ea0c7ea27c37d8f95cfa64d282370efdafd2 | 2 + .../35554617ea6418bd43161fe9a2c337ed82d7ec5b | 4 + .../35f0c561297cfc840ddaeebb9fc61091f4eadece | 2 + .../3787bcc22ef645e665cc5f722b8a633af86de9cf | 9 + .../3953688866ccb3b4f371f1a858570d6afdb6452d | 3 + .../39b19c41ba537f37511eff7727733715db432e76 | 2 + .../3e3c4756d5e40b5aa250954cbac86b826e70a7ac | 3 + .../3f03265921120c6ffa61b944e213e062a5538d4b | 2 + .../3fb034e66ee5494a67acae1b4e6ff64ba92a2046 | 2 + .../466059ed07a0d55d6ad5e522c7d367cbf278eaf9 | 4 + .../487725eb38511c79a9340bf4560a1411061fa6fa | 2 + .../48b9b205cae8ac21512a3f26f49fd53e21ee13c5 | 2 + .../4b1f1f79a0bfa3f942479dd5f8edb59a7c257c55 | 2 + .../5028c56a5116a186b7343ff59567b47347a0796d | 3 + .../533f62b3f495ce704babf3ee8d840f196a714dff | 4 + .../5892cbb284771fc9761caae37b19cd6e27dbc104 | 2 + .../5aeab6e4f7c2a1c09d4ac0dbdb3beac4893607ee | 2 + .../5b6292bdf009b0daecbc90b85cca30a88c36eec5 | 2 + .../5c1659b77678b41faa4fa13df7772dae3238d1c0 | 2 + .../5c81f61621e29ec9c6a64ac3af9b3b216141618e | 2 + .../657368df512ca6294b9df16adf935a3f374a8be2 | 3 + .../7fc4520094902ce2c760d70eaad5b674d2817337 | 5 + .../81f59a12b458ec3604035cb962165c604d1355e6 | 2 + .../8f41c50e88ee8c17ecad3d41d63d38fb12aca0b9 | 4 + .../97c16de7fe3c390a2e6c09ff5c28f17d5c67542c | 2 + .../97e4499d450c95660de86747f527e670f2012548 | 3 + .../9a996857196e0998a1278994a9bab3d35526e7f1 | 2 + .../9b7e00049ec356ecd84b1747e4e1941140139ae8 | 3 + .../9f0c38ec455cc363369b3674a2d32bc21c206de1 | 5 + .../a1dc7bc235e46eb21d91084d7b52d5ff9f45df85 | 3 + .../aa3bbb876eafa8ad8ca4ff2eabc6dd94341d2441 | 2 + .../ae8ba95d7dbe99926a8f5bfd80347fd6a4b616a0 | 17 + .../b04fea5c041c707db0ad9c09a81672557b52cc47 | 2 + .../c4acff8aa2ff886f35439f72625d05002990c940 | 4 + .../c55ce9995b002e88a102ae2891a71e8bacb346c8 | 2 + .../ca5a0c00b8969310acb73d15ad0d0c602f1bd0c2 | 3 + .../cce734f1b263de6994f7950e0df7bf0c81449f70 | 3 + .../d39c8ee11a697634a09b309460c0bbd967e7effa | 17 + .../d4c3e4cf5d035596433c30eaabbd2b2925f4b453 | 3 + .../d51f7fcc089f269c7afecaaca51966bab5fde629 | 2 + .../d936dad71c129cf659097dc3db64550c4dd467f4 | 2 + .../e275b0466a8fb8d9e0e15856e343ddc7112ae66b | 3 + .../e5c364b205855a2991ce07482aebb2a3a6147089 | 2 + .../ee2077e08c3cfccd9bd82adb574ac4fc7d429afb | 2 + .../fc5d4b9117ba9e87388174aee4f4970bdfe8d066 | 1 + .../fdeb2c7daa9e7704f67e141106384e6dd0042c0b | 2 + test/core/http/request_corpus/request1.txt | 3 + test/core/http/request_corpus/request2.txt | 3 + test/core/http/request_corpus/request3.txt | 3 + test/core/http/request_corpus/request4.txt | 3 + test/core/http/request_corpus/request5.txt | 3 + test/core/http/request_corpus/response1.txt | 4 + test/core/http/request_corpus/response2.txt | 4 + test/core/http/request_corpus/response3.txt | 5 + test/core/http/request_corpus/response4.txt | 2 + test/core/http/request_corpus/response5.txt | 5 + test/core/http/request_corpus/response6.txt | 5 + test/core/http/request_corpus/toolong.txt | 2 + test/core/http/request_fuzzer.cc | 45 + .../0299ca2580e4398d170c4a336e0c33eb2cd9d427 | 2 + .../05e613853d64a9669ea3cf41b0de777dc24931ba | 2 + .../069352518a1d1baa05f317c677d275cefda2ac97 | 2 + .../0925527c9358b1e10ec0f0387cd99f35204d9a34 | 2 + .../0c5b7c2569410b526605e308309a7f36574e530d | 4 + .../0ef3d0a84360bb5ad66274f1226f5cb273ecdbcf | 3 + .../1e1273f90187fdf5df3625764245610f86af6aa4 | 3 + .../1fbc57d118f3733287e9a9d808bb8947b3260e55 | 3 + .../24756c396bc72894fd720092bb6f9c03e66b469f | 2 + .../276def41311933421ae7a9ee42e906c85b6a4d3f | 2 + .../29daa75432381937fd005cb25e314e328de6e9f9 | 2 + .../2a75204bc492084ad853682f8de3fb137d5907bc | 2 + .../2d34ba249b755a880525cf53c665633a5e359305 | 2 + .../33f4ea0c7ea27c37d8f95cfa64d282370efdafd2 | 2 + .../35554617ea6418bd43161fe9a2c337ed82d7ec5b | 4 + .../35f0c561297cfc840ddaeebb9fc61091f4eadece | 2 + .../3787bcc22ef645e665cc5f722b8a633af86de9cf | 9 + .../3953688866ccb3b4f371f1a858570d6afdb6452d | 3 + .../39b19c41ba537f37511eff7727733715db432e76 | 2 + .../3e3c4756d5e40b5aa250954cbac86b826e70a7ac | 3 + .../3f03265921120c6ffa61b944e213e062a5538d4b | 2 + .../3fb034e66ee5494a67acae1b4e6ff64ba92a2046 | 2 + .../466059ed07a0d55d6ad5e522c7d367cbf278eaf9 | 4 + .../487725eb38511c79a9340bf4560a1411061fa6fa | 2 + .../48b9b205cae8ac21512a3f26f49fd53e21ee13c5 | 2 + .../4b1f1f79a0bfa3f942479dd5f8edb59a7c257c55 | 2 + .../5028c56a5116a186b7343ff59567b47347a0796d | 3 + .../533f62b3f495ce704babf3ee8d840f196a714dff | 4 + .../5892cbb284771fc9761caae37b19cd6e27dbc104 | 2 + .../5aeab6e4f7c2a1c09d4ac0dbdb3beac4893607ee | 2 + .../5b6292bdf009b0daecbc90b85cca30a88c36eec5 | 2 + .../5c1659b77678b41faa4fa13df7772dae3238d1c0 | 2 + .../5c81f61621e29ec9c6a64ac3af9b3b216141618e | 2 + .../657368df512ca6294b9df16adf935a3f374a8be2 | 3 + .../7fc4520094902ce2c760d70eaad5b674d2817337 | 5 + .../81f59a12b458ec3604035cb962165c604d1355e6 | 2 + .../8f41c50e88ee8c17ecad3d41d63d38fb12aca0b9 | 4 + .../97c16de7fe3c390a2e6c09ff5c28f17d5c67542c | 2 + .../97e4499d450c95660de86747f527e670f2012548 | 3 + .../9a996857196e0998a1278994a9bab3d35526e7f1 | 2 + .../9b7e00049ec356ecd84b1747e4e1941140139ae8 | 3 + .../9f0c38ec455cc363369b3674a2d32bc21c206de1 | 5 + .../a1dc7bc235e46eb21d91084d7b52d5ff9f45df85 | 3 + .../aa3bbb876eafa8ad8ca4ff2eabc6dd94341d2441 | 2 + .../ae8ba95d7dbe99926a8f5bfd80347fd6a4b616a0 | 17 + .../b04fea5c041c707db0ad9c09a81672557b52cc47 | 2 + .../c4acff8aa2ff886f35439f72625d05002990c940 | 4 + .../c55ce9995b002e88a102ae2891a71e8bacb346c8 | 2 + .../ca5a0c00b8969310acb73d15ad0d0c602f1bd0c2 | 3 + .../cce734f1b263de6994f7950e0df7bf0c81449f70 | 3 + .../d39c8ee11a697634a09b309460c0bbd967e7effa | 17 + .../d4c3e4cf5d035596433c30eaabbd2b2925f4b453 | 3 + .../d51f7fcc089f269c7afecaaca51966bab5fde629 | 2 + .../d936dad71c129cf659097dc3db64550c4dd467f4 | 2 + .../e275b0466a8fb8d9e0e15856e343ddc7112ae66b | 3 + .../e5c364b205855a2991ce07482aebb2a3a6147089 | 2 + .../ee2077e08c3cfccd9bd82adb574ac4fc7d429afb | 2 + .../fc5d4b9117ba9e87388174aee4f4970bdfe8d066 | 1 + .../fdeb2c7daa9e7704f67e141106384e6dd0042c0b | 2 + test/core/http/response_corpus/request1.txt | 3 + test/core/http/response_corpus/request2.txt | 3 + test/core/http/response_corpus/request3.txt | 3 + test/core/http/response_corpus/request4.txt | 3 + test/core/http/response_corpus/request5.txt | 3 + test/core/http/response_corpus/response1.txt | 4 + test/core/http/response_corpus/response2.txt | 4 + test/core/http/response_corpus/response3.txt | 5 + test/core/http/response_corpus/response4.txt | 2 + test/core/http/response_corpus/response5.txt | 5 + test/core/http/response_corpus/response6.txt | 5 + test/core/http/response_corpus/toolong.txt | 2 + test/core/http/response_fuzzer.cc | 44 + test/core/http/test_server.py | 65 + test/core/iomgr/BUILD | 368 + test/core/iomgr/buffer_list_test.cc | 136 + test/core/iomgr/combiner_test.cc | 149 + test/core/iomgr/endpoint_pair_test.cc | 78 + test/core/iomgr/endpoint_tests.cc | 353 + test/core/iomgr/endpoint_tests.h | 43 + test/core/iomgr/error_test.cc | 232 + test/core/iomgr/ev_epollex_linux_test.cc | 115 + test/core/iomgr/fd_conservation_posix_test.cc | 57 + test/core/iomgr/fd_posix_test.cc | 540 + .../grpc_ipv6_loopback_available_test.cc | 48 + .../ios/CFStreamTests/CFStreamClientTests.mm | 201 + .../CFStreamTests/CFStreamEndpointTests.mm | 344 + .../CFStreamTests.xcodeproj/project.pbxproj | 323 + .../xcschemes/CFStreamTests.xcscheme | 63 + .../xcschemes/CFStreamTests_Asan.xcscheme | 66 + .../xcschemes/CFStreamTests_Msan.xcscheme | 83 + .../xcschemes/CFStreamTests_Tsan.xcscheme | 65 + test/core/iomgr/ios/CFStreamTests/Info.plist | 22 + test/core/iomgr/ios/CFStreamTests/Podfile | 51 + .../ios/CFStreamTests/build_and_run_tests.sh | 72 + .../iomgr/ios/CFStreamTests/build_tests.sh | 39 + test/core/iomgr/load_file_test.cc | 163 + test/core/iomgr/mpmcqueue_test.cc | 230 + test/core/iomgr/poller/BUILD | 37 + .../iomgr/poller/eventmanager_libuv_test.cc | 83 + .../iomgr/pollset_windows_starvation_test.cc | 144 + test/core/iomgr/resolve_address_posix_test.cc | 263 + test/core/iomgr/resolve_address_test.cc | 405 + test/core/iomgr/resource_quota_test.cc | 930 + test/core/iomgr/sockaddr_utils_test.cc | 276 + test/core/iomgr/socket_utils_test.cc | 139 + test/core/iomgr/tcp_client_posix_test.cc | 222 + test/core/iomgr/tcp_client_uv_test.cc | 214 + test/core/iomgr/tcp_posix_test.cc | 652 + test/core/iomgr/tcp_server_posix_test.cc | 510 + test/core/iomgr/tcp_server_uv_test.cc | 319 + test/core/iomgr/threadpool_test.cc | 192 + test/core/iomgr/time_averaged_stats_test.cc | 193 + test/core/iomgr/timer_heap_test.cc | 298 + test/core/iomgr/timer_list_test.cc | 265 + test/core/iomgr/udp_server_test.cc | 390 + test/core/iomgr/work_serializer_test.cc | 110 + test/core/json/BUILD | 49 + .../006d552e952c42b5340baaeb85c2cb80c81e78dd | 1 + .../007eb985c44b6089a34995a7d9ebf349f1c2bf18 | 1 + .../03b74a08f23734691512cb12d0b38d189a8df905 | 1 + .../0495693af07325fb0d52eafd2d4c4d802c6457c6 | 1 + .../05454ab015cf74e9c3e8574d995517e05dd56751 | 1 + .../0716d9708d321ffb6a00818614779e779925365c | 1 + .../0a9b3522a8e711e3bd53e2c2eb9d28b34a003acc | 1 + .../0ade7c2cf97f75d009975f4d720d1fa6c19f4897 | 1 + .../0b1fcf0ac07e1e50cfe27316c7e1c8cc997f1318 | 1 + .../0bc13548356d08009703d35e9c8d74397367bdfb | 1 + .../0ea9a160c57f2c705dce037196e360bf9be739c5 | 1 + .../0f20d9c46991c0e97419e2cca07c7389f1d6bdf8 | 1 + .../0f2e2e6346f70c419300b661251754d50f7ca8ea | 1 + .../108b310facc1a193833fc2971fd83081f775ea0c | 1 + .../108e5bcd69b19ad0df743641085163b84f376fe8 | 2 + .../10e3ecd5624465020fdf0662a67e0f0885536cae | 1 + .../113c8c97cbb0a2b6176d75eaa9ac9baaa7ccddcc | 1 + .../11479d936dd006410a5946b6081a94d573bf8efd | 1 + .../11aa091189b78d1cc35c7ff4907ac16a73aba547 | 1 + .../1227907b2ee5a9492a890beed55332e4560834c8 | 1 + .../134d65130947ec69cf8df8483424b45e99cf04e3 | 1 + .../13584505caa892d94982a968bbc4391ebcfe0d06 | 1 + .../137f554ee0f6b903acb81ab4e1f98c11fe92b008 | 1 + .../1401ea03ec78b8f20dc7be952555004d7147f0f5 | 1 + .../141d45a59b073aeec4443cd7bcf20f7833ddbc95 | 1 + .../15a8f2e7f94aa00b46f1b991416aa015dd633580 | 1 + .../15c9c1284c27c8893559e15c9b2a50cbd5bbb56f | 1 + .../15d1a6cda48ef569b368a0c4627435bc2c80a988 | 1 + .../17a29f2ac6df774585d7713091b299729738030c | 1 + .../17b815f1f72cb64481bc40263e91ce063040f739 | 1 + .../182d57403d2c973a394055017d35b7621aa0aa05 | 1 + .../190fbe2da448f6bdec0706c5301ad13363ae3ad9 | 1 + .../1b045a24b8f1f1fd6e8234d5019952ee7713a8b7 | 1 + .../1b6453892473a467d07372d45eb05abc2031647a | 1 + .../1c6463aa2dabcb4fadc8e5441d8b418535e768af | 1 + .../1dea95b5050b766274ef80847505c0e4f47f3ebb | 1 + .../1df0754d3e7970b3afe549b11ca128dcd0d4832b | 1 + .../1dfe267b623b20cd97c6e8969d8b9148af9f4a2c | 1 + .../1e5c2f367f02e47a8c160cda1cd9d91decbac441 | 1 + .../20efdba13ca7a3657d071b3d56997aa3b083068a | 1 + .../215a956168f77421253e947c2436371d56aa7ea1 | 1 + .../2174b9ab6bf4f7c21fe1ed56957f1776ef611959 | 1 + .../232f4bced4075545bb1469d5c2360f083ec7ec65 | 1 + .../26aca41ee8f199e7c0c7cf31d979952571c53fc9 | 1 + .../27d84210636e9e83786be9e9b96b69f70b743b86 | 1 + .../27da426a5883662d19ea78f306d7a992be52f827 | 2 + .../296dcda6f7e6979e68ddef7cbc1206a355084ad3 | 1 + .../29b08c03ca5a6851fa4604a984cb7ff44433a5a5 | 1 + .../2a3d964ec4527ad9f02129fcbf087b67a6ea6444 | 1 + .../2b04974149815b143afb17af4388d751217e54ec | 1 + .../2b3b1ad952e3acb566e32a84e2d503acde13eb53 | 1 + .../2cc301a6ed7f01e2cd339f02bd0fda20c227a17e | 1 + .../2d3d5b9275553430b4cfa68114099120ad7809ee | 1 + .../2d5dbf403e0c12e2fe21b04ca3daff171c028ab7 | 1 + .../2d7c769bed62004270034b976b1d940a5686106b | 1 + .../2db120231eea12d9cdc6a00f30839b3cef2046be | 1 + .../2db610e1a230409a205cf22fbad3348a54cbe703 | 1 + .../2df1dd2e2f5d57e7d9d4e60a756a86e603573225 | 1 + .../2e32faacd3ea4461ec7aace297b4be6904d9a389 | 1 + .../2e756d91759d7e74f5b776c0d2a1935292f576d1 | 1 + .../2f09b24f9f5fa0af2c29b604b4b0f97fa6163895 | 1 + .../3027d901361162b38fcaf17f97ba7d9646e32495 | 1 + .../30d4467ecb771ece9ed6c78a46adc299072d9db9 | 1 + .../311048bbf4c4bbabcde73607d7e76915cee9312e | 1 + .../323b48969d7bf9a50aacf0912f1b5cb02119e2ab | 1 + .../33400a242baeb5c46ddb1578c28b10d32a9c3cd3 | 1 + .../356a192b7913b04c54574d18c28d46e6395428ab | 1 + .../35e995c107a71caeb833bb3b79f9f54781b33fa1 | 1 + .../373769c15c145472c8ec3bdde8fc84e85ec79211 | 2 + .../3795d911970a1fd8416b93649051b418948e3edf | 1 + .../37d3333e1e2a384c3ba14a52682ca29f061d1ac7 | 1 + .../38cd33bb390445e35b6514024b1317902cb7ba1b | 1 + .../3a90c688f44447a78efc111872b061a001f04d2b | 1 + .../3b1e7b56ad4465d126ea994d34d20dcecbb3a50a | 1 + .../3c0a8d6c31edaca124714624eb64cb8ec0cbab13 | 1 + .../3cc0c9adcf3882f01409c70391c3cd30588ef34c | 1 + .../3d0d9878b812ce4634962ba3dd755c0953550200 | 1 + .../3d4d5887a2fcdc5dd360b8a6f89dbce6500d8580 | 1 + .../3efb5b7ff94c5b9d411c93da9a70e1cc547f4c59 | 1 + .../421b7e8ea86e3c07474af16ab3ccef55d1857205 | 2 + .../428d051e437dd260f2a2f7ed920d9734ca34dc90 | 1 + .../42adc281578ffb1b8684b78b47aa40a16d10b6e7 | 1 + .../43620ecd2e2fd58fe5650da2e9783f980f29ec07 | 1 + .../43b1ffcda49477adb1632822202631990ed3a269 | 1 + .../45279f85bf2f533a629073caf89403006279fab2 | 2 + .../455d9bb597f08bf698454157ecd86647b5dec4e0 | 1 + .../4561eb5c7e43cae048c06aaaad3d5f5218b376e9 | 1 + .../46417b001eeb87c32b642499fd5e1690d5d88c7f | 1 + .../468af040024e96e9878ef33cc52755c5e7f5cbd5 | 1 + .../469e5ed2547e9e55a96e96eb832c615631e3b576 | 1 + .../472b07b9fcf2c2451e8781e944bf5f77cd8457c8 | 1 + .../486da8aff04083c5e0fe112e733f2ae510e312a1 | 1 + .../488a5ed641e340ae51992e04ce6590bdec587218 | 1 + .../4a0a19218e082a343a1b17e5333409af9d98f0f5 | 1 + .../4a6644a1a3d5218f4bbd60220cab79c0b7bef45e | 1 + .../4b39d4b8a9a04b9469e8fe4016322327fe540882 | 1 + .../4bb0294e14946fb1f64213384097a676d3ef94f0 | 1 + .../4cd66dfabbd964f8c6c4414b07cdb45dae692e19 | 1 + .../4d134bc072212ace2df385dae143139da74ec0ef | 1 + .../4efa35221b2088e785048d0ff8fd99b03d5316fc | 1 + .../4fa2a4a5a2f7dc4ddbdecae3ee85c787817b4cf8 | 1 + .../4fed4bf2dc6259d9de54e9fa7db4fd5a61f2535e | 1 + .../4ff800de0863adb5851fa26935159aa53b11cba7 | 1 + .../4ff99a030518a132748c44bc1d836018e5b82cd0 | 1 + .../531c87b9772e54e3e183ef729f0a7d5a0d584f46 | 1 + .../534d66e7b0709d1e7692faae9e7f7299c92bba4b | 1 + .../548775f9d7d13339dba3001f8238b84e9a457533 | 1 + .../54ec3b2d8a9b7a6d8204712eb1b90da703cf8a79 | 1 + .../552cfe1d8958e6d003ec8e883c4983dd67ef255e | 1 + .../55f0c61d096a08506076489ded3b868db4086770 | 1 + .../56cd60743c2cee939f5f357905bd36ec9363f441 | 1 + .../56e5f35e3d08b4e17e3558cacddf9e5ed13a0159 | 1 + .../580b03c49fba02bb8e399500eb66f2ff0482b22a | 1 + .../5852643fbbcf92b0181327b69b4874c6ba6fa9f4 | 1 + .../58f497e5efaf9f69080f9eef63b0b9dabcfdbc0d | 1 + .../59129aacfb6cebbe2c52f30ef3424209f7252e82 | 1 + .../598a287a3e56caae23ed63abc95d5f3457165eef | 1 + .../5a37a26dd2482226f534f79d321d28e7a615ab72 | 1 + .../5a710dcd4c78ca1a74ceb9fbfb011f7ac86a5f7b | 1 + .../5ae7b87f5377d5ffc16fd3f69b4a4aa7be8b1184 | 2 + .../5b3fe86d5a309a6ba745881bd220fe1100b271ce | 1 + .../5c38b7da113ab4535dbc22777ce8a1480c1c9d1e | 1 + .../5ca6c45a8d2e11c782806df43e7668beb4aba8f5 | 1 + .../5da7b543313339f84fd52e96bacf3a73368a1d2c | 1 + .../5e12ae9117668bcc22832640cc626315940aeba8 | 1 + .../5e397439a2680ed827c46704969c6711dabbda84 | 1 + .../5e629dfb8b7533c7c2d173d4c3d587c88112cc29 | 1 + .../5e785c7c26813577f3e30ef8f7e37ab2a9ffe39c | 1 + .../5f3394f5058822cc044b92654837625897176480 | 1 + .../5fb9bcbbb30a377209eab0541d144e44e71508d7 | 1 + .../6008213a61d06b4382b223768530c3452968b7b3 | 1 + .../60ba4b2daa4ed4d070fec06687e249e0e6f9ee45 | 1 + .../625ed64c30c8ab2f0b3bc75690f9faa4270f0041 | 1 + .../6314c2b304d04dc0108a95d29a93515e85e2b0b0 | 1 + .../6462d8079d2ea921617e7d073b85cfab706800d3 | 1 + .../6474383282788e556aa86f57fc8650137ad264d0 | 1 + .../648c3f58ecc8fb4b8c779e6b11006ab5b1986dad | 1 + .../66328e03a2ccd5e54dab23b816182786e6f518b6 | 1 + .../683e9045bc95e0cb5fc16ec64b118433475ba559 | Bin 0 -> 4 bytes .../689f13680f4682303c8aa6828b67955959dc9669 | 1 + .../68c6ba7f0602a5410d1fa3c5de24fe264436b993 | 1 + .../699cafde80b1e1777306f781186d1253f018ab23 | 1 + .../69ab053b59e235fd6af246c5180f15bd95295113 | 1 + .../69afa12510b2e653b0af7c7030832647b2d63c37 | 1 + .../6b75857f86be5c51b21a97f4a61e69e8bb6cd698 | 1 + .../6c75e71ecde9f073a7bad89f4831c8cde0bc1830 | 1 + .../6ce5170dc4f2eee3b31a875b6a41f2444959f3dd | 1 + .../6d2859436fbbee637f0a5981ca82e8f88a1d0d28 | 1 + .../6d63e39f56d1d537bab9c2830303cabab3cd9035 | 1 + .../6e05a0a240fe2974e14527bbe390d294564156e2 | 1 + .../6e6c9d301adb0f0ddffd79cdf3426a2de99bad48 | 2 + .../6e989edf725ec64849377681ce02641c3d1870e8 | 1 + .../70142f66475ae2fb33722d8d4750f386ecfefe7b | 1 + .../719edbe667ce2729ac78a22dac29263c91144029 | 1 + .../71f99ca2bda6ef2e15b965479a79587f9d794be0 | 1 + .../743e89b768af4bd591ea7228118550b1bfb8e7d1 | 1 + .../7714a1a32872442a2eaff472685f3ea69451a732 | 1 + .../7719a1c782a1ba91c031a682a0a2f8658209adbf | 1 + .../775e8ffda1f5d340dba472d06dc7c8bf8159e379 | 1 + .../77de68daecd823babbb58edb1c8e14d7106e83bb | 1 + .../7957dc9aac31e6a6783fb3a6ee073688fed6cf9d | 1 + .../7ae893cbbf9b11ff411640b80985ce618907559c | 1 + .../7b20ac50954063e3ad00813acab4a98b2bfdb858 | 1 + .../7b6273145fb090de1c6163586f884a1da4b5cfbf | 1 + .../7cf84b5a78281e6c6b5a9884110f3dbc6a40e310 | 2 + .../7ef13b83e6bde582d9000be043e729cd3221c150 | 1 + .../82059e250904b478f65daa0e647c1647ba6d6a3d | 1 + .../8207fdf4bd302d6b6b1894990b353944a8716aa7 | 1 + .../831a49ad81b59025c241ac9e58bd88463fd798eb | 1 + .../84582c1dbe026475319df14c19967d1dd0bf751f | 1 + .../860d4ad0b7c026d1fcf51932b5e46500be7860a6 | 2 + .../865c7cf36a4f4499a6242e51b77b58b868a7447b | 1 + .../87a2b80f9272583517c0207af176fc40ea55022c | 1 + .../887309d048beef83ad3eabf2a79a64a389ab1c9f | 1 + .../88d89860ccaf21e5f0f002303a2cd853ecbb2acb | 1 + .../88f658400b1870ddf081fb03020c3098b0b1e083 | 1 + .../88f8b0984bb2f081918ad883c8f0ffacb5a8ff0a | 2 + .../89304953495f060c7abd3584d83cb1c8e6d6653b | 1 + .../8a5f6dc6873e3fd51fd866854d85258f8aa83a02 | 2 + .../8a87261277c15667e2957dd52c5db6757ebc8e88 | 1 + .../8aa61d8bd260942521bb1ba82cd4cce2324fdbee | 1 + .../8d8874439569824e371a0284460440175cdb8a27 | 1 + .../8d952ec2e33b2a6a1c7876898719a610f5546388 | 1 + .../8e6fec8a05b24f221b6e94fdfe205e5bf7709a2c | 1 + .../8e7fda77644ff91578d25243fad51a3cd6d60860 | 1 + .../8ea6295ff82bb119acd44a91b463b19fedafb226 | 1 + .../8ee51caaa2c2f4ee2e5b4b7ef5a89db7df1068d7 | 1 + .../8ef4dd9f2d0f9d770c937d9a43413d24df83f09b | 1 + .../8efd86fb78a56a5145ed7739dcb00c78581c5375 | 1 + .../8f0ba762c2fed0fc993feb91948902ac397b0919 | 1 + .../8fe81e450694cac1eb4c4a5c966ffbc56ade3513 | 1 + .../902ba3cda1883801594b6e1b452790cc53948fda | 1 + .../910a1528b28ebc6ff2f2a4fedb013c86de4103e2 | 1 + .../92049bf3d8a0ec93c2d1633631c0082e66ca69e7 | 2 + .../920a3c318f3127b9c30ab02a077555c7dfbb6edb | 1 + .../925fc05dd661aeb4a776dcbc5df3dcb2cefaf0a6 | 1 + .../9367ba65affd5bf7aabf79c28e783cc5d93518e8 | 1 + .../939f5049b1eefb91ccbd3fcecaed8cb21ea6b285 | 1 + .../9405c2b00eaa5526f71cc78914dbd3ecaf093b6e | 1 + .../94d3598751569d2a5be258e59665cbbf0692dfbe | 1 + .../94f96d95d01e98fd2f04ce26c0913e5f9a882fb4 | 1 + .../95b54a84db75abab401d282fdb04440a879a9708 | 1 + .../96189202e587ec951d5795da3e03062f2fb5d708 | 1 + .../9711703428704ce2827a719eddb9d54be23a0cb7 | 1 + .../9734597e96eebe99b2243121a51d178a338ec46f | 1 + .../9747c85a9510011bf87c23a80b029b9f2d04c37d | 1 + .../97d170e1550eee4afc0af065b78cda302a97674c | 1 + .../98e02e7fc96479e8d10ff2cc7610be772e2d6fba | 1 + .../996156b191b619eff79b2fcbb7598518a09b06bc | 1 + .../99667fcfa6d583a742fb5450527fc86dfb78ebbf | 1 + .../9b1ead2dbeeb1a3e9a7bebcf6964c3cfbc7e8867 | 1 + .../9b7669e201574bfb979d56110539a90da5aca2c0 | 1 + .../9c24b456af3cb51a1ff2780c2d9cbdd7d93f6c76 | 1 + .../9d0441f23ae7d5a3a5b1140497868ee6eeab656b | 2 + .../9d890bd3139a8f9a44d435ff8edfbeb5b072ded0 | 2 + .../9e6a55b6b4563e652a23be9d623ca5055c356940 | 1 + .../9ec88420ef0408642f6930996e35f5b9f18ec88c | 1 + .../9edd067c569315d5e93b0d14c7eac9fa6d81d3cd | 1 + .../9fbda4f714043d975389b536b4497c6d713452e5 | 1 + .../9fc8cb8ab3b05e306e5e81d9d949e69f931244ea | Bin 0 -> 3 bytes .../a02b857f2eff73e8e188f35529dd91f8144b23b9 | 1 + .../a060d5bfd1235cbbe4bcecf332fa3b03bc2282e3 | 1 + .../a0931fae1d43e7887c1cabde83fdfc52eaeedba8 | 1 + .../a0d4af29c6c223b48fe34d6a09b3a7466242f33c | 1 + .../a1abe8a785030d475a7350438fd23a05c382c110 | 2 + .../a1fb86293eac950c2b4f5182d9e4b5d9e0982ef6 | 1 + .../a2d4e3d6f5ba43c9199d5d2011678f82cfd55afc | 1 + .../a39653cb3d97c58c44013197f4d7557577700177 | 1 + .../a4c74ad56ae0e94e96101a8f2ce9b1e588df5e44 | 1 + .../a6b34b06b00e9226f2bd961483f9da81d8de99a8 | 1 + .../a72c3b9cc71eb7f0e0e4dabcd2dcd2b997f21c07 | 1 + .../a749d24bac55bc19465acc92b12244c56ca0f20d | 1 + .../a78009ff8b3f4d722ee0eb84795e857e74a58aea | 1 + .../a7ae4b16677806d78d0016c276b6722eba8eef3c | 1 + .../a806f43dd48e35e75c27814c13a2a96c12449bd1 | 1 + .../a90a858013f90d2a94e0d62a7156ffd6848bf238 | 1 + .../a94bfbfe16d026b52d7f73cf78fdf7d6a6c5c58b | 1 + .../a9718f029d11a9335ef596cbd42794de5b0b18b5 | 1 + .../aa6e08a488d1ed00aa51f20c2477fc89e7b0a852 | 2 + .../aaa038513c192fec501e4e7302156872ce2fde37 | 2 + .../ac2686c095a5a1c92a1d4209a6c287778720c86d | 1 + .../ac3478d69a3c81fa62e60f5c3696165a4e5e6ac4 | 1 + .../ac9231da4082430afe8f4d40127814c613648d8e | 1 + .../adc83b19e793491b1c6ea0fd8b46cd9f32e592fc | 1 + .../aff25e569bd8c93157e08cd18ebcd896438e34c9 | 1 + .../affced8168ec801de89deac663f708f0c96cf1a4 | 1 + .../b015dfc2f62b640d7c25adab7b38c5fcb5cb64c8 | 1 + .../b021dd7cd98b63092685ea092df0dc01c8f63334 | 1 + .../b17485b8bdec8809b3819a83753ca893871df403 | 1 + .../b32ef51eca9c6c658e6fb75fdf96bbba066404e7 | 1 + .../b3f0c7f6bb763af1be91d9e74eabfeb199dc1f1f | 1 + .../b45a1635ec526bcc890f9d735976704e516c5f19 | 1 + .../b50ce51a7baa28cd298ebd05b4a3b9b70f9d4370 | 1 + .../b5126721812b925426b30d283d2bb8b6969f230a | 1 + .../b57af943a3ee411bffeaa3872eec9c6fb01569a4 | 1 + .../b5abf6fd22ed0f852781de35d043059d0f86f3cd | 1 + .../b6589fc6ab0dc82cf12099d1c2d40ab994e8410c | 1 + .../b6f19238d2b04c5b86a17369093dafda34f332e7 | 2 + .../b858cb282617fb0956d960215c8e84d1ccf909c6 | 1 + .../b9c38fad09c80db7781fefbe51039752de575ecc | 1 + .../bb407c8992800444201dccfe744dac49c0295fde | 1 + .../bc335734f73502b92d2bd3587259ce915985f0ee | 1 + .../bd113c2c8a2328e3674c680c7cff829a6c8ab924 | 1 + .../be051d58015d4af1977a5dfd14ef3fd070ecc9d2 | 1 + .../be461a0cd1fda052a69c3fd94f8cf5f6f86afa34 | 1 + .../bef524502f8dbbc45af717ece01ec88edd7f903b | 1 + .../bf21a9e8fbc5a3846fb05b4fa0859e0917b2202f | 1 + .../c0b6a90832b78ed5f6d129d3640c612540527c85 | 1 + .../c18d315f0d35849b2aae4a47cab4608204b85d76 | 2 + .../c257fd6bc9e5254a733378ab4ddd39629c4a3069 | 1 + .../c2bf7f49d8f2e13a60af4473b3b3451b65b3aa9a | 1 + .../c308517acf6f7088634d491a1608240f83a3ac95 | 1 + .../c3badd71ef8a51b97ce93cbfe99f6778048f2128 | 1 + .../c482a632702ae7f532d126e70149dda4fadc3cd7 | 1 + .../c541bb86e55b98e083b141114066f9c17d853374 | 1 + .../c5b50b9015b6aaedd7eb1077b1204858f837b53c | 1 + .../c62ef0dbd1350da9ea5a32e56672d385837643e7 | 1 + .../c7a34d6d49e1da1ccd490350c2df3a168ed09ae8 | 3 + .../c88c4bec8d440c56d3ea7abce39276f0927dbe0a | 1 + .../c92f147bfc034003ac42ed9e62a16c84102ab417 | 1 + .../c96b0fe6034668edf37ef0f5f391d5107953dc06 | 1 + .../cac74aa5d7aab7fce0253f00c1a025980c1f9b7a | 1 + .../caea0a0e6d8708cf682eaa446c344da56a7d5515 | 1 + .../cc8a3dd2678d4b400ad630f402012b894e841b05 | 1 + .../cd851bec7adad52f79777fb9347d5fd2f9486aa7 | 1 + .../ce3899b62ba3efe00eb31ddad2861ffe16a30d06 | 1 + .../ce8b76fdcdbf1c951afc2b115be9acc8a6358b32 | 1 + .../cec87b67871fc7a59652bc3546fbbb68e4d31e28 | 2 + .../cf32406111908544e504c84731147f072cdf2fbd | 1 + .../cf35dc76bf9a2052636c1ecc92942161830dcdc3 | 1 + .../cf6a5e6bfe4f15b43e411dd2782e10f1670c9767 | 1 + .../cfc45616f5f0e7c25df91f6984ff5f6f1648beab | 1 + .../cff891e5858ae68d08ecc8470ca6a68c9438bfa3 | 1 + .../cfff4e9d08cba81b663dd1999710008342851e19 | 1 + ...h-f21867fe8b6df0b54c13e2e6e613dce871ecf0f0 | 1 + .../d1db03c626fb16c3b9cd44cc38cf40ebd355a194 | 1 + .../d85ca051da784c0441898c5affbf11a2ae8f56bc | 1 + .../da03f536ceaf609972aa2a699687cc6f73ac0dcd | 1 + .../da4b9237bacccdf19c0760cab7aec4a8359010b0 | 1 + .../dcc45e405208d7a2db33d0b5b9da2a2f1b034957 | 1 + .../dcc60d3aaa1fc4d00201a3512284fcb79b5b68ef | Bin 0 -> 13 bytes .../dd0567ae57bf3cc85891a1ca988c2945d9186678 | 1 + .../dd890a5a32e9f0489c6c77695f2155041f00fc9a | 1 + .../df88e2baf7b76ffb2e94b9da57fd8d137f44b1ef | 1 + .../e00ee378c3f6e0b3cd89bd6e7517478d093f73dd | 1 + .../e0c124e90d068e2a70a3e148052869033453ec58 | 1 + .../e0d87b1f3e54e5adc5c2205f9e14772822a25766 | 1 + .../e1199df649697c570db5d6b2ea09d755eddd32b7 | 1 + .../e235f6f2a8b6a22117f1baa932fb6c69799e1136 | 1 + .../e3a654055a867ae62d8e68fa2c410228ac55cb6d | 1 + .../e3c680aac46b9c46392e3b2c43ecdcc1547f2023 | 1 + .../e3d134b35cc25a4861d90023c95988ec6103ddd5 | 1 + .../e3ff65de4b1622315c3b34b7a5e39bffb275489d | 1 + .../e4a4085cc31476f5de9047422851d8ccf86339df | 1 + .../e4e3c69da200af932c8a79fa055d7aeea28eb1d1 | 1 + .../e6c3dd630428fd54834172b8fd2735fed9416da4 | 1 + .../e71eb37fca2070521e1e07c503c2bcd6445b35ea | 1 + .../e760e6e22ae8cd1ea78fe28b5eb1f3d7b5fdc536 | 1 + .../e95ff1142118a2ca5b84935612a8a64d55360e64 | 1 + .../e9c5e2c67930513941753c2d54591c7098c82f6c | 1 + .../eb26070d17ffa908204912e75cb4313835042038 | 1 + .../ebc6aee49e5ae57722df86e7fa33c420f045a449 | 1 + .../ed1dc11d713e7487de18ce8317b62916959206d0 | 1 + .../ede3f66106acd7796da8b3942d029fe213058286 | 1 + .../eed7bd220cd511b6d42ce6553019266a22a3d56a | 1 + .../f090932162756b798b1a050b05e3d36a3437c4fc | 1 + .../f1905eaa84ba6a3593ec6ac0486a5b42893c01f1 | 1 + .../f4635fbbf765ead81a261ca152df02622e182d2c | 1 + .../f46eeb1020c7c4153e742a50bc24c2c6939dab1e | 1 + .../f473451610783521d51bc08cdd920ddd97f8a71f | 1 + .../f63aa599600f6e7d648c4287905e16e8e6e479fd | 1 + .../f667dcf1c06e87db2dc49d86ea1c285e796f8f8c | 1 + .../f8d0f85975e49b959799cc52847110cc940b9db1 | 1 + .../f92c47e35da42d79a48beff54b93cd28f55f05fb | 1 + .../f9a33bb8bd78d869fbafa402d9be58940ce2c318 | 1 + .../fbf6f3156c1bd4bb701839bc0e26533bdccd1c9a | 1 + .../fe2ef495a1152561572949784c16bf23abb28057 | 1 + .../fe5dbbcea5ce7e2988b8c69bcfdfde8904aabc1f | 1 + .../ff8fb34603c7f772768d61504954553e6bed173c | 1 + test/core/json/corpus/test1.json | 1 + test/core/json/corpus/test2.json | 1 + test/core/json/corpus/test3.json | 1 + test/core/json/corpus/test4.json | 1 + test/core/json/corpus/test5.json | 1 + test/core/json/corpus/test6.json | 1 + test/core/json/corpus/test7.json | 1 + test/core/json/corpus/test8.json | 1 + test/core/json/corpus/test9.json | 1 + test/core/json/fuzzer.cc | 37 + test/core/json/json_test.cc | 295 + test/core/nanopb/BUILD | 47 + .../0052f8fb6a7884ced8a6754aa13441be1f7dcd51 | Bin 0 -> 49 bytes .../0c35544f40d428d103e9c5b969ad9cd16767b110 | Bin 0 -> 51 bytes .../0c60ee9ed55c9af6190b132ef6636c1d2abe4540 | 1 + .../0ecb3e69889c036a86d21eb942077dc9abd649be | Bin 0 -> 36 bytes .../1324c95dafe597fe05f9babe92fe6fbf181c1897 | 1 + .../14eb42f7423081b455820daa2c02b358315dc0fa | 1 + .../1e2dd3a96d4c5142da19b2dd64014d9358504536 | Bin 0 -> 59 bytes .../2277a90ab01e3f27a4a8caf34ecd9997f3ffbf19 | Bin 0 -> 49 bytes .../23121c5f633db5d7c1a9f2225240754246fee513 | Bin 0 -> 42 bytes .../235548307ee9f2b0855fded42a871990d9ade956 | Bin 0 -> 64 bytes .../28ed3a797da3c48c309a4ef792147f3c56cfec40 | 1 + .../2bf123dbfa1d37a04493b5662a4b3b9c147485fc | Bin 0 -> 64 bytes .../2d4c0908ecc0310ea234d10b6bdb4f4ca3c41dd1 | 1 + .../30084b06df1cfb2bf2e1cfa8f8024c5af47a4d80 | Bin 0 -> 65 bytes .../304e8cdc9122b709ec2c063a5c8c38489a788033 | Bin 0 -> 43 bytes .../324d4a2aed8bc1840fee212fd38dadec80a72ea2 | Bin 0 -> 50 bytes .../32d5dad0f831572fbbd32ea3de5df43e27568f34 | Bin 0 -> 50 bytes .../33353a0b011901a13d010c6b165074ccdaa717ac | 1 + .../37dfead09389fcd9b9d24ef817a0fed13d8ff2b0 | Bin 0 -> 42 bytes .../47879cc364be304754f6af15563ad6f9a538da41 | Bin 0 -> 44 bytes .../49a5cef4c730ecab22712b156ddba5106f165afd | 1 + .../4bbbbb794a098deeacff73b774c30f12c54ceacb | 1 + .../4bd815b34ddfbbc45c780d1e7a97341796ee8471 | Bin 0 -> 50 bytes .../4c498ce69c8476f745693deb23272930e05cad60 | Bin 0 -> 42 bytes .../4fb5e3085c32e9bccac9e18343cca07017d037de | Bin 0 -> 44 bytes .../4fe5e46c1299e7f3e8a41dde3ae1bf1b60b4a43c | 1 + .../595b8d51971c1d15146909567e539a1bb39b1af5 | Bin 0 -> 78 bytes .../670cc6bae958cb4f15e7297fe63959ac5799aa42 | Bin 0 -> 44 bytes .../675f3263af7d1bbb084872f2b23f6d363227e85d | Bin 0 -> 42 bytes .../67fe0d2acc727c8a39a707b92c6cebda9bd20986 | 1 + .../6995dd153f712ad257ab5a365e5a4b84dc676ed3 | Bin 0 -> 66 bytes .../6d15065785eb8f4b5f17357a520cb4815a2cb355 | 1 + .../706b579bfc3db01ef7216d77ce231ea477c2fae2 | Bin 0 -> 97 bytes .../71ec91b3a142105bc25dfa5b84ca0bd893e1db28 | Bin 0 -> 56 bytes .../73285d7a70d73b517648067520d921e4477dbbfa | Bin 0 -> 7 bytes .../747d1ed8bee4c6f0438beaf88ae76d8ef9f63da2 | 1 + .../74c9d6b5d7d31a7c48c842311857c319fafedd64 | Bin 0 -> 66 bytes .../763878a34b3adeb99a03b54d09768a4451617016 | 1 + .../7b4b0c2555178333ba15203a930c88ef7e7500e7 | Bin 0 -> 43 bytes .../7b8a91aa46e370eb61307b4998889dc89775462f | 1 + .../7cd11836c64f98742fa7beccec5c981ef4dd62ae | Bin 0 -> 37 bytes .../7d8f4f045e70e8a2cb45dc3c001504f5c2614b16 | Bin 0 -> 16 bytes .../7e9848558fb004e14795b3ebd3e1488dcde1db8c | 1 + .../8707d3367be279eba1ddb5ffb990e40a3141c7d0 | Bin 0 -> 51 bytes .../89734c37ee267e69a6950c6d60ee541c1be5ccff | Bin 0 -> 44 bytes .../899ef237274b4a44b5478d7ec880680a0cb7dd88 | Bin 0 -> 66 bytes .../9034aaf45143996a2b14465c352ab0c6fa26b221 | 1 + .../91e3b6a3484ab4b95cdeecc5aefe1291824060e8 | 1 + .../95cd94c858e5e97f7df4a5eb7552e5e0d5ce1ec4 | 1 + .../971f42d5a4d9816145ebc9dd28ba33ed3f5860b0 | Bin 0 -> 44 bytes .../9849ff4673525f3c6ad567fc681b224a818da732 | 1 + .../9db3a1854de87fd643b910aeab50553afc73e667 | Bin 0 -> 52 bytes .../a10e7effe8b9a50ef55b5e0244ea4dba5c48e9f3 | Bin 0 -> 55 bytes .../a147873135c6c52d4da03c260a0165bc0ab1b979 | Bin 0 -> 44 bytes .../a20fa4d2633e9a401cb765470913483b848721d1 | Bin 0 -> 120 bytes .../a710eead945dabbbffa213a980c75f9463a27398 | 1 + .../a72406e3ca06d941fe8e168bbf67da88a81c947b | 1 + .../a8a62a7ebb7d68b211ae319e082575935c07d188 | Bin 0 -> 60 bytes .../a8abd012eb59b862bf9bc1ea443d2f35a1a2e222 | 1 + .../aab56035a3533b5d83a32a439f179eb678250113 | Bin 0 -> 42 bytes .../ac174acef2c5da26fadc7270bab9c8c4e938c463 | 1 + .../acbbd60eeb76e41ce254d0fef353b92abe69c831 | 2 + .../b24237aa77b5f09208a7eb80b6178aeb2d53d24a | Bin 0 -> 63 bytes .../b8e1c06314e52491ba955b72e13161c74e9b1422 | Bin 0 -> 60 bytes .../c1eed32e1e353737987da851ad760312ea8e557c | 1 + .../c4214ace2c4bab24bb356f71aedca08544baad70 | 1 + .../c4f87a6290aee1acfc1f26083974ce94621fca64 | 1 + .../c6fa750d7de79b2547531ed597ab7f1c4cd74193 | Bin 0 -> 51 bytes .../d285d78d3ba966b4b199453d38ead1aa36a7484f | Bin 0 -> 63 bytes .../df5200f371cff3cae0e1595cd86d641725f5d1ba | 1 + .../dfc66cb172919102f3ba14f6816228aa46f78154 | 1 + .../e53e789a4c175c6a2c468472f1047d0fe8db1177 | Bin 0 -> 3 bytes .../e67fe6794e755ea801272980f2c272edb027f6dc | 1 + .../ead61e86fedf118df8e44ed70ce002be651cf291 | Bin 0 -> 44 bytes .../eced8b29efbdc82eb8a1d0865c5f382f0ff78446 | 1 + .../f107c60f00da44a2c412c5b89c733efe5f9be4aa | Bin 0 -> 78 bytes .../f58a9135d07ea9a5e3e710f6b3bf6d48d5942dfd | Bin 0 -> 44 bytes .../f70e0dfc4185374b764189b1a96f3b4b7581ce0c | Bin 0 -> 66 bytes .../f8c2c4ddd2f474b4839f13a9be862c00ab0ece77 | Bin 0 -> 2 bytes .../faa1781e1444bba5b8c677bc5e2a38d023a1ec65 | 1 + .../fb60def26b39a737e29e850194a0c2047e378900 | 1 + .../fccda587af845f0685275960649d8f4a45272a95 | 1 + ...t-3ec5d82cc22b6f35ab7d281faf1cc5e66f0e3bfb | Bin 0 -> 56 bytes ...t-6995dd153f712ad257ab5a365e5a4b84dc676ed3 | Bin 0 -> 66 bytes ...t-e5609086439f47e81c775bf80a7213fb73eb028c | Bin 0 -> 55 bytes .../000def12957806bb0d40005cb651d35b4cde7b4e | 3 + .../0068af2acc3020f344ee84b2c8adfb90492354c3 | 1 + .../009132022c3a1660b701728ac92e26baf82e8eac | Bin 0 -> 64 bytes .../00bf0233aa1155b34a3081e4a2b7a1c9cdf8ea1e | 2 + .../013197cfb12b59755b807501c6d6615859f9cd3f | 1 + .../018a4332eb19f2398162317cb6ad2e8cf700dfd6 | 1 + .../0273d3496bf5f4594e59083ac319f8f863a15be0 | 1 + .../0355002521e74dcdb3a0c633338bd02ab1d85312 | 3 + .../053d8d6ceeba9453c97d0ee5374db863e6f77ad4 | Bin 0 -> 2 bytes .../0628c29e3ae264f8fa08652435bb3e61afe60883 | 1 + .../065e91578e5359b70a668164310af6f0dd40e922 | 2 + .../06b4b617d5937da8a7b58aed5341dc5ef6d1bcd7 | 1 + .../07216a4f5934890b89d845f6256546c2681350ce | 3 + .../08584e8308b7f52f0fe380358800d7f585cba89c | 1 + .../085a37568e99ec5855bd96affd259921515479e8 | 2 + .../0903d1e9297179c18de6a3707b16f27d0d54ed67 | 1 + .../0aa20a75bff4e8af10330c66d288e900146f1a39 | 1 + .../0ae76e2b24ca999bd5e09e517aa4d88f5b5f58a4 | 1 + .../0c3025fdfb008a6563ea2a2bb6cbc79b8ccbf8f3 | 2 + .../0d219165cd317142afa36b8b5476cc022c95c4e6 | Bin 0 -> 26 bytes .../0e053123dd6256de5aff55b0731f913de250c18e | 2 + .../0e065f98325849ac05eed515865b33dba0264cd4 | 1 + .../0e4ff715d491c9f0b471c400b71804739b6d400a | 2 + .../0ec94942046cd7e00bc058204c1d046075ca9531 | 1 + .../0f0e8da530eb8c924cee6985d9c3dfd93274ef8c | 1 + .../0ff365225c981d74b89499d1e708684ed4d0b570 | 2 + .../113b1efff1677c1b9a24f89aec0c3ecc228ddf62 | 2 + .../11697d621eab6743ba22715722d5b23830b79075 | 1 + .../12463318b795c756f389bc0fb1cca9645eafef28 | 1 + .../12784250cf16ec999529f601ae5c5798e853d34a | 1 + .../13122d08c1cee0dae6434605917d4cc6d8ea8cc5 | 1 + .../148a1118649dd8aa9b4ed778efdf7c1611aa5d27 | Bin 0 -> 61 bytes .../15dea2bb5fb36a3dd5172796da66a821a32918e7 | 2 + .../16488fe15a7e33cb41f2b7c159c99154464b3fd3 | 1 + .../1870a48a3c9c1dd9027cbd85beb503b43cff6e89 | 2 + .../1900b6a9123667a79020319aa7fd54d230bc7073 | 2 + .../1a000f1cbccd2ab6f7e623e015ed2e84284c9dbf | 2 + .../1c1d403f6175d52ac4430d1ef2401b549761707e | Bin 0 -> 63 bytes .../1c2ae0e1915e18dffc2215e9121f1afe0e4335c4 | 3 + .../1c5d2eef52426db9d0842f3d57b27a219434c512 | 1 + .../1d0676867c1ebce84531035fa7eb86ed00762df5 | 1 + .../1d92b263fa70450b0d0aeb81bf5d2f69eefbbd99 | 1 + .../1e843ed4864d6a808b671dd6769ae191ac8a13ad | 1 + .../1eb06a34ee568d584c4b33472788889bc68af3f5 | 3 + .../2169c2b4d560d74a5487df68b56f3af1d648f544 | 1 + .../21f8f7583e58c1c81a3ac8237b5fa58071edf8a4 | 1 + .../231e348407fdcb14412c691b0b20982940160ccd | 1 + .../27b8f060e3296eaef77dcdd4c2cd11d5650604ac | 2 + .../28ed3a797da3c48c309a4ef792147f3c56cfec40 | 1 + .../291fcc6e043942638fa3c865c0a1be5e4dcc0e70 | 2 + .../2a7f6c1f8fdc090b24ceb90ab4f3a7b331c06c86 | 2 + .../2b85f180fe56f84925b274819ce10a8972a594e7 | 1 + .../2dea73d7d10ba0dcfd103f7542bdf7458e772b2b | 1 + .../2e9c19f98ef88b83ec2dea8b1b7f92b8337f757b | 1 + .../2fbd59ffb74aba392b86f4fe2ff8067b6d45cce8 | 3 + .../31059c32ea28d37b7442f51b20e966665662783c | 1 + .../31f78e35feb36037864df5f8f47136f8e6e4768a | 2 + .../326d322d1aa31696a14518830e544770f12146ee | Bin 0 -> 64 bytes .../337df26552e0884ff133cc1be8e72020be38f457 | 1 + .../33a2a0aa86956097e034b5ee16aeceacee7efc34 | 2 + .../33d175d1ecb3a85be7dd93d24efc3ddda0a85ad6 | 1 + .../3718a1b790db16bcfc4ec30691fab24ea7bb0b74 | 3 + .../37aa3946054035b712102a62b71c94747dfd1491 | 3 + .../37b697adc0708ad12e4ed7355f3f8fdf1b7919ca | 1 + .../37bf4642c5e5a806e2042cdf5ead9bf3c97b9ac1 | 2 + .../37d94ca6a20303389b35404f3dfd20aaa9ff0851 | 1 + .../39278604f6a1102366464bbe769ae846e542bc56 | 2 + .../396b57d9a11a1b135e36ad266e155cc0c3b77d21 | 2 + .../39a49db120a807fe4e80c502254a5009625c7599 | 1 + .../39f04d1c6d4beefa3e3d6eae3a5317d969787055 | 3 + .../3b199b80209fa0b8ffedba4381019f8729cc09d6 | 1 + .../3ccf7ffb96c3e4789409db33cc12bfd8ddc24c1a | 1 + .../3d04382d1fe11ff3b717100aece7f9eff2d04b9b | 4 + .../3d4eb9f836bb40cf4c734073bcba8b73e4cc93ae | 1 + .../41dc8c55e41d32c30865f9761931ddd4c5b740f8 | 1 + .../41ef7b74d212f8f7f6681edcffd0db719030d31d | 1 + .../431187b5926fa7d0823305a9f87635616ea3ef27 | Bin 0 -> 63 bytes .../44c6da04b8378986721f7225e70a1514695c176c | 1 + .../450161236e37a1dfc0da6398c4876df82ff640ac | 1 + .../45257a176ca6a05ec65a6df430bbb6b85d0a676f | 2 + .../46d1c2f2edcc9cdc0d1698fa0c8853cb19a6e7d9 | 1 + .../4764bd4297bf0c405348d2bb87b8fbc02beadcb8 | 2 + .../48199bfd0e2c160f56d03e881bb5dfe276eec462 | 2 + .../48e865c56e8db13640d6ecbfc0f2486eb77e07d1 | 2 + .../499b003b8b98edd9dbe2668c8c6af948769d7e87 | 1 + .../4a55591c4b390c5a36cecc6f1b6f5105300b546b | 1 + .../4d33f97ec69c64e14dcf205be36a6319ddb8a20d | 1 + .../4dbfb08904739928e19c2f459040b35ac410f699 | 3 + .../501bd6fe1de2719cf8d2c517a071e5d883fbe766 | 1 + .../5208871ea8948223b64b304336cea41ac3240244 | 1 + .../5348c71be34967458403bd4b58bb2a8a744d35ee | 1 + .../54362c2f6965268d0835a992c3ba656171b8f044 | 4 + .../54411aa13f6d9118028171935322bbbc74c15329 | 2 + .../54c50af22d147f192918499b4b3819eb389468a4 | 1 + .../55441aac903d96b36bf8a11bc804234bcf0c04da | 1 + .../56e1a7c279482a57fcbca43468df96a791ee22b4 | 1 + .../57cbea7c563d5c4b6b290271b0009c3f348d92da | 2 + .../57e11c7a62f0fc807d7b51bb1ef0f0e22f43795b | 3 + .../585183c1a240df6926689fe1bd8cb434664db4d8 | 1 + .../5b2ee8ca40508bf108a729dcb228191670ec34d6 | 1 + .../5b47eabaf74479348fd0318f174d649dbe96e7d2 | 2 + .../5ba93c9db0cff93f52b521d7420e43f6eda2784f | Bin 0 -> 1 bytes .../5cc827e33932ccf8c72c6a839074e856d93463d8 | 1 + .../5cc89bbf687f94ff87241a8f935905e1c441de33 | 3 + .../5ec6596f12462fe9f36924c262f97408b54bbba8 | 3 + .../5f8f3af69295223fb04c37d28035bb75b4cbd705 | 2 + .../5fd76d48b9fefecbdabd4511decc161b25db79dd | 2 + .../614cf839ccac2d896d61a0ba0ab1f42b2fabafea | 1 + .../618305cc2d3d3814d78b77ffbf421b769bd862cf | 2 + .../61dfcd913c4f0a8d005bd089c34e95d8dbbf1897 | 1 + .../65a89e10aab00039680e1f7d014737b634c74d8d | 1 + .../66a273dbf5e37410efd45518a42b06a65cffe1f0 | 3 + .../673ff0de0702e8098892060a5365c175d8ef18fc | 1 + .../68465c782c37bfdd98ac493b0458444bb94336e5 | 2 + .../688451dee13d0be420598c6e205a3bc419173e18 | 1 + .../68a1d9150e1380c219e0a1deb3993f321e000ecd | 2 + .../69f49bf7ae8886f5b4c6296fdb1c570256919604 | 2 + .../6a425f414cd69ffffdbaa34d03eb43841b432e11 | 1 + .../6ca9e6e85f9b007a0920b0112decbd1403d506da | 1 + .../6cd62e3d67b4154639adbe753115bfdd770edddb | 1 + .../6d4f2de4cc427417d6335ff5396ea2588509bb5b | 2 + .../6ea84030dd0b5b03e4720c244ea8b4ec65e1f236 | 1 + .../710c1fc8cf7dc1386312c34de5057933fcf868b3 | 2 + .../720e81dcaf83f867288a90293c5de3b088d5c556 | 1 + .../72cdc8f78ab5237f96ed354264c726ac79ec429c | 1 + .../73535a4f7af7e4c6aa23556cacd63f6929ac33fe | 1 + .../73d7b933a5673a4d6f5905006ef6266dda1e4fba | Bin 0 -> 22 bytes .../753aea13c82d1f8841c2bd4309b1b55d0ae2ba8d | Bin 0 -> 64 bytes .../754428e00e8a1d0471e00bd9e8f060ab88ab640e | 1 + .../761c29151b23b4d14ce6261626641df1182f7a96 | Bin 0 -> 64 bytes .../7658451dd805f277a5b1c3d4065d752d2d8de5f4 | 2 + .../767e91cedcd9bc1bdac882acc34a53cc23cf4d02 | 1 + .../77d3754bdd4ea358369c936ed36b974b4181f6ab | 1 + .../7a95295bebe6237f65deb15ffeccab22716d574d | 2 + .../7ad88b82e87fbfb3d4bddaa2f6e201a151e3a007 | 3 + .../7b1010cc012e34af1d03e8845868ff0e1db3a601 | 3 + .../7d3ddbd11e82807321c9a53835ea897cf43aa7f2 | 1 + .../7da9c5ab5f049da297b0f4c1322edd696202d02a | 1 + .../7e265a019c02e5d089152849ac00bb005fa644f5 | 2 + .../7f33bff4f740eb898b908374b0c1badd47566947 | 2 + .../81f13b9b65891f2bfce77cb183a06045c461fee6 | 1 + .../846a14a480ffa1ad0f6333f3ecf2be3057ce6aed | 2 + .../87373a7f89feba2d50591b433f69877044155af2 | 2 + .../8833ba4c780c94fc6c3c466f849c0387acefdb20 | 1 + .../8c23a5ecd20db4da2c061f3463254e9de104c8b9 | 1 + .../8d883f1577ca8c334b7c6d75ccb71209d71ced13 | 1 + .../8dc80bd5f5d1fea64412203e304432edcf5f52c4 | 2 + .../8fc9a9ea6ad7d6d51e770076eaddacad9f970c6f | 2 + .../8fd167de17534776ef57aba2f27675789a11b8db | 3 + .../9117d3e51560813b3ce4615dced18fa0e4d0a25a | 1 + .../921c68eaa8776f7544e195ae52224355d08a2d4d | 1 + .../9293945411fca2dc81fc34b36b575a384e6d489e | 1 + .../933287d66c3ff3f0a21f2c583c763f2f65872ef8 | 1 + .../933d1d91283403f0a56571f533f482e9744eb735 | 1 + .../93855fc41b3e3004ca6ba85f34b985042d4c9869 | 2 + .../9544f445c39470f05785b52cfc31bb73bda22659 | 2 + .../97757217fde05ff4fc15c864bf29e9f560fd1c62 | 2 + .../9877c0f2d40dd43878bb0209bbc4b5fa93bec55a | 1 + .../98bc5065f79dd9d20cdac14ba28f0cf39908cb5f | 1 + .../992860817f7fb0e49423607355dab973aa7ab815 | 1 + .../995ee3d74bc6042fd6a8908c9df5a4cb530378d8 | 2 + .../9a38c24a6e87e99a72a3a4f007b117ec191a1705 | 1 + .../9aa97a0ffcdc37a8ef487355fb7271eb6891deaa | 2 + .../9b9fddc17ed7bc05a81c18f01e800a4e9efd0c8d | 1 + .../a0d4cb9a5a30bb01e8e4f68d636fb173632ed29d | 1 + .../a1e070288ec564d10a8c59779aa07fa771fa1d4f | 1 + .../a23d10723415d20f4ef1ed9b14d9dc24494856a0 | Bin 0 -> 54 bytes .../a245750cfe4212dca7bfde918de85f64eb053232 | 1 + .../a24bbe3600f4dfd61bb8415c6a291e0521e4f267 | 1 + .../a25104d039a549c8d457ecea3b55369ed312f086 | 3 + .../a33c4fcabe6aebe012cd01c8cb851a9ab0a12098 | 3 + .../a393e1727b0decca9f193179765c3a83d7096437 | 1 + .../a5507f06be4735a3a9e416ea986d52c1a6a20909 | 1 + .../a5adf028c902d17dd6a7ddeadabbed2b36420313 | 1 + .../a6aa1237a282ee3a93f2544bb6bb7704e565209e | Bin 0 -> 56 bytes .../a871185cabce7b96c9e2f6ffb40d9901c774b335 | 2 + .../a89d0e67bf53e22533a635f103d1fd400969ad56 | 1 + .../a8d1b4e5672a501d7a6cd14b2929297f3a82e035 | 1 + .../aa614cc8d05a3a58c30a890c10b9a0c1d609b228 | 1 + .../aa65320376f63805cc82b247612b2e05b87bdbee | Bin 0 -> 33 bytes .../abd3f6e2cc8887942de20e1c257427b825aed0ad | 2 + .../ad0653a3a63675a7ce797e69b4673866b88ace33 | 2 + .../ae2ce27806f67312e0d0e29a492db9ab9cb9bf4e | 1 + .../ae4c0e671bd004165a1e7877d9c67249a165d2df | 1 + .../af75c24dff7e22948ed141c763a1309e6f540bcc | 1 + .../b0f228c6d0cbbc9f10117f344d5aae6f001d00fa | 3 + .../b2c6eab05580b85cda591093d3f05c44bf453fce | Bin 0 -> 63 bytes .../b35281c0aae174d1ddc8999d97b9713f8004f285 | 1 + .../b484ae40795cf9730ba94d5a4ca40aa47b88eacb | 2 + .../b49c2fed1417a981ba29b32be73ee1700bea7ec9 | 1 + .../b68542373c05c0ed25231d09955b2c699d37c45b | 1 + .../b6d42cbe913f7275b574a71f0768781bdb6f45b7 | 1 + .../b80b6c2cae83c2097c7e4c1fb181d47cb8fd0519 | 2 + .../b90ab62d8591182fd90cd21cdb893178d97f7e0e | 1 + .../ba45c93ee6b8b286798d8791ec049207c448f7cd | 1 + .../ba67e81ef0f9a14bf5a1ca228bff87c681e83a44 | 1 + .../bbd1f06ddee4fbbd0e5c9c915889862e5df34f9c | 1 + .../bd982feb5dd4362e6bd9746ed216c25ce2749df4 | 1 + .../be77053335e6496288fcf8b6c4d0b4abf86493ff | 1 + .../bfb53203499969fac4f4be48e1bcd9235c2fa101 | 2 + .../c143576bdb5b34ad89fa3319507ae382a721f587 | 1 + .../c1ac502a15c53a90a1934f4a31d30f93db36dc8a | 1 + .../c1b29883768551fa5aadc38ba6eaad8007b9b85b | 3 + .../c2331fe0660ab5e411f6d38968c706aed390d8f6 | 1 + .../c32647119c244cc018bb1863853d5c7bd37090df | 1 + .../c4098733900c27861bbf74a71afcbbd93d62f8ee | 3 + .../c4f5769bf3b4f2a55c006b4cf5a3bba44b347241 | 2 + .../c6ea7b2d47402a458d5d03235bb042b61e05b2e8 | 1 + .../c7255dc48b42d44f6c0676d6009051b7e1aa885b | 1 + .../c7d77af55176ae0ae5e59f46e48e1e6ea108d799 | Bin 0 -> 64 bytes .../c80827341dcdf1c21b303b82ec7e6df7eaf63f3d | 1 + .../c9501031a75c067b6602e2831f03421b87be4496 | 1 + .../c98f88d962dfbc2a83e08bfbd8a87b0cc5a8b330 | 1 + .../ccd33fa22b2983978f9617b3cde76ea05b683c2c | 3 + .../cd0e7701fd79879c56f680817a0d2705751b1f44 | 2 + .../cd1c2b5c2684d831aab5265e9cd6f1ee045dab9b | Bin 0 -> 28 bytes .../cf98e8b01e7a759f28a9c5f59c896317d74ac47c | 3 + .../d1d171589e035be85dc347278f0735151a342d68 | 1 + .../d243143bf9b8adf6be92a157428ec6cbfd785423 | 1 + .../d2cd278979f2842ebd890f1d84712750273ad0fc | 2 + .../d2e96eb2699c7dd4a183f13d3a063a1aa9c192fd | 1 + .../d3178f8b0d26275667c27bb8533a61643213e4d8 | 2 + .../d46f536ea4b601c0ff313a5eb5b47e2b55aa9eb0 | 1 + .../d4be3038631eac422022ee23f43b47905a15b2b5 | 1 + .../d56b30a2d1b5a2a13ae00392bcb4ca72085310d9 | 2 + .../d67f85948143218d11e2fb7936a119741036045d | 1 + .../d6930ea81dfd91856a06a0c16483e47616642b4b | 1 + .../d737c10038a92add90e2ebea5c174ed249de8018 | 1 + .../d758a67f018b176dfc7d29630cf8cb587f5b2a6b | 2 + .../dc7139105787f3ba67d7971d80796e9cf5786a91 | 1 + .../dc8ec35f43e994b9c4ac61275d6b934990d42181 | 2 + .../dd2694fe12a018bc6af6f288b5c22a030eec8049 | Bin 0 -> 2 bytes .../de7424f44508582a953f137195533b7a0191eda7 | 1 + .../de91a02040d792dfcb71a4cb5aa4c1c006201273 | 1 + .../deb576067b11f6e2a3a39b0f2ef38ddae5c67b18 | 1 + .../df58248c414f342c81e056b40bee12d17a08bf61 | 1 + .../e076020b2826abd3a4b960fb33a35fd7d0606dd8 | Bin 0 -> 49 bytes .../e0bcf682342967c002621acd2563a2157826d156 | Bin 0 -> 50 bytes .../e1edca08a7654b42a64647abb0e773eddddb580b | 2 + .../e2fa528289b5971f5b40b3687a2a6f0d17348de6 | 2 + .../e52af0ba8750572b98f3a8968de77811ddff0893 | 1 + .../e5a0f40647f805b5001645ce2d94505e72fa64f3 | 2 + .../e69762f0c6a2750c0b03503a6aec90ffc94bcb72 | 1 + .../e7064f0b80f61dbc65915311032d27baa569ae2a | 1 + .../e863a4420854c36168d2b8dd39ce474ebe11cd26 | 1 + .../e8993f97bb9c83f87c64cfc429095eeaccf32953 | 1 + .../e9875d9a54b3ebc57df4da886cd30a39252ac666 | 3 + .../e98a9d92bbbac9b1e64c0641e967adebd681b2aa | 1 + .../eb7c31f48c77b742fa29126ac78a2c06c41208e8 | 1 + .../ec174492517f988010ed3ddbd003cb388f477bb6 | 1 + .../ec4d6a393be7ec80ccb8c531337a7fc3ef140e66 | 1 + .../ecd40909ab5e2c61841d9fb95b8aacc87651100c | Bin 0 -> 43 bytes .../ed17c8ddb6cc8a0b653dc87aca999d31e80c781a | 1 + .../ee0b476126bb1c2249b299323718ecef1250645e | 2 + .../ee1fb6a0b4139c07f1cf6bce850eaac9a2db29ba | 1 + .../eeac145c017ed35305f0ae69f820fc41e26e7997 | 1 + .../efac7390c6e3a653d3ce93c3d6902f2f1c281ce0 | 1 + .../f0f0dace93d51cd8e045aeacca89424fc836eebc | Bin 0 -> 34 bytes .../f3341b8cc55c0bb6e2d0a1f7f06d68e4f04057f5 | 2 + .../f59ff56e341b94f2bddfd718b48ae9ab1692d720 | 2 + .../f5a1824b9fd9f124df8097017607bcfa00eccfce | 2 + .../f5b92b69853a5d123bffdc6b0ab093f767ec30ad | Bin 0 -> 59 bytes .../f6aea4c380e41ddef2489ee581ab35e17fa3e8dd | 2 + .../f7b7254a3af7c41cb86e4b23bb93c5a6d55e2583 | 1 + .../f7bdc1b174f53a49c6ef8f8cdb9b8e74e0a5d4ab | 3 + .../f98c78c028baf22f39c77faf6e70edb86ac1d927 | 1 + .../fb440171bca6ff922727e9ff2a4ac40d8d7905ff | 1 + .../fc76cc4030b422e4cb5c145c3e8ed122e242acf0 | 1 + .../fcab3b80624b431e464dc12d3b6da1cf538bd15e | 2 + .../fdb3a9b59798d7e851d9074db69422b1d2df38dd | 1 + .../fe5de5f387e31b029d589d9b1777fd0d6b3e47b3 | 3 + .../ff52d938aaa10c08b2eb0830fc0066c3b57e040f | Bin 0 -> 36 bytes test/core/nanopb/fuzzer_response.cc | 45 + test/core/nanopb/fuzzer_serverlist.cc | 47 + test/core/network_benchmarks/BUILD | 37 + .../network_benchmarks/low_level_ping_pong.cc | 696 + test/core/profiling/mark_timings.stp | 40 + test/core/security/BUILD | 290 + test/core/security/alts_credentials_fuzzer.cc | 110 + .../security/alts_security_connector_test.cc | 205 + test/core/security/auth_context_test.cc | 146 + .../check_gcp_environment_linux_test.cc | 86 + .../check_gcp_environment_windows_test.cc | 92 + .../0149b46b88d583e05be0fb1423d10f2a14d36c48 | Bin 0 -> 9 bytes .../047fc351e73f760d329d5a8845944720be9ce773 | Bin 0 -> 685 bytes .../04ef96c66d8222d1a2c07e6b2a6548e6a527042b | Bin 0 -> 12 bytes .../05a7e16c1d7f92111f43e9c777421879920e79a4 | Bin 0 -> 219 bytes .../063eb46f202fdfe7935c30ca38d7eb81c82db419 | Bin 0 -> 10 bytes .../064773597c295fa871c184fc12d17b6de8aab31b | Bin 0 -> 91 bytes .../087449740758b114d16790067707934479946bd6 | Bin 0 -> 7 bytes .../0a5d068feb57a2782c6eba57b637abe8668ac82f | Bin 0 -> 271 bytes .../0b81e6d89bf7df80e87e5ee7c49f7cc1431f77e8 | Bin 0 -> 130 bytes .../11409339cec708a5e353893101bfe76364337d5c | Bin 0 -> 4 bytes .../147696a264cd6f197adb7c68aff834c30b1b77f8 | 1 + .../160e5cac38c5c9e919ed6e4fbafee76907d63044 | Bin 0 -> 7 bytes .../173d02167db431040b0540d98f6fc5e8b456587d | 1 + .../18a3fe239806b3c7d1af24bcd2bd23aeeb072d5c | Bin 0 -> 542 bytes .../195abd83b2e9d32b1b5b854fe33da44b6db40880 | 1 + .../19af2509c7d84334b9ec64de4767a07d5294fd72 | Bin 0 -> 7 bytes .../1b9864b948fcf08b062fd4401ef55b214c259535 | Bin 0 -> 642 bytes .../1edddfa67de854d7faaba41418fda845e9c6a89d | Bin 0 -> 385 bytes .../20031bb00e6608e1b570aa96e6afb9de06d42167 | Bin 0 -> 49 bytes .../22b4c7ce7db99b0df63c9eae9265de484b695922 | Bin 0 -> 15 bytes .../27416437ad287bd3cc1c5efdecebc39f20df73c1 | 1 + .../27e8cd785c2b9346f68dba75761b52fbabaf2b72 | Bin 0 -> 348 bytes .../28236f860d3d8e5ea11176746cb4c1c5c4f1f6c0 | Bin 0 -> 28 bytes .../29e15b492c5a409938092a30c003c5c34df7e283 | Bin 0 -> 4 bytes .../2a47864d77749aa042b772895dbdf46f608ccc6d | Bin 0 -> 745 bytes .../2cca5cb1b135c35f6e5e1ec4c37deb9e12d37dc0 | 2 + .../2df27b6c42dbaee382a29a87338d64ee87354acb | Bin 0 -> 760 bytes .../2e9ddd1339d8e599cef658a08965985c4f45e428 | 2 + .../31a2d12a84a7a56ace831a9668d6ab4847390679 | 2 + .../33cb9ec0ce3538ed6079b5fcb127649a5d05955b | Bin 0 -> 244 bytes .../348d9ae6eebb2e1644addf7f07231d108cf6f3b8 | 1 + .../359f76f3c802292e92b0640de2bfe051e780a3b6 | Bin 0 -> 4 bytes .../35a479988e965a6e3e75138b64b0bd1f45073e2f | Bin 0 -> 244 bytes .../362b00d713686ff70cb0199f3d7d0058e5a1a27a | Bin 0 -> 4 bytes .../3849c1625071791ceae709b9c6c705b28d099d67 | Bin 0 -> 32 bytes .../39ef03c66ee2d4bcfb6c8da50486dcd40f02fb12 | Bin 0 -> 28 bytes .../3a3ca061863499ebc171a4f910fa1b49523baad4 | 1 + .../3a890f3fd01b048ac9db65a9a9b4f4443268b91a | Bin 0 -> 690 bytes .../3b9554038a425bd1fae057ba41f9366bb467e946 | 1 + .../3ce0ae4aa226f205a3a4e66bbb253419d9d754bf | Bin 0 -> 326 bytes .../3dccc5523986c37e27684659bba8a1037e7a92e8 | Bin 0 -> 697 bytes .../3e0908c15b1cede4541d25f388b1345e8641e221 | Bin 0 -> 140 bytes .../3fcb181ff6a8c8e2ba38ed34cf78f7482eb55cb7 | Bin 0 -> 199 bytes .../41c9b5f720eb8f8fa04c840375a881781a849b43 | Bin 0 -> 388 bytes .../4257a018f08f13a3a9adc848ef808e1be50bc4cf | 2 + .../42dfc5c4d13261b7259e65cd692df9c9d607194e | Bin 0 -> 4 bytes .../43144664aedb585d45d42aa5249ddbfe81afe470 | Bin 0 -> 3 bytes .../43e5ad495a47593b17dbcbd3e70c2e25a417bb6e | Bin 0 -> 531 bytes .../446614e45b7bef49118b17e031c48faf167ebe3e | Bin 0 -> 68 bytes .../46492477fa84ca88e85df914801af0b09b0939f6 | Bin 0 -> 362 bytes .../47157f83b166b57e0052c98a65c6db864fa6cb9b | Bin 0 -> 81 bytes .../473fc9b6d768a925527d3ad805ca363d490dc741 | Bin 0 -> 759 bytes .../483c0b4015100eee00f6b23d1100d8c4953dd3b1 | Bin 0 -> 766 bytes .../48be2dc4cdc5462407b319caa855d976cda88153 | Bin 0 -> 367 bytes .../4e84eb54a0e438052b0c2e83653135042d9eb59a | 1 + .../50839d5c8bf33f0970986dcc4b73b024f11a95b7 | 1 + .../523d964986d8ad966ae07e540a608681098813f9 | Bin 0 -> 4 bytes .../5410b8190c95dacd36d6e6ec75b7538a630e08de | Bin 0 -> 364 bytes .../549b2891ac79f504a7c9ea00f6d7527c34ce04e6 | Bin 0 -> 66 bytes .../55321649e7b7f1b5664ae20724e683c930643fc4 | 1 + .../55cc52f25865baee3e6e52c3110a9723caa2b3cb | 1 + .../56c22410e3295ad03aa31552ab888f581756cc17 | Bin 0 -> 283 bytes .../5724a705b62a7548ba2df1abe4ef0c970c4e1bd2 | Bin 0 -> 759 bytes .../576a148c107d56861d1611641a6f7c7921061c5c | Bin 0 -> 362 bytes .../5a6b8263e8939f851cf5b1e347a33d97253b7b3d | Bin 0 -> 85 bytes .../5ba93c9db0cff93f52b521d7420e43f6eda2784f | Bin 0 -> 1 bytes .../5bd02a339fd7705449388580c75bfcc597aba954 | Bin 0 -> 109 bytes .../5bd6fb6fc4163bf3a9db6ddaf509dce8df8a5000 | 1 + .../5d06fc38005503af3d084721c60e574fb9d2f370 | 1 + .../5ddc10489ff3269bdaa3051b70fb7af455ee1104 | Bin 0 -> 4 bytes .../5ea9d515f0d10b04f1356b9463139bfe121a6e4a | Bin 0 -> 13 bytes .../61c449793347cf2e1ed0c38d54d23c63dfaabeb8 | 1 + .../6287389c373e9788dcc04f9747b4be1fd1ef3028 | Bin 0 -> 6 bytes .../64d4de4d5aafab7ec388a7fe83066c1a4d1d9d68 | Bin 0 -> 37 bytes .../651c37806d2ac579dcfc97643c3c1ea74dbb8774 | Bin 0 -> 305 bytes .../6551d02d20573cfa2944ec1f12b0c01f264a1326 | 1 + .../65f029414ee10e45ff4b9f305f7b472364cea538 | Bin 0 -> 22 bytes .../68b75a17fe2db060df3e61a597650ba99079abbf | Bin 0 -> 788 bytes .../69e80594dbc5c4c648e39883a650b1760f20ab63 | Bin 0 -> 157 bytes .../6cb47d0e640b4c41e32f13c0d64ee46eae1b80b5 | Bin 0 -> 25 bytes .../6da5fe063432cb9094c7c083efdbbe5ba4246d18 | Bin 0 -> 243 bytes .../6dd140da774d85f272fb587dc1b2a85d881a7c21 | Bin 0 -> 89 bytes .../6ddab273597d73be49e2307d68e00fa18bba4765 | Bin 0 -> 16 bytes .../6eaf85d84fbf47ea0619d0dba8d366f4e3ff0be6 | Bin 0 -> 4 bytes .../6f751cc09af8113f6ecd491b1830bd8454c4738d | Bin 0 -> 751 bytes .../70d9eb29a70d483d07e2faca6b00098af78d1fff | Bin 0 -> 124 bytes .../7192effa1058382b379fb7b87f1acad5ac554d05 | Bin 0 -> 643 bytes .../730e85d6a62e70cb6721009b903782ade4ff73a2 | Bin 0 -> 370 bytes .../74002471a854059cb29de7cad8f9fb7adc3c5ec2 | 2 + .../747f2330cd1fc4a06d54b376a9a6528d0364f0ac | Bin 0 -> 646 bytes .../749d5d7a9e0b1545b297117e834462af32b3e230 | 1 + .../77de0b1de120ac702ca45868b1008a48626daf12 | 1 + .../792c67398bce19a4eeda32653c994436e79456e5 | 1 + .../7a3022b248c8960289e4c80c7cc8df409499e5da | Bin 0 -> 250 bytes .../7a9372081294a6fbd3fecdd91b99589c98d4948e | Bin 0 -> 150 bytes .../7bbe4ba828947550f4ad089d5989cb695ecbdb1b | Bin 0 -> 34 bytes .../7f1ad514a96f0c3d5ca5d6f7880b929a65eeae96 | Bin 0 -> 37 bytes .../7f2b075f0b6707c38db851747e2578343eeab286 | Bin 0 -> 382 bytes .../81ebc64bfde3fad37af5a58ef7f1c5c3c54c4b5d | Bin 0 -> 4 bytes .../82fae081afaea13831404024d39658344d56e1c6 | Bin 0 -> 77 bytes .../83ba41cea1adab707f7f213af5e2ed734bdddc25 | Bin 0 -> 128 bytes .../841a3f66c94e5acd836a44cd5a8514d4ad45d83e | Bin 0 -> 161 bytes .../841ef94ee0f1b0b45983d95b75aba25421d73f2c | Bin 0 -> 4 bytes .../843b0aad4a9707c5dcc92d12d876b78675cfcb65 | Bin 0 -> 168 bytes .../8483e3d92eda8df504b1d1d0d012f4bcd778cd33 | Bin 0 -> 769 bytes .../876830fdff4e59038fa2173b700faef5bffe61de | 1 + .../87ca3342fdce0c1f678a3f1b62428032ef51442d | Bin 0 -> 16 bytes .../87d044027cdb7d35fadb56532f497764246946a6 | Bin 0 -> 642 bytes .../88ce75ba18bdb7e93a81197d850f4e792f6a8155 | Bin 0 -> 690 bytes .../89dc55e8e20e811e78c952c8bd2c16f55fe72f57 | 1 + .../8a215a58908f44bdced595ceb01a81977f1d72f0 | 1 + .../8ac7459e918304ca40b1cf29a3ac0f555eada678 | Bin 0 -> 150 bytes .../8b93e50a911f3ea0e0b0377ba4636574f2ee9a5e | Bin 0 -> 67 bytes .../8c9ec0ffd803505772693833d56e7a02110645b3 | 1 + .../8e4b361a530dc6825afcfb4106bd482c3fd010fa | 1 + .../8f6690d97bcda890f2a5b2930a2b7a4d7b56c6e7 | 1 + .../917636de2c14dce2580d4308249a94d61d62c305 | Bin 0 -> 31 bytes .../91f11008defda918951bda868cc68c6373fb0e6a | Bin 0 -> 3 bytes .../92e01a34047b660a798086d55a3d8d7100a01939 | Bin 0 -> 4 bytes .../963fafadb4de09dee0e6a852bd61b1740039a465 | 1 + .../97bf33ec97b93fcc2449431915911a55b906e3b6 | 1 + .../99e31e12b02b02479d10b2c08426906bd93a0840 | 1 + .../9a75ce693e7259d4d3bb9203dfc0a65f8bbaa466 | Bin 0 -> 152 bytes .../9ac0d956f9743e026baad7319ba2a75d9f1a534f | Bin 0 -> 760 bytes .../9ae56d4451dd3e1b66ddc250d84dbf6d8cae0dbd | Bin 0 -> 13 bytes .../9b9a3a1e4023c9b172060249752a482a3437ef2a | Bin 0 -> 14 bytes .../9c81164e10bf612c352dca3ecabf57743b451d42 | 2 + .../9d8b420b5d32deb0140ab91eeebba58ca6163722 | Bin 0 -> 15 bytes .../9de687bf1e2cfac54c3b2e2eb85b53014a460ff7 | Bin 0 -> 77 bytes .../9f3cda19a186bd11bfac361b464f92daa129a33b | Bin 0 -> 97 bytes .../a14fc6a608121f8abf0fe25cf466720f00f25653 | Bin 0 -> 964 bytes .../a39906074669a6b76a35b0adf2bf36ad751f3b35 | Bin 0 -> 19 bytes .../a454ca483b4a66b83826d061be2859dd79ff0d6c | Bin 0 -> 4 bytes .../a52df5607370ff0f56d821000f3d5e386a01d489 | 1 + .../a56eaf47f7c7263e53efdc55ec39063dbb4ae71c | Bin 0 -> 34 bytes .../a79249fb8f7d53f0a280359d2d9df31594adbdfc | Bin 0 -> 687 bytes .../aa98a46f25004f7436aadb36ff8b7f07ed7bfce1 | 1 + .../adc83b19e793491b1c6ea0fd8b46cd9f32e592fc | 1 + .../afd8e19f7bfd6c963f1856be59b75627864821dc | 2 + .../b3966239b8568442baecbeb0f8a1aa29dcdfd7ed | Bin 0 -> 241 bytes .../b430d41ef65493b3e917182c23ce90df983e01ab | 2 + .../b44e715e0cfe05f0c92a9e000ac3c36aae17df9d | 1 + .../b4cf4ef7b3f64eff76cf99091fddc04411774708 | Bin 0 -> 542 bytes .../b53d84468ea93620a9824ca65acf1179f431e763 | Bin 0 -> 584 bytes .../b6ac4831cc5baabee9c8ab9af9ca3923f91097a0 | 2 + .../b7f4a484866a8050dbc63bc905c9803c6964eda5 | Bin 0 -> 22 bytes .../b8f21e59f90431c982d5ec3fb54ae4605f102252 | Bin 0 -> 361 bytes .../bad10b6581cdead8e7cb96e4f544dcf0ea650fbc | Bin 0 -> 9 bytes .../bb01bed86b43257be9f527388e1183f52438c473 | 1 + .../bb7497b00f0d999ef39dbf81c6bd0441e32723b6 | Bin 0 -> 359 bytes .../bf01b72e635deda1b4a8468f1cc36f01a54e1338 | Bin 0 -> 3 bytes .../bf8b4530d8d246dd74ac53a13471bba17941dff7 | 1 + .../c08bc84ab6a512b901bb730beb05c8394e4f1c5d | Bin 0 -> 50 bytes .../c244b635d94e6f5d6b344887434be3e001a04b41 | Bin 0 -> 46 bytes .../c281efe9620da999a637ff6e9b3279ec613fb992 | Bin 0 -> 73 bytes .../c30a212824ee71e215f475f453de17c65a200101 | Bin 0 -> 172 bytes .../c449427f35b7ecdf5641073629f7723df52c4cb0 | 1 + .../c60240cd3b02eb71e2bf5ebd59afa3a5dc9b5e4d | Bin 0 -> 172 bytes .../c60cdf9c3fb9060838f445b3bc3852b6f81e1e4c | Bin 0 -> 4 bytes .../c72d0501bacadb45242c553ba292591302f12a6a | Bin 0 -> 13 bytes .../c739e7b5ad999edbdeffdab672dbc30deb3959a0 | Bin 0 -> 34 bytes .../c7d73b12a7108d82f8dac6d8a6a34f838601aca6 | Bin 0 -> 4 bytes .../ca781e1add632433293e847ae9e71649c217ee5f | Bin 0 -> 651 bytes .../cc48e916f40e8d69c2d07cfda42c7d3b7fe3447a | Bin 0 -> 357 bytes .../cca1aff4c08ee4ccbcb6f80e1cd1480a0a093cfd | Bin 0 -> 372 bytes .../cf6ae8bf1d08d25e235b7bee0839984bbc04edf6 | Bin 0 -> 4 bytes .../cfc52fa086292c699efd7bf41d2fae3deb449536 | Bin 0 -> 510 bytes .../cfe13ef3c6c713a059f231f0001ecec97e2a932d | Bin 0 -> 4 bytes .../d14026ac6421bca7161024f4e735cb80a1068d01 | 2 + .../d2fb6e8f7867fc1e2ebe723da2b5246dc9cc6b14 | Bin 0 -> 4 bytes .../d4db7d51bdaa4781cf12c3b59914bad414d2a41e | Bin 0 -> 7 bytes .../d533da0e7f8c1e39bb025b4d7a89613142a6f54e | Bin 0 -> 4 bytes .../d5cf489d01a1b847a7aac5dddabff23fdc218e1e | Bin 0 -> 14 bytes .../d686f8561a249c7c15c78f76a5fceb884286e070 | Bin 0 -> 73 bytes .../d92424daad9d96a40e5ab177e3824c36ef51dc0f | Bin 0 -> 10 bytes .../db242a11ed88b2b26af46770dd1927d9f35301fb | Bin 0 -> 756 bytes .../db32eb04db13d58f65f46d262608bd088987c063 | Bin 0 -> 684 bytes .../db39a953317951759e40734de6607a0b4457728e | Bin 0 -> 387 bytes .../dc5e8f3102456bed90d17303bc4cff1a7e076d5d | 1 + .../dd9542bbed8e5dc58da2789edbfb9c38d578d3b4 | Bin 0 -> 4 bytes .../de2ebb1ed324385de500a1a3308846239857c3c7 | 1 + .../de8ba9158254c1cd84b53df1e4cdf1757b1392f1 | Bin 0 -> 650 bytes .../e1dd260746f50024822a8b729b89545d26decfb8 | Bin 0 -> 14 bytes .../e29add81b20dc570fdc885782689f6dccb1c5fad | Bin 0 -> 9 bytes .../e2e99af62843cd3b29d50daeb118e58830784da9 | Bin 0 -> 646 bytes .../e46611c5daf99662e1576147c1623409752a1f39 | 1 + .../e5a1ba11af830e9d2db201c5164f75747a85fe9b | Bin 0 -> 94 bytes .../e6026ee0badf216b326443a5f708446b2f2e579f | Bin 0 -> 952 bytes .../e6c7d2c0038fa1f03fc6590a726abc98f4c641f3 | 1 + .../eafdef6a630bed71bd0e4f3d4a16b5fa0c920651 | Bin 0 -> 4 bytes .../ece985b9b82e27281514d460709d7edf8203ded7 | Bin 0 -> 11 bytes .../edb8f4259f756c2c4bc731f05beaa36f992cf079 | Bin 0 -> 697 bytes .../edce7778c2e1adb81dda3d057a6536759a7cb293 | 1 + .../ee4040c0dd406dd616c49ed2c37b40478dabfe0f | Bin 0 -> 71 bytes .../ee69f2b380663d051a70f30fcfce9f79f5341e5a | Bin 0 -> 5 bytes .../efc6743e47274058771bb6eda1fefa017bde4a95 | Bin 0 -> 373 bytes .../f0038e54162000694d882b1acb80930c807b41d2 | Bin 0 -> 7 bytes .../f1deb9e388c877337dabe92f31b01e2a019a10f4 | Bin 0 -> 223 bytes .../f3a09373e4d3c7310d372089e6deb15d6b22c198 | 1 + .../f3db7ef6495fa1ac5bb4db293fb38dd59122bb7c | 2 + .../f434bb4ceecc573e085d4c3ef453ef01e93d9c89 | Bin 0 -> 76 bytes .../f55bceaad42ddf9d2b37fdfca68255d29a696109 | 1 + .../f62ca5321428a5d23f3c804fb51eb4e65bc58716 | Bin 0 -> 4 bytes .../f7c6a558b8d0af64db2b139371a7af7068b01b92 | Bin 0 -> 661 bytes .../faa1781e1444bba5b8c677bc5e2a38d023a1ec65 | 1 + .../fceba33ada1dda05fccedfefd331c9a201f1a2e5 | 1 + .../fd668bef6fdaf7f3ffd58d8c60ce550476652e60 | Bin 0 -> 247 bytes .../fdf06b928e37e7c4ae59a568b5723ad98bbed6e5 | Bin 0 -> 19 bytes .../fe2fc5d499aeb2762387ef2e3ce939280813dec0 | Bin 0 -> 4 bytes .../ff548d368b090409a138e5cc4afc7f43b4a3fbbd | Bin 0 -> 748 bytes .../05cda1e986096f42698ee2d86ab0a4a3f6a6690b | Bin 0 -> 158 bytes .../0f65ef472e8308561c77ada56afd4de5932d950a | Bin 0 -> 156 bytes .../128915cb83e66a736f8a1833c8901eccb81e0656 | Bin 0 -> 473 bytes .../134d3a5e7a1609a583f6282c48ef9b871e0fdc15 | Bin 0 -> 64 bytes .../13fccd43a6b52c62851ea24e8be4f8cfe6c0103d | Bin 0 -> 156 bytes .../171bc6b14b94c72435d2da2e31e9682f12a3f13c | Bin 0 -> 156 bytes .../17dea38d21e9282ecd062466cf287ecf5b30c1cf | Bin 0 -> 156 bytes .../1961eb9d4dd4bf21cbcd9c45a17b1d025eb0d200 | Bin 0 -> 43 bytes .../226ebb5cc16ac42fae3be273de533ac79759ae01 | Bin 0 -> 470 bytes .../2333cf428cb1e2976679ac84e64873bf76c6595e | Bin 0 -> 156 bytes .../2885553a9e6829265d5f44ea4e24fcf7d6513436 | Bin 0 -> 313 bytes .../28bce9a7cb21f3232239b9b71ef568137bf801f4 | Bin 0 -> 156 bytes .../2a0286615be426d1e7fd5894aadf1a503df05a0a | Bin 0 -> 156 bytes .../2b4a1f3ebe223d91c042a5e86aff31e460f6cc3f | Bin 0 -> 156 bytes .../2cfbe809bcf53160ecc0109b2df01a8696a226fd | Bin 0 -> 156 bytes .../2f770de96db36ef9a71f7eb09b2e8695ac1f0655 | Bin 0 -> 172 bytes .../30ba8ad171657470b5312232387b7da70c387219 | Bin 0 -> 63 bytes .../36548a97a8b847e17a77d1e646c6eb5ec001d84a | Bin 0 -> 156 bytes .../3c442804f73cfe826a609d97c12ef87852742883 | Bin 0 -> 156 bytes .../3dad758011b16a3771376f9af91242953be3e47b | Bin 0 -> 61 bytes .../43b56a1adffaf2c3c994679bf2b6fe6414e13df4 | Bin 0 -> 156 bytes .../4446c60ab89c34e5ccc26bec18d7e7d21fe5aec1 | Bin 0 -> 42 bytes .../44924b3866956d0668ec65750c3663279ac84a36 | Bin 0 -> 156 bytes .../44e4370a4eafde61f8e7dc7e4542e0ad5ecf5253 | Bin 0 -> 471 bytes .../44fb8c02117ebd75c97e517624c0abc9f9a76aa7 | Bin 0 -> 63 bytes .../45d76dd1f0a29fce3f8d289b5177263871eb3f83 | Bin 0 -> 156 bytes .../4fcbf18c4135352539eaf445c26f2f8a5da9b68e | Bin 0 -> 156 bytes .../508ca86c6f4e6ecc30c252ccf74e78256a893b17 | Bin 0 -> 43 bytes .../515d240b860fcd1e77d4a5af291aa4a667d9b609 | Bin 0 -> 156 bytes .../528e9738d5016f01cf59d74f20a8aa3f341ad89e | Bin 0 -> 156 bytes .../54b636a2bb66ccf8247b53ff76a6400e9f1355d0 | Bin 0 -> 313 bytes .../5cc337c4b33cd703cd354804530f5b72684260d0 | Bin 0 -> 7 bytes .../5ce3ec59111bf328044e41fcf26b3bc542df527e | Bin 0 -> 314 bytes .../5eaac270339f19cfce4eafa2e69d62adf100ad1c | 1 + .../6129382083353687a5c3acb3d4274b811227bf3d | Bin 0 -> 43 bytes .../616a25f7c4557ef9eb33d4367c6884abc336802d | Bin 0 -> 46 bytes .../6214e558afbfdb8451e49b62619896492f1a8972 | Bin 0 -> 312 bytes .../6c6a6b2ce74acf8a8b90fc0b268ecc7dc992cd60 | 2 + .../6f72309e1b23b824e9bbb9abf74a014b78be038e | Bin 0 -> 64 bytes .../7137ffad853e4dd76c6d6490f37b36e20de7ede0 | Bin 0 -> 64 bytes .../71c9356b6b6c5a3a07033d0fa4ed417fa74a77e5 | Bin 0 -> 395 bytes .../7414938799ed61282f41d5fb1474751ca52b2682 | Bin 0 -> 315 bytes .../75e853eb2ff7e78efb327e114b39baff5a1dd5bb | Bin 0 -> 156 bytes .../7607c92952b4429e350260d8074c3c460468fd49 | Bin 0 -> 156 bytes .../7677373c082fee56d8cdde009d9db5b117a4c8de | Bin 0 -> 42 bytes .../76abde5c970743f9fb8bc781e46c431dee2aa104 | 2 + .../77e0b4e2066853df9d32d475b8788e3d7d19329b | Bin 0 -> 313 bytes .../78e66840048ddc3c75e0e4abffbb3109af0d750e | Bin 0 -> 156 bytes .../7dc620eb45764390c7b106362fc4922227415407 | Bin 0 -> 156 bytes .../82ca7a52d589e9dbae37ebf1c59fac7ad876eb7c | 1 + .../8997d472f73eec84fea712638abd762818ec92ec | Bin 0 -> 156 bytes .../933bc3fdc56718d7ac0486c26eecddb6db1c5ba2 | Bin 0 -> 161 bytes .../94431bda60ddc175cf86273ddc07cb41ecf45fa1 | Bin 0 -> 64 bytes .../94c4272b2bb4fa9178eb4ae7dcf4b796fdcb22ac | Bin 0 -> 472 bytes .../9551c32a794250fb425005d8faf4bd24475acd41 | Bin 0 -> 314 bytes .../9677da7c82f18cec3e0ed2e78aadd6e590271a52 | Bin 0 -> 156 bytes .../9c2e6291aff608f3f5307a7c80db6b17107f0575 | Bin 0 -> 313 bytes .../9c39dc04c7414ca0bb64fb942422bebe83ed8e8f | Bin 0 -> 156 bytes .../9cc8547d183a4f2ab7022b36376ca4a6230726c6 | Bin 0 -> 313 bytes .../9e19e5e77789c34f99bbe1e6de198610d6765806 | Bin 0 -> 317 bytes .../9f0853ccf6912df9fba2d5fc3a1ddece41c377ac | Bin 0 -> 20 bytes .../a6d521e501322f052df5a81ee622e0e4942ddcda | Bin 0 -> 156 bytes .../a9dc20f09890403be510357a7665a8f0db2468a4 | Bin 0 -> 313 bytes .../ac1c60970910880558ae7a2ca2e155cfd7772e05 | Bin 0 -> 312 bytes .../afe36d0187a155fc6e4e5c055c0ed0f3802cf696 | Bin 0 -> 156 bytes .../b12b5fc39edc5407b4a525c414ff6b5e116eee05 | Bin 0 -> 65 bytes .../b5b088c6e3a96f88119a940874ab04cb954797ae | 1 + .../b65ad77a43ede3394ba714238829860c4ef4bc9f | Bin 0 -> 312 bytes .../b6f265cad9d47e2ccd17a73a6d309d8898dc5428 | Bin 0 -> 156 bytes .../b7ca5868bca7ae7d1952f44ca966218b26fb7207 | Bin 0 -> 43 bytes .../bd20809eacabadb9bcc77d31e42d3359117b03f2 | Bin 0 -> 156 bytes .../c328623c4ce12505a54cf1a7a1606e1db36e870d | Bin 0 -> 165 bytes .../c823e8bd5526d9fe7d51319737f51bd18bdd75e8 | Bin 0 -> 64 bytes .../c9394095d86ff36b69d90f7122592bf51cafe7dd | Bin 0 -> 157 bytes .../cdbf0d2ae953bec07a67b7152785b548e55f85a4 | 1 + .../cef06f9c35ee338998703555847d70c26bfc9474 | Bin 0 -> 156 bytes .../cfb40ab8eb7031e978bed2418cdc2f0b8a8d8ec7 | Bin 0 -> 156 bytes .../d30840c3f48f11179ef976ada30477045c6d1e98 | Bin 0 -> 312 bytes .../d5afef69141edc7f4911243cf2deb19c912999cf | Bin 0 -> 155 bytes .../d5cf71396e1a04da1a7ec266957ffd2de29d6a57 | Bin 0 -> 312 bytes .../d6dd8a2b085db5d33ef24b23502293ce1ce906a3 | Bin 0 -> 156 bytes .../d7676dcd39b7c7cfaac513a98b56fe4ac8ea27d8 | Bin 0 -> 156 bytes .../d8c9e9ef14abc23b36cb493283ba3e2812d9e537 | Bin 0 -> 156 bytes .../d9edb0aa5d2fe4af26ac861770c1530a4075f919 | 1 + .../da1b52041957334b9ea1371bd2993013118bc82d | Bin 0 -> 62 bytes .../dca7861424c8f92d3720de5c4488454cde1c39df | Bin 0 -> 64 bytes .../df3755e257d024ef8ab08f6d5cefcf28148ea4b1 | Bin 0 -> 64 bytes .../e360a49faefb87d671edb99e777f528f52cac9ae | Bin 0 -> 156 bytes .../e5e789605744d47e5a5d433bb04db1b413bc91a8 | Bin 0 -> 43 bytes .../e6e44a6aa0ece409450c85e43d02c57e338ce1da | Bin 0 -> 314 bytes .../e8ebd49ee98cf57ca7eb35b6e96ef8866270aac6 | Bin 0 -> 156 bytes .../ea0645f46ccd233337a8389b6118db5b0289f040 | Bin 0 -> 312 bytes .../f6f7687df6b7056d3c819c03c9268e22a956b6b5 | Bin 0 -> 156 bytes .../f725caa73aa9467c5e934c49780fc409b36b251c | Bin 0 -> 156 bytes .../f8d3326a860091edd4d60725f96f429d13f3abe6 | Bin 0 -> 156 bytes .../f9261344b4049e90e88b5af784dd29b938c5c838 | Bin 0 -> 156 bytes .../f95b97ece3b46815204a8e6d6e94f92ec40a9672 | Bin 0 -> 156 bytes .../f97db29497e4e3225016a6ced837e20a13622f16 | Bin 0 -> 156 bytes .../ff1a900b12f19772f9a86bd5f560a754cdb18d1a | Bin 0 -> 311 bytes test/core/security/create_jwt.cc | 99 + test/core/security/credentials_test.cc | 1841 + test/core/security/etc/BUILD | 22 + test/core/security/etc/README | 2 + test/core/security/etc/bundle.pem | 63 + test/core/security/etc/test_roots/cert1.pem | 21 + test/core/security/etc/test_roots/cert2.pem | 21 + test/core/security/etc/test_roots/cert3.pem | 21 + test/core/security/fetch_oauth2.cc | 158 + .../grpc_alts_credentials_options_test.cc | 95 + .../grpc_tls_credentials_options_test.cc | 100 + test/core/security/json_token_test.cc | 452 + test/core/security/jwt_verifier_test.cc | 637 + test/core/security/linux_system_roots_test.cc | 98 + test/core/security/oauth2_utils.cc | 116 + test/core/security/oauth2_utils.h | 29 + .../print_google_default_creds_token.cc | 129 + test/core/security/secure_endpoint_test.cc | 232 + test/core/security/security_connector_test.cc | 666 + test/core/security/ssl_credentials_test.cc | 66 + test/core/security/ssl_server_fuzzer.cc | 127 + .../security/tls_security_connector_test.cc | 334 + test/core/security/verify_jwt.cc | 119 + test/core/slice/BUILD | 159 + .../testcase-5759629707444224 | 6 + test/core/slice/b64_decode_fuzzer.cc | 38 + .../testcase-5686577615339520 | 1 + test/core/slice/b64_encode_fuzzer.cc | 36 + test/core/slice/b64_test.cc | 219 + .../04cb8ccc553f9b2f5e52c421aff6d1c954d3dae6 | 1 + .../0dd8f3a63745b3a2d39791559b5c1b311447b537 | 1 + .../17eeaca784409adbe43365c32ac87915d736bba3 | 2 + .../2040c1ff65f52a7ae668c2c8f324de5dacc9d695 | 1 + .../26b0d1da23027ae54db96e125e4a9e98842d77fb | 1 + .../2a089c0db45acdb4c6ed8e7ff81ca7235792c0b9 | 1 + .../35b7b3bc3a740d5c3abca0d75b53f0e1e1ee998a | 1 + .../36367ba1adba47a1cbc3a88707fde8cc7abdc248 | 1 + .../39c2ba51548a0beaf0d6d1164531f1447dc311b5 | 1 + .../56d08fea787c041395c6697ce26cfbc0decbe688 | 1 + .../678d981fdabb9f0d6640235cf1719dd1e1e66ae9 | 1 + .../68751961609ec010565de0aa87521dcbf0722c5d | 1 + .../7875c06c6f03c9aa2f8e9c59f8d8957c8a32e759 | 2 + .../7b302090e090a5829b6d1dd7be30bd4e36a7e60f | 1 + .../875e1022169c9e4c541a9ad894e69e989df22ba1 | 1 + .../8c1051ce066f5a26de9a9d133180621d0da957b4 | 1 + .../8e084e628ab83a18ac7ca7cb3506525263655c63 | 1 + .../9d316c4675f40ddccaf8f1cc7aea94170b1e4223 | 1 + .../ad1c7c11d18a7d116e2c2ef4d4c5afb1270836ae | 1 + .../b471f94aa4facf502e622e4a248f1ba4063ae681 | 1 + .../bf52ece030f16136d46e0dc97f58d60a0d8a1f0b | 2 + ...rpc_percent_decode_fuzzer-5652313562808320 | 1 + .../d5b2a7177339ba2b7ce2f60e5f4459bef1e72758 | 2 + .../de867b64c54a7ed773dc611fc5cd2f17c5433113 | 2 + .../e3948dbe004950591630dd5c52f4e0fcbd5e388a | 1 + .../e7064f0b80f61dbc65915311032d27baa569ae2a | 1 + test/core/slice/percent_decode_corpus/xyz | 1 + test/core/slice/percent_decode_fuzzer.cc | 48 + .../0d3ee7fa54e6c66103965fd4409b044ba7db6c3f | 3 + .../2e7ccf75e27b9501e3b28cf1c50ed0c45ab7c226 | 1 + .../55bb859f3942c462b03b7cbcf22ab4a0ac9705cf | 1 + .../56070cecd54c845b6d4334953b17b712eb000d93 | 1 + .../61f50e891bf7ff5eb7a7af206f1e25d77f8756e7 | 3 + .../6e0c60cefc704c7940e475a87dd9ae423061cb5a | 3 + .../7271ebcc6d22a0f186f7bc3c1973a7ed1bec8d8e | 4 + .../74c83ece3e2920a67593a9be9c82468f16cbb969 | 1 + .../98e004fd2a9f141a7a019720820080e12d637c06 | 3 + .../ba2c1e98227aa21ea3bb2ca4d0e504119717da8b | 3 + .../c16b9fd45370d4afb5d3ebd307a6e263c25ffd45 | 2 + .../d58c3cd4eab9b6d2343abfa1c25c90a383fe0ec3 | 1 + .../e2619218ede30d2b7b8ecd601a9f0ae754b728b4 | 4 + .../f93b3653e453f0e3eea3198001be6ce46e64bd21 | 5 + .../fd41d029c7682ad3d1c40a9fd017a4c85b673a54 | 3 + test/core/slice/percent_encode_corpus/xyz | 1 + test/core/slice/percent_encode_fuzzer.cc | 56 + test/core/slice/percent_encoding_test.cc | 147 + test/core/slice/slice_buffer_test.cc | 160 + test/core/slice/slice_hash_table_test.cc | 227 + test/core/slice/slice_string_helpers_test.cc | 203 + test/core/slice/slice_test.cc | 361 + test/core/slice/slice_weak_hash_table_test.cc | 107 + test/core/surface/BUILD | 176 + test/core/surface/byte_buffer_reader_test.cc | 280 + test/core/surface/channel_create_test.cc | 52 + test/core/surface/completion_queue_test.cc | 505 + .../completion_queue_threading_test.cc | 301 + .../surface/concurrent_connectivity_test.cc | 314 + test/core/surface/init_test.cc | 98 + test/core/surface/lame_client_test.cc | 150 + ...num_external_connectivity_watchers_test.cc | 204 + .../core/surface/public_headers_must_be_c89.c | 341 + .../surface/secure_channel_create_test.cc | 80 + .../surface/sequential_connectivity_test.cc | 203 + test/core/surface/server_chttp2_test.cc | 78 + test/core/surface/server_test.cc | 173 + test/core/transport/BUILD | 153 + test/core/transport/bdp_estimator_test.cc | 150 + test/core/transport/byte_stream_test.cc | 255 + test/core/transport/chttp2/BUILD | 156 + test/core/transport/chttp2/alpn_test.cc | 57 + .../core/transport/chttp2/bin_decoder_test.cc | 170 + .../core/transport/chttp2/bin_encoder_test.cc | 178 + .../transport/chttp2/context_list_test.cc | 173 + .../transport/chttp2/hpack_encoder_test.cc | 418 + .../0141fcddc9807ee093313b2256f1306fbbdc6cda | 1 + .../0255050a9ccb25f46d6c1bf6a5a8a4c0c7635599 | Bin 0 -> 27 bytes .../0320a995a8c76c64c8a0e0297f632b76d9bc92d6 | 1 + .../042091aeac4cc255506b96fa11c7354e699fde76 | 1 + .../051268ade45dbed0aab896d7d9f4d10ba89d3b09 | 1 + .../0696e7bf7837d98de01c915d3c9d80e5d21b30d2 | 1 + .../06995c2f3f01c7ec50547415dc324c64030b7a3e | Bin 0 -> 4 bytes .../06f7ce769fe07804fc842462d4be8c1aa2ba82c2 | 1 + .../0781b055c85ab8fbd0a3d0080a32e394af8761c4 | 1 + .../080e1f19e6061c5bcac31add2095f87f6ce46129 | 1 + .../0828169ba82152a8907f1001e3d98804397d4610 | 1 + .../08ffc4a4160e9fe6f322c28870a89a41fd9c37d7 | Bin 0 -> 37 bytes .../090a7a758898a6e7c9108b7e8a1cb9cda383e707 | 1 + .../0940663729501b750a18542e1041cc26385c6148 | 1 + .../0a10bd140c6c5fb109a0816ca061739688a6db9a | Bin 0 -> 24 bytes .../0a4d3fda02cdcb7adad1daa80d65780c9c8d1464 | Bin 0 -> 50 bytes .../0ad812832efa33e086874fbf3496664d3f1b4dbe | Bin 0 -> 39 bytes .../0c9996d4fef87bacd7a001e99a515b3ba3d5788f | Bin 0 -> 35 bytes .../0d6210208831fe55951af56cdeee3d54a91a5361 | 1 + .../0d784965b2262df7ed7a1eb57b92a718cc76bde8 | 1 + .../0dc9e41eedf35ccedf4e2b0d230ead7c4d72fdb2 | Bin 0 -> 60 bytes .../0dd470c8939ed535de6b36f7b7bfb68aeace493e | 1 + .../0e61e471fa6d3405daef4276ee00cf5fc189f378 | Bin 0 -> 36 bytes .../0e9196f951874edbb5ed098739ea5c8b6c0751c2 | Bin 0 -> 64 bytes .../11442d93a554b9e7f9ab02782bbf9443bf6e1ddc | Bin 0 -> 36 bytes .../11833b795d04eda5a3af56ef7b3c3a26a8ee3444 | 1 + .../141272316382b0f3e9ec841c735b84e7aa517c3e | 1 + .../15ae43369798e48c396dfe7d53a21878b96e66c8 | Bin 0 -> 44 bytes .../166bf1843c229d34a2880d234dd166c27bdc11fd | 1 + .../179e8ac763b4051a953a38b6b3b1f1e1f6cc6c9e | Bin 0 -> 14 bytes .../17faf0ba8a491a835d35977a9007b90ab7d30d2a | Bin 0 -> 49 bytes .../188f6cf2470e95b228341de305ef839b27f01a5c | 1 + .../1ab3e52adace335d02e2b5130eb4f7c918add7fd | 1 + .../1b5150514364e2c17f5a4edac1b7af99b936f55a | Bin 0 -> 48 bytes .../1e8befb98cbaba059d6771abd1680e19484e7723 | Bin 0 -> 27 bytes .../1e9b962969c359bc2ff766704c8ca8e25f5eccfc | Bin 0 -> 31 bytes .../1f80af104acf41b912bf4a48fb938267e3718719 | 1 + .../1fcc4afd6f48e83d61ea74970df3ca9dcd8ec291 | Bin 0 -> 48 bytes .../213a734ccdb813b18ad9f2dd99b7f9967ee1460b | 1 + .../2151945f43991c27e123c45dc72b93752a47e65f | 1 + .../21545d998c27a5a1572a89a552937752432b1c14 | 1 + .../23c7443fa1ab713e7c34ec50222b1b8cceaedc65 | 1 + .../2445bb2c6779712dc9e14c01fecb7103f8732858 | Bin 0 -> 37 bytes .../244b0a20500e31d3c538418800db816b07f4d210 | 1 + .../2461b9fa6b5bc4b6424dec5b9a18d4ec7c309112 | 1 + .../24ec2f3e17d3850564788f3fed17a5c586c44658 | Bin 0 -> 39 bytes .../2537b8d6b902b8dfc6e17f194cf7d05ddecf74cf | 1 + .../253ad01acea4b7038edc3f2a8c4a0c0f5c4dcd05 | 1 + .../256d0bbdbed22f5867a6f503bf082011e61ee12b | Bin 0 -> 52 bytes .../26f0e88adbd8f8cdf778131a35b33ecf8711fa49 | 1 + .../2e5dd8fb9d2a31fad9d681eda697d085b647b57c | 1 + .../2fdfd2abf30c636ec8c841f1ac26594e25664f0f | Bin 0 -> 47 bytes .../311dac5092e36134d3490f98aa4207425e0ee941 | 1 + .../320fe6224a5b691c0425e34b6b14e8c6fe9f9620 | 1 + .../3255f1c7441a7150dc3c33022bfbe8c956c7b7b1 | 1 + .../33bc9db104eb72891fb096f34cbac191b3f9918d | Bin 0 -> 36 bytes .../342ff1db70a7616b4ef76c03a42802c6702c18cb | 1 + .../344c011df992ccfc0ec682c14a1cb2d7959998c7 | 1 + .../35775efb9d0d68fa07987b9a84934389b528e436 | 1 + .../3650168db6fe115fb1e73eed4b76cd224d977d01 | 1 + .../38228bf98cdb50fd3fa830ba5a9d4c7399063dff | 1 + .../38717bee901151b22a10beb12c6623ccc844d3c2 | 1 + .../3a4bb427a85bdc5bf66ac71db073c99e0dc9f881 | 1 + .../3ab48621d9b8f075369099a8ec7517bd23fd6e70 | 1 + .../3aec8d9311130dfbb6584fe6e619579c21992b5f | 1 + .../3b14837f22905dcb04f93aed2aa69bf95924fb9d | 1 + .../3be63c163805927e04fd7f84d96122c48240e601 | 1 + .../3bf2e349747c0f539181e0d4084a5fe506811a9e | 1 + .../3c5af4d73e94d0e8ad5666b6acb340f929031e95 | 1 + .../3d2b25346a9671d83bd082d170a45eed739bae6b | 1 + .../3de7b860c3fba2bc55707fd6875dce276f2f249b | 1 + .../3e2004ff9f40e398e0f41138a25a8b66e3d843d9 | Bin 0 -> 38 bytes .../3f8983e457033cc85997c356935ba9c21460e86b | 1 + .../4105669086d83a20f8d991088553ba08202478cd | 1 + .../4180619316eef7912d1cf52ffe85897242e1ae88 | 1 + .../420291d7139d9246de747739fd98102434a742dd | Bin 0 -> 50 bytes .../4256437fc5897c0cd5d755816e4e68c7be326849 | Bin 0 -> 11 bytes .../42b25a5413c536478a3e63da5adef4250babf2f4 | Bin 0 -> 27 bytes .../42bef44ae751a45c671d9da5b1231d2ac747a48d | Bin 0 -> 38 bytes .../438c3c9045c3cf7910aceec34f77b47a70ca4abd | 1 + .../43af96b4f65ed0ace7236427f2f8833c4835989e | 1 + .../44c6119bb91a452d6128ce0ea0d62938800779ea | 1 + .../46d595331689ae01d77aff387747a98ff3480096 | Bin 0 -> 36 bytes .../471a307b81dc37459087d41532741c5c9d7ba836 | 1 + .../48900b4a5557530922ce45c15ad0d3b0a337520d | Bin 0 -> 24 bytes .../48bcce2c6487b18706ef0c609ca39c456215bac8 | 1 + .../49027bbd3f3f3cafa315843c8fe8280f86985273 | Bin 0 -> 38 bytes .../499376c5e291da2f9c25999abf4960fab5a92ec8 | Bin 0 -> 39 bytes .../4a3b7ce0cdf217963a0b692769e5d6f4befe73b8 | Bin 0 -> 39 bytes .../4a3fdb96bc8c80f1992f0f72f963f84856cbade8 | Bin 0 -> 37 bytes .../4aae80e05793d7adb42a7e6e8a5283b677318777 | 1 + .../4c7a034d3a3b4f29d99caf021a0e9bbb89706c2e | Bin 0 -> 64 bytes .../4ce8a43fb17a075627160812ad26c25210d8a82d | 1 + .../5032a75a98cd14d4dab75c1c5e2cd981abb19dcf | Bin 0 -> 36 bytes .../50b3f4b6aed97f442496d27f3b4315a18ba76d5f | 1 + .../51064b88a98658d48a0da7f1545c2d1293ad9538 | 1 + .../51752f12d59fadaaa0dc72e6370612b84ee1555b | 1 + .../51eff6fcbfe1a51ceb3f5f2140c01eea89b4313d | 1 + .../51f65f681cf3a1218d83ad58642c06deaea86210 | 1 + .../521809903d36db80b1ccd707f354361f2bf05075 | Bin 0 -> 25 bytes .../5278e3581c069624157fd9176eddf52c0e58df67 | Bin 0 -> 63 bytes .../52fe8f0e1fa270ea16f66c93f2ffab265ce059e8 | 1 + .../53de87ae94acdc8e58a369459c12a3240f1294fe | 1 + .../54a2b3993c3483745f6314c870a038a8e58f97a7 | Bin 0 -> 38 bytes .../55d60c2e5040a38be8ca41de63e137e3fef892a4 | 1 + .../5653c44a5b520bdf2bdc599b7966f1d7c44950b3 | 1 + .../5838b5a683229ebb6e6277e2810863e642b8afc2 | Bin 0 -> 16 bytes .../588d225784891ac88e30ac6eb5651d63fac34083 | 1 + .../58d51c21a20b6549567a0ab8fee29d162dd3fc5a | 1 + .../58f1036d8ff855841ec25b3c33e85a8fec0d94b7 | 1 + .../5a99df42fb7bbafa2d55714ee235b1c46776b2ad | 1 + .../5b42793550699b2c015bed677cfcddc052f73513 | 1 + .../5b8ca72ba00231c38b19f582127e6a146eba4282 | 1 + .../5baa13dc95da05e7ba02bbe9583ea24517a29a1a | 1 + .../5bab61eb53176449e25c2c82f172b82cb13ffb9d | 1 + .../5c6f6b6f7f3e7b435f060abb73c20d2b773a7f56 | 1 + .../5c9fd9cc7100feaeead1e0e45201945a6e76fd85 | Bin 0 -> 38 bytes .../5ff49c9edc7361797a951585f3e180222c8dd95d | 1 + .../6129954942e26c2a9ec071b6659675745613cf3c | Bin 0 -> 40 bytes .../61fa69b6b51b0ed91914fe48779173f8d26a1d54 | 1 + .../6362ac61cfb6e964aff78f3cd648475dfd5fd4e9 | 1 + .../644deba51c79b6ebd470bd4367452941045d112a | Bin 0 -> 35 bytes .../64beae98e2276749b133e6368c9e0f19a79eba96 | 1 + .../64d7add9192301fd878854dc96f9fa9053f03992 | 1 + .../65566df65e8f55428b6672cc351df414fa8f936c | 1 + .../65bb703af35d5afb824cd68c41d7a1aeb3848d35 | 1 + .../66c537bf59cb3667c037b3517be3d31245c9da8a | 1 + .../66f576baeb0c9435a56eb7375dadc5b5d630ed87 | 1 + .../67b4cec5183659aeae0f5bc71b3adf0542a11828 | Bin 0 -> 35 bytes .../68c94721eda2f62481bff9f1d183df70498d0c5b | 1 + .../68ee8169a65d58edb9fc1c752ea81dfec383203c | 1 + .../6b203d49bbba6ee74def0d35c2266e06ad3c45d9 | Bin 0 -> 59 bytes .../6d580f28d785c0bf87ac351a31a89289449feadb | 1 + .../6f231dec759eb2105e09263d53e171de19a92c74 | Bin 0 -> 43 bytes .../70ff6621a09e4f641538cb1b27e8b382b2f56a94 | 1 + .../71981b55f27a1eb6274eda247048fa2c597f5004 | 1 + .../71c2b0bebf7f0e916e4ab7eb36d47ccca2b9101c | Bin 0 -> 48 bytes .../74610e278a5b90aa12ce1beaf222c4306b02ed43 | 1 + .../748ee9817eba56ec9938601a0e380c74bad4563f | 1 + .../7727e3eeb2a48c46bf5a678c300ff8a38b8ffe3a | 1 + .../78176d80c1d74c4b1b820d386ae483ac4d1d92b7 | 1 + .../789abb571563a6795220046f76b7cf0ade90743c | 1 + .../78f5ff40e5554aa9c31b45f79a7ae9699f93e7fd | Bin 0 -> 47 bytes .../7a28fc2e9c72d51d29e87eed63ed405c9779b5e1 | 1 + .../7a42083be21dce7f96edef1f3b3b2fea0bcaeb3f | 1 + .../7a51275b11ecb1efec9251390531681c8d6f2481 | Bin 0 -> 11 bytes .../7b9682cd7a3984698f6eac034c59c0f91b4fb83d | Bin 0 -> 29 bytes .../7ba7239a29d6183960e3986abc8f19cfb548b905 | 1 + .../7d3b3d5f23d0ede9f7e5dbd1115db58c8a54a213 | 1 + .../7ff3b6239b04479a9caf67f45b2d0c619f712815 | Bin 0 -> 48 bytes .../8035c81c95dedfc27c3649064f98f49e3e72c21f | Bin 0 -> 37 bytes .../804e1052842ce4d44b9c775ade2b18fcb8ce7bcf | 1 + .../80514b85933ea9bdd3462595f949c5af24409b87 | 1 + .../8057c32b8bd28a5ec2105d62f2abe8cf69c9f5fc | 1 + .../806a3bd4e078d91adeacedfd3e47ef8ae229244a | 1 + .../8090444f98218e65ff9594789ff22bbea3c0497c | 1 + .../80e516692955d5f224706f268e247858858e16d8 | Bin 0 -> 56 bytes .../810a1372fa97380265f5529c5043ae96f007f5bb | Bin 0 -> 46 bytes .../8127597d3c146b2a89579e44daef9d03a0f941ec | 1 + .../82ed571f8922caa572d13b4cc9b5c5fabafaade9 | 1 + .../8328e86178800f87a3bf6f80749984f45b0cd0e8 | 1 + .../84441efd7d8bdb0ce2fac28f218d3d5d4d77f1d4 | Bin 0 -> 40 bytes .../84cbf70f45a64d5a01d1c96367b6d6160134f1ad | 1 + .../85eb0f4502a51e646dab4ae08eabd90613cdf8e1 | Bin 0 -> 40 bytes .../86080f33e4eae21b37863c253ce61eaa13021a97 | Bin 0 -> 49 bytes .../862e3ccf601ee0f7fbd8b23e6811fd50485a118f | 1 + .../86bae059b18af8ae263e5ae0022b67da0cfc0fbe | 1 + .../870f9cc4bd89c6c04c6a51ceae1efa8634627cd6 | 1 + .../8762a523cdb78d2344d553fa52a229bd63c44e51 | 1 + .../894211571f9153c3c2ea4102541dac69be8aaa9c | Bin 0 -> 15 bytes .../894e9b7832c52acb04bfa994ef53c7105d8db206 | 1 + .../8b0e12978b8e2eecf62346e438e47d0993845693 | 1 + .../8b3fa0bd4f289eff6a04a5205e04baaeafbdf637 | 1 + .../8d1deedd1e463f8c95129a6f839c380a7c83ab04 | 1 + .../8d1e029bd72381e382c87e61b4c5a9741d80d644 | Bin 0 -> 36 bytes .../8dd1983889b6632228d4897c365a1e6124d101e1 | Bin 0 -> 37 bytes .../8dfc2183691385432f92957cff0b2538e5a0ebfa | Bin 0 -> 50 bytes .../8eb9b86b4f0aa79b8ef84b44e1fb03094e7bb426 | Bin 0 -> 24 bytes .../8ec540c36da3814e93da765bf2ff0825b59c1bd0 | 1 + .../8f1bec32f4b8e64062f5405a096543e61d771076 | Bin 0 -> 48 bytes .../8f3e48c49d0794909f6e8e61e5a4312edf484c33 | Bin 0 -> 39 bytes .../8fbbf3c0eaa25b64d0a97a8ee08006539e649199 | 1 + .../907d0021d42d0fdc867fd02d3609cdce13c8a055 | 1 + .../919511c217a3427c22cad4a71aae31a6cd47b193 | Bin 0 -> 63 bytes .../9267c81c3283da8193c198de05e05fa30631a453 | 1 + .../92e80997a4237d76f10b70dae2870b7255c97435 | 1 + .../935322db76f5d4c74c2dc68fc4631915b8e24323 | 1 + .../939f2627ef6263d0176566de267ff3eb910e6a60 | 1 + .../94adea6a0d9a44bee6f5e88adcee57be9e9e3597 | Bin 0 -> 23 bytes .../94dcbe0d3352bd9b230096b8dce9c6d8d63f9d51 | 1 + .../95dad738f60e3e5eb0f1cdafd91ad461f4418e8f | Bin 0 -> 38 bytes .../960c0a21c9e5c1a61b93b34da3189b0de1c264df | Bin 0 -> 37 bytes .../96903512b1f1dec08206123f024b62d0e31cd4dc | 1 + .../96a89c005e8d9992e34cc149b0be096ad0051446 | Bin 0 -> 51 bytes .../97db8a66dd513eea47a5a25115508f4e59984854 | 1 + .../98f2cb84ad89550cf56ee54e11f1448ae7287247 | Bin 0 -> 29 bytes .../993497422a59b7f9f0f6db8c867339b5c9e4c978 | 1 + .../999821e3750a7f2c9db663d2d100b4404c225040 | 1 + .../99b2ed83be40cab431d1940e8de2dc3ebfe9352f | Bin 0 -> 47 bytes .../99e888b7372b29256dbefd476855ff73584cc00f | Bin 0 -> 47 bytes .../9b18087deb3cfafa1b964aa65d8ee980bc61404e | Bin 0 -> 23 bytes .../9b3c745ea3e313909a228a07b49aae110b02ae4a | 1 + .../9be1ce0ba77758928ff5e9c45139b1624cbe9c2d | 1 + .../9c703141efd69eb8f32a58133c8035fb585e0f4c | Bin 0 -> 50 bytes .../9c7f77981677499f0426a0ffb5cb79d5fe55dcb2 | 1 + .../9ca59e6cadaa5be9af30dfe5620d1bcd70f442e5 | 1 + .../9d139835d91474e8d8361d65698a31b8b38c4f7b | 1 + .../9e2179564a99e96e179c96f28802a0a2759b581c | 1 + .../9e56bb3b68d2e2617cb2d2f0f3941f7fc832e462 | 1 + .../9f318b2c2ff9cf4615bd06ba13bdd086b4ad08c6 | 1 + .../9f8d90b1480989fc46ea2f1c66cf687638994587 | Bin 0 -> 47 bytes .../a09db5715f0bc3879a0e18e4db5a6b5640b254a3 | 1 + .../a0c59a090818bca29d76ccf9843f7e2faf330ddf | 1 + .../a1cf10478e5e01a0d951c743a3dd45aa5fc409f2 | 1 + .../a22c0f03f8c005a4612a9dcbcd6a643334c35d2f | 1 + .../a3154b8ed26b3461f2b091c732da00b63ce8bed3 | 1 + .../a84a1ed1a24e753a27adfd3ba806f06fc44f899f | Bin 0 -> 39 bytes .../a871e7ce66afd4f57702cd1299de06cd08995561 | Bin 0 -> 31 bytes .../a8dc736ea964586b7dcbf2bc065ec4675d1daba3 | 1 + .../a91a835836c72217824f0b63491d9b623130502a | 1 + .../ab97c1f6033dc7d96f69b9e1461fd594c16f4ebf | Bin 0 -> 25 bytes .../ac8a8c23acd8c290a11dc7828f7f397957fa6400 | 1 + .../ac94b2788f5252f9e2e8502c7c75e04bef4c0b76 | 1 + .../ad03b4f58470c43db6593a35be48989486d754f9 | 1 + .../af417c83e831a96fda1bdde99a1af6509ef2df3d | 1 + .../affd292cd2ce3306b4651cc7ec0ec0524cbbae3d | 1 + .../b0587e6e319f4b56d877e7ed46bc7da9b1e7249c | 1 + .../b166aa66b5b3ad178bc38aee5768226c8adc082f | 1 + .../b1ade0571262c6e5f1d72f6d25ebb513d2055bc9 | 1 + .../b244c690157ff21d073940ef8c77d1898f37cf8e | 1 + .../b523091ee4f17d20f51f9b5cf82293465cf61780 | 1 + .../b7d4d49ac2c530eb8444a449feb689ee50fd210d | 1 + .../b855c161121bfa29c6fb22d3c0236fae4af6984e | 1 + .../bc4263a92952d56168b354f723eaa43a33cd0b35 | Bin 0 -> 15 bytes .../bcaa71abf23b2e5130e0cc464755fe769bf4aaa7 | 1 + .../bcf4684ce097faa7e9d99b6e93cc2de24f57aee3 | Bin 0 -> 7 bytes .../bdca6504d2ee7925f62e176355bb481344772075 | 1 + .../beb208fd8675ba7de2ecb12998d2d628d579ca7c | 1 + .../bf0c98689ab81fc32787023300caf9a4175583dc | Bin 0 -> 58 bytes .../bf479e97b39b697e715663de6a1e78dd58d64122 | 1 + .../bf826c96be94d1b42eea0666f7239cc5f699a375 | 1 + .../c17650d19ae4a48abb36739c83d8979453f5705f | 1 + .../c1e5307d88feda2c3b15fc221cba92bcf41622bf | 1 + .../c249f408c552a0408eab3fe1d1cbeca95cd537c1 | 1 + .../c26b460aebc9082c519539069f7e060042989696 | 1 + .../c2eae71daad0d3561ab4d09b8b85372b8d790bc1 | 1 + .../c37fda8d02e99132a1de99f959596c784ab8a53c | Bin 0 -> 48 bytes .../c4836760377a7091fb20f4afa9c712875792b9a7 | Bin 0 -> 46 bytes .../c48caad597176404f776d532d4baf9faf7655ee2 | Bin 0 -> 58 bytes .../c4eff0f59986fc5ab09d5bd95f394292f2882659 | 1 + .../c5fc2086d167c8c3a7d9ec778db69c5fa14a59fe | 1 + .../c600877ce547166eb1b9d83afbe128d98767f8a3 | 1 + .../c6a98fdaf6de78e59e1a149a43f3e42222d650b7 | 1 + .../c8d22f7fb4f37f2d8cc7953fa2d599d38d899aec | Bin 0 -> 36 bytes .../c90951c19b24bac84296e3ec32cdeafe99e99cfb | 1 + .../c95ff2a172626efb50e94aa6781feba609820076 | 1 + .../ca6c557afb9c571de62e9b65ca6469a6133760da | 1 + .../cb2d0fb23f66c968af2e80d59f71d4c1aed96fbd | 1 + .../cc60a642cc2037ad3c459a57381b8f65d8d7aa35 | 1 + .../ccd3b8aa26c52f6d9c607c26ebdf621142aff745 | Bin 0 -> 25 bytes .../ccdfd1354997eb117bd76b75440a7e4ff20bf564 | 1 + .../cd7a7b8f08c189e95ae3e2ea44b9015000e823f3 | 1 + .../ce05678d812a5f8ae8e115938410116ce9169456 | 1 + .../ce6b642b81373f05baa2a6fe6e9d5d1387046285 | Bin 0 -> 38 bytes .../cf84d06e4dddb997a79a41f9b6122bf620bbdb4b | 1 + .../cfbcc3e8cd65aa8b654688145ade34b8789468a6 | 1 + .../clusterfuzz-testcase-5298216461402112 | Bin 0 -> 172032 bytes ...erfuzz-testcase-minimized-4857057310146560 | 1 + ...h-5ac3e1ea7764cfb6383629574262f82dc7b3cada | Bin 0 -> 21 bytes .../d000502f32ca5620d7745f39ff6be3b547e26a6d | Bin 0 -> 27 bytes .../d131f83ee73450ff45565d0c638be7d8beeb30d9 | 1 + .../d1c7ae01a81a122c2fd7c5d8debcae7566e9ee2f | Bin 0 -> 29 bytes .../d2817b89d7aaa7fa880c077b1a67168ec2f4f0f7 | Bin 0 -> 35 bytes .../d3ccd7039dd34baef465c4b78baa7a30312a8f07 | 1 + .../d4cfaf3b59b22b654d7af80ee6715ce5015bfdc0 | Bin 0 -> 48 bytes .../d5670827c8e8d4c95ac0f738c0790c19916c0336 | 1 + .../d59d7e94863f1ed89cacfbaabf7bc59946036c8f | 1 + .../d6d8b478e6d13945f7a6f7d27f424ff57ca12f7f | Bin 0 -> 16 bytes .../d76d0c7f24ae3cc3f530d5306b8dcc15290c7ff2 | 1 + .../d8b15e9e555ad9900ba4be8cc9f87bef75725b24 | 1 + .../d9748abd540810c2449c3dd39a0ebb62754e520f | Bin 0 -> 50 bytes .../da9fc821f0c1e00728b139b36269bc3d21c0a8cc | 1 + .../dcd1bd94ad97b4e67fd7e12ff1bf7c039eb17f66 | 1 + .../dd3ba9b139e13324fc76cd62af84b00ca8b87205 | 1 + .../de0a9dce0ea4e4bfdcb13f788ae728bf979fed25 | 1 + .../deb6f9a930d9b31586ede19fd8fd3caae0e5b1f2 | 1 + .../dee95e0280b70681eddfb68e3b418126c5661e18 | Bin 0 -> 40 bytes .../df01203edfa2dfe9e108ddde786ae48235624fef | Bin 0 -> 27 bytes .../df0adbe2523508e9afb42a58d98c2657710d6033 | Bin 0 -> 48 bytes .../e05fcba1b22f658c8bd6f3c330b2b3c9faebf977 | 1 + .../e145caa75d73e3d819a9cb4b6217f1f53112f3f8 | 1 + .../e1d86c0094657386197d191855b5645ac1dd5936 | Bin 0 -> 48 bytes .../e25adf8de44f5978d00b7e8c52aee89c5cd1fe93 | 1 + .../e29f05162e3d96d5549f96aa4a54c868535b2847 | 1 + .../e3a970ac8636d29da3ded328b876ed3550cb3209 | 1 + .../e3cfdc862187b4ec28bd4fb2ced5094bb5b09909 | Bin 0 -> 26 bytes .../e4ce52007d001806fc9368b62c124dfc56e8471c | 1 + .../e52173f0bc3325629046e85e2dc41acc6ba7d1c3 | 1 + .../e6589006e3bda4c57247ad66fcd73ac00ee2cbe2 | 1 + .../e67c79d0ed89ab2d5e8d81127df22876e636ac44 | Bin 0 -> 38 bytes .../e6fab7572fb2a1c6e107b6f83cffd103a233d021 | Bin 0 -> 35 bytes .../e790f5d312957dbfd20abdefe4b1735779ff9689 | Bin 0 -> 36 bytes .../e8809017a4cf6c1e80a93f661166ead961f26bb4 | Bin 0 -> 47 bytes .../e9733e973c33b38c2087b7f1deb36688b3b14259 | 1 + .../ea8134769855d574f6673bf0301eb2e24632c6eb | 1 + .../eb489536e4e5589a93a17cd36669475b8f2a5e1b | 1 + .../eb48ebd4d01e5623dd16ae61938b3333fab3ce78 | 1 + .../eb6ca7624384239c7f7e0d83edb7cc334b7926d7 | Bin 0 -> 38 bytes .../ec9457ad41ed745ea9377ffdb16ad09f981daa7f | Bin 0 -> 48 bytes .../edff5256a2d60d0e51caef25dc1d6f1643dad6d5 | Bin 0 -> 38 bytes .../ee4d9c5d22512da42726f47213ff56404d1d81d1 | Bin 0 -> 22 bytes .../eef2f30b5e2ecd98ebefb12d57aba8b4ad52d904 | 1 + .../ef23911de1a27d03d2d4983ca1527e17d6a7092b | 1 + .../ef5b7fc62a2daecf1e8f928b1fa3ebd028413a41 | Bin 0 -> 64 bytes .../ef718258ca1870198e91a2fbc1eaa90b620673fb | 1 + .../efb46deb37a78f41dd760f6b7203b20956eb114e | 1 + .../efdd6824bd2456e3e408e0e84369c4fa3aa14f41 | 1 + .../efec040a5de1969df5e37e4bc50a0a8f0de341d8 | 1 + .../f1e30464c24dc1d7cec7ec1dd2adec8512232b43 | Bin 0 -> 35 bytes .../f27a617b936814476770a3b31a5afb80d0f3b423 | Bin 0 -> 27 bytes .../f3f0d99ac2962f8fddb25c65fb4c8c6eb63518a9 | 1 + .../f4628084cf46f139babb886a782b4ab5977d5d2e | 1 + .../f4753e8881e4b3c71f2728149be7d04cc648f6a6 | 1 + .../f4b48c4f3f310ed767755267210f212dd62bd715 | Bin 0 -> 47 bytes .../f4d6ff635ae4fda497221da4bfa3e593df59a44e | 1 + .../f52f4d51aaaed0f9c3a20936cf5efd25d0692f67 | 1 + .../f7cf30724ab740918eee6e4a6b6658ae3d7706e8 | 1 + .../f823828ffd2a60efee36f1de52cb0f024ac5b4bb | 1 + .../f8760761bd5ab7b47376bfbc5a44e16b2d5ca800 | 1 + .../fb15042c268625089ef6c8aa3d8a6f12d1d02c74 | 1 + .../fc3dd4292d6884a770199596f5e9cbc1e869e5fb | Bin 0 -> 48 bytes .../fcc06696e641a7743bfd2f3b7ecd88e7b727e00a | 1 + .../fd34ec90fe8f9218fd25c3eac151aec998cff6d8 | Bin 0 -> 36 bytes .../fdf548cde981fab4fb17bd63a124b75eddc5c836 | 1 + .../fe47fb18b064e26479c3c3140082bd01065e897a | 1 + .../ff2097734bd7bb8451aece13c9336c4624735170 | Bin 0 -> 52 bytes .../ff2c949863eb4e14d9e835c51591304403d91b6c | Bin 0 -> 5 bytes .../ff7d6ff060e63355701b2e655c802902338497de | 1 + .../chttp2/hpack_parser_fuzzer_test.cc | 54 + .../transport/chttp2/hpack_parser_test.cc | 222 + .../core/transport/chttp2/hpack_table_test.cc | 274 + .../transport/chttp2/settings_timeout_test.cc | 257 + test/core/transport/chttp2/stream_map_test.cc | 190 + test/core/transport/chttp2/varint_test.cc | 57 + .../core/transport/connectivity_state_test.cc | 195 + test/core/transport/metadata_test.cc | 414 + test/core/transport/pid_controller_test.cc | 91 + test/core/transport/static_metadata_test.cc | 51 + test/core/transport/status_conversion_test.cc | 183 + test/core/transport/status_metadata_test.cc | 64 + .../core/transport/stream_owned_slice_test.cc | 43 + test/core/transport/timeout_encoding_test.cc | 167 + test/core/tsi/BUILD | 100 + test/core/tsi/alts/crypt/BUILD | 45 + test/core/tsi/alts/crypt/aes_gcm_test.cc | 2107 + test/core/tsi/alts/crypt/gsec_test_util.cc | 89 + test/core/tsi/alts/crypt/gsec_test_util.h | 89 + test/core/tsi/alts/fake_handshaker/BUILD | 62 + .../fake_handshaker/fake_handshaker_server.cc | 289 + .../fake_handshaker/fake_handshaker_server.h | 39 + .../fake_handshaker_server_main.cc | 56 + .../tsi/alts/fake_handshaker/handshaker.proto | 224 + .../transport_security_common.proto | 40 + test/core/tsi/alts/frame_protector/BUILD | 75 + .../alts/frame_protector/alts_counter_test.cc | 180 + .../alts/frame_protector/alts_crypter_test.cc | 492 + .../alts_frame_protector_test.cc | 394 + .../frame_protector/frame_handler_test.cc | 244 + test/core/tsi/alts/handshaker/BUILD | 98 + .../alts_concurrent_connectivity_test.cc | 601 + .../handshaker/alts_handshaker_client_test.cc | 517 + .../alts_handshaker_service_api_test_lib.cc | 163 + .../alts_handshaker_service_api_test_lib.h | 55 + .../handshaker/alts_tsi_handshaker_test.cc | 1023 + .../alts/handshaker/alts_tsi_utils_test.cc | 78 + .../transport_security_common_api_test.cc | 166 + .../tsi/alts/zero_copy_frame_protector/BUILD | 60 + .../alts_grpc_record_protocol_test.cc | 461 + .../alts_iovec_record_protocol_test.cc | 928 + .../alts_zero_copy_grpc_protector_test.cc | 312 + test/core/tsi/fake_transport_security_test.cc | 156 + test/core/tsi/ssl_session_cache_test.cc | 153 + test/core/tsi/ssl_transport_security_test.cc | 976 + test/core/tsi/transport_security_test.cc | 391 + test/core/tsi/transport_security_test_lib.cc | 669 + test/core/tsi/transport_security_test_lib.h | 231 + test/core/util/BUILD | 170 + test/core/util/cmdline.cc | 319 + test/core/util/cmdline.h | 82 + test/core/util/cmdline_test.cc | 488 + test/core/util/debugger_macros.cc | 57 + test/core/util/debugger_macros.h | 27 + test/core/util/fuzzer_corpus_test.cc | 169 + test/core/util/fuzzer_one_entry_runner.sh | 18 + test/core/util/fuzzer_util.cc | 82 + test/core/util/fuzzer_util.h | 49 + test/core/util/grpc_fuzzer.bzl | 29 + test/core/util/grpc_profiler.cc | 45 + test/core/util/grpc_profiler.h | 25 + test/core/util/histogram.cc | 230 + test/core/util/histogram.h | 62 + test/core/util/histogram_test.cc | 163 + test/core/util/lsan_suppressions.txt | 6 + test/core/util/memory_counters.cc | 169 + test/core/util/memory_counters.h | 53 + test/core/util/mock_endpoint.cc | 148 + test/core/util/mock_endpoint.h | 29 + test/core/util/one_corpus_entry_fuzzer.cc | 48 + test/core/util/parse_hexstring.cc | 56 + test/core/util/parse_hexstring.h | 26 + test/core/util/passthru_endpoint.cc | 229 + test/core/util/passthru_endpoint.h | 43 + test/core/util/port.cc | 132 + test/core/util/port.h | 44 + .../util/port_isolated_runtime_environment.cc | 69 + test/core/util/port_server_client.cc | 255 + test/core/util/port_server_client.h | 30 + test/core/util/reconnect_server.cc | 129 + test/core/util/reconnect_server.h | 45 + test/core/util/run_with_poller.sh | 19 + test/core/util/slice_splitter.cc | 126 + test/core/util/slice_splitter.h | 53 + test/core/util/subprocess.h | 36 + test/core/util/subprocess_posix.cc | 100 + test/core/util/subprocess_windows.cc | 126 + test/core/util/test_config.cc | 419 + test/core/util/test_config.h | 57 + test/core/util/test_lb_policies.cc | 255 + test/core/util/test_lb_policies.h | 37 + test/core/util/test_tcp_server.cc | 115 + test/core/util/test_tcp_server.h | 41 + test/core/util/tracer_util.cc | 31 + test/core/util/tracer_util.h | 32 + test/core/util/trickle_endpoint.cc | 209 + test/core/util/trickle_endpoint.h | 32 + test/core/util/tsan_suppressions.txt | 13 + test/core/util/ubsan_suppressions.txt | 27 + test/cpp/README-iOS.md | 52 + test/cpp/client/BUILD | 76 + test/cpp/client/client_channel_stress_test.cc | 352 + test/cpp/client/credentials_test.cc | 758 + ...channel_with_active_connect_stress_test.cc | 127 + .../GRPCCppTests.xcodeproj/project.pbxproj | 531 + test/cpp/cocoapods/Podfile | 71 + test/cpp/cocoapods/generic/Info.plist | 22 + test/cpp/cocoapods/generic/generic.mm | 245 + test/cpp/cocoapods/test/Info.plist | 22 + .../test/server_context_test_spouse_test.mm | 98 + test/cpp/codegen/BUILD | 100 + test/cpp/codegen/codegen_test_full.cc | 42 + test/cpp/codegen/codegen_test_minimal.cc | 34 + test/cpp/codegen/compiler_test_golden | 1176 + test/cpp/codegen/compiler_test_mock_golden | 39 + test/cpp/codegen/golden_file_test.cc | 79 + test/cpp/codegen/proto_utils_test.cc | 192 + test/cpp/codegen/run_golden_file_test.sh | 19 + test/cpp/common/BUILD | 126 + test/cpp/common/alarm_test.cc | 377 + test/cpp/common/alts_util_test.cc | 203 + .../cpp/common/auth_property_iterator_test.cc | 88 + test/cpp/common/channel_arguments_test.cc | 263 + test/cpp/common/channel_filter_test.cc | 65 + test/cpp/common/secure_auth_context_test.cc | 97 + test/cpp/common/time_jump_test.cc | 143 + test/cpp/common/timer_test.cc | 230 + test/cpp/end2end/BUILD | 796 + test/cpp/end2end/async_end2end_test.cc | 1901 + test/cpp/end2end/cfstream_test.cc | 496 + test/cpp/end2end/channelz_service_test.cc | 767 + .../end2end/client_callback_end2end_test.cc | 1474 + test/cpp/end2end/client_crash_test.cc | 147 + test/cpp/end2end/client_crash_test_server.cc | 80 + .../client_interceptors_end2end_test.cc | 1194 + test/cpp/end2end/client_lb_end2end_test.cc | 1811 + test/cpp/end2end/delegating_channel_test.cc | 100 + test/cpp/end2end/end2end_test.cc | 2353 + test/cpp/end2end/exception_test.cc | 123 + test/cpp/end2end/filter_end2end_test.cc | 343 + test/cpp/end2end/flaky_network_test.cc | 555 + test/cpp/end2end/generic_end2end_test.cc | 429 + test/cpp/end2end/grpclb_end2end_test.cc | 1997 + .../end2end/health_service_end2end_test.cc | 374 + test/cpp/end2end/hybrid_end2end_test.cc | 987 + test/cpp/end2end/interceptors_util.cc | 212 + test/cpp/end2end/interceptors_util.h | 317 + .../end2end/message_allocator_end2end_test.cc | 425 + test/cpp/end2end/mock_test.cc | 434 + test/cpp/end2end/nonblocking_test.cc | 214 + test/cpp/end2end/port_sharing_end2end_test.cc | 375 + .../end2end/proto_server_reflection_test.cc | 150 + test/cpp/end2end/raw_end2end_test.cc | 370 + .../cpp/end2end/server_builder_plugin_test.cc | 270 + test/cpp/end2end/server_crash_test.cc | 160 + test/cpp/end2end/server_crash_test_client.cc | 72 + test/cpp/end2end/server_early_return_test.cc | 232 + .../server_interceptors_end2end_test.cc | 706 + .../server_load_reporting_end2end_test.cc | 191 + .../end2end/service_config_end2end_test.cc | 623 + test/cpp/end2end/shutdown_test.cc | 170 + test/cpp/end2end/streaming_throughput_test.cc | 193 + .../end2end/test_health_check_service_impl.cc | 98 + .../end2end/test_health_check_service_impl.h | 58 + test/cpp/end2end/test_service_impl.cc | 624 + test/cpp/end2end/test_service_impl.h | 484 + test/cpp/end2end/thread_stress_test.cc | 442 + test/cpp/end2end/time_change_test.cc | 367 + test/cpp/end2end/xds_end2end_test.cc | 4749 + test/cpp/ext/filters/census/BUILD | 43 + .../census/stats_plugin_end2end_test.cc | 426 + test/cpp/grpclb/BUILD | 38 + test/cpp/grpclb/grpclb_api_test.cc | 139 + test/cpp/interop/BUILD | 246 + test/cpp/interop/client.cc | 297 + test/cpp/interop/client_helper.cc | 133 + test/cpp/interop/client_helper.h | 109 + test/cpp/interop/grpclb_fallback_test.cc | 284 + test/cpp/interop/http2_client.cc | 230 + test/cpp/interop/http2_client.h | 68 + test/cpp/interop/interop_client.cc | 1257 + test/cpp/interop/interop_client.h | 150 + test/cpp/interop/interop_server.cc | 375 + test/cpp/interop/interop_server_bootstrap.cc | 40 + test/cpp/interop/interop_test.cc | 126 + test/cpp/interop/metrics_client.cc | 105 + test/cpp/interop/reconnect_interop_client.cc | 103 + test/cpp/interop/reconnect_interop_server.cc | 190 + test/cpp/interop/server_helper.cc | 81 + test/cpp/interop/server_helper.h | 103 + test/cpp/interop/stress_interop_client.cc | 199 + test/cpp/interop/stress_interop_client.h | 118 + test/cpp/interop/stress_test.cc | 329 + test/cpp/interop/xds_interop_client.cc | 277 + test/cpp/interop/xds_interop_server.cc | 100 + .../ios/CronetTests/CppCronetEnd2EndTests.mm | 595 + test/cpp/ios/CronetTests/TestHelper.h | 81 + test/cpp/ios/CronetTests/TestHelper.mm | 198 + test/cpp/ios/Info.plist | 24 + test/cpp/ios/Podfile | 102 + .../RemoteTestClientCpp/RemoteTestCpp.podspec | 45 + test/cpp/ios/Tests.xcodeproj/project.pbxproj | 594 + .../xcschemes/CronetTests.xcscheme | 95 + test/cpp/ios/build_and_run_tests.sh | 40 + test/cpp/ios/build_tests.sh | 40 + test/cpp/ios/verbose_time.sh | 20 + test/cpp/microbenchmarks/BUILD | 389 + test/cpp/microbenchmarks/bm_alarm.cc | 63 + test/cpp/microbenchmarks/bm_arena.cc | 73 + test/cpp/microbenchmarks/bm_byte_buffer.cc | 130 + test/cpp/microbenchmarks/bm_call_create.cc | 832 + .../bm_callback_streaming_ping_pong.cc | 136 + .../bm_callback_unary_ping_pong.cc | 118 + test/cpp/microbenchmarks/bm_channel.cc | 89 + test/cpp/microbenchmarks/bm_chttp2_hpack.cc | 945 + .../microbenchmarks/bm_chttp2_transport.cc | 692 + test/cpp/microbenchmarks/bm_closure.cc | 401 + test/cpp/microbenchmarks/bm_cq.cc | 259 + .../microbenchmarks/bm_cq_multiple_threads.cc | 222 + test/cpp/microbenchmarks/bm_error.cc | 324 + .../bm_fullstack_streaming_ping_pong.cc | 127 + .../bm_fullstack_streaming_pump.cc | 71 + .../microbenchmarks/bm_fullstack_trickle.cc | 471 + .../bm_fullstack_unary_ping_pong.cc | 179 + test/cpp/microbenchmarks/bm_metadata.cc | 303 + .../microbenchmarks/bm_opencensus_plugin.cc | 129 + test/cpp/microbenchmarks/bm_pollset.cc | 266 + test/cpp/microbenchmarks/bm_threadpool.cc | 328 + test/cpp/microbenchmarks/bm_timer.cc | 117 + .../callback_streaming_ping_pong.h | 150 + .../microbenchmarks/callback_test_service.cc | 112 + .../microbenchmarks/callback_test_service.h | 49 + .../callback_unary_ping_pong.h | 101 + .../fullstack_context_mutators.h | 143 + test/cpp/microbenchmarks/fullstack_fixtures.h | 331 + .../fullstack_streaming_ping_pong.h | 404 + .../fullstack_streaming_pump.h | 169 + .../fullstack_unary_ping_pong.h | 115 + test/cpp/microbenchmarks/helpers.cc | 111 + test/cpp/microbenchmarks/helpers.h | 76 + test/cpp/microbenchmarks/noop-benchmark.cc | 30 + ...esentative_server_initial_metadata.headers | 4 + ...sentative_server_trailing_metadata.headers | 3 + test/cpp/naming/BUILD | 64 + test/cpp/naming/address_sorting_test.cc | 843 + test/cpp/naming/cancel_ares_query_test.cc | 402 + test/cpp/naming/dns_test_util.cc | 97 + test/cpp/naming/dns_test_util.h | 38 + test/cpp/naming/gen_build_yaml.py | 82 + .../generate_resolver_component_tests.bzl | 86 + .../manual_run_resolver_component_test.py | 42 + test/cpp/naming/resolver_component_test.cc | 687 + .../naming/resolver_component_tests_runner.py | 618 + ...resolver_component_tests_runner_invoker.cc | 201 + .../naming/resolver_test_record_groups.yaml | 502 + test/cpp/naming/utils/BUILD | 50 + test/cpp/naming/utils/dns_resolver.py | 65 + test/cpp/naming/utils/dns_server.py | 183 + .../run_dns_server_for_lb_interop_tests.py | 118 + test/cpp/naming/utils/tcp_connect.py | 48 + test/cpp/performance/BUILD | 35 + test/cpp/performance/writes_per_rpc_test.cc | 248 + test/cpp/qps/BUILD | 213 + test/cpp/qps/benchmark_config.cc | 93 + test/cpp/qps/benchmark_config.h | 39 + test/cpp/qps/client.h | 574 + test/cpp/qps/client_async.cc | 961 + test/cpp/qps/client_callback.cc | 387 + test/cpp/qps/client_sync.cc | 428 + test/cpp/qps/driver.cc | 627 + test/cpp/qps/driver.h | 45 + test/cpp/qps/gen_build_yaml.py | 197 + test/cpp/qps/histogram.h | 81 + .../qps/inproc_sync_unary_ping_pong_test.cc | 66 + test/cpp/qps/interarrival.h | 107 + test/cpp/qps/json_run_localhost.cc | 134 + .../qps/json_run_localhost_scenario_gen.py | 42 + test/cpp/qps/json_run_localhost_scenarios.bzl | 3 + test/cpp/qps/parse_json.cc | 65 + test/cpp/qps/parse_json.h | 37 + test/cpp/qps/qps_benchmark_script.bzl | 82 + test/cpp/qps/qps_interarrival_test.cc | 59 + test/cpp/qps/qps_json_driver.cc | 298 + test/cpp/qps/qps_json_driver_scenario_gen.py | 42 + test/cpp/qps/qps_json_driver_scenarios.bzl | 3 + test/cpp/qps/qps_openloop_test.cc | 70 + test/cpp/qps/qps_server_builder.cc | 45 + test/cpp/qps/qps_server_builder.h | 46 + test/cpp/qps/qps_worker.cc | 312 + test/cpp/qps/qps_worker.h | 62 + test/cpp/qps/report.cc | 239 + test/cpp/qps/report.h | 150 + .../qps/secure_sync_unary_ping_pong_test.cc | 73 + test/cpp/qps/server.h | 161 + test/cpp/qps/server_async.cc | 588 + test/cpp/qps/server_callback.cc | 133 + test/cpp/qps/server_sync.cc | 191 + test/cpp/qps/stats.h | 46 + test/cpp/qps/usage_timer.cc | 99 + test/cpp/qps/usage_timer.h | 44 + test/cpp/qps/worker.cc | 67 + test/cpp/server/BUILD | 61 + test/cpp/server/load_reporter/BUILD | 62 + .../load_reporter/get_cpu_stats_test.cc | 61 + .../load_reporter/load_data_store_test.cc | 481 + .../load_reporter/load_reporter_test.cc | 507 + test/cpp/server/server_builder_test.cc | 93 + ...server_builder_with_socket_mutator_test.cc | 121 + test/cpp/server/server_request_call_test.cc | 165 + test/cpp/test/BUILD | 38 + .../test/server_context_test_spouse_test.cc | 96 + test/cpp/thread_manager/BUILD | 39 + .../cpp/thread_manager/thread_manager_test.cc | 193 + test/cpp/util/BUILD | 312 + test/cpp/util/byte_buffer_proto_helper.cc | 57 + test/cpp/util/byte_buffer_proto_helper.h | 42 + test/cpp/util/byte_buffer_test.cc | 131 + test/cpp/util/channel_trace_proto_helper.cc | 115 + test/cpp/util/channel_trace_proto_helper.h | 37 + test/cpp/util/cli_call.cc | 213 + test/cpp/util/cli_call.h | 101 + test/cpp/util/cli_call_test.cc | 128 + test/cpp/util/cli_credentials.cc | 245 + test/cpp/util/cli_credentials.h | 55 + test/cpp/util/config_grpc_cli.h | 70 + test/cpp/util/create_test_channel.cc | 253 + test/cpp/util/create_test_channel.h | 103 + test/cpp/util/error_details_test.cc | 123 + test/cpp/util/grpc_cli.cc | 89 + test/cpp/util/grpc_tool.cc | 959 + test/cpp/util/grpc_tool.h | 39 + test/cpp/util/grpc_tool_test.cc | 1226 + test/cpp/util/metrics_server.cc | 117 + test/cpp/util/metrics_server.h | 98 + test/cpp/util/proto_file_parser.cc | 325 + test/cpp/util/proto_file_parser.h | 129 + .../proto_reflection_descriptor_database.cc | 333 + .../proto_reflection_descriptor_database.h | 111 + test/cpp/util/service_describer.cc | 93 + test/cpp/util/service_describer.h | 42 + test/cpp/util/slice_test.cc | 141 + test/cpp/util/string_ref_helper.cc | 29 + test/cpp/util/string_ref_helper.h | 32 + test/cpp/util/string_ref_test.cc | 202 + test/cpp/util/subprocess.cc | 44 + test/cpp/util/subprocess.h | 47 + test/cpp/util/test_config.h | 30 + test/cpp/util/test_config_cc.cc | 37 + test/cpp/util/test_credentials_provider.cc | 181 + test/cpp/util/test_credentials_provider.h | 85 + test/cpp/util/time_test.cc | 69 + test/distrib/cpp/run_distrib_test_cmake.bat | 94 + test/distrib/cpp/run_distrib_test_cmake.sh | 80 + ..._distrib_test_cmake_as_externalproject.bat | 41 + ...n_distrib_test_cmake_as_externalproject.sh | 37 + .../run_distrib_test_cmake_as_submodule.sh | 25 + .../run_distrib_test_cmake_fetchcontent.sh | 45 + .../run_distrib_test_cmake_module_install.sh | 46 + ...rib_test_cmake_module_install_pkgconfig.sh | 45 + .../cpp/run_distrib_test_cmake_pkgconfig.sh | 77 + .../cpp/run_distrib_test_raspberry_pi.sh | 90 + .../cpp/run_distrib_test_routeguide.sh | 37 + test/distrib/csharp/.gitignore | 6 + test/distrib/csharp/DistribTest.sln | 28 + test/distrib/csharp/DistribTest/.gitignore | 3 + .../csharp/DistribTest/DistribTest.csproj | 135 + .../DistribTest/DistribTestDotNet.csproj | 30 + test/distrib/csharp/DistribTest/Program.cs | 66 + .../DistribTest/Properties/AssemblyInfo.cs | 54 + .../csharp/DistribTest/packages.config | 16 + .../csharp/DistribTest/testcodegen.proto | 29 + test/distrib/csharp/NuGet.Config | 8 + test/distrib/csharp/build_vs2015.bat | 24 + test/distrib/csharp/run_distrib_test.bat | 44 + test/distrib/csharp/run_distrib_test.sh | 29 + .../csharp/run_distrib_test_dotnetcli.sh | 49 + test/distrib/csharp/update_version.sh | 31 + test/distrib/php/distribtest.php | 30 + test/distrib/php/run_distrib_test.sh | 25 + test/distrib/php/run_distrib_test_macos.sh | 25 + test/distrib/python/distribtest.py | 21 + .../distrib/python/run_binary_distrib_test.sh | 18 + .../distrib/python/run_source_distrib_test.sh | 18 + test/distrib/python/test_packages.sh | 88 + test/distrib/ruby/Gemfile | 11 + test/distrib/ruby/distribtest.gemspec | 21 + test/distrib/ruby/distribtest.rb | 24 + test/distrib/ruby/run_distrib_test.sh | 58 + test/http2_test/http2_base_server.py | 229 + test/http2_test/http2_server_health_check.py | 34 + test/http2_test/http2_test_server.py | 124 + test/http2_test/messages_pb2.py | 661 + test/http2_test/test_data_frame_padding.py | 93 + test/http2_test/test_goaway.py | 68 + test/http2_test/test_max_streams.py | 52 + test/http2_test/test_ping.py | 57 + test/http2_test/test_rst_after_data.py | 45 + test/http2_test/test_rst_after_header.py | 36 + test/http2_test/test_rst_during_data.py | 47 + third_party/BUILD | 14 + third_party/README.md | 60 + third_party/address_sorting/BUILD | 60 + third_party/address_sorting/LICENSE | 26 + .../address_sorting/address_sorting.bzl | 38 + third_party/address_sorting/address_sorting.c | 375 + .../address_sorting_internal.h | 70 + .../address_sorting/address_sorting_posix.c | 97 + .../address_sorting/address_sorting_windows.c | 95 + .../include/address_sorting/address_sorting.h | 113 + third_party/cares/BUILD | 10 + third_party/cares/ares_build.h | 223 + third_party/cares/cares.BUILD | 215 + .../cares/config_android/ares_config.h | 461 + third_party/cares/config_darwin/ares_config.h | 428 + .../cares/config_freebsd/ares_config.h | 505 + third_party/cares/config_linux/ares_config.h | 461 + .../cares/config_openbsd/ares_config.h | 505 + .../cares/config_windows/ares_config.h | 426 + third_party/constantly.BUILD | 7 + third_party/cython.BUILD | 29 + third_party/enum34.BUILD | 6 + third_party/futures.BUILD | 6 + third_party/incremental.BUILD | 10 + third_party/libuv.BUILD | 199 + third_party/objective_c/Cronet/BUILD | 27 + .../Cronet/bidirectional_stream_c.h | 246 + .../objective_c/google_toolbox_for_mac/BUILD | 29 + .../UnitTesting/GTMGoogleTestRunner.mm | 226 + third_party/py/BUILD | 0 third_party/py/BUILD.tpl | 37 + third_party/py/python_configure.bzl | 380 + third_party/py/variety.tpl | 26 + third_party/six.BUILD | 14 + third_party/toolchains/BUILD | 43 + third_party/toolchains/README.md | 5 + .../toolchains/bazel_0.26.0_rbe_windows/BUILD | 187 + .../cc_toolchain_config.bzl | 1718 + third_party/toolchains/rbe_win2019/Dockerfile | 94 + third_party/twisted.BUILD | 15 + third_party/upb/.bazelci/presubmit.yml | 10 + third_party/upb/.gitignore | 4 + third_party/upb/.gitmodules | 3 + third_party/upb/CMakeLists.txt | 156 + third_party/upb/CONTRIBUTING.md | 7 + third_party/upb/DESIGN.md | 72 + third_party/upb/LICENSE | 26 + third_party/upb/README.md | 134 + third_party/upb/WORKSPACE | 39 + third_party/upb/bazel/BUILD | 0 third_party/upb/bazel/build_defs.bzl | 221 + third_party/upb/bazel/lua.BUILD | 102 + third_party/upb/bazel/ragel.BUILD | 193 + third_party/upb/bazel/repository_defs.bzl | 15 + third_party/upb/bazel/upb_proto_library.bzl | 307 + third_party/upb/bazel/workspace_deps.bzl | 35 + third_party/upb/examples/bazel/BUILD | 18 + third_party/upb/examples/bazel/WORKSPACE | 13 + third_party/upb/examples/bazel/foo.proto | 7 + third_party/upb/examples/bazel/test_binary.c | 17 + .../google/protobuf/descriptor.upb.c | 485 + .../google/protobuf/descriptor.upb.h | 1690 + .../upb/generated_for_cmake/upb/json/parser.c | 3440 + third_party/upb/kokoro/ubuntu/build.sh | 16 + third_party/upb/kokoro/ubuntu/continuous.cfg | 2 + third_party/upb/kokoro/ubuntu/presubmit.cfg | 2 + third_party/upb/tests/benchmark.cc | 36 + .../tests/bindings/googlepb/test_vs_proto2.cc | 165 + .../upb/tests/bindings/lua/test_upb.lua | 750 + .../upb/tests/bindings/lua/test_upb.pb.lua | 80 + third_party/upb/tests/bindings/ruby/upb.rb | 62 + third_party/upb/tests/conformance_upb.c | 179 + .../upb/tests/conformance_upb_failures.txt | 1 + third_party/upb/tests/corpus/README | 1 + third_party/upb/tests/corpus/temp.cc | 1 + .../tests/file_descriptor_parsenew_fuzzer.cc | 15 + third_party/upb/tests/google_message1.dat | Bin 0 -> 228 bytes third_party/upb/tests/google_message2.dat | Bin 0 -> 84570 bytes third_party/upb/tests/google_messages.proto | 149 + .../tests/json/enum_from_separate_file.proto | 9 + third_party/upb/tests/json/test.proto | 47 + third_party/upb/tests/json/test.proto.pb | Bin 0 -> 1958 bytes third_party/upb/tests/json/test_json.cc | 256 + third_party/upb/tests/pb/test_decoder.cc | 1203 + third_party/upb/tests/pb/test_decoder.proto | 128 + third_party/upb/tests/pb/test_encoder.cc | 48 + third_party/upb/tests/pb/test_varint.c | 117 + third_party/upb/tests/test.proto | 68 + third_party/upb/tests/test.proto.pb | Bin 0 -> 652 bytes third_party/upb/tests/test_cpp.cc | 957 + third_party/upb/tests/test_cpp.proto | 12 + third_party/upb/tests/test_table.cc | 679 + third_party/upb/tests/test_util.h | 230 + third_party/upb/tests/testmain.cc | 16 + third_party/upb/tests/upb_test.h | 53 + third_party/upb/third_party/lunit/LICENSE | 32 + .../upb/third_party/lunit/README.google | 9 + third_party/upb/third_party/lunit/console.lua | 156 + third_party/upb/third_party/lunit/lunit.lua | 725 + third_party/upb/tools/amalgamate.py | 81 + third_party/upb/tools/make_cmakelists.py | 279 + third_party/upb/tools/staleness_test.py | 30 + third_party/upb/tools/staleness_test_lib.py | 158 + third_party/upb/upb/bindings/README | 5 + third_party/upb/upb/bindings/lua/def.c | 766 + third_party/upb/upb/bindings/lua/msg.c | 1060 + third_party/upb/upb/bindings/lua/upb.c | 245 + third_party/upb/upb/bindings/lua/upb.h | 127 + third_party/upb/upb/bindings/lua/upb.lua | 172 + third_party/upb/upb/bindings/lua/upb/pb.c | 56 + third_party/upb/upb/bindings/lua/upb/pb.lua | 3 + third_party/upb/upb/bindings/stdc++/string.h | 69 + third_party/upb/upb/decode.c | 609 + third_party/upb/upb/decode.h | 21 + third_party/upb/upb/def.c | 1756 + third_party/upb/upb/def.h | 909 + third_party/upb/upb/encode.c | 378 + third_party/upb/upb/encode.h | 21 + third_party/upb/upb/generated_util.h | 105 + third_party/upb/upb/handlers-inl.h | 923 + third_party/upb/upb/handlers.c | 567 + third_party/upb/upb/handlers.h | 732 + third_party/upb/upb/json/parser.h | 140 + third_party/upb/upb/json/parser.rl | 3003 + third_party/upb/upb/json/printer.c | 1406 + third_party/upb/upb/json/printer.h | 72 + third_party/upb/upb/legacy_msg_reflection.c | 399 + third_party/upb/upb/legacy_msg_reflection.h | 191 + third_party/upb/upb/msg.c | 111 + third_party/upb/upb/msg.h | 69 + third_party/upb/upb/msgfactory.c | 248 + third_party/upb/upb/msgfactory.h | 48 + third_party/upb/upb/pb/compile_decoder.c | 919 + third_party/upb/upb/pb/decoder.c | 1051 + third_party/upb/upb/pb/decoder.h | 240 + third_party/upb/upb/pb/decoder.int.h | 288 + third_party/upb/upb/pb/encoder.c | 570 + third_party/upb/upb/pb/encoder.h | 83 + third_party/upb/upb/pb/make-gdb-script.rb | 36 + third_party/upb/upb/pb/textprinter.c | 340 + third_party/upb/upb/pb/textprinter.h | 69 + third_party/upb/upb/pb/varint.c | 74 + third_party/upb/upb/pb/varint.int.h | 164 + third_party/upb/upb/port.c | 26 + third_party/upb/upb/port_def.inc | 150 + third_party/upb/upb/port_undef.inc | 21 + third_party/upb/upb/sink.c | 17 + third_party/upb/upb/sink.h | 517 + third_party/upb/upb/table.c | 913 + third_party/upb/upb/table.int.h | 507 + third_party/upb/upb/upb.c | 261 + third_party/upb/upb/upb.h | 364 + third_party/upb/upbc/generator.cc | 826 + third_party/upb/upbc/generator.h | 12 + third_party/upb/upbc/main.cc | 9 + third_party/upb/upbc/message_layout.cc | 179 + third_party/upb/upbc/message_layout.h | 107 + third_party/yaml.BUILD | 10 + third_party/zlib.BUILD | 36 + third_party/zope_interface.BUILD | 13 + tools/README.md | 23 + tools/api_reference/add_google_analytics.sh | 40 + tools/bazel | 75 + tools/bazel.rc | 90 + tools/buildgen/build_cleaner.py | 95 + tools/buildgen/bunch.py | 53 + .../extract_metadata_from_bazel_xml.py | 968 + tools/buildgen/generate_build_additions.sh | 37 + tools/buildgen/generate_projects.py | 102 + tools/buildgen/generate_projects.sh | 40 + tools/buildgen/mako_renderer.py | 190 + tools/buildgen/plugins/check_attrs.py | 128 + tools/buildgen/plugins/expand_bin_attrs.py | 46 + tools/buildgen/plugins/expand_filegroups.py | 158 + tools/buildgen/plugins/expand_version.py | 129 + tools/buildgen/plugins/generate_vsprojects.py | 85 + tools/buildgen/plugins/list_api.py | 67 + tools/buildgen/plugins/list_protos.py | 53 + tools/buildgen/plugins/make_fuzzer_tests.py | 55 + .../plugins/transitive_dependencies.py | 63 + .../plugins/verify_duplicate_sources.py | 42 + tools/codegen/core/gen_header_frame.py | 145 + tools/codegen/core/gen_hpack_tables.cc | 353 + .../core/gen_legal_metadata_characters.cc | 66 + .../core/gen_percent_encoding_tables.cc | 69 + ..._registered_method_bad_client_test_body.py | 55 + tools/codegen/core/gen_settings_ids.py | 192 + tools/codegen/core/gen_static_metadata.py | 741 + tools/codegen/core/gen_stats_data.py | 468 + tools/codegen/core/gen_upb_api.sh | 127 + tools/debug/core/chttp2_ref_leak.py | 44 + tools/debug/core/error_ref_leak.py | 47 + tools/distrib/bazel_style.cfg | 4 + tools/distrib/build_ruby_environment_macos.sh | 71 + tools/distrib/buildifier_format_code.sh | 70 + .../distrib/buildifier_format_code_strict.sh | 20 + tools/distrib/c-ish/check_documentation.py | 67 + .../distrib/check_boringssl_prefix_symbol.sh | 27 + tools/distrib/check_copyright.py | 173 + tools/distrib/check_include_guards.py | 198 + tools/distrib/check_protobuf_pod_version.sh | 46 + tools/distrib/check_pytype.sh | 19 + tools/distrib/check_trailing_newlines.sh | 52 + tools/distrib/check_upb_output.sh | 23 + tools/distrib/check_windows_dlls.sh | 22 + tools/distrib/clang_format_code.sh | 33 + tools/distrib/clang_tidy_code.sh | 35 + tools/distrib/format_bazel.sh | 39 + .../generate_boringssl_prefix_header.sh | 60 + tools/distrib/guard_headers.sh | 75 + tools/distrib/pull_requests_interval.sh | 80 + tools/distrib/pylint_code.sh | 62 + tools/distrib/python/.gitignore | 1 + tools/distrib/python/bazel_deps.sh | 21 + tools/distrib/python/check_grpcio_tools.py | 33 + tools/distrib/python/docgen.py | 136 + tools/distrib/python/grpc_prefixed/.gitignore | 2 + .../distrib/python/grpc_prefixed/generate.py | 140 + .../templates/MANIFEST.in.template | 4 + .../templates/README.rst.template | 2 + .../grpc_prefixed/templates/setup.py.template | 45 + tools/distrib/python/grpcio_tools/.gitignore | 8 + tools/distrib/python/grpcio_tools/MANIFEST.in | 8 + tools/distrib/python/grpcio_tools/README.rst | 186 + .../grpcio_tools/_parallel_compile_patch.py | 63 + .../grpcio_tools/grpc_tools/__init__.py | 13 + .../grpc_tools/_protoc_compiler.pyx | 24 + .../python/grpcio_tools/grpc_tools/command.py | 70 + .../python/grpcio_tools/grpc_tools/main.cc | 38 + .../python/grpcio_tools/grpc_tools/main.h | 18 + .../python/grpcio_tools/grpc_tools/protoc.py | 36 + .../python/grpcio_tools/grpc_version.py | 17 + .../python/grpcio_tools/protoc_lib_deps.py | 23 + tools/distrib/python/grpcio_tools/setup.py | 226 + tools/distrib/python/make_grpcio_tools.py | 177 + tools/distrib/python/submit.py | 93 + tools/distrib/python_wrapper.sh | 32 + tools/distrib/run_clang_tidy.py | 66 + tools/distrib/sanitize.sh | 24 + tools/distrib/yapf_code.sh | 40 + tools/dockerfile/OWNERS | 11 + .../distribtest/cpp_jessie_x64/Dockerfile | 38 + .../distribtest/cpp_stretch_x64/Dockerfile | 26 + .../distribtest/csharp_alpine_x64/Dockerfile | 28 + .../distribtest/csharp_centos7_x64/Dockerfile | 28 + .../distribtest/csharp_jessie_x64/Dockerfile | 31 + .../distribtest/csharp_jessie_x86/Dockerfile | 31 + .../distribtest/csharp_stretch_x64/Dockerfile | 41 + .../csharp_ubuntu1604_x64/Dockerfile | 41 + .../distribtest/node_centos7_x64/Dockerfile | 21 + .../distribtest/node_jessie_x64/Dockerfile | 21 + .../distribtest/node_jessie_x86/Dockerfile | 21 + .../node_ubuntu1404_x64/Dockerfile | 21 + .../node_ubuntu1604_x64/Dockerfile | 21 + .../distribtest/php_jessie_x64/Dockerfile | 21 + .../distribtest/python_arch_x64/Dockerfile | 21 + .../distribtest/python_centos6_x64/Dockerfile | 33 + .../distribtest/python_centos7_x64/Dockerfile | 20 + .../python_dev_alpine3.7_x64/Dockerfile | 27 + .../python_dev_arch_x64/Dockerfile | 22 + .../python_dev_centos7_x64/Dockerfile | 22 + .../python_dev_fedora23_x64/Dockerfile | 23 + .../python_dev_jessie_x64/Dockerfile | 21 + .../python_dev_jessie_x86/Dockerfile | 27 + .../python_dev_ubuntu1404_x64/Dockerfile | 22 + .../python_dev_ubuntu1604_x64/Dockerfile | 22 + .../python_fedora23_x64/Dockerfile | 18 + .../distribtest/python_jessie_x64/Dockerfile | 18 + .../distribtest/python_jessie_x86/Dockerfile | 24 + .../python_opensuse_x64/Dockerfile | 27 + .../python_ubuntu1404_x64/Dockerfile | 19 + .../python_ubuntu1604_x64/Dockerfile | 19 + .../distribtest/ruby_centos6_x64/Dockerfile | 37 + .../distribtest/ruby_centos7_x64/Dockerfile | 33 + .../distribtest/ruby_fedora23_x64/Dockerfile | 39 + .../distribtest/ruby_jessie_x64/Dockerfile | 19 + .../ruby_jessie_x64_ruby_2_3/Dockerfile | 41 + .../ruby_jessie_x64_ruby_2_4/Dockerfile | 40 + .../ruby_jessie_x64_ruby_2_5/Dockerfile | 40 + .../ruby_jessie_x64_ruby_2_6/Dockerfile | 40 + .../ruby_jessie_x64_ruby_2_7/Dockerfile | 40 + .../distribtest/ruby_jessie_x86/Dockerfile | 19 + .../distribtest/ruby_opensuse_x64/Dockerfile | 30 + .../ruby_ubuntu1404_x64/Dockerfile | 24 + .../ruby_ubuntu1604_x64/Dockerfile | 19 + .../grpc_artifact_android_ndk/Dockerfile | 73 + .../grpc_artifact_centos6_x64/Dockerfile | 58 + .../grpc_artifact_centos6_x86/Dockerfile | 58 + .../grpc_artifact_linux_armv6/Dockerfile | 26 + .../grpc_artifact_linux_armv7/Dockerfile | 26 + .../grpc_artifact_linux_x64/Dockerfile | 96 + .../grpc_artifact_linux_x86/Dockerfile | 86 + .../grpc_artifact_protoc/Dockerfile | 63 + .../Dockerfile | 30 + .../Dockerfile | 30 + tools/dockerfile/grpc_clang/Dockerfile | 46 + tools/dockerfile/grpc_clang_format/Dockerfile | 24 + .../clang_format_all_the_things.sh | 58 + tools/dockerfile/grpc_clang_tidy/Dockerfile | 46 + .../clang_tidy_all_the_things.sh | 24 + tools/dockerfile/grpc_dist_proto/Dockerfile | 61 + tools/dockerfile/grpc_dist_proto/version.txt | 1 + tools/dockerfile/grpc_scan_build/Dockerfile | 32 + .../grpc_interop_aspnetcore/Dockerfile | 21 + .../grpc_interop_aspnetcore/build_interop.sh | 42 + .../grpc_interop_csharp/Dockerfile | 114 + .../grpc_interop_csharp/build_interop.sh | 32 + .../grpc_interop_csharpcoreclr/Dockerfile | 114 + .../build_interop.sh | 32 + .../interoptest/grpc_interop_cxx/Dockerfile | 77 + .../grpc_interop_cxx/build_interop.sh | 37 + .../interoptest/grpc_interop_dart/Dockerfile | 18 + .../grpc_interop_dart/build_interop.sh | 26 + .../interoptest/grpc_interop_go/Dockerfile | 37 + .../grpc_interop_go/build_interop.sh | 33 + .../grpc_interop_go1.11/Dockerfile | 37 + .../grpc_interop_go1.11/build_interop.sh | 33 + .../interoptest/grpc_interop_go1.7/Dockerfile | 37 + .../grpc_interop_go1.7/build_interop.sh | 33 + .../interoptest/grpc_interop_go1.8/Dockerfile | 37 + .../grpc_interop_go1.8/build_interop.sh | 33 + .../interoptest/grpc_interop_http2/Dockerfile | 39 + .../grpc_interop_http2/build_interop.sh | 31 + .../interoptest/grpc_interop_java/Dockerfile | 26 + .../grpc_interop_java/build_interop.sh | 46 + .../interoptest/grpc_interop_node/Dockerfile | 87 + .../grpc_interop_node/build_interop.sh | 32 + .../grpc_interop_nodepurejs/Dockerfile | 71 + .../grpc_interop_nodepurejs/build_interop.sh | 32 + .../interoptest/grpc_interop_php/Dockerfile | 74 + .../grpc_interop_php/build_interop.sh | 50 + .../interoptest/grpc_interop_php7/Dockerfile | 73 + .../grpc_interop_php7/build_interop.sh | 50 + .../grpc_interop_python/Dockerfile | 68 + .../grpc_interop_python/build_interop.sh | 32 + .../grpc_interop_pythonasyncio/Dockerfile | 68 + .../build_interop.sh | 32 + .../interoptest/grpc_interop_ruby/Dockerfile | 89 + .../grpc_interop_ruby/build_interop.sh | 33 + .../lb_interop_fake_servers/Dockerfile | 34 + .../lb_interop_fake_servers/build_interop.sh | 35 + tools/dockerfile/push_testing_images.sh | 50 + tools/dockerfile/test/bazel/Dockerfile | 92 + .../test/csharp_stretch_x64/Dockerfile | 117 + .../dockerfile/test/cxx_alpine_x64/Dockerfile | 58 + .../dockerfile/test/cxx_buster_x64/Dockerfile | 80 + .../dockerfile/test/cxx_jessie_x64/Dockerfile | 96 + .../dockerfile/test/cxx_jessie_x86/Dockerfile | 93 + .../test/cxx_sanitizers_jessie_x64/Dockerfile | 81 + .../test/cxx_ubuntu1404_x64/Dockerfile | 79 + .../test/cxx_ubuntu1604_x64/Dockerfile | 85 + .../test/cxx_ubuntu1804_x64/Dockerfile | 80 + tools/dockerfile/test/fuzzer/Dockerfile | 124 + .../test/node_jessie_x64/Dockerfile | 104 + .../test/php73_zts_stretch_x64/Dockerfile | 45 + .../test/php7_jessie_x64/Dockerfile | 93 + .../dockerfile/test/php_jessie_x64/Dockerfile | 88 + .../test/python_alpine_x64/Dockerfile | 50 + .../test/python_stretch_2.7_x64/Dockerfile | 65 + .../test/python_stretch_3.5_x64/Dockerfile | 68 + .../test/python_stretch_3.6_x64/Dockerfile | 85 + .../test/python_stretch_3.7_x64/Dockerfile | 71 + .../test/python_stretch_3.8_x64/Dockerfile | 85 + .../python_stretch_default_x64/Dockerfile | 114 + .../test/ruby_jessie_x64/Dockerfile | 92 + tools/dockerfile/test/sanity/Dockerfile | 116 + tools/doxygen/Doxyfile.c++ | 2671 + tools/doxygen/Doxyfile.c++.internal | 3579 + tools/doxygen/Doxyfile.core | 2465 + tools/doxygen/Doxyfile.core.internal | 3336 + tools/doxygen/Doxyfile.objc | 2439 + tools/doxygen/Doxyfile.objc.internal | 2466 + tools/doxygen/run_doxygen.sh | 27 + tools/failures/detect_new_failures.py | 304 + tools/failures/sql/new_failures_24h.sql | 62 + tools/fuzzer/build_and_run_fuzzer.sh | 23 + tools/fuzzer/options/client_fuzzer.options | 3 + tools/fuzzer/options/fuzzer.options | 2 + tools/fuzzer/options/fuzzer_response.options | 2 + .../fuzzer/options/fuzzer_serverlist.options | 2 + .../options/hpack_parser_fuzzer_test.options | 3 + .../options/percent_decode_fuzzer.options | 2 + .../options/percent_encode_fuzzer.options | 2 + tools/fuzzer/options/request_fuzzer.options | 3 + tools/fuzzer/options/response_fuzzer.options | 3 + tools/fuzzer/options/server_fuzzer.options | 3 + .../fuzzer/options/ssl_server_fuzzer.options | 2 + tools/fuzzer/options/uri_fuzzer_test.options | 2 + .../fuzzer/runners/alts_credentials_fuzzer.sh | 30 + tools/fuzzer/runners/client_fuzzer.sh | 31 + .../runners/hpack_parser_fuzzer_test.sh | 31 + .../runners/http_request_fuzzer_test.sh | 30 + .../runners/http_response_fuzzer_test.sh | 30 + tools/fuzzer/runners/json_fuzzer_test.sh | 30 + .../runners/nanopb_fuzzer_response_test.sh | 30 + .../runners/nanopb_fuzzer_serverlist_test.sh | 30 + tools/fuzzer/runners/percent_decode_fuzzer.sh | 30 + tools/fuzzer/runners/percent_encode_fuzzer.sh | 30 + tools/fuzzer/runners/server_fuzzer.sh | 31 + tools/fuzzer/runners/ssl_server_fuzzer.sh | 30 + tools/fuzzer/runners/uri_fuzzer_test.sh | 30 + .../create_linux_kokoro_performance_worker.sh | 56 + ...ux_kokoro_performance_worker_from_image.sh | 38 + tools/gce/create_win2019_container_vm.sh | 46 + tools/gce/create_windows_debug_worker.sh | 57 + tools/gce/kokoro_performance.pub | 4 + .../linux_kokoro_performance_worker_init.sh | 231 + tools/gcp/github_stats_tracking/app.yaml | 13 + .../github_stats_tracking/appengine_config.py | 19 + tools/gcp/github_stats_tracking/cron.yaml | 4 + tools/gcp/github_stats_tracking/fetch_data.py | 93 + tools/gcp/github_stats_tracking/main.py | 28 + tools/gcp/utils/big_query_utils.py | 205 + tools/github/pr_latency.py | 202 + tools/gource/create_auth_context.h | 27 + tools/gource/gen-all-logs.sh | 31 + tools/gource/gource.sh | 25 + tools/gource/make-video.sh | 32 + tools/http2_interop/README.md | 9 + tools/http2_interop/doc.go | 20 + tools/http2_interop/frame.go | 25 + tools/http2_interop/frameheader.go | 134 + tools/http2_interop/goaway.go | 86 + tools/http2_interop/http1frame.go | 63 + tools/http2_interop/http2interop.go | 420 + tools/http2_interop/http2interop_test.go | 197 + tools/http2_interop/ping.go | 79 + tools/http2_interop/s6.5.go | 104 + tools/http2_interop/s6.5_test.go | 40 + tools/http2_interop/settings.go | 126 + tools/http2_interop/testsuite.go | 70 + tools/http2_interop/unknownframe.go | 68 + tools/internal_ci/README.md | 7 + .../helper_scripts/delete_nonartifacts.sh | 27 + .../helper_scripts/install_python38.ps1 | 72 + .../prepare_build_grpclb_interop_rc | 33 + .../helper_scripts/prepare_build_interop_rc | 35 + .../prepare_build_linux_perf_multilang_rc | 40 + .../prepare_build_linux_perf_rc | 27 + .../helper_scripts/prepare_build_linux_rc | 31 + .../prepare_build_macos_interop_rc | 25 + .../helper_scripts/prepare_build_macos_rc | 124 + .../helper_scripts/prepare_build_windows.bat | 48 + tools/internal_ci/linux/grpc_android.cfg | 19 + tools/internal_ci/linux/grpc_android.sh | 56 + .../internal_ci/linux/grpc_asan_on_foundry.sh | 20 + .../linux/grpc_basictests_c_cpp_dbg.cfg | 30 + .../linux/grpc_basictests_c_cpp_opt.cfg | 30 + .../linux/grpc_basictests_csharp.cfg | 30 + .../linux/grpc_basictests_multilang.cfg | 30 + .../linux/grpc_basictests_node.cfg | 30 + .../internal_ci/linux/grpc_basictests_php.cfg | 30 + .../linux/grpc_basictests_python.cfg | 30 + .../linux/grpc_basictests_ruby.cfg | 30 + tools/internal_ci/linux/grpc_bazel.sh | 25 + tools/internal_ci/linux/grpc_bazel_build.cfg | 23 + .../linux/grpc_bazel_build_in_docker.sh | 27 + .../linux/grpc_bazel_on_foundry_base.sh | 51 + .../linux/grpc_bazel_on_foundry_dbg.sh | 20 + .../linux/grpc_bazel_on_foundry_opt.sh | 20 + .../linux/grpc_bazel_privileged_docker.sh | 26 + .../internal_ci/linux/grpc_bazel_rbe_asan.cfg | 30 + .../internal_ci/linux/grpc_bazel_rbe_dbg.cfg | 30 + .../grpc_bazel_rbe_incompatible_changes.cfg | 30 + .../grpc_bazel_rbe_incompatible_changes.sh | 28 + .../internal_ci/linux/grpc_bazel_rbe_msan.cfg | 30 + .../internal_ci/linux/grpc_bazel_rbe_opt.cfg | 30 + .../internal_ci/linux/grpc_bazel_rbe_tsan.cfg | 30 + .../linux/grpc_bazel_rbe_ubsan.cfg | 30 + tools/internal_ci/linux/grpc_bazel_test.cfg | 23 + .../linux/grpc_bazel_test_in_docker.sh | 27 + .../linux/grpc_build_artifacts.cfg | 26 + .../internal_ci/linux/grpc_build_artifacts.sh | 29 + .../linux/grpc_build_artifacts_extra.cfg | 26 + .../linux/grpc_build_artifacts_extra.sh | 29 + .../grpc_build_artifacts_extra_release.cfg | 26 + .../linux/grpc_build_boringssl_at_head.cfg | 37 + .../internal_ci/linux/grpc_build_packages.cfg | 26 + .../internal_ci/linux/grpc_build_packages.sh | 36 + .../linux/grpc_build_protobuf_at_head.cfg | 31 + .../linux/grpc_build_submodule_at_head.sh | 53 + tools/internal_ci/linux/grpc_coverage.cfg | 25 + tools/internal_ci/linux/grpc_coverage.sh | 49 + tools/internal_ci/linux/grpc_distribtests.cfg | 26 + tools/internal_ci/linux/grpc_distribtests.sh | 35 + .../linux/grpc_distribtests_standalone.cfg | 26 + .../linux/grpc_distribtests_standalone.sh | 23 + .../linux/grpc_e2e_performance_singlevm.cfg | 25 + .../linux/grpc_e2e_performance_singlevm.sh | 31 + .../internal_ci/linux/grpc_flaky_network.cfg | 23 + .../linux/grpc_flaky_network_in_docker.sh | 31 + .../linux/grpc_full_performance_master.cfg | 25 + .../linux/grpc_full_performance_master.sh | 50 + .../linux/grpc_full_performance_release.cfg | 25 + .../linux/grpc_full_performance_release.sh | 50 + tools/internal_ci/linux/grpc_interop_alts.cfg | 30 + .../internal_ci/linux/grpc_interop_matrix.cfg | 30 + .../internal_ci/linux/grpc_interop_matrix.sh | 36 + .../linux/grpc_interop_tocloud.cfg | 30 + .../internal_ci/linux/grpc_interop_toprod.cfg | 39 + tools/internal_ci/linux/grpc_line_count.cfg | 19 + tools/internal_ci/linux/grpc_line_count.sh | 29 + .../linux/grpc_microbenchmark_diff.sh | 40 + .../internal_ci/linux/grpc_msan_on_foundry.sh | 19 + .../linux/grpc_performance_profile_daily.cfg | 25 + .../linux/grpc_performance_profile_daily.sh | 35 + .../linux/grpc_performance_profile_master.cfg | 25 + .../linux/grpc_performance_profile_master.sh | 32 + tools/internal_ci/linux/grpc_portability.cfg | 30 + .../linux/grpc_portability_build_only.cfg | 30 + .../linux/grpc_publish_packages.cfg | 28 + .../linux/grpc_publish_packages.sh | 248 + .../linux/grpc_pull_request_sanity.cfg | 30 + .../linux/grpc_python_bazel_test.cfg | 23 + .../linux/grpc_python_bazel_test_in_docker.sh | 38 + .../linux/grpc_run_grpclb_interop_tests.sh | 26 + .../linux/grpc_run_interop_tests.sh | 26 + .../linux/grpc_run_tests_matrix.sh | 35 + tools/internal_ci/linux/grpc_sanity.cfg | 30 + tools/internal_ci/linux/grpc_trickle_diff.sh | 42 + .../internal_ci/linux/grpc_tsan_on_foundry.sh | 19 + .../linux/grpc_ubsan_on_foundry.sh | 19 + tools/internal_ci/linux/grpc_xds.cfg | 29 + tools/internal_ci/linux/grpc_xds.sh | 26 + .../grpc_xds_bazel_python_test_in_docker.sh | 59 + .../linux/grpc_xds_bazel_test_in_docker.sh | 59 + tools/internal_ci/linux/grpc_xds_csharp.cfg | 25 + tools/internal_ci/linux/grpc_xds_csharp.sh | 26 + .../linux/grpc_xds_csharp_test_in_docker.sh | 59 + tools/internal_ci/linux/grpc_xds_php.cfg | 25 + tools/internal_ci/linux/grpc_xds_php.sh | 26 + .../linux/grpc_xds_php_test_in_docker.sh | 69 + tools/internal_ci/linux/grpc_xds_python.cfg | 29 + tools/internal_ci/linux/grpc_xds_ruby.cfg | 25 + tools/internal_ci/linux/grpc_xds_ruby.sh | 26 + .../linux/grpc_xds_ruby_test_in_docker.sh | 59 + .../linux/grpclb_in_dns_interop.cfg | 25 + .../pull_request/grpc_asan_on_foundry.sh | 19 + .../grpc_basictests_c_cpp_build_only.cfg | 30 + .../pull_request/grpc_basictests_c_dbg.cfg | 30 + .../pull_request/grpc_basictests_c_opt.cfg | 30 + .../pull_request/grpc_basictests_cpp_dbg.cfg | 30 + .../pull_request/grpc_basictests_cpp_opt.cfg | 30 + .../pull_request/grpc_basictests_csharp.cfg | 30 + .../grpc_basictests_multilang.cfg | 30 + .../pull_request/grpc_basictests_node.cfg | 30 + .../pull_request/grpc_basictests_php.cfg | 30 + .../pull_request/grpc_basictests_python.cfg | 30 + .../pull_request/grpc_basictests_ruby.cfg | 30 + .../pull_request/grpc_bazel_on_foundry_dbg.sh | 19 + .../pull_request/grpc_bazel_on_foundry_opt.sh | 19 + .../pull_request/grpc_bazel_rbe_asan.cfg | 30 + .../linux/pull_request/grpc_bazel_rbe_dbg.cfg | 30 + .../pull_request/grpc_bazel_rbe_msan.cfg | 30 + .../linux/pull_request/grpc_bazel_rbe_opt.cfg | 30 + .../pull_request/grpc_bazel_rbe_tsan.cfg | 30 + .../pull_request/grpc_bazel_rbe_ubsan.cfg | 30 + .../linux/pull_request/grpc_interop_alts.cfg | 30 + .../grpc_interop_matrix_adhoc.cfg | 30 + .../pull_request/grpc_interop_tocloud.cfg | 30 + .../pull_request/grpc_interop_toprod.cfg | 39 + .../pull_request/grpc_microbenchmark_diff.cfg | 33 + .../pull_request/grpc_msan_on_foundry.sh | 18 + .../linux/pull_request/grpc_sanity.cfg | 30 + .../linux/pull_request/grpc_trickle_diff.cfg | 33 + .../pull_request/grpc_tsan_on_foundry.sh | 18 + .../pull_request/grpc_ubsan_on_foundry.sh | 18 + .../linux/run_if_c_cpp_modified.sh | 34 + .../linux/run_performance_profile_daily.sh | 34 + .../linux/run_performance_profile_hourly.sh | 24 + .../linux/sanitizer/grpc_c_asan.cfg | 30 + .../linux/sanitizer/grpc_c_msan.cfg | 30 + .../linux/sanitizer/grpc_c_tsan.cfg | 30 + .../linux/sanitizer/grpc_c_ubsan.cfg | 30 + .../linux/sanitizer/grpc_cpp_asan.cfg | 30 + .../linux/sanitizer/grpc_cpp_tsan.cfg | 30 + .../sanitizer/pull_request/grpc_c_asan.cfg | 31 + .../sanitizer/pull_request/grpc_c_msan.cfg | 31 + .../sanitizer/pull_request/grpc_c_tsan.cfg | 31 + .../sanitizer/pull_request/grpc_c_ubsan.cfg | 31 + .../sanitizer/pull_request/grpc_cpp_asan.cfg | 31 + .../sanitizer/pull_request/grpc_cpp_tsan.cfg | 31 + .../macos/grpc_basictests_c_cpp.cfg | 31 + .../macos/grpc_basictests_cpp_ios.cfg | 31 + .../macos/grpc_basictests_csharp.cfg | 31 + .../macos/grpc_basictests_csharp.sh | 19 + .../macos/grpc_basictests_node.cfg | 31 + .../macos/grpc_basictests_objc_examples.cfg | 31 + .../macos/grpc_basictests_objc_ios.cfg | 31 + .../macos/grpc_basictests_objc_mac.cfg | 31 + .../macos/grpc_basictests_objc_tvos.cfg | 32 + .../internal_ci/macos/grpc_basictests_php.cfg | 31 + .../macos/grpc_basictests_python.cfg | 31 + .../macos/grpc_basictests_python.sh | 19 + .../macos/grpc_basictests_ruby.cfg | 31 + .../internal_ci/macos/grpc_basictests_ruby.sh | 19 + .../macos/grpc_bazel_c_cpp_dbg.cfg | 41 + .../macos/grpc_bazel_c_cpp_opt.cfg | 41 + .../macos/grpc_bazel_cpp_ios_tests.cfg | 19 + .../macos/grpc_build_artifacts.cfg | 27 + .../internal_ci/macos/grpc_build_artifacts.sh | 46 + tools/internal_ci/macos/grpc_cfstream.cfg | 19 + .../internal_ci/macos/grpc_cfstream_asan.cfg | 23 + .../internal_ci/macos/grpc_cfstream_tsan.cfg | 23 + tools/internal_ci/macos/grpc_distribtests.cfg | 27 + tools/internal_ci/macos/grpc_distribtests.sh | 35 + .../internal_ci/macos/grpc_interop_toprod.cfg | 35 + .../internal_ci/macos/grpc_interop_toprod.sh | 45 + .../internal_ci/macos/grpc_ios_binary_size.sh | 28 + .../macos/grpc_run_bazel_c_cpp_tests.sh | 57 + .../macos/grpc_run_bazel_cpp_ios_tests.sh | 31 + .../macos/grpc_run_bazel_isolated_tests.sh | 35 + .../macos/grpc_run_tests_matrix.sh | 33 + .../macos/grpc_run_tests_matrix_objc.sh | 19 + .../pull_request/grpc_basictests_c_cpp.cfg | 31 + .../pull_request/grpc_basictests_cpp_ios.cfg | 31 + .../pull_request/grpc_basictests_csharp.cfg | 31 + .../pull_request/grpc_basictests_dbg.cfg | 31 + .../pull_request/grpc_basictests_node.cfg | 31 + .../grpc_basictests_objc_examples.cfg | 31 + .../pull_request/grpc_basictests_objc_ios.cfg | 31 + .../pull_request/grpc_basictests_objc_mac.cfg | 31 + .../grpc_basictests_objc_tvos.cfg | 31 + .../pull_request/grpc_basictests_opt.cfg | 31 + .../pull_request/grpc_basictests_php.cfg | 31 + .../pull_request/grpc_basictests_python.cfg | 31 + .../pull_request/grpc_basictests_ruby.cfg | 31 + .../pull_request/grpc_bazel_c_cpp_dbg.cfg | 36 + .../pull_request/grpc_bazel_c_cpp_opt.cfg | 37 + .../macos/pull_request/grpc_interop.cfg | 26 + .../pull_request/grpc_ios_binary_size.cfg | 33 + tools/internal_ci/windows/bazel_rbe.bat | 36 + tools/internal_ci/windows/grpc_basictests.cfg | 30 + .../internal_ci/windows/grpc_basictests_c.cfg | 30 + .../windows/grpc_basictests_csharp.cfg | 30 + .../windows/grpc_basictests_dbg.cfg | 30 + .../windows/grpc_basictests_opt.cfg | 30 + .../windows/grpc_basictests_python.cfg | 30 + .../windows/grpc_bazel_rbe_dbg.cfg | 43 + .../windows/grpc_bazel_rbe_opt.cfg | 42 + .../windows/grpc_build_artifacts.bat | 29 + .../windows/grpc_build_artifacts.cfg | 26 + .../windows/grpc_build_packages.bat | 29 + .../windows/grpc_build_packages.cfg | 26 + .../internal_ci/windows/grpc_distribtests.bat | 29 + .../internal_ci/windows/grpc_distribtests.cfg | 26 + .../windows/grpc_distribtests_standalone.bat | 25 + .../windows/grpc_distribtests_standalone.cfg | 26 + .../internal_ci/windows/grpc_portability.cfg | 30 + .../windows/grpc_portability_build_only.cfg | 30 + .../windows/grpc_run_tests_matrix.bat | 25 + .../windows/pull_request/grpc_basictests.cfg | 30 + .../pull_request/grpc_basictests_c.cfg | 30 + .../pull_request/grpc_basictests_csharp.cfg | 30 + .../pull_request/grpc_basictests_dbg.cfg | 30 + .../pull_request/grpc_basictests_opt.cfg | 30 + .../pull_request/grpc_basictests_python.cfg | 30 + .../pull_request/grpc_bazel_rbe_dbg.cfg | 38 + .../pull_request/grpc_bazel_rbe_opt.cfg | 38 + .../windows/pull_request/grpc_portability.cfg | 30 + tools/interop_matrix/README.md | 51 + tools/interop_matrix/client_matrix.py | 403 + tools/interop_matrix/create_matrix_images.py | 360 + tools/interop_matrix/create_testcases.sh | 86 + tools/interop_matrix/patches/README.md | 38 + .../patches/csharp_v1.0.1/git_repo.patch | 81 + .../patches/ruby_v1.0.1/git_repo.patch | 34 + .../patches/ruby_v1.18.0/git_repo.patch | 10 + .../run_interop_matrix_tests.py | 312 + tools/interop_matrix/testcases/csharp__master | 22 + tools/interop_matrix/testcases/csharp__v1.1.4 | 20 + .../interop_matrix/testcases/csharp__v1.18.0 | 23 + tools/interop_matrix/testcases/csharp__v1.3.9 | 20 + .../testcases/csharpcoreclr__master | 22 + .../testcases/csharpcoreclr__v1.1.4 | 20 + .../testcases/csharpcoreclr__v1.18.0 | 22 + .../testcases/csharpcoreclr__v1.3.9 | 20 + tools/interop_matrix/testcases/cxx__master | 22 + tools/interop_matrix/testcases/cxx__v1.0.1 | 20 + tools/interop_matrix/testcases/go__master | 22 + tools/interop_matrix/testcases/go__v1.0.5 | 20 + tools/interop_matrix/testcases/java__master | 22 + tools/interop_matrix/testcases/java__v1.0.3 | 20 + tools/interop_matrix/testcases/node__master | 20 + tools/interop_matrix/testcases/node__v1.0.1 | 21 + tools/interop_matrix/testcases/node__v1.1.4 | 20 + tools/interop_matrix/testcases/php__master | 22 + tools/interop_matrix/testcases/php__v1.0.1 | 20 + tools/interop_matrix/testcases/python__master | 22 + tools/interop_matrix/testcases/python__v1.0.x | 20 + .../interop_matrix/testcases/python__v1.11.1 | 20 + tools/interop_matrix/testcases/ruby__master | 22 + tools/interop_matrix/testcases/ruby__v1.0.1 | 20 + tools/interop_matrix/testcases/ruby__v1.1.4 | 20 + tools/line_count/collect-history.py | 42 + tools/line_count/collect-now.sh | 21 + tools/line_count/summarize-history.py | 38 + tools/line_count/yaml2csv.py | 40 + tools/mkowners/mkowners.py | 235 + tools/package_hosting/404.html | 1 + tools/package_hosting/build-201807.xsl | 112 + tools/package_hosting/dirindex.css | 16 + tools/package_hosting/home.xsl | 87 + tools/package_hosting/style.css | 76 + tools/package_hosting/upload_web_assets.sh | 30 + tools/profiling/bloat/bloat_diff.py | 94 + tools/profiling/ios_bin/binary_size.py | 148 + tools/profiling/ios_bin/parse_link_map.py | 104 + .../latency_profile/profile_analyzer.py | 275 + tools/profiling/microbenchmarks/README.md | 4 + tools/profiling/microbenchmarks/bm2bq.py | 65 + .../microbenchmarks/bm_diff/README.md | 116 + .../microbenchmarks/bm_diff/bm_build.py | 79 + .../microbenchmarks/bm_diff/bm_constants.py | 32 + .../microbenchmarks/bm_diff/bm_diff.py | 230 + .../microbenchmarks/bm_diff/bm_main.py | 153 + .../microbenchmarks/bm_diff/bm_run.py | 119 + .../microbenchmarks/bm_diff/bm_speedup.py | 59 + tools/profiling/microbenchmarks/bm_json.py | 213 + .../profiling/perf/run_perf_unconstrained.sh | 80 + tools/profiling/qps/qps_diff.py | 170 + tools/profiling/qps/qps_scenarios.py | 21 + tools/release/release_notes.py | 369 + tools/release/verify_python_release.py | 116 + tools/remote_build/README.md | 71 + tools/remote_build/kokoro.bazelrc | 33 + tools/remote_build/mac.bazelrc | 35 + tools/remote_build/manual.bazelrc | 39 + tools/remote_build/rbe_common.bazelrc | 94 + tools/remote_build/windows.bazelrc | 50 + .../remote_build/workspace_status_kokoro.bat | 29 + tools/remote_build/workspace_status_kokoro.sh | 26 + tools/run_tests/README.md | 53 + tools/run_tests/artifacts/__init__.py | 13 + tools/run_tests/artifacts/artifact_targets.py | 399 + .../artifacts/build_artifact_csharp.bat | 50 + .../artifacts/build_artifact_csharp.sh | 33 + .../build_artifact_csharp_android.sh | 24 + .../artifacts/build_artifact_csharp_ios.sh | 23 + .../run_tests/artifacts/build_artifact_php.sh | 24 + .../artifacts/build_artifact_protoc.bat | 36 + .../artifacts/build_artifact_protoc.sh | 27 + .../artifacts/build_artifact_python.bat | 61 + .../artifacts/build_artifact_python.sh | 145 + .../artifacts/build_artifact_ruby.sh | 64 + .../run_tests/artifacts/build_package_php.sh | 23 + .../artifacts/build_package_python.sh | 50 + .../run_tests/artifacts/build_package_ruby.sh | 61 + .../artifacts/distribtest_targets.py | 352 + tools/run_tests/artifacts/package_targets.py | 163 + tools/run_tests/artifacts/run_in_workspace.sh | 37 + .../build_stats/build_stats_schema.json | 56 + .../build_stats_schema_no_matrix.json | 49 + .../dockerize/build_and_run_docker.sh | 91 + .../dockerize/build_docker_and_run_tests.sh | 90 + .../dockerize/build_interop_image.sh | 127 + tools/run_tests/dockerize/docker_run.sh | 44 + tools/run_tests/dockerize/docker_run_tests.sh | 48 + tools/run_tests/generated/configs.json | 88 + .../generated/lb_interop_test_scenarios.json | 1167 + tools/run_tests/generated/tests.json | 71254 ++++++++++++++++ .../run_tests/helper_scripts/build_csharp.bat | 27 + .../run_tests/helper_scripts/build_csharp.sh | 26 + tools/run_tests/helper_scripts/build_php.sh | 37 + .../run_tests/helper_scripts/build_python.sh | 231 + .../helper_scripts/build_python_msys2.sh | 21 + tools/run_tests/helper_scripts/build_ruby.sh | 28 + .../helper_scripts/bundle_install_wrapper.sh | 31 + .../run_tests/helper_scripts/post_tests_c.sh | 30 + .../helper_scripts/post_tests_csharp.bat | 39 + .../helper_scripts/post_tests_csharp.sh | 29 + .../helper_scripts/post_tests_php.sh | 31 + .../helper_scripts/post_tests_python.sh | 24 + .../helper_scripts/post_tests_ruby.sh | 31 + .../helper_scripts/pre_build_cmake.bat | 35 + .../helper_scripts/pre_build_cmake.sh | 24 + .../helper_scripts/pre_build_csharp.bat | 43 + .../helper_scripts/pre_build_csharp.sh | 28 + .../helper_scripts/pre_build_ruby.sh | 24 + tools/run_tests/helper_scripts/prep_xds.sh | 37 + .../run_tests/helper_scripts/run_grpc-node.sh | 33 + tools/run_tests/helper_scripts/run_python.sh | 30 + tools/run_tests/helper_scripts/run_ruby.sh | 21 + .../helper_scripts/run_ruby_end2end_tests.sh | 39 + .../helper_scripts/run_tests_in_workspace.sh | 34 + .../interop/interop_html_report.template | 201 + tools/run_tests/interop/with_nvm.sh | 20 + tools/run_tests/interop/with_rvm.sh | 20 + .../lb_interop_tests/gen_build_yaml.py | 345 + tools/run_tests/performance/README.md | 134 + tools/run_tests/performance/__init__.py | 13 + .../run_tests/performance/bq_upload_result.py | 185 + .../performance/build_performance.sh | 82 + .../performance/build_performance_go.sh | 30 + .../performance/build_performance_node.sh | 29 + .../performance/build_performance_php7.sh | 30 + tools/run_tests/performance/kill_workers.sh | 44 + .../performance/massage_qps_stats.py | 511 + .../performance/massage_qps_stats_helpers.py | 62 + .../patch_scenario_results_schema.py | 59 + .../process_local_perf_flamegraphs.sh | 28 + .../process_remote_perf_flamegraphs.sh | 33 + .../performance/remote_host_build.sh | 22 + .../performance/remote_host_prepare.sh | 43 + tools/run_tests/performance/run_netperf.sh | 30 + tools/run_tests/performance/run_qps_driver.sh | 25 + .../performance/run_worker_csharp.sh | 23 + tools/run_tests/performance/run_worker_go.sh | 23 + .../run_tests/performance/run_worker_java.sh | 24 + .../run_tests/performance/run_worker_node.sh | 33 + tools/run_tests/performance/run_worker_php.sh | 24 + .../performance/run_worker_python.sh | 20 + .../performance/run_worker_python_asyncio.sh | 20 + .../run_tests/performance/run_worker_ruby.sh | 22 + .../run_tests/performance/scenario_config.py | 1408 + .../performance/scenario_result_schema.json | 1899 + tools/run_tests/python_utils/__init__.py | 13 + tools/run_tests/python_utils/antagonist.py | 18 + tools/run_tests/python_utils/check_on_pr.py | 140 + tools/run_tests/python_utils/dockerjob.py | 156 + .../python_utils/filter_pull_request_tests.py | 201 + tools/run_tests/python_utils/jobset.py | 583 + tools/run_tests/python_utils/port_server.py | 206 + tools/run_tests/python_utils/report_utils.py | 180 + .../python_utils/start_port_server.py | 129 + .../python_utils/upload_rbe_results.py | 293 + .../python_utils/upload_test_results.py | 176 + tools/run_tests/python_utils/watch_dirs.py | 60 + tools/run_tests/run_grpclb_interop_tests.py | 605 + tools/run_tests/run_interop_tests.py | 1719 + tools/run_tests/run_microbenchmark.py | 261 + tools/run_tests/run_performance_tests.py | 719 + tools/run_tests/run_tests.py | 1981 + tools/run_tests/run_tests_matrix.py | 577 + tools/run_tests/run_xds_tests.py | 1602 + .../sanity/check_bad_dependencies.sh | 31 + .../run_tests/sanity/check_bazel_workspace.py | 195 + tools/run_tests/sanity/check_buildifier.sh | 31 + tools/run_tests/sanity/check_cache_mk.sh | 24 + .../sanity/check_deprecated_grpc++.py | 189 + tools/run_tests/sanity/check_owners.sh | 29 + tools/run_tests/sanity/check_port_platform.py | 67 + .../sanity/check_qps_scenario_changes.py | 34 + tools/run_tests/sanity/check_shellcheck.sh | 29 + tools/run_tests/sanity/check_submodules.sh | 47 + .../run_tests/sanity/check_test_filtering.py | 161 + tools/run_tests/sanity/check_tracer_sanity.py | 47 + tools/run_tests/sanity/check_version.py | 85 + .../run_tests/sanity/core_banned_functions.py | 75 + .../run_tests/sanity/core_untyped_structs.sh | 27 + .../run_tests/sanity/cpp_banned_constructs.sh | 49 + tools/run_tests/sanity/sanity_tests.yaml | 31 + tools/run_tests/start_port_server.py | 30 + tools/run_tests/task_runner.py | 120 + 8325 files changed, 920262 insertions(+) create mode 100644 .bazelci/presubmit.yml create mode 100644 .bazelrc create mode 100644 .clang-format create mode 100644 .clang-tidy create mode 100644 .clang_complete create mode 100644 .editorconfig create mode 100644 .gitallowed create mode 100644 .github/CODEOWNERS create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/cleanup_request.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/ISSUE_TEMPLATE/question.md create mode 100644 .github/lock.yml create mode 100644 .github/mergeable.yml create mode 100644 .github/pull_request_template.md create mode 100644 .github/stale.yml create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 .istanbul.yml create mode 100644 .pylintrc create mode 100644 .pylintrc-examples create mode 100644 .pylintrc-tests create mode 100755 .rspec create mode 100644 .travis.yml create mode 100644 .yapfignore create mode 100644 .yardopts create mode 100644 AUTHORS create mode 100644 BUILD create mode 100644 BUILD.gn create mode 100644 BUILDING.md create mode 100644 CMakeLists.txt create mode 100644 CODE-OF-CONDUCT.md create mode 100644 CONCEPTS.md create mode 100644 CONTRIBUTING.md create mode 100644 GOVERNANCE.md create mode 100755 Gemfile create mode 100644 LICENSE create mode 100644 MAINTAINERS.md create mode 100644 MANIFEST.md create mode 100644 Makefile create mode 100644 NOTICE.txt create mode 100644 OWNERS create mode 100644 PYTHON-MANIFEST.in create mode 100644 README.md create mode 100755 Rakefile create mode 100644 TROUBLESHOOTING.md create mode 100644 WORKSPACE create mode 100644 bazel/BUILD create mode 100644 bazel/OWNERS create mode 100644 bazel/cc_grpc_library.bzl create mode 100644 bazel/custom_exec_properties.bzl create mode 100644 bazel/cython_library.bzl create mode 100644 bazel/generate_cc.bzl create mode 100644 bazel/generate_objc.bzl create mode 100644 bazel/grpc_build_system.bzl create mode 100644 bazel/grpc_deps.bzl create mode 100644 bazel/grpc_extra_deps.bzl create mode 100644 bazel/grpc_python_deps.bzl create mode 100644 bazel/grpc_util.bzl create mode 100644 bazel/objc_grpc_library.bzl create mode 100644 bazel/protobuf.bzl create mode 100644 bazel/python_rules.bzl create mode 100644 bazel/test/python_test_repo/.gitignore create mode 100644 bazel/test/python_test_repo/BUILD create mode 100644 bazel/test/python_test_repo/README.md create mode 100644 bazel/test/python_test_repo/WORKSPACE create mode 100644 bazel/test/python_test_repo/dummy_plugin.py create mode 100644 bazel/test/python_test_repo/helloworld.proto create mode 100644 bazel/test/python_test_repo/helloworld.py create mode 100644 bazel/test/python_test_repo/helloworld_moved.py create mode 120000 bazel/test/python_test_repo/tools/bazel create mode 100755 bazel/update_mirror.sh create mode 100644 build_autogenerated.yaml create mode 100644 build_config.rb create mode 100644 build_handwritten.yaml create mode 100644 cmake/OWNERS create mode 100644 cmake/abseil-cpp.cmake create mode 100644 cmake/address_sorting.cmake create mode 100644 cmake/benchmark.cmake create mode 100644 cmake/cares.cmake create mode 100644 cmake/gRPCConfig.cmake.in create mode 100644 cmake/gflags.cmake create mode 100644 cmake/modules/Findc-ares.cmake create mode 100644 cmake/msvc_static_runtime.cmake create mode 100644 cmake/pkg-config-template.pc.in create mode 100644 cmake/protobuf.cmake create mode 100644 cmake/ssl.cmake create mode 100644 cmake/upb.cmake create mode 100644 cmake/zlib.cmake create mode 100644 composer.json create mode 100644 config.m4 create mode 100644 config.w32 create mode 100644 doc/.gitignore create mode 100644 doc/PROTOCOL-HTTP2.md create mode 100644 doc/PROTOCOL-WEB.md create mode 100644 doc/binary-logging.md create mode 100644 doc/c-style-guide.md create mode 100644 doc/command_line_tool.md create mode 100644 doc/compression.md create mode 100644 doc/compression_cookbook.md create mode 100644 doc/connection-backoff-interop-test-description.md create mode 100644 doc/connection-backoff.md create mode 100644 doc/connectivity-semantics-and-api.md create mode 100644 doc/core/combiner-explainer.md create mode 100644 doc/core/epoll-polling-engine.md create mode 100644 doc/core/grpc-client-server-polling-engine-usage.md create mode 100644 doc/core/grpc-cq.md create mode 100644 doc/core/grpc-error.md create mode 100644 doc/core/grpc-polling-engines.md create mode 100644 doc/core/images/new_epoll_impl.png create mode 100644 doc/core/images/old_epoll_impl.png create mode 100644 doc/core/moving-to-c++.md create mode 100644 doc/core/pending_api_cleanups.md create mode 100644 doc/core/transport_explainer.md create mode 100644 doc/cpp-style-guide.md create mode 100644 doc/cpp/pending_api_cleanups.md create mode 100644 doc/cpp/perf_notes.md create mode 100644 doc/csharp/server_reflection.md create mode 100644 doc/environment_variables.md create mode 100644 doc/fail_fast.md create mode 100644 doc/fork_support.md create mode 100644 doc/g_stands_for.md create mode 100644 doc/grpc_release_schedule.md create mode 100644 doc/grpc_security_audit.pdf create mode 100644 doc/health-checking.md create mode 100644 doc/http-grpc-status-mapping.md create mode 100644 doc/http2-interop-test-descriptions.md create mode 100644 doc/images/compression_cookbook_incoming.png create mode 100644 doc/images/compression_cookbook_outgoing.png create mode 100644 doc/images/grpc-call-channel-cq.png create mode 100644 doc/images/grpc-client-lb-pss.png create mode 100644 doc/images/grpc-cq.png create mode 100644 doc/images/grpc-epoll1.png create mode 100644 doc/images/grpc-epollex.png create mode 100644 doc/images/grpc-ps-pss-fd.png create mode 100644 doc/images/grpc-pss.png create mode 100644 doc/images/grpc-server-cq-fds.png create mode 100644 doc/images/load-balancing.png create mode 100644 doc/images/load-balancing.svg create mode 100644 doc/images/stress_test_framework.png create mode 100644 doc/internationalization.md create mode 100755 doc/interop-test-descriptions.md create mode 100644 doc/keepalive.md create mode 100644 doc/load-balancing.md create mode 100644 doc/naming.md create mode 100644 doc/python/server_reflection.md create mode 100644 doc/python/sphinx/_static/custom.css create mode 100644 doc/python/sphinx/conf.py create mode 100644 doc/python/sphinx/glossary.rst create mode 100644 doc/python/sphinx/grpc.rst create mode 100644 doc/python/sphinx/grpc_asyncio.rst create mode 100644 doc/python/sphinx/grpc_channelz.rst create mode 100644 doc/python/sphinx/grpc_health_checking.rst create mode 100644 doc/python/sphinx/grpc_reflection.rst create mode 100644 doc/python/sphinx/grpc_status.rst create mode 100644 doc/python/sphinx/grpc_testing.rst create mode 100644 doc/python/sphinx/index.rst create mode 100644 doc/security_audit.md create mode 100644 doc/server-reflection.md create mode 100644 doc/server_reflection_tutorial.md create mode 100644 doc/server_side_auth.md create mode 100644 doc/service_config.md create mode 100644 doc/ssl-performance.md create mode 100644 doc/status_ordering.md create mode 100644 doc/statuscodes.md create mode 100644 doc/unit_testing.md create mode 100644 doc/versioning.md create mode 100644 doc/wait-for-ready.md create mode 100644 doc/workarounds.md create mode 100644 doc/xds-test-descriptions.md create mode 100644 etc/README.md create mode 100644 etc/roots.pem create mode 100644 examples/BUILD create mode 100644 examples/README.md create mode 100644 examples/android/helloworld/.gitignore create mode 100644 examples/android/helloworld/README.md create mode 100644 examples/android/helloworld/app/.gitignore create mode 100644 examples/android/helloworld/app/CMakeLists.txt create mode 100644 examples/android/helloworld/app/build.gradle create mode 100644 examples/android/helloworld/app/proguard-rules.pro create mode 100644 examples/android/helloworld/app/src/main/AndroidManifest.xml create mode 100644 examples/android/helloworld/app/src/main/cpp/grpc-helloworld.cc create mode 100644 examples/android/helloworld/app/src/main/java/io/grpc/helloworldexample/cpp/HelloworldActivity.java create mode 100644 examples/android/helloworld/app/src/main/res/layout/activity_helloworld.xml create mode 100644 examples/android/helloworld/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 examples/android/helloworld/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 examples/android/helloworld/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 examples/android/helloworld/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 examples/android/helloworld/app/src/main/res/values/strings.xml create mode 100644 examples/android/helloworld/build.gradle create mode 100644 examples/android/helloworld/gradle.properties create mode 100644 examples/android/helloworld/gradle/wrapper/gradle-wrapper.jar create mode 100644 examples/android/helloworld/gradle/wrapper/gradle-wrapper.properties create mode 100755 examples/android/helloworld/gradlew create mode 100644 examples/android/helloworld/gradlew.bat create mode 100644 examples/android/helloworld/settings.gradle create mode 100644 examples/cpp/README.md create mode 100644 examples/cpp/compression/Makefile create mode 100644 examples/cpp/compression/README.md create mode 100644 examples/cpp/compression/greeter_client.cc create mode 100644 examples/cpp/compression/greeter_server.cc create mode 100644 examples/cpp/helloworld/.gitignore create mode 100644 examples/cpp/helloworld/CMakeLists.txt create mode 100644 examples/cpp/helloworld/Makefile create mode 100644 examples/cpp/helloworld/README.md create mode 100644 examples/cpp/helloworld/cmake_externalproject/CMakeLists.txt create mode 100644 examples/cpp/helloworld/cocoapods/HelloWorldCpp.xcodeproj/project.pbxproj create mode 100644 examples/cpp/helloworld/cocoapods/HelloWorldCpp/AppDelegate.h create mode 100644 examples/cpp/helloworld/cocoapods/HelloWorldCpp/AppDelegate.mm create mode 100644 examples/cpp/helloworld/cocoapods/HelloWorldCpp/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 examples/cpp/helloworld/cocoapods/HelloWorldCpp/Base.lproj/LaunchScreen.storyboard create mode 100644 examples/cpp/helloworld/cocoapods/HelloWorldCpp/Base.lproj/Main.storyboard create mode 100644 examples/cpp/helloworld/cocoapods/HelloWorldCpp/Info.plist create mode 100644 examples/cpp/helloworld/cocoapods/HelloWorldCpp/ViewController.h create mode 100644 examples/cpp/helloworld/cocoapods/HelloWorldCpp/ViewController.mm create mode 100644 examples/cpp/helloworld/cocoapods/HelloWorldCpp/main.m create mode 100644 examples/cpp/helloworld/cocoapods/Podfile create mode 100644 examples/cpp/helloworld/greeter_async_client.cc create mode 100644 examples/cpp/helloworld/greeter_async_client2.cc create mode 100644 examples/cpp/helloworld/greeter_async_server.cc create mode 100644 examples/cpp/helloworld/greeter_client.cc create mode 100644 examples/cpp/helloworld/greeter_server.cc create mode 100644 examples/cpp/keyvaluestore/caching_interceptor.h create mode 100644 examples/cpp/keyvaluestore/client.cc create mode 100644 examples/cpp/keyvaluestore/server.cc create mode 100644 examples/cpp/load_balancing/Makefile create mode 100644 examples/cpp/load_balancing/README.md create mode 100644 examples/cpp/load_balancing/greeter_client.cc create mode 100644 examples/cpp/load_balancing/greeter_server.cc create mode 100644 examples/cpp/metadata/Makefile create mode 100644 examples/cpp/metadata/README.md create mode 100644 examples/cpp/metadata/greeter_client.cc create mode 100644 examples/cpp/metadata/greeter_server.cc create mode 100644 examples/cpp/route_guide/Makefile create mode 100644 examples/cpp/route_guide/README.md create mode 100644 examples/cpp/route_guide/helper.cc create mode 100644 examples/cpp/route_guide/helper.h create mode 100644 examples/cpp/route_guide/route_guide_client.cc create mode 100644 examples/cpp/route_guide/route_guide_db.json create mode 100644 examples/cpp/route_guide/route_guide_server.cc create mode 100644 examples/csharp/.gitignore create mode 100644 examples/csharp/Helloworld/Greeter.sln create mode 100644 examples/csharp/Helloworld/Greeter/Greeter.csproj create mode 100644 examples/csharp/Helloworld/GreeterClient/GreeterClient.csproj create mode 100644 examples/csharp/Helloworld/GreeterClient/Program.cs create mode 100644 examples/csharp/Helloworld/GreeterServer/GreeterServer.csproj create mode 100644 examples/csharp/Helloworld/GreeterServer/Program.cs create mode 100644 examples/csharp/Helloworld/README.md create mode 100644 examples/csharp/HelloworldLegacyCsproj/Greeter.sln create mode 100644 examples/csharp/HelloworldLegacyCsproj/Greeter/.gitignore create mode 100644 examples/csharp/HelloworldLegacyCsproj/Greeter/Greeter.csproj create mode 100644 examples/csharp/HelloworldLegacyCsproj/Greeter/Properties/AssemblyInfo.cs create mode 100644 examples/csharp/HelloworldLegacyCsproj/Greeter/packages.config create mode 100644 examples/csharp/HelloworldLegacyCsproj/GreeterClient/.gitignore create mode 100644 examples/csharp/HelloworldLegacyCsproj/GreeterClient/GreeterClient.csproj create mode 100644 examples/csharp/HelloworldLegacyCsproj/GreeterClient/Program.cs create mode 100644 examples/csharp/HelloworldLegacyCsproj/GreeterClient/Properties/AssemblyInfo.cs create mode 100644 examples/csharp/HelloworldLegacyCsproj/GreeterClient/packages.config create mode 100644 examples/csharp/HelloworldLegacyCsproj/GreeterServer/.gitignore create mode 100644 examples/csharp/HelloworldLegacyCsproj/GreeterServer/GreeterServer.csproj create mode 100644 examples/csharp/HelloworldLegacyCsproj/GreeterServer/Program.cs create mode 100644 examples/csharp/HelloworldLegacyCsproj/GreeterServer/Properties/AssemblyInfo.cs create mode 100644 examples/csharp/HelloworldLegacyCsproj/GreeterServer/packages.config create mode 100644 examples/csharp/HelloworldLegacyCsproj/README.md create mode 100644 examples/csharp/HelloworldUnity/.gitignore create mode 100644 examples/csharp/HelloworldUnity/Assets/Plugins.meta create mode 100644 examples/csharp/HelloworldUnity/Assets/Scenes.meta create mode 100644 examples/csharp/HelloworldUnity/Assets/Scenes/SampleScene.unity create mode 100644 examples/csharp/HelloworldUnity/Assets/Scenes/SampleScene.unity.meta create mode 100644 examples/csharp/HelloworldUnity/Assets/Scripts.meta create mode 100644 examples/csharp/HelloworldUnity/Assets/Scripts/HelloWorldScript.cs create mode 100644 examples/csharp/HelloworldUnity/Assets/Scripts/HelloWorldScript.cs.meta create mode 100644 examples/csharp/HelloworldUnity/Assets/Scripts/HelloWorldTest.cs create mode 100644 examples/csharp/HelloworldUnity/Assets/Scripts/HelloWorldTest.cs.meta create mode 100644 examples/csharp/HelloworldUnity/Assets/Scripts/Helloworld.cs create mode 100644 examples/csharp/HelloworldUnity/Assets/Scripts/Helloworld.cs.meta create mode 100644 examples/csharp/HelloworldUnity/Assets/Scripts/HelloworldGrpc.cs create mode 100644 examples/csharp/HelloworldUnity/Assets/Scripts/HelloworldGrpc.cs.meta create mode 100644 examples/csharp/HelloworldUnity/ProjectSettings/AudioManager.asset create mode 100644 examples/csharp/HelloworldUnity/ProjectSettings/ClusterInputManager.asset create mode 100644 examples/csharp/HelloworldUnity/ProjectSettings/DynamicsManager.asset create mode 100644 examples/csharp/HelloworldUnity/ProjectSettings/EditorBuildSettings.asset create mode 100644 examples/csharp/HelloworldUnity/ProjectSettings/EditorSettings.asset create mode 100644 examples/csharp/HelloworldUnity/ProjectSettings/GraphicsSettings.asset create mode 100644 examples/csharp/HelloworldUnity/ProjectSettings/InputManager.asset create mode 100644 examples/csharp/HelloworldUnity/ProjectSettings/NavMeshAreas.asset create mode 100644 examples/csharp/HelloworldUnity/ProjectSettings/NetworkManager.asset create mode 100644 examples/csharp/HelloworldUnity/ProjectSettings/Physics2DSettings.asset create mode 100644 examples/csharp/HelloworldUnity/ProjectSettings/PresetManager.asset create mode 100644 examples/csharp/HelloworldUnity/ProjectSettings/ProjectSettings.asset create mode 100644 examples/csharp/HelloworldUnity/ProjectSettings/ProjectVersion.txt create mode 100644 examples/csharp/HelloworldUnity/ProjectSettings/QualitySettings.asset create mode 100644 examples/csharp/HelloworldUnity/ProjectSettings/TagManager.asset create mode 100644 examples/csharp/HelloworldUnity/ProjectSettings/TimeManager.asset create mode 100644 examples/csharp/HelloworldUnity/ProjectSettings/UnityConnectSettings.asset create mode 100644 examples/csharp/HelloworldUnity/ProjectSettings/VFXManager.asset create mode 100644 examples/csharp/HelloworldUnity/README.md create mode 100644 examples/csharp/HelloworldUnity/UIElementsSchema/UIElements.xsd create mode 100644 examples/csharp/HelloworldUnity/UIElementsSchema/UnityEditor.Experimental.UIElements.xsd create mode 100644 examples/csharp/HelloworldUnity/UIElementsSchema/UnityEditor.PackageManager.UI.xsd create mode 100644 examples/csharp/HelloworldUnity/UIElementsSchema/UnityEngine.Experimental.UIElements.xsd create mode 100644 examples/csharp/HelloworldXamarin/.gitignore create mode 100644 examples/csharp/HelloworldXamarin/Droid/Assets/AboutAssets.txt create mode 100644 examples/csharp/HelloworldXamarin/Droid/HelloworldXamarin.Droid.csproj create mode 100644 examples/csharp/HelloworldXamarin/Droid/MainActivity.cs create mode 100644 examples/csharp/HelloworldXamarin/Droid/Properties/AndroidManifest.xml create mode 100644 examples/csharp/HelloworldXamarin/Droid/Properties/AssemblyInfo.cs create mode 100644 examples/csharp/HelloworldXamarin/Droid/Resources/AboutResources.txt create mode 100644 examples/csharp/HelloworldXamarin/Droid/Resources/Resource.designer.cs create mode 100644 examples/csharp/HelloworldXamarin/Droid/Resources/layout/Main.axml create mode 100644 examples/csharp/HelloworldXamarin/Droid/Resources/mipmap-hdpi/Icon.png create mode 100644 examples/csharp/HelloworldXamarin/Droid/Resources/mipmap-mdpi/Icon.png create mode 100644 examples/csharp/HelloworldXamarin/Droid/Resources/mipmap-xhdpi/Icon.png create mode 100644 examples/csharp/HelloworldXamarin/Droid/Resources/mipmap-xxhdpi/Icon.png create mode 100644 examples/csharp/HelloworldXamarin/Droid/Resources/mipmap-xxxhdpi/Icon.png create mode 100644 examples/csharp/HelloworldXamarin/Droid/Resources/values/Strings.xml create mode 100644 examples/csharp/HelloworldXamarin/Droid/packages.config create mode 100644 examples/csharp/HelloworldXamarin/HelloworldXamarin.sln create mode 100644 examples/csharp/HelloworldXamarin/HelloworldXamarin/Helloworld.cs create mode 100644 examples/csharp/HelloworldXamarin/HelloworldXamarin/HelloworldGrpc.cs create mode 100644 examples/csharp/HelloworldXamarin/HelloworldXamarin/HelloworldXamarin.projitems create mode 100644 examples/csharp/HelloworldXamarin/HelloworldXamarin/HelloworldXamarin.shproj create mode 100644 examples/csharp/HelloworldXamarin/README.md create mode 100644 examples/csharp/HelloworldXamarin/iOS/AppDelegate.cs create mode 100644 examples/csharp/HelloworldXamarin/iOS/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 examples/csharp/HelloworldXamarin/iOS/Assets.xcassets/Contents.json create mode 100644 examples/csharp/HelloworldXamarin/iOS/Entitlements.plist create mode 100644 examples/csharp/HelloworldXamarin/iOS/HelloworldXamarin.iOS.csproj create mode 100644 examples/csharp/HelloworldXamarin/iOS/Info.plist create mode 100644 examples/csharp/HelloworldXamarin/iOS/LaunchScreen.storyboard create mode 100644 examples/csharp/HelloworldXamarin/iOS/Main.cs create mode 100644 examples/csharp/HelloworldXamarin/iOS/Main.storyboard create mode 100644 examples/csharp/HelloworldXamarin/iOS/ViewController.cs create mode 100644 examples/csharp/HelloworldXamarin/iOS/ViewController.designer.cs create mode 100644 examples/csharp/HelloworldXamarin/iOS/packages.config create mode 100644 examples/csharp/RouteGuide/.gitignore create mode 100644 examples/csharp/RouteGuide/README.md create mode 100644 examples/csharp/RouteGuide/RouteGuide.sln create mode 100644 examples/csharp/RouteGuide/RouteGuide/RouteGuide.csproj create mode 100644 examples/csharp/RouteGuide/RouteGuide/RouteGuideUtil.cs create mode 100644 examples/csharp/RouteGuide/RouteGuide/route_guide_db.json create mode 100644 examples/csharp/RouteGuide/RouteGuideClient/Program.cs create mode 100644 examples/csharp/RouteGuide/RouteGuideClient/RouteGuideClient.csproj create mode 100644 examples/csharp/RouteGuide/RouteGuideServer/Program.cs create mode 100644 examples/csharp/RouteGuide/RouteGuideServer/RouteGuideImpl.cs create mode 100644 examples/csharp/RouteGuide/RouteGuideServer/RouteGuideServer.csproj create mode 100644 examples/csharp/Xds/Greeter.sln create mode 100644 examples/csharp/Xds/Greeter/Greeter.csproj create mode 100644 examples/csharp/Xds/GreeterClient/GreeterClient.csproj create mode 100644 examples/csharp/Xds/GreeterClient/Program.cs create mode 100644 examples/csharp/Xds/GreeterServer/GreeterServer.csproj create mode 100644 examples/csharp/Xds/GreeterServer/Program.cs create mode 100644 examples/csharp/Xds/README.md create mode 100644 examples/node/.gitignore create mode 100644 examples/node/README.md create mode 100644 examples/node/dynamic_codegen/README.md create mode 100644 examples/node/dynamic_codegen/greeter_client.js create mode 100644 examples/node/dynamic_codegen/greeter_server.js create mode 100644 examples/node/dynamic_codegen/route_guide/README.md create mode 100644 examples/node/dynamic_codegen/route_guide/route_guide_client.js create mode 100644 examples/node/dynamic_codegen/route_guide/route_guide_db.json create mode 100644 examples/node/dynamic_codegen/route_guide/route_guide_server.js create mode 100644 examples/node/package.json create mode 100644 examples/node/static_codegen/README.md create mode 100644 examples/node/static_codegen/greeter_client.js create mode 100644 examples/node/static_codegen/greeter_server.js create mode 100644 examples/node/static_codegen/helloworld_grpc_pb.js create mode 100644 examples/node/static_codegen/helloworld_pb.js create mode 100644 examples/node/static_codegen/route_guide/README.md create mode 100644 examples/node/static_codegen/route_guide/route_guide_client.js create mode 100644 examples/node/static_codegen/route_guide/route_guide_db.json create mode 100644 examples/node/static_codegen/route_guide/route_guide_grpc_pb.js create mode 100644 examples/node/static_codegen/route_guide/route_guide_pb.js create mode 100644 examples/node/static_codegen/route_guide/route_guide_server.js create mode 100644 examples/objective-c/BUILD create mode 100644 examples/objective-c/auth_sample/AuthSample.xcodeproj/project.pbxproj create mode 100644 examples/objective-c/auth_sample/AuthSample.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 examples/objective-c/auth_sample/AuthSample.xcodeproj/xcshareddata/xcschemes/AuthSample.xcscheme create mode 100644 examples/objective-c/auth_sample/AuthTestService.podspec create mode 100644 examples/objective-c/auth_sample/MakeRPCViewController.h create mode 100644 examples/objective-c/auth_sample/MakeRPCViewController.m create mode 100644 examples/objective-c/auth_sample/Misc/AppDelegate.h create mode 100644 examples/objective-c/auth_sample/Misc/AppDelegate.m create mode 100644 examples/objective-c/auth_sample/Misc/Base.lproj/Main.storyboard create mode 100644 examples/objective-c/auth_sample/Misc/GoogleService-Info.plist create mode 100644 examples/objective-c/auth_sample/Misc/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 examples/objective-c/auth_sample/Misc/Images.xcassets/first.imageset/Contents.json create mode 100644 examples/objective-c/auth_sample/Misc/Images.xcassets/first.imageset/first.pdf create mode 100644 examples/objective-c/auth_sample/Misc/Images.xcassets/second.imageset/Contents.json create mode 100644 examples/objective-c/auth_sample/Misc/Images.xcassets/second.imageset/second.pdf create mode 100644 examples/objective-c/auth_sample/Misc/Info.plist create mode 100644 examples/objective-c/auth_sample/Misc/main.m create mode 100644 examples/objective-c/auth_sample/Podfile create mode 100644 examples/objective-c/auth_sample/README.md create mode 100644 examples/objective-c/auth_sample/SelectUserViewController.h create mode 100644 examples/objective-c/auth_sample/SelectUserViewController.m create mode 100644 examples/objective-c/helloworld/HelloWorld.podspec create mode 100644 examples/objective-c/helloworld/HelloWorld.xcodeproj/project.pbxproj create mode 100644 examples/objective-c/helloworld/HelloWorld.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 examples/objective-c/helloworld/HelloWorld.xcodeproj/xcshareddata/xcschemes/HelloWorld.xcscheme create mode 100644 examples/objective-c/helloworld/HelloWorld/AppDelegate.h create mode 100644 examples/objective-c/helloworld/HelloWorld/AppDelegate.m create mode 100644 examples/objective-c/helloworld/HelloWorld/Base.lproj/Main.storyboard create mode 100644 examples/objective-c/helloworld/HelloWorld/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 examples/objective-c/helloworld/HelloWorld/Info.plist create mode 100644 examples/objective-c/helloworld/HelloWorld/ViewController.m create mode 100644 examples/objective-c/helloworld/Podfile create mode 100644 examples/objective-c/helloworld/README.md create mode 100644 examples/objective-c/helloworld/main.m create mode 100644 examples/objective-c/helloworld_macos/HelloWorld.podspec create mode 100644 examples/objective-c/helloworld_macos/HelloWorld.xcodeproj/project.pbxproj create mode 100644 examples/objective-c/helloworld_macos/HelloWorld/AppDelegate.h create mode 100644 examples/objective-c/helloworld_macos/HelloWorld/AppDelegate.m create mode 100644 examples/objective-c/helloworld_macos/HelloWorld/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 examples/objective-c/helloworld_macos/HelloWorld/Assets.xcassets/Contents.json create mode 100644 examples/objective-c/helloworld_macos/HelloWorld/Base.lproj/Main.storyboard create mode 100644 examples/objective-c/helloworld_macos/HelloWorld/HelloWorld.entitlements create mode 100644 examples/objective-c/helloworld_macos/HelloWorld/Info.plist create mode 100644 examples/objective-c/helloworld_macos/HelloWorld/ViewController.h create mode 100644 examples/objective-c/helloworld_macos/HelloWorld/ViewController.m create mode 100644 examples/objective-c/helloworld_macos/Podfile create mode 100644 examples/objective-c/helloworld_macos/README.md create mode 100644 examples/objective-c/helloworld_macos/main.m create mode 100644 examples/objective-c/route_guide/Misc/AppDelegate.h create mode 100644 examples/objective-c/route_guide/Misc/AppDelegate.m create mode 100644 examples/objective-c/route_guide/Misc/Base.lproj/Main.storyboard create mode 100644 examples/objective-c/route_guide/Misc/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 examples/objective-c/route_guide/Misc/Images.xcassets/first.imageset/Contents.json create mode 100644 examples/objective-c/route_guide/Misc/Images.xcassets/first.imageset/first.pdf create mode 100644 examples/objective-c/route_guide/Misc/Images.xcassets/second.imageset/Contents.json create mode 100644 examples/objective-c/route_guide/Misc/Images.xcassets/second.imageset/second.pdf create mode 100644 examples/objective-c/route_guide/Misc/Info.plist create mode 100644 examples/objective-c/route_guide/Misc/main.m create mode 100644 examples/objective-c/route_guide/Podfile create mode 100644 examples/objective-c/route_guide/README.md create mode 100644 examples/objective-c/route_guide/RouteGuide.podspec create mode 100644 examples/objective-c/route_guide/RouteGuideClient.xcodeproj/project.pbxproj create mode 100644 examples/objective-c/route_guide/RouteGuideClient.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 examples/objective-c/route_guide/RouteGuideClient.xcodeproj/xcshareddata/xcschemes/RouteGuideClient.xcscheme create mode 100644 examples/objective-c/route_guide/ViewControllers.m create mode 100644 examples/objective-c/route_guide/route_guide_db.json create mode 100644 examples/php/.gitignore create mode 100644 examples/php/README.md create mode 100644 examples/php/composer.json create mode 100644 examples/php/echo/README.md create mode 100644 examples/php/echo/apache.Dockerfile create mode 100644 examples/php/echo/base.Dockerfile create mode 100644 examples/php/echo/cli.Dockerfile create mode 100644 examples/php/echo/client.php create mode 100644 examples/php/echo/composer.json create mode 100644 examples/php/echo/echo.proto create mode 100644 examples/php/echo/fpm.Dockerfile create mode 100644 examples/php/echo/nginx.conf create mode 100644 examples/php/greeter_client.php create mode 100755 examples/php/greeter_proto_gen.sh create mode 100644 examples/php/route_guide/README.md create mode 100644 examples/php/route_guide/route_guide_client.php create mode 100755 examples/php/route_guide/route_guide_proto_gen.sh create mode 100755 examples/php/route_guide/run_route_guide_client.sh create mode 100755 examples/php/run_greeter_client.sh create mode 100644 examples/protos/README.md create mode 100644 examples/protos/auth_sample.proto create mode 100644 examples/protos/hellostreamingworld.proto create mode 100644 examples/protos/helloworld.proto create mode 100644 examples/protos/keyvaluestore.proto create mode 100644 examples/protos/route_guide.proto create mode 100644 examples/python/README.md create mode 100644 examples/python/auth/BUILD.bazel create mode 100644 examples/python/auth/README.md create mode 100644 examples/python/auth/_credentials.py create mode 100644 examples/python/auth/credentials/localhost.crt create mode 100644 examples/python/auth/credentials/localhost.key create mode 100644 examples/python/auth/credentials/root.crt create mode 100644 examples/python/auth/customized_auth_client.py create mode 100644 examples/python/auth/customized_auth_server.py create mode 100644 examples/python/auth/test/_auth_example_test.py create mode 100644 examples/python/cancellation/BUILD.bazel create mode 100644 examples/python/cancellation/README.md create mode 100644 examples/python/cancellation/client.py create mode 100644 examples/python/cancellation/hash_name.proto create mode 100644 examples/python/cancellation/search.py create mode 100644 examples/python/cancellation/server.py create mode 100644 examples/python/cancellation/test/_cancellation_example_test.py create mode 100644 examples/python/compression/BUILD.bazel create mode 100644 examples/python/compression/README.md create mode 100644 examples/python/compression/client.py create mode 100644 examples/python/compression/server.py create mode 100644 examples/python/compression/test/compression_example_test.py create mode 100644 examples/python/data_transmission/BUILD create mode 100644 examples/python/data_transmission/README.cn.md create mode 100644 examples/python/data_transmission/README.en.md create mode 100644 examples/python/data_transmission/alts_client.py create mode 100644 examples/python/data_transmission/alts_server.py create mode 100644 examples/python/data_transmission/client.py create mode 100644 examples/python/data_transmission/demo.proto create mode 100644 examples/python/data_transmission/demo_pb2.py create mode 100644 examples/python/data_transmission/demo_pb2_grpc.py create mode 100644 examples/python/data_transmission/server.py create mode 100644 examples/python/debug/BUILD.bazel create mode 100644 examples/python/debug/README.md create mode 100644 examples/python/debug/debug_server.py create mode 100644 examples/python/debug/get_stats.py create mode 100644 examples/python/debug/send_message.py create mode 100644 examples/python/debug/test/_debug_example_test.py create mode 100644 examples/python/errors/BUILD.bazel create mode 100644 examples/python/errors/README.md create mode 100644 examples/python/errors/client.py create mode 100644 examples/python/errors/server.py create mode 100644 examples/python/errors/test/_error_handling_example_test.py create mode 100644 examples/python/helloworld/.gitignore create mode 100644 examples/python/helloworld/README.md create mode 100644 examples/python/helloworld/greeter_client.py create mode 100644 examples/python/helloworld/greeter_client_with_options.py create mode 100644 examples/python/helloworld/greeter_server.py create mode 100644 examples/python/helloworld/greeter_server_with_reflection.py create mode 100644 examples/python/helloworld/helloworld_pb2.py create mode 100644 examples/python/helloworld/helloworld_pb2_grpc.py create mode 100644 examples/python/interceptors/default_value/default_value_client_interceptor.py create mode 100644 examples/python/interceptors/default_value/greeter_client.py create mode 100644 examples/python/interceptors/default_value/helloworld_pb2.py create mode 100644 examples/python/interceptors/default_value/helloworld_pb2_grpc.py create mode 100644 examples/python/interceptors/headers/generic_client_interceptor.py create mode 100644 examples/python/interceptors/headers/greeter_client.py create mode 100644 examples/python/interceptors/headers/greeter_server.py create mode 100644 examples/python/interceptors/headers/header_manipulator_client_interceptor.py create mode 100644 examples/python/interceptors/headers/helloworld_pb2.py create mode 100644 examples/python/interceptors/headers/helloworld_pb2_grpc.py create mode 100644 examples/python/interceptors/headers/request_header_validator_interceptor.py create mode 100644 examples/python/metadata/README.md create mode 100644 examples/python/metadata/helloworld_pb2.py create mode 100644 examples/python/metadata/helloworld_pb2_grpc.py create mode 100644 examples/python/metadata/metadata_client.py create mode 100644 examples/python/metadata/metadata_server.py create mode 100644 examples/python/multiplex/.gitignore create mode 100644 examples/python/multiplex/README.md create mode 100644 examples/python/multiplex/helloworld_pb2.py create mode 100644 examples/python/multiplex/helloworld_pb2_grpc.py create mode 100644 examples/python/multiplex/multiplex_client.py create mode 100644 examples/python/multiplex/multiplex_server.py create mode 100644 examples/python/multiplex/route_guide_db.json create mode 100644 examples/python/multiplex/route_guide_pb2.py create mode 100644 examples/python/multiplex/route_guide_pb2_grpc.py create mode 100644 examples/python/multiplex/route_guide_resources.py create mode 100644 examples/python/multiplex/run_codegen.py create mode 100644 examples/python/multiprocessing/BUILD create mode 100644 examples/python/multiprocessing/README.md create mode 100644 examples/python/multiprocessing/client.py create mode 100644 examples/python/multiprocessing/prime.proto create mode 100644 examples/python/multiprocessing/server.py create mode 100644 examples/python/multiprocessing/test/_multiprocessing_example_test.py create mode 100644 examples/python/route_guide/.gitignore create mode 100644 examples/python/route_guide/README.md create mode 100644 examples/python/route_guide/route_guide_client.py create mode 100644 examples/python/route_guide/route_guide_db.json create mode 100644 examples/python/route_guide/route_guide_pb2.py create mode 100644 examples/python/route_guide/route_guide_pb2_grpc.py create mode 100644 examples/python/route_guide/route_guide_resources.py create mode 100644 examples/python/route_guide/route_guide_server.py create mode 100644 examples/python/route_guide/run_codegen.py create mode 100644 examples/python/wait_for_ready/BUILD.bazel create mode 100644 examples/python/wait_for_ready/README.md create mode 100644 examples/python/wait_for_ready/test/_wait_for_ready_example_test.py create mode 100644 examples/python/wait_for_ready/wait_for_ready_example.py create mode 100644 examples/python/xds/README.md create mode 100644 examples/python/xds/client.py create mode 100644 examples/python/xds/helloworld_pb2.py create mode 100644 examples/python/xds/helloworld_pb2_grpc.py create mode 100644 examples/python/xds/requirements.txt create mode 100644 examples/python/xds/server.py create mode 100644 examples/ruby/.gitignore create mode 100644 examples/ruby/Gemfile create mode 100644 examples/ruby/README.md create mode 100644 examples/ruby/errors_and_cancellation/README.md create mode 100755 examples/ruby/errors_and_cancellation/error_examples_client.rb create mode 100755 examples/ruby/errors_and_cancellation/error_examples_server.rb create mode 100755 examples/ruby/greeter_client.rb create mode 100755 examples/ruby/greeter_server.rb create mode 100644 examples/ruby/grpc-demo.gemspec create mode 100644 examples/ruby/lib/helloworld_pb.rb create mode 100644 examples/ruby/lib/helloworld_services_pb.rb create mode 100644 examples/ruby/lib/route_guide_pb.rb create mode 100644 examples/ruby/lib/route_guide_services_pb.rb create mode 100644 examples/ruby/pubsub/.gitignore create mode 100644 examples/ruby/pubsub/Gemfile create mode 100644 examples/ruby/pubsub/google/protobuf/empty.rb create mode 100755 examples/ruby/pubsub/pubsub_demo.rb create mode 100644 examples/ruby/pubsub/tech/pubsub/proto/pubsub.rb create mode 100644 examples/ruby/pubsub/tech/pubsub/proto/pubsub_services.rb create mode 100644 examples/ruby/route_guide/README.md create mode 100755 examples/ruby/route_guide/route_guide_client.rb create mode 100755 examples/ruby/route_guide/route_guide_server.rb create mode 100644 examples/ruby/without_protobuf/README.md create mode 100755 examples/ruby/without_protobuf/echo_client.rb create mode 100755 examples/ruby/without_protobuf/echo_server.rb create mode 100644 examples/ruby/without_protobuf/echo_services_noprotobuf.rb create mode 100644 gRPC-C++.podspec create mode 100644 gRPC-Core.podspec create mode 100644 gRPC-ProtoRPC.podspec create mode 100644 gRPC-RxLibrary.podspec create mode 100644 gRPC.podspec create mode 100644 grpc.bzl create mode 100644 grpc.def create mode 100644 grpc.gemspec create mode 100644 grpc.gyp create mode 100644 include/grpc++/alarm.h create mode 100644 include/grpc++/channel.h create mode 100644 include/grpc++/client_context.h create mode 100644 include/grpc++/completion_queue.h create mode 100644 include/grpc++/create_channel.h create mode 100644 include/grpc++/create_channel_posix.h create mode 100644 include/grpc++/ext/health_check_service_server_builder_option.h create mode 100644 include/grpc++/ext/proto_server_reflection_plugin.h create mode 100644 include/grpc++/generic/async_generic_service.h create mode 100644 include/grpc++/generic/generic_stub.h create mode 100644 include/grpc++/grpc++.h create mode 100644 include/grpc++/health_check_service_interface.h create mode 100644 include/grpc++/impl/call.h create mode 100644 include/grpc++/impl/channel_argument_option.h create mode 100644 include/grpc++/impl/client_unary_call.h create mode 100644 include/grpc++/impl/codegen/async_stream.h create mode 100644 include/grpc++/impl/codegen/async_unary_call.h create mode 100644 include/grpc++/impl/codegen/byte_buffer.h create mode 100644 include/grpc++/impl/codegen/call.h create mode 100644 include/grpc++/impl/codegen/call_hook.h create mode 100644 include/grpc++/impl/codegen/channel_interface.h create mode 100644 include/grpc++/impl/codegen/client_context.h create mode 100644 include/grpc++/impl/codegen/client_unary_call.h create mode 100644 include/grpc++/impl/codegen/completion_queue.h create mode 100644 include/grpc++/impl/codegen/completion_queue_tag.h create mode 100644 include/grpc++/impl/codegen/config.h create mode 100644 include/grpc++/impl/codegen/config_protobuf.h create mode 100644 include/grpc++/impl/codegen/core_codegen.h create mode 100644 include/grpc++/impl/codegen/core_codegen_interface.h create mode 100644 include/grpc++/impl/codegen/create_auth_context.h create mode 100644 include/grpc++/impl/codegen/grpc_library.h create mode 100644 include/grpc++/impl/codegen/metadata_map.h create mode 100644 include/grpc++/impl/codegen/method_handler_impl.h create mode 100644 include/grpc++/impl/codegen/proto_utils.h create mode 100644 include/grpc++/impl/codegen/rpc_method.h create mode 100644 include/grpc++/impl/codegen/rpc_service_method.h create mode 100644 include/grpc++/impl/codegen/security/auth_context.h create mode 100644 include/grpc++/impl/codegen/serialization_traits.h create mode 100644 include/grpc++/impl/codegen/server_context.h create mode 100644 include/grpc++/impl/codegen/server_interface.h create mode 100644 include/grpc++/impl/codegen/service_type.h create mode 100644 include/grpc++/impl/codegen/slice.h create mode 100644 include/grpc++/impl/codegen/status.h create mode 100644 include/grpc++/impl/codegen/status_code_enum.h create mode 100644 include/grpc++/impl/codegen/string_ref.h create mode 100644 include/grpc++/impl/codegen/stub_options.h create mode 100644 include/grpc++/impl/codegen/sync_stream.h create mode 100644 include/grpc++/impl/codegen/time.h create mode 100644 include/grpc++/impl/grpc_library.h create mode 100644 include/grpc++/impl/method_handler_impl.h create mode 100644 include/grpc++/impl/rpc_method.h create mode 100644 include/grpc++/impl/rpc_service_method.h create mode 100644 include/grpc++/impl/serialization_traits.h create mode 100644 include/grpc++/impl/server_builder_option.h create mode 100644 include/grpc++/impl/server_builder_plugin.h create mode 100644 include/grpc++/impl/server_initializer.h create mode 100644 include/grpc++/impl/service_type.h create mode 100644 include/grpc++/resource_quota.h create mode 100644 include/grpc++/security/auth_context.h create mode 100644 include/grpc++/security/auth_metadata_processor.h create mode 100644 include/grpc++/security/credentials.h create mode 100644 include/grpc++/security/server_credentials.h create mode 100644 include/grpc++/server.h create mode 100644 include/grpc++/server_builder.h create mode 100644 include/grpc++/server_context.h create mode 100644 include/grpc++/server_posix.h create mode 100644 include/grpc++/support/async_stream.h create mode 100644 include/grpc++/support/async_unary_call.h create mode 100644 include/grpc++/support/byte_buffer.h create mode 100644 include/grpc++/support/channel_arguments.h create mode 100644 include/grpc++/support/config.h create mode 100644 include/grpc++/support/error_details.h create mode 100644 include/grpc++/support/slice.h create mode 100644 include/grpc++/support/status.h create mode 100644 include/grpc++/support/status_code_enum.h create mode 100644 include/grpc++/support/string_ref.h create mode 100644 include/grpc++/support/stub_options.h create mode 100644 include/grpc++/support/sync_stream.h create mode 100644 include/grpc++/support/time.h create mode 100644 include/grpc++/test/mock_stream.h create mode 100644 include/grpc++/test/server_context_test_spouse.h create mode 100644 include/grpc/byte_buffer.h create mode 100644 include/grpc/byte_buffer_reader.h create mode 100644 include/grpc/census.h create mode 100644 include/grpc/compression.h create mode 100644 include/grpc/fork.h create mode 100644 include/grpc/grpc.h create mode 100644 include/grpc/grpc_cronet.h create mode 100644 include/grpc/grpc_posix.h create mode 100644 include/grpc/grpc_security.h create mode 100644 include/grpc/grpc_security_constants.h create mode 100644 include/grpc/impl/codegen/atm.h create mode 100644 include/grpc/impl/codegen/atm_gcc_atomic.h create mode 100644 include/grpc/impl/codegen/atm_gcc_sync.h create mode 100644 include/grpc/impl/codegen/atm_windows.h create mode 100644 include/grpc/impl/codegen/byte_buffer.h create mode 100644 include/grpc/impl/codegen/byte_buffer_reader.h create mode 100644 include/grpc/impl/codegen/compression_types.h create mode 100644 include/grpc/impl/codegen/connectivity_state.h create mode 100644 include/grpc/impl/codegen/fork.h create mode 100644 include/grpc/impl/codegen/gpr_slice.h create mode 100644 include/grpc/impl/codegen/gpr_types.h create mode 100644 include/grpc/impl/codegen/grpc_types.h create mode 100644 include/grpc/impl/codegen/log.h create mode 100644 include/grpc/impl/codegen/port_platform.h create mode 100644 include/grpc/impl/codegen/propagation_bits.h create mode 100644 include/grpc/impl/codegen/slice.h create mode 100644 include/grpc/impl/codegen/status.h create mode 100644 include/grpc/impl/codegen/sync.h create mode 100644 include/grpc/impl/codegen/sync_abseil.h create mode 100644 include/grpc/impl/codegen/sync_custom.h create mode 100644 include/grpc/impl/codegen/sync_generic.h create mode 100644 include/grpc/impl/codegen/sync_posix.h create mode 100644 include/grpc/impl/codegen/sync_windows.h create mode 100644 include/grpc/load_reporting.h create mode 100644 include/grpc/module.modulemap create mode 100644 include/grpc/slice.h create mode 100644 include/grpc/slice_buffer.h create mode 100644 include/grpc/status.h create mode 100644 include/grpc/support/alloc.h create mode 100644 include/grpc/support/atm.h create mode 100644 include/grpc/support/atm_gcc_atomic.h create mode 100644 include/grpc/support/atm_gcc_sync.h create mode 100644 include/grpc/support/atm_windows.h create mode 100644 include/grpc/support/cpu.h create mode 100644 include/grpc/support/log.h create mode 100644 include/grpc/support/log_windows.h create mode 100644 include/grpc/support/port_platform.h create mode 100644 include/grpc/support/string_util.h create mode 100644 include/grpc/support/sync.h create mode 100644 include/grpc/support/sync_abseil.h create mode 100644 include/grpc/support/sync_custom.h create mode 100644 include/grpc/support/sync_generic.h create mode 100644 include/grpc/support/sync_posix.h create mode 100644 include/grpc/support/sync_windows.h create mode 100644 include/grpc/support/thd_id.h create mode 100644 include/grpc/support/time.h create mode 100644 include/grpc/support/workaround_list.h create mode 100644 include/grpcpp/alarm.h create mode 100644 include/grpcpp/alarm_impl.h create mode 100644 include/grpcpp/channel.h create mode 100644 include/grpcpp/channel_impl.h create mode 100644 include/grpcpp/client_context.h create mode 100644 include/grpcpp/completion_queue.h create mode 100644 include/grpcpp/completion_queue_impl.h create mode 100644 include/grpcpp/create_channel.h create mode 100644 include/grpcpp/create_channel_impl.h create mode 100644 include/grpcpp/create_channel_posix.h create mode 100644 include/grpcpp/create_channel_posix_impl.h create mode 100644 include/grpcpp/ext/channelz_service_plugin.h create mode 100644 include/grpcpp/ext/channelz_service_plugin_impl.h create mode 100644 include/grpcpp/ext/health_check_service_server_builder_option.h create mode 100644 include/grpcpp/ext/proto_server_reflection_plugin.h create mode 100644 include/grpcpp/ext/proto_server_reflection_plugin_impl.h create mode 100644 include/grpcpp/ext/server_load_reporting.h create mode 100644 include/grpcpp/ext/server_load_reporting_impl.h create mode 100644 include/grpcpp/generic/async_generic_service.h create mode 100644 include/grpcpp/generic/generic_stub.h create mode 100644 include/grpcpp/generic/generic_stub_impl.h create mode 100644 include/grpcpp/grpcpp.h create mode 100644 include/grpcpp/health_check_service_interface.h create mode 100644 include/grpcpp/health_check_service_interface_impl.h create mode 100644 include/grpcpp/impl/README.md create mode 100644 include/grpcpp/impl/call.h create mode 100644 include/grpcpp/impl/channel_argument_option.h create mode 100644 include/grpcpp/impl/client_unary_call.h create mode 100644 include/grpcpp/impl/codegen/async_generic_service.h create mode 100644 include/grpcpp/impl/codegen/async_stream.h create mode 100644 include/grpcpp/impl/codegen/async_stream_impl.h create mode 100644 include/grpcpp/impl/codegen/async_unary_call.h create mode 100644 include/grpcpp/impl/codegen/async_unary_call_impl.h create mode 100644 include/grpcpp/impl/codegen/byte_buffer.h create mode 100644 include/grpcpp/impl/codegen/call.h create mode 100644 include/grpcpp/impl/codegen/call_hook.h create mode 100644 include/grpcpp/impl/codegen/call_op_set.h create mode 100644 include/grpcpp/impl/codegen/call_op_set_interface.h create mode 100644 include/grpcpp/impl/codegen/callback_common.h create mode 100644 include/grpcpp/impl/codegen/channel_interface.h create mode 100644 include/grpcpp/impl/codegen/client_callback.h create mode 100644 include/grpcpp/impl/codegen/client_callback_impl.h create mode 100644 include/grpcpp/impl/codegen/client_context.h create mode 100644 include/grpcpp/impl/codegen/client_context_impl.h create mode 100644 include/grpcpp/impl/codegen/client_interceptor.h create mode 100644 include/grpcpp/impl/codegen/client_unary_call.h create mode 100644 include/grpcpp/impl/codegen/completion_queue.h create mode 100644 include/grpcpp/impl/codegen/completion_queue_impl.h create mode 100644 include/grpcpp/impl/codegen/completion_queue_tag.h create mode 100644 include/grpcpp/impl/codegen/config.h create mode 100644 include/grpcpp/impl/codegen/config_protobuf.h create mode 100644 include/grpcpp/impl/codegen/core_codegen.h create mode 100644 include/grpcpp/impl/codegen/core_codegen_interface.h create mode 100644 include/grpcpp/impl/codegen/create_auth_context.h create mode 100644 include/grpcpp/impl/codegen/delegating_channel.h create mode 100644 include/grpcpp/impl/codegen/grpc_library.h create mode 100644 include/grpcpp/impl/codegen/intercepted_channel.h create mode 100644 include/grpcpp/impl/codegen/interceptor.h create mode 100644 include/grpcpp/impl/codegen/interceptor_common.h create mode 100644 include/grpcpp/impl/codegen/message_allocator.h create mode 100644 include/grpcpp/impl/codegen/metadata_map.h create mode 100644 include/grpcpp/impl/codegen/method_handler.h create mode 100644 include/grpcpp/impl/codegen/method_handler_impl.h create mode 100644 include/grpcpp/impl/codegen/proto_buffer_reader.h create mode 100644 include/grpcpp/impl/codegen/proto_buffer_writer.h create mode 100644 include/grpcpp/impl/codegen/proto_utils.h create mode 100644 include/grpcpp/impl/codegen/rpc_method.h create mode 100644 include/grpcpp/impl/codegen/rpc_service_method.h create mode 100644 include/grpcpp/impl/codegen/security/auth_context.h create mode 100644 include/grpcpp/impl/codegen/serialization_traits.h create mode 100644 include/grpcpp/impl/codegen/server_callback.h create mode 100644 include/grpcpp/impl/codegen/server_callback_handlers.h create mode 100644 include/grpcpp/impl/codegen/server_callback_impl.h create mode 100644 include/grpcpp/impl/codegen/server_context.h create mode 100644 include/grpcpp/impl/codegen/server_context_impl.h create mode 100644 include/grpcpp/impl/codegen/server_interceptor.h create mode 100644 include/grpcpp/impl/codegen/server_interface.h create mode 100644 include/grpcpp/impl/codegen/service_type.h create mode 100644 include/grpcpp/impl/codegen/slice.h create mode 100644 include/grpcpp/impl/codegen/status.h create mode 100644 include/grpcpp/impl/codegen/status_code_enum.h create mode 100644 include/grpcpp/impl/codegen/string_ref.h create mode 100644 include/grpcpp/impl/codegen/stub_options.h create mode 100644 include/grpcpp/impl/codegen/sync.h create mode 100644 include/grpcpp/impl/codegen/sync_stream.h create mode 100644 include/grpcpp/impl/codegen/sync_stream_impl.h create mode 100644 include/grpcpp/impl/codegen/time.h create mode 100644 include/grpcpp/impl/grpc_library.h create mode 100644 include/grpcpp/impl/method_handler_impl.h create mode 100644 include/grpcpp/impl/rpc_method.h create mode 100644 include/grpcpp/impl/rpc_service_method.h create mode 100644 include/grpcpp/impl/serialization_traits.h create mode 100644 include/grpcpp/impl/server_builder_option.h create mode 100644 include/grpcpp/impl/server_builder_option_impl.h create mode 100644 include/grpcpp/impl/server_builder_plugin.h create mode 100644 include/grpcpp/impl/server_initializer.h create mode 100644 include/grpcpp/impl/server_initializer_impl.h create mode 100644 include/grpcpp/impl/service_type.h create mode 100644 include/grpcpp/opencensus.h create mode 100644 include/grpcpp/resource_quota.h create mode 100644 include/grpcpp/resource_quota_impl.h create mode 100644 include/grpcpp/security/alts_context.h create mode 100644 include/grpcpp/security/alts_util.h create mode 100644 include/grpcpp/security/auth_context.h create mode 100644 include/grpcpp/security/auth_metadata_processor.h create mode 100644 include/grpcpp/security/auth_metadata_processor_impl.h create mode 100644 include/grpcpp/security/credentials.h create mode 100644 include/grpcpp/security/credentials_impl.h create mode 100644 include/grpcpp/security/cronet_credentials.h create mode 100644 include/grpcpp/security/cronet_credentials_impl.h create mode 100644 include/grpcpp/security/server_credentials.h create mode 100644 include/grpcpp/security/server_credentials_impl.h create mode 100644 include/grpcpp/security/tls_credentials_options.h create mode 100644 include/grpcpp/server.h create mode 100644 include/grpcpp/server_builder.h create mode 100644 include/grpcpp/server_builder_impl.h create mode 100644 include/grpcpp/server_context.h create mode 100644 include/grpcpp/server_impl.h create mode 100644 include/grpcpp/server_posix.h create mode 100644 include/grpcpp/server_posix_impl.h create mode 100644 include/grpcpp/support/async_stream.h create mode 100644 include/grpcpp/support/async_stream_impl.h create mode 100644 include/grpcpp/support/async_unary_call.h create mode 100644 include/grpcpp/support/async_unary_call_impl.h create mode 100644 include/grpcpp/support/byte_buffer.h create mode 100644 include/grpcpp/support/channel_arguments.h create mode 100644 include/grpcpp/support/channel_arguments_impl.h create mode 100644 include/grpcpp/support/client_callback.h create mode 100644 include/grpcpp/support/client_callback_impl.h create mode 100644 include/grpcpp/support/client_interceptor.h create mode 100644 include/grpcpp/support/config.h create mode 100644 include/grpcpp/support/error_details.h create mode 100644 include/grpcpp/support/error_details_impl.h create mode 100644 include/grpcpp/support/interceptor.h create mode 100644 include/grpcpp/support/message_allocator.h create mode 100644 include/grpcpp/support/method_handler.h create mode 100644 include/grpcpp/support/proto_buffer_reader.h create mode 100644 include/grpcpp/support/proto_buffer_writer.h create mode 100644 include/grpcpp/support/server_callback.h create mode 100644 include/grpcpp/support/server_callback_impl.h create mode 100644 include/grpcpp/support/server_interceptor.h create mode 100644 include/grpcpp/support/slice.h create mode 100644 include/grpcpp/support/status.h create mode 100644 include/grpcpp/support/status_code_enum.h create mode 100644 include/grpcpp/support/string_ref.h create mode 100644 include/grpcpp/support/stub_options.h create mode 100644 include/grpcpp/support/sync_stream.h create mode 100644 include/grpcpp/support/sync_stream_impl.h create mode 100644 include/grpcpp/support/time.h create mode 100644 include/grpcpp/support/validate_service_config.h create mode 100644 include/grpcpp/test/channel_test_peer.h create mode 100644 include/grpcpp/test/default_reactor_test_peer.h create mode 100644 include/grpcpp/test/mock_stream.h create mode 100644 include/grpcpp/test/server_context_test_spouse.h create mode 100644 package.xml create mode 100644 requirements.bazel.txt create mode 100644 requirements.txt create mode 100644 setup.cfg create mode 100644 setup.py create mode 100755 src/abseil-cpp/gen_build_yaml.py create mode 100644 src/abseil-cpp/preprocessed_builds.yaml create mode 100755 src/abseil-cpp/preprocessed_builds.yaml.gen.py create mode 100644 src/android/test/interop/.gitignore create mode 100644 src/android/test/interop/README.md create mode 100644 src/android/test/interop/app/.gitignore create mode 100644 src/android/test/interop/app/CMakeLists.txt create mode 100644 src/android/test/interop/app/build.gradle create mode 100644 src/android/test/interop/app/proguard-rules.pro create mode 100644 src/android/test/interop/app/src/androidTest/java/io/grpc/interop/cpp/InteropTest.java create mode 100644 src/android/test/interop/app/src/main/AndroidManifest.xml create mode 100644 src/android/test/interop/app/src/main/cpp/grpc-interop.cc create mode 100644 src/android/test/interop/app/src/main/java/io/grpc/interop/cpp/InteropActivity.java create mode 100644 src/android/test/interop/app/src/main/res/layout/activity_interop.xml create mode 100644 src/android/test/interop/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/android/test/interop/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/android/test/interop/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/android/test/interop/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/android/test/interop/app/src/main/res/values/strings.xml create mode 100644 src/android/test/interop/build.gradle create mode 100644 src/android/test/interop/gradle.properties create mode 100644 src/android/test/interop/gradle/wrapper/gradle-wrapper.jar create mode 100644 src/android/test/interop/gradle/wrapper/gradle-wrapper.properties create mode 100755 src/android/test/interop/gradlew create mode 100644 src/android/test/interop/gradlew.bat create mode 100644 src/android/test/interop/settings.gradle create mode 100755 src/benchmark/gen_build_yaml.py create mode 100644 src/boringssl/boringssl_prefix_symbols.h create mode 100755 src/boringssl/gen_build_yaml.py create mode 100755 src/c-ares/gen_build_yaml.py create mode 100644 src/compiler/BUILD create mode 100644 src/compiler/README.md create mode 100644 src/compiler/config.h create mode 100644 src/compiler/config_protobuf.h create mode 100644 src/compiler/cpp_generator.cc create mode 100644 src/compiler/cpp_generator.h create mode 100644 src/compiler/cpp_generator_helpers.h create mode 100644 src/compiler/cpp_plugin.cc create mode 100644 src/compiler/cpp_plugin.h create mode 100644 src/compiler/csharp_generator.cc create mode 100644 src/compiler/csharp_generator.h create mode 100644 src/compiler/csharp_generator_helpers.h create mode 100644 src/compiler/csharp_plugin.cc create mode 100644 src/compiler/generator_helpers.h create mode 100644 src/compiler/node_generator.cc create mode 100644 src/compiler/node_generator.h create mode 100644 src/compiler/node_generator_helpers.h create mode 100644 src/compiler/node_plugin.cc create mode 100644 src/compiler/objective_c_generator.cc create mode 100644 src/compiler/objective_c_generator.h create mode 100644 src/compiler/objective_c_generator_helpers.h create mode 100644 src/compiler/objective_c_plugin.cc create mode 100644 src/compiler/php_generator.cc create mode 100644 src/compiler/php_generator.h create mode 100644 src/compiler/php_generator_helpers.h create mode 100644 src/compiler/php_plugin.cc create mode 100644 src/compiler/protobuf_plugin.h create mode 100644 src/compiler/python_generator.cc create mode 100644 src/compiler/python_generator.h create mode 100644 src/compiler/python_generator_helpers.h create mode 100644 src/compiler/python_plugin.cc create mode 100644 src/compiler/python_private_generator.h create mode 100644 src/compiler/ruby_generator.cc create mode 100644 src/compiler/ruby_generator.h create mode 100644 src/compiler/ruby_generator_helpers-inl.h create mode 100644 src/compiler/ruby_generator_map-inl.h create mode 100644 src/compiler/ruby_generator_string-inl.h create mode 100644 src/compiler/ruby_plugin.cc create mode 100644 src/compiler/schema_interface.h create mode 100644 src/core/README.md create mode 100644 src/core/ext/README.md create mode 100644 src/core/ext/filters/census/grpc_context.cc create mode 100644 src/core/ext/filters/client_channel/OWNERS create mode 100644 src/core/ext/filters/client_channel/README.md create mode 100644 src/core/ext/filters/client_channel/backend_metric.cc create mode 100644 src/core/ext/filters/client_channel/backend_metric.h create mode 100644 src/core/ext/filters/client_channel/backup_poller.cc create mode 100644 src/core/ext/filters/client_channel/backup_poller.h create mode 100644 src/core/ext/filters/client_channel/channel_connectivity.cc create mode 100644 src/core/ext/filters/client_channel/client_channel.cc create mode 100644 src/core/ext/filters/client_channel/client_channel.h create mode 100644 src/core/ext/filters/client_channel/client_channel_channelz.cc create mode 100644 src/core/ext/filters/client_channel/client_channel_channelz.h create mode 100644 src/core/ext/filters/client_channel/client_channel_factory.cc create mode 100644 src/core/ext/filters/client_channel/client_channel_factory.h create mode 100644 src/core/ext/filters/client_channel/client_channel_plugin.cc create mode 100644 src/core/ext/filters/client_channel/connector.h create mode 100644 src/core/ext/filters/client_channel/global_subchannel_pool.cc create mode 100644 src/core/ext/filters/client_channel/global_subchannel_pool.h create mode 100644 src/core/ext/filters/client_channel/health/health_check_client.cc create mode 100644 src/core/ext/filters/client_channel/health/health_check_client.h create mode 100644 src/core/ext/filters/client_channel/http_connect_handshaker.cc create mode 100644 src/core/ext/filters/client_channel/http_connect_handshaker.h create mode 100644 src/core/ext/filters/client_channel/http_proxy.cc create mode 100644 src/core/ext/filters/client_channel/http_proxy.h create mode 100644 src/core/ext/filters/client_channel/lb_policy.cc create mode 100644 src/core/ext/filters/client_channel/lb_policy.h create mode 100644 src/core/ext/filters/client_channel/lb_policy/address_filtering.cc create mode 100644 src/core/ext/filters/client_channel/lb_policy/address_filtering.h create mode 100644 src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc create mode 100644 src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h create mode 100644 src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc create mode 100644 src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h create mode 100644 src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc create mode 100644 src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h create mode 100644 src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc create mode 100644 src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h create mode 100644 src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.cc create mode 100644 src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h create mode 100644 src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc create mode 100644 src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc create mode 100644 src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h create mode 100644 src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc create mode 100644 src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h create mode 100644 src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc create mode 100644 src/core/ext/filters/client_channel/lb_policy/priority/priority.cc create mode 100644 src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc create mode 100644 src/core/ext/filters/client_channel/lb_policy/subchannel_list.h create mode 100644 src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc create mode 100644 src/core/ext/filters/client_channel/lb_policy/xds/cds.cc create mode 100644 src/core/ext/filters/client_channel/lb_policy/xds/eds.cc create mode 100644 src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc create mode 100644 src/core/ext/filters/client_channel/lb_policy/xds/xds.h create mode 100644 src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc create mode 100644 src/core/ext/filters/client_channel/lb_policy_factory.h create mode 100644 src/core/ext/filters/client_channel/lb_policy_registry.cc create mode 100644 src/core/ext/filters/client_channel/lb_policy_registry.h create mode 100644 src/core/ext/filters/client_channel/local_subchannel_pool.cc create mode 100644 src/core/ext/filters/client_channel/local_subchannel_pool.h create mode 100644 src/core/ext/filters/client_channel/parse_address.cc create mode 100644 src/core/ext/filters/client_channel/parse_address.h create mode 100644 src/core/ext/filters/client_channel/proxy_mapper.h create mode 100644 src/core/ext/filters/client_channel/proxy_mapper_registry.cc create mode 100644 src/core/ext/filters/client_channel/proxy_mapper_registry.h create mode 100644 src/core/ext/filters/client_channel/resolver.cc create mode 100644 src/core/ext/filters/client_channel/resolver.h create mode 100644 src/core/ext/filters/client_channel/resolver/README.md create mode 100644 src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc create mode 100644 src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc create mode 100644 src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h create mode 100644 src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc create mode 100644 src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc create mode 100644 src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc create mode 100644 src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc create mode 100644 src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h create mode 100644 src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc create mode 100644 src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc create mode 100644 src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc create mode 100644 src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc create mode 100644 src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc create mode 100644 src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h create mode 100644 src/core/ext/filters/client_channel/resolver/dns/native/README.md create mode 100644 src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc create mode 100644 src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc create mode 100644 src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h create mode 100644 src/core/ext/filters/client_channel/resolver/sockaddr/README.md create mode 100644 src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc create mode 100644 src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc create mode 100644 src/core/ext/filters/client_channel/resolver_factory.h create mode 100644 src/core/ext/filters/client_channel/resolver_registry.cc create mode 100644 src/core/ext/filters/client_channel/resolver_registry.h create mode 100644 src/core/ext/filters/client_channel/resolver_result_parsing.cc create mode 100644 src/core/ext/filters/client_channel/resolver_result_parsing.h create mode 100644 src/core/ext/filters/client_channel/resolving_lb_policy.cc create mode 100644 src/core/ext/filters/client_channel/resolving_lb_policy.h create mode 100644 src/core/ext/filters/client_channel/retry_throttle.cc create mode 100644 src/core/ext/filters/client_channel/retry_throttle.h create mode 100644 src/core/ext/filters/client_channel/server_address.cc create mode 100644 src/core/ext/filters/client_channel/server_address.h create mode 100644 src/core/ext/filters/client_channel/service_config.cc create mode 100644 src/core/ext/filters/client_channel/service_config.h create mode 100644 src/core/ext/filters/client_channel/service_config_call_data.h create mode 100644 src/core/ext/filters/client_channel/service_config_parser.cc create mode 100644 src/core/ext/filters/client_channel/service_config_parser.h create mode 100644 src/core/ext/filters/client_channel/subchannel.cc create mode 100644 src/core/ext/filters/client_channel/subchannel.h create mode 100644 src/core/ext/filters/client_channel/subchannel_interface.h create mode 100644 src/core/ext/filters/client_channel/subchannel_pool_interface.cc create mode 100644 src/core/ext/filters/client_channel/subchannel_pool_interface.h create mode 100644 src/core/ext/filters/client_channel/xds/xds_api.cc create mode 100644 src/core/ext/filters/client_channel/xds/xds_api.h create mode 100644 src/core/ext/filters/client_channel/xds/xds_bootstrap.cc create mode 100644 src/core/ext/filters/client_channel/xds/xds_bootstrap.h create mode 100644 src/core/ext/filters/client_channel/xds/xds_channel.cc create mode 100644 src/core/ext/filters/client_channel/xds/xds_channel.h create mode 100644 src/core/ext/filters/client_channel/xds/xds_channel_args.h create mode 100644 src/core/ext/filters/client_channel/xds/xds_channel_secure.cc create mode 100644 src/core/ext/filters/client_channel/xds/xds_client.cc create mode 100644 src/core/ext/filters/client_channel/xds/xds_client.h create mode 100644 src/core/ext/filters/client_channel/xds/xds_client_stats.cc create mode 100644 src/core/ext/filters/client_channel/xds/xds_client_stats.h create mode 100644 src/core/ext/filters/client_idle/client_idle_filter.cc create mode 100644 src/core/ext/filters/deadline/deadline_filter.cc create mode 100644 src/core/ext/filters/deadline/deadline_filter.h create mode 100644 src/core/ext/filters/http/client/http_client_filter.cc create mode 100644 src/core/ext/filters/http/client/http_client_filter.h create mode 100644 src/core/ext/filters/http/client_authority_filter.cc create mode 100644 src/core/ext/filters/http/client_authority_filter.h create mode 100644 src/core/ext/filters/http/http_filters_plugin.cc create mode 100644 src/core/ext/filters/http/message_compress/message_compress_filter.cc create mode 100644 src/core/ext/filters/http/message_compress/message_compress_filter.h create mode 100644 src/core/ext/filters/http/message_compress/message_decompress_filter.cc create mode 100644 src/core/ext/filters/http/message_compress/message_decompress_filter.h create mode 100644 src/core/ext/filters/http/server/http_server_filter.cc create mode 100644 src/core/ext/filters/http/server/http_server_filter.h create mode 100644 src/core/ext/filters/load_reporting/registered_opencensus_objects.h create mode 100644 src/core/ext/filters/load_reporting/server_load_reporting_filter.cc create mode 100644 src/core/ext/filters/load_reporting/server_load_reporting_filter.h create mode 100644 src/core/ext/filters/max_age/max_age_filter.cc create mode 100644 src/core/ext/filters/max_age/max_age_filter.h create mode 100644 src/core/ext/filters/message_size/message_size_filter.cc create mode 100644 src/core/ext/filters/message_size/message_size_filter.h create mode 100644 src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc create mode 100644 src/core/ext/filters/workarounds/workaround_cronet_compression_filter.h create mode 100644 src/core/ext/filters/workarounds/workaround_utils.cc create mode 100644 src/core/ext/filters/workarounds/workaround_utils.h create mode 100644 src/core/ext/transport/README.md create mode 100644 src/core/ext/transport/chttp2/README.md create mode 100644 src/core/ext/transport/chttp2/alpn/alpn.cc create mode 100644 src/core/ext/transport/chttp2/alpn/alpn.h create mode 100644 src/core/ext/transport/chttp2/client/authority.cc create mode 100644 src/core/ext/transport/chttp2/client/authority.h create mode 100644 src/core/ext/transport/chttp2/client/chttp2_connector.cc create mode 100644 src/core/ext/transport/chttp2/client/chttp2_connector.h create mode 100644 src/core/ext/transport/chttp2/client/insecure/README.md create mode 100644 src/core/ext/transport/chttp2/client/insecure/channel_create.cc create mode 100644 src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc create mode 100644 src/core/ext/transport/chttp2/client/secure/README.md create mode 100644 src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc create mode 100644 src/core/ext/transport/chttp2/server/chttp2_server.cc create mode 100644 src/core/ext/transport/chttp2/server/chttp2_server.h create mode 100644 src/core/ext/transport/chttp2/server/insecure/README.md create mode 100644 src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc create mode 100644 src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc create mode 100644 src/core/ext/transport/chttp2/server/secure/README.md create mode 100644 src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc create mode 100644 src/core/ext/transport/chttp2/transport/README.md create mode 100644 src/core/ext/transport/chttp2/transport/bin_decoder.cc create mode 100644 src/core/ext/transport/chttp2/transport/bin_decoder.h create mode 100644 src/core/ext/transport/chttp2/transport/bin_encoder.cc create mode 100644 src/core/ext/transport/chttp2/transport/bin_encoder.h create mode 100644 src/core/ext/transport/chttp2/transport/chttp2_plugin.cc create mode 100644 src/core/ext/transport/chttp2/transport/chttp2_transport.cc create mode 100644 src/core/ext/transport/chttp2/transport/chttp2_transport.h create mode 100644 src/core/ext/transport/chttp2/transport/context_list.cc create mode 100644 src/core/ext/transport/chttp2/transport/context_list.h create mode 100644 src/core/ext/transport/chttp2/transport/flow_control.cc create mode 100644 src/core/ext/transport/chttp2/transport/flow_control.h create mode 100644 src/core/ext/transport/chttp2/transport/frame.h create mode 100644 src/core/ext/transport/chttp2/transport/frame_data.cc create mode 100644 src/core/ext/transport/chttp2/transport/frame_data.h create mode 100644 src/core/ext/transport/chttp2/transport/frame_goaway.cc create mode 100644 src/core/ext/transport/chttp2/transport/frame_goaway.h create mode 100644 src/core/ext/transport/chttp2/transport/frame_ping.cc create mode 100644 src/core/ext/transport/chttp2/transport/frame_ping.h create mode 100644 src/core/ext/transport/chttp2/transport/frame_rst_stream.cc create mode 100644 src/core/ext/transport/chttp2/transport/frame_rst_stream.h create mode 100644 src/core/ext/transport/chttp2/transport/frame_settings.cc create mode 100644 src/core/ext/transport/chttp2/transport/frame_settings.h create mode 100644 src/core/ext/transport/chttp2/transport/frame_window_update.cc create mode 100644 src/core/ext/transport/chttp2/transport/frame_window_update.h create mode 100644 src/core/ext/transport/chttp2/transport/hpack_encoder.cc create mode 100644 src/core/ext/transport/chttp2/transport/hpack_encoder.h create mode 100644 src/core/ext/transport/chttp2/transport/hpack_parser.cc create mode 100644 src/core/ext/transport/chttp2/transport/hpack_parser.h create mode 100644 src/core/ext/transport/chttp2/transport/hpack_table.cc create mode 100644 src/core/ext/transport/chttp2/transport/hpack_table.h create mode 100644 src/core/ext/transport/chttp2/transport/hpack_tables.txt create mode 100644 src/core/ext/transport/chttp2/transport/http2_settings.cc create mode 100644 src/core/ext/transport/chttp2/transport/http2_settings.h create mode 100644 src/core/ext/transport/chttp2/transport/huffsyms.cc create mode 100644 src/core/ext/transport/chttp2/transport/huffsyms.h create mode 100644 src/core/ext/transport/chttp2/transport/incoming_metadata.cc create mode 100644 src/core/ext/transport/chttp2/transport/incoming_metadata.h create mode 100644 src/core/ext/transport/chttp2/transport/internal.h create mode 100644 src/core/ext/transport/chttp2/transport/parsing.cc create mode 100644 src/core/ext/transport/chttp2/transport/stream_lists.cc create mode 100644 src/core/ext/transport/chttp2/transport/stream_map.cc create mode 100644 src/core/ext/transport/chttp2/transport/stream_map.h create mode 100644 src/core/ext/transport/chttp2/transport/varint.cc create mode 100644 src/core/ext/transport/chttp2/transport/varint.h create mode 100644 src/core/ext/transport/chttp2/transport/writing.cc create mode 100644 src/core/ext/transport/cronet/BUILD create mode 100644 src/core/ext/transport/cronet/client/secure/cronet_channel_create.cc create mode 100644 src/core/ext/transport/cronet/client/secure/cronet_channel_create.h create mode 100644 src/core/ext/transport/cronet/plugin_registry/grpc_cronet_plugin_registry.cc create mode 100644 src/core/ext/transport/cronet/transport/cronet_api_dummy.cc create mode 100644 src/core/ext/transport/cronet/transport/cronet_transport.cc create mode 100644 src/core/ext/transport/cronet/transport/cronet_transport.h create mode 100644 src/core/ext/transport/inproc/inproc_plugin.cc create mode 100644 src/core/ext/transport/inproc/inproc_transport.cc create mode 100644 src/core/ext/transport/inproc/inproc_transport.h create mode 100644 src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c create mode 100644 src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h create mode 100644 src/core/ext/upb-generated/envoy/annotations/resource.upb.c create mode 100644 src/core/ext/upb-generated/envoy/annotations/resource.upb.h create mode 100644 src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c create mode 100644 src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h create mode 100644 src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c create mode 100644 src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h create mode 100644 src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c create mode 100644 src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h create mode 100644 src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c create mode 100644 src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h create mode 100644 src/core/ext/upb-generated/envoy/api/v2/cds.upb.c create mode 100644 src/core/ext/upb-generated/envoy/api/v2/cds.upb.h create mode 100644 src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c create mode 100644 src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h create mode 100644 src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c create mode 100644 src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h create mode 100644 src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c create mode 100644 src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h create mode 100644 src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c create mode 100644 src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h create mode 100644 src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c create mode 100644 src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h create mode 100644 src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c create mode 100644 src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h create mode 100644 src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c create mode 100644 src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h create mode 100644 src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c create mode 100644 src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h create mode 100644 src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c create mode 100644 src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h create mode 100644 src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c create mode 100644 src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h create mode 100644 src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c create mode 100644 src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h create mode 100644 src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c create mode 100644 src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h create mode 100644 src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c create mode 100644 src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h create mode 100644 src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c create mode 100644 src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h create mode 100644 src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c create mode 100644 src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h create mode 100644 src/core/ext/upb-generated/envoy/api/v2/eds.upb.c create mode 100644 src/core/ext/upb-generated/envoy/api/v2/eds.upb.h create mode 100644 src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c create mode 100644 src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h create mode 100644 src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c create mode 100644 src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.h create mode 100644 src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c create mode 100644 src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h create mode 100644 src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c create mode 100644 src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.h create mode 100644 src/core/ext/upb-generated/envoy/api/v2/lds.upb.c create mode 100644 src/core/ext/upb-generated/envoy/api/v2/lds.upb.h create mode 100644 src/core/ext/upb-generated/envoy/api/v2/listener.upb.c create mode 100644 src/core/ext/upb-generated/envoy/api/v2/listener.upb.h create mode 100644 src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c create mode 100644 src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.h create mode 100644 src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c create mode 100644 src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.h create mode 100644 src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c create mode 100644 src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.h create mode 100644 src/core/ext/upb-generated/envoy/api/v2/rds.upb.c create mode 100644 src/core/ext/upb-generated/envoy/api/v2/rds.upb.h create mode 100644 src/core/ext/upb-generated/envoy/api/v2/route.upb.c create mode 100644 src/core/ext/upb-generated/envoy/api/v2/route.upb.h create mode 100644 src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c create mode 100644 src/core/ext/upb-generated/envoy/api/v2/route/route.upb.h create mode 100644 src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c create mode 100644 src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h create mode 100644 src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c create mode 100644 src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.h create mode 100644 src/core/ext/upb-generated/envoy/api/v2/srds.upb.c create mode 100644 src/core/ext/upb-generated/envoy/api/v2/srds.upb.h create mode 100644 src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c create mode 100644 src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h create mode 100644 src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c create mode 100644 src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h create mode 100644 src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c create mode 100644 src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h create mode 100644 src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c create mode 100644 src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h create mode 100644 src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c create mode 100644 src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h create mode 100644 src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c create mode 100644 src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h create mode 100644 src/core/ext/upb-generated/envoy/type/http.upb.c create mode 100644 src/core/ext/upb-generated/envoy/type/http.upb.h create mode 100644 src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c create mode 100644 src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h create mode 100644 src/core/ext/upb-generated/envoy/type/matcher/string.upb.c create mode 100644 src/core/ext/upb-generated/envoy/type/matcher/string.upb.h create mode 100644 src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c create mode 100644 src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.h create mode 100644 src/core/ext/upb-generated/envoy/type/percent.upb.c create mode 100644 src/core/ext/upb-generated/envoy/type/percent.upb.h create mode 100644 src/core/ext/upb-generated/envoy/type/range.upb.c create mode 100644 src/core/ext/upb-generated/envoy/type/range.upb.h create mode 100644 src/core/ext/upb-generated/envoy/type/semantic_version.upb.c create mode 100644 src/core/ext/upb-generated/envoy/type/semantic_version.upb.h create mode 100644 src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c create mode 100644 src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.h create mode 100644 src/core/ext/upb-generated/gogoproto/gogo.upb.c create mode 100644 src/core/ext/upb-generated/gogoproto/gogo.upb.h create mode 100644 src/core/ext/upb-generated/google/api/annotations.upb.c create mode 100644 src/core/ext/upb-generated/google/api/annotations.upb.h create mode 100644 src/core/ext/upb-generated/google/api/http.upb.c create mode 100644 src/core/ext/upb-generated/google/api/http.upb.h create mode 100644 src/core/ext/upb-generated/google/protobuf/any.upb.c create mode 100644 src/core/ext/upb-generated/google/protobuf/any.upb.h create mode 100644 src/core/ext/upb-generated/google/protobuf/descriptor.upb.c create mode 100644 src/core/ext/upb-generated/google/protobuf/descriptor.upb.h create mode 100644 src/core/ext/upb-generated/google/protobuf/duration.upb.c create mode 100644 src/core/ext/upb-generated/google/protobuf/duration.upb.h create mode 100644 src/core/ext/upb-generated/google/protobuf/empty.upb.c create mode 100644 src/core/ext/upb-generated/google/protobuf/empty.upb.h create mode 100644 src/core/ext/upb-generated/google/protobuf/struct.upb.c create mode 100644 src/core/ext/upb-generated/google/protobuf/struct.upb.h create mode 100644 src/core/ext/upb-generated/google/protobuf/timestamp.upb.c create mode 100644 src/core/ext/upb-generated/google/protobuf/timestamp.upb.h create mode 100644 src/core/ext/upb-generated/google/protobuf/wrappers.upb.c create mode 100644 src/core/ext/upb-generated/google/protobuf/wrappers.upb.h create mode 100644 src/core/ext/upb-generated/google/rpc/status.upb.c create mode 100644 src/core/ext/upb-generated/google/rpc/status.upb.h create mode 100644 src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c create mode 100644 src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h create mode 100644 src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c create mode 100644 src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h create mode 100644 src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c create mode 100644 src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h create mode 100644 src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c create mode 100644 src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h create mode 100644 src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c create mode 100644 src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h create mode 100644 src/core/ext/upb-generated/udpa/annotations/migrate.upb.c create mode 100644 src/core/ext/upb-generated/udpa/annotations/migrate.upb.h create mode 100644 src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c create mode 100644 src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h create mode 100644 src/core/ext/upb-generated/udpa/annotations/status.upb.c create mode 100644 src/core/ext/upb-generated/udpa/annotations/status.upb.h create mode 100644 src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c create mode 100644 src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h create mode 100644 src/core/ext/upb-generated/validate/validate.upb.c create mode 100644 src/core/ext/upb-generated/validate/validate.upb.h create mode 100644 src/core/lib/README.md create mode 100644 src/core/lib/avl/avl.cc create mode 100644 src/core/lib/avl/avl.h create mode 100644 src/core/lib/backoff/backoff.cc create mode 100644 src/core/lib/backoff/backoff.h create mode 100644 src/core/lib/channel/README.md create mode 100644 src/core/lib/channel/channel_args.cc create mode 100644 src/core/lib/channel/channel_args.h create mode 100644 src/core/lib/channel/channel_stack.cc create mode 100644 src/core/lib/channel/channel_stack.h create mode 100644 src/core/lib/channel/channel_stack_builder.cc create mode 100644 src/core/lib/channel/channel_stack_builder.h create mode 100644 src/core/lib/channel/channel_trace.cc create mode 100644 src/core/lib/channel/channel_trace.h create mode 100644 src/core/lib/channel/channelz.cc create mode 100644 src/core/lib/channel/channelz.h create mode 100644 src/core/lib/channel/channelz_registry.cc create mode 100644 src/core/lib/channel/channelz_registry.h create mode 100644 src/core/lib/channel/connected_channel.cc create mode 100644 src/core/lib/channel/connected_channel.h create mode 100644 src/core/lib/channel/context.h create mode 100644 src/core/lib/channel/handshaker.cc create mode 100644 src/core/lib/channel/handshaker.h create mode 100644 src/core/lib/channel/handshaker_factory.h create mode 100644 src/core/lib/channel/handshaker_registry.cc create mode 100644 src/core/lib/channel/handshaker_registry.h create mode 100644 src/core/lib/channel/status_util.cc create mode 100644 src/core/lib/channel/status_util.h create mode 100644 src/core/lib/compression/algorithm_metadata.h create mode 100644 src/core/lib/compression/compression.cc create mode 100644 src/core/lib/compression/compression_args.cc create mode 100644 src/core/lib/compression/compression_args.h create mode 100644 src/core/lib/compression/compression_internal.cc create mode 100644 src/core/lib/compression/compression_internal.h create mode 100644 src/core/lib/compression/message_compress.cc create mode 100644 src/core/lib/compression/message_compress.h create mode 100644 src/core/lib/compression/stream_compression.cc create mode 100644 src/core/lib/compression/stream_compression.h create mode 100644 src/core/lib/compression/stream_compression_gzip.cc create mode 100644 src/core/lib/compression/stream_compression_gzip.h create mode 100644 src/core/lib/compression/stream_compression_identity.cc create mode 100644 src/core/lib/compression/stream_compression_identity.h create mode 100644 src/core/lib/debug/stats.cc create mode 100644 src/core/lib/debug/stats.h create mode 100644 src/core/lib/debug/stats_data.cc create mode 100644 src/core/lib/debug/stats_data.h create mode 100644 src/core/lib/debug/stats_data.yaml create mode 100644 src/core/lib/debug/stats_data_bq_schema.sql create mode 100644 src/core/lib/debug/trace.cc create mode 100644 src/core/lib/debug/trace.h create mode 100644 src/core/lib/gpr/README.md create mode 100644 src/core/lib/gpr/alloc.cc create mode 100644 src/core/lib/gpr/alloc.h create mode 100644 src/core/lib/gpr/arena.h create mode 100644 src/core/lib/gpr/atm.cc create mode 100644 src/core/lib/gpr/cpu_iphone.cc create mode 100644 src/core/lib/gpr/cpu_linux.cc create mode 100644 src/core/lib/gpr/cpu_posix.cc create mode 100644 src/core/lib/gpr/cpu_windows.cc create mode 100644 src/core/lib/gpr/env.h create mode 100644 src/core/lib/gpr/env_linux.cc create mode 100644 src/core/lib/gpr/env_posix.cc create mode 100644 src/core/lib/gpr/env_windows.cc create mode 100644 src/core/lib/gpr/log.cc create mode 100644 src/core/lib/gpr/log_android.cc create mode 100644 src/core/lib/gpr/log_linux.cc create mode 100644 src/core/lib/gpr/log_posix.cc create mode 100644 src/core/lib/gpr/log_windows.cc create mode 100644 src/core/lib/gpr/murmur_hash.cc create mode 100644 src/core/lib/gpr/murmur_hash.h create mode 100644 src/core/lib/gpr/spinlock.h create mode 100644 src/core/lib/gpr/string.cc create mode 100644 src/core/lib/gpr/string.h create mode 100644 src/core/lib/gpr/string_posix.cc create mode 100644 src/core/lib/gpr/string_util_windows.cc create mode 100644 src/core/lib/gpr/string_windows.cc create mode 100644 src/core/lib/gpr/string_windows.h create mode 100644 src/core/lib/gpr/sync.cc create mode 100644 src/core/lib/gpr/sync_abseil.cc create mode 100644 src/core/lib/gpr/sync_posix.cc create mode 100644 src/core/lib/gpr/sync_windows.cc create mode 100644 src/core/lib/gpr/time.cc create mode 100644 src/core/lib/gpr/time_posix.cc create mode 100644 src/core/lib/gpr/time_precise.cc create mode 100644 src/core/lib/gpr/time_precise.h create mode 100644 src/core/lib/gpr/time_windows.cc create mode 100644 src/core/lib/gpr/tls.h create mode 100644 src/core/lib/gpr/tls_gcc.h create mode 100644 src/core/lib/gpr/tls_msvc.h create mode 100644 src/core/lib/gpr/tls_pthread.cc create mode 100644 src/core/lib/gpr/tls_pthread.h create mode 100644 src/core/lib/gpr/tmpfile.h create mode 100644 src/core/lib/gpr/tmpfile_msys.cc create mode 100644 src/core/lib/gpr/tmpfile_posix.cc create mode 100644 src/core/lib/gpr/tmpfile_windows.cc create mode 100644 src/core/lib/gpr/useful.h create mode 100644 src/core/lib/gpr/wrap_memcpy.cc create mode 100644 src/core/lib/gprpp/README.md create mode 100644 src/core/lib/gprpp/arena.cc create mode 100644 src/core/lib/gprpp/arena.h create mode 100644 src/core/lib/gprpp/atomic.h create mode 100644 src/core/lib/gprpp/debug_location.h create mode 100644 src/core/lib/gprpp/fork.cc create mode 100644 src/core/lib/gprpp/fork.h create mode 100644 src/core/lib/gprpp/global_config.h create mode 100644 src/core/lib/gprpp/global_config_custom.h create mode 100644 src/core/lib/gprpp/global_config_env.cc create mode 100644 src/core/lib/gprpp/global_config_env.h create mode 100644 src/core/lib/gprpp/global_config_generic.h create mode 100644 src/core/lib/gprpp/host_port.cc create mode 100644 src/core/lib/gprpp/host_port.h create mode 100644 src/core/lib/gprpp/manual_constructor.h create mode 100644 src/core/lib/gprpp/map.h create mode 100644 src/core/lib/gprpp/memory.h create mode 100644 src/core/lib/gprpp/mpscq.cc create mode 100644 src/core/lib/gprpp/mpscq.h create mode 100644 src/core/lib/gprpp/orphanable.h create mode 100644 src/core/lib/gprpp/ref_counted.h create mode 100644 src/core/lib/gprpp/ref_counted_ptr.h create mode 100644 src/core/lib/gprpp/sync.h create mode 100644 src/core/lib/gprpp/thd.h create mode 100644 src/core/lib/gprpp/thd_posix.cc create mode 100644 src/core/lib/gprpp/thd_windows.cc create mode 100644 src/core/lib/http/format_request.cc create mode 100644 src/core/lib/http/format_request.h create mode 100644 src/core/lib/http/httpcli.cc create mode 100644 src/core/lib/http/httpcli.h create mode 100644 src/core/lib/http/httpcli_security_connector.cc create mode 100644 src/core/lib/http/parser.cc create mode 100644 src/core/lib/http/parser.h create mode 100644 src/core/lib/iomgr/README.md create mode 100644 src/core/lib/iomgr/block_annotate.h create mode 100644 src/core/lib/iomgr/buffer_list.cc create mode 100644 src/core/lib/iomgr/buffer_list.h create mode 100644 src/core/lib/iomgr/call_combiner.cc create mode 100644 src/core/lib/iomgr/call_combiner.h create mode 100644 src/core/lib/iomgr/cfstream_handle.cc create mode 100644 src/core/lib/iomgr/cfstream_handle.h create mode 100644 src/core/lib/iomgr/closure.h create mode 100644 src/core/lib/iomgr/combiner.cc create mode 100644 src/core/lib/iomgr/combiner.h create mode 100644 src/core/lib/iomgr/dualstack_socket_posix.cc create mode 100644 src/core/lib/iomgr/dynamic_annotations.h create mode 100644 src/core/lib/iomgr/endpoint.cc create mode 100644 src/core/lib/iomgr/endpoint.h create mode 100644 src/core/lib/iomgr/endpoint_cfstream.cc create mode 100644 src/core/lib/iomgr/endpoint_cfstream.h create mode 100644 src/core/lib/iomgr/endpoint_pair.h create mode 100644 src/core/lib/iomgr/endpoint_pair_posix.cc create mode 100644 src/core/lib/iomgr/endpoint_pair_uv.cc create mode 100644 src/core/lib/iomgr/endpoint_pair_windows.cc create mode 100644 src/core/lib/iomgr/error.cc create mode 100644 src/core/lib/iomgr/error.h create mode 100644 src/core/lib/iomgr/error_cfstream.cc create mode 100644 src/core/lib/iomgr/error_cfstream.h create mode 100644 src/core/lib/iomgr/error_internal.h create mode 100644 src/core/lib/iomgr/ev_apple.cc create mode 100644 src/core/lib/iomgr/ev_apple.h create mode 100644 src/core/lib/iomgr/ev_epoll1_linux.cc create mode 100644 src/core/lib/iomgr/ev_epoll1_linux.h create mode 100644 src/core/lib/iomgr/ev_epollex_linux.cc create mode 100644 src/core/lib/iomgr/ev_epollex_linux.h create mode 100644 src/core/lib/iomgr/ev_poll_posix.cc create mode 100644 src/core/lib/iomgr/ev_poll_posix.h create mode 100644 src/core/lib/iomgr/ev_posix.cc create mode 100644 src/core/lib/iomgr/ev_posix.h create mode 100644 src/core/lib/iomgr/ev_windows.cc create mode 100644 src/core/lib/iomgr/exec_ctx.cc create mode 100644 src/core/lib/iomgr/exec_ctx.h create mode 100644 src/core/lib/iomgr/executor.cc create mode 100644 src/core/lib/iomgr/executor.h create mode 100644 src/core/lib/iomgr/executor/mpmcqueue.cc create mode 100644 src/core/lib/iomgr/executor/mpmcqueue.h create mode 100644 src/core/lib/iomgr/executor/threadpool.cc create mode 100644 src/core/lib/iomgr/executor/threadpool.h create mode 100644 src/core/lib/iomgr/fork_posix.cc create mode 100644 src/core/lib/iomgr/fork_windows.cc create mode 100644 src/core/lib/iomgr/gethostname.h create mode 100644 src/core/lib/iomgr/gethostname_fallback.cc create mode 100644 src/core/lib/iomgr/gethostname_host_name_max.cc create mode 100644 src/core/lib/iomgr/gethostname_sysconf.cc create mode 100644 src/core/lib/iomgr/grpc_if_nametoindex.h create mode 100644 src/core/lib/iomgr/grpc_if_nametoindex_posix.cc create mode 100644 src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc create mode 100644 src/core/lib/iomgr/internal_errqueue.cc create mode 100644 src/core/lib/iomgr/internal_errqueue.h create mode 100644 src/core/lib/iomgr/iocp_windows.cc create mode 100644 src/core/lib/iomgr/iocp_windows.h create mode 100644 src/core/lib/iomgr/iomgr.cc create mode 100644 src/core/lib/iomgr/iomgr.h create mode 100644 src/core/lib/iomgr/iomgr_custom.cc create mode 100644 src/core/lib/iomgr/iomgr_custom.h create mode 100644 src/core/lib/iomgr/iomgr_internal.cc create mode 100644 src/core/lib/iomgr/iomgr_internal.h create mode 100644 src/core/lib/iomgr/iomgr_posix.cc create mode 100644 src/core/lib/iomgr/iomgr_posix.h create mode 100644 src/core/lib/iomgr/iomgr_posix_cfstream.cc create mode 100644 src/core/lib/iomgr/iomgr_uv.cc create mode 100644 src/core/lib/iomgr/iomgr_windows.cc create mode 100644 src/core/lib/iomgr/is_epollexclusive_available.cc create mode 100644 src/core/lib/iomgr/is_epollexclusive_available.h create mode 100644 src/core/lib/iomgr/load_file.cc create mode 100644 src/core/lib/iomgr/load_file.h create mode 100644 src/core/lib/iomgr/lockfree_event.cc create mode 100644 src/core/lib/iomgr/lockfree_event.h create mode 100644 src/core/lib/iomgr/nameser.h create mode 100644 src/core/lib/iomgr/poller/eventmanager_interface.h create mode 100644 src/core/lib/iomgr/poller/eventmanager_libuv.cc create mode 100644 src/core/lib/iomgr/poller/eventmanager_libuv.h create mode 100644 src/core/lib/iomgr/polling_entity.cc create mode 100644 src/core/lib/iomgr/polling_entity.h create mode 100644 src/core/lib/iomgr/pollset.cc create mode 100644 src/core/lib/iomgr/pollset.h create mode 100644 src/core/lib/iomgr/pollset_custom.cc create mode 100644 src/core/lib/iomgr/pollset_custom.h create mode 100644 src/core/lib/iomgr/pollset_set.cc create mode 100644 src/core/lib/iomgr/pollset_set.h create mode 100644 src/core/lib/iomgr/pollset_set_custom.cc create mode 100644 src/core/lib/iomgr/pollset_set_custom.h create mode 100644 src/core/lib/iomgr/pollset_set_windows.cc create mode 100644 src/core/lib/iomgr/pollset_set_windows.h create mode 100644 src/core/lib/iomgr/pollset_uv.cc create mode 100644 src/core/lib/iomgr/pollset_uv.h create mode 100644 src/core/lib/iomgr/pollset_windows.cc create mode 100644 src/core/lib/iomgr/pollset_windows.h create mode 100644 src/core/lib/iomgr/port.h create mode 100644 src/core/lib/iomgr/python_util.h create mode 100644 src/core/lib/iomgr/resolve_address.cc create mode 100644 src/core/lib/iomgr/resolve_address.h create mode 100644 src/core/lib/iomgr/resolve_address_custom.cc create mode 100644 src/core/lib/iomgr/resolve_address_custom.h create mode 100644 src/core/lib/iomgr/resolve_address_posix.cc create mode 100644 src/core/lib/iomgr/resolve_address_windows.cc create mode 100644 src/core/lib/iomgr/resource_quota.cc create mode 100644 src/core/lib/iomgr/resource_quota.h create mode 100644 src/core/lib/iomgr/sockaddr.h create mode 100644 src/core/lib/iomgr/sockaddr_custom.h create mode 100644 src/core/lib/iomgr/sockaddr_posix.h create mode 100644 src/core/lib/iomgr/sockaddr_utils.cc create mode 100644 src/core/lib/iomgr/sockaddr_utils.h create mode 100644 src/core/lib/iomgr/sockaddr_windows.h create mode 100644 src/core/lib/iomgr/socket_factory_posix.cc create mode 100644 src/core/lib/iomgr/socket_factory_posix.h create mode 100644 src/core/lib/iomgr/socket_mutator.cc create mode 100644 src/core/lib/iomgr/socket_mutator.h create mode 100644 src/core/lib/iomgr/socket_utils.h create mode 100644 src/core/lib/iomgr/socket_utils_common_posix.cc create mode 100644 src/core/lib/iomgr/socket_utils_linux.cc create mode 100644 src/core/lib/iomgr/socket_utils_posix.cc create mode 100644 src/core/lib/iomgr/socket_utils_posix.h create mode 100644 src/core/lib/iomgr/socket_utils_uv.cc create mode 100644 src/core/lib/iomgr/socket_utils_windows.cc create mode 100644 src/core/lib/iomgr/socket_windows.cc create mode 100644 src/core/lib/iomgr/socket_windows.h create mode 100644 src/core/lib/iomgr/sys_epoll_wrapper.h create mode 100644 src/core/lib/iomgr/tcp_client.cc create mode 100644 src/core/lib/iomgr/tcp_client.h create mode 100644 src/core/lib/iomgr/tcp_client_cfstream.cc create mode 100644 src/core/lib/iomgr/tcp_client_custom.cc create mode 100644 src/core/lib/iomgr/tcp_client_posix.cc create mode 100644 src/core/lib/iomgr/tcp_client_posix.h create mode 100644 src/core/lib/iomgr/tcp_client_windows.cc create mode 100644 src/core/lib/iomgr/tcp_custom.cc create mode 100644 src/core/lib/iomgr/tcp_custom.h create mode 100644 src/core/lib/iomgr/tcp_posix.cc create mode 100644 src/core/lib/iomgr/tcp_posix.h create mode 100644 src/core/lib/iomgr/tcp_server.cc create mode 100644 src/core/lib/iomgr/tcp_server.h create mode 100644 src/core/lib/iomgr/tcp_server_custom.cc create mode 100644 src/core/lib/iomgr/tcp_server_posix.cc create mode 100644 src/core/lib/iomgr/tcp_server_utils_posix.h create mode 100644 src/core/lib/iomgr/tcp_server_utils_posix_common.cc create mode 100644 src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc create mode 100644 src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc create mode 100644 src/core/lib/iomgr/tcp_server_windows.cc create mode 100644 src/core/lib/iomgr/tcp_uv.cc create mode 100644 src/core/lib/iomgr/tcp_windows.cc create mode 100644 src/core/lib/iomgr/tcp_windows.h create mode 100644 src/core/lib/iomgr/time_averaged_stats.cc create mode 100644 src/core/lib/iomgr/time_averaged_stats.h create mode 100644 src/core/lib/iomgr/timer.cc create mode 100644 src/core/lib/iomgr/timer.h create mode 100644 src/core/lib/iomgr/timer_custom.cc create mode 100644 src/core/lib/iomgr/timer_custom.h create mode 100644 src/core/lib/iomgr/timer_generic.cc create mode 100644 src/core/lib/iomgr/timer_generic.h create mode 100644 src/core/lib/iomgr/timer_heap.cc create mode 100644 src/core/lib/iomgr/timer_heap.h create mode 100644 src/core/lib/iomgr/timer_manager.cc create mode 100644 src/core/lib/iomgr/timer_manager.h create mode 100644 src/core/lib/iomgr/timer_uv.cc create mode 100644 src/core/lib/iomgr/udp_server.cc create mode 100644 src/core/lib/iomgr/udp_server.h create mode 100644 src/core/lib/iomgr/unix_sockets_posix.cc create mode 100644 src/core/lib/iomgr/unix_sockets_posix.h create mode 100644 src/core/lib/iomgr/unix_sockets_posix_noop.cc create mode 100644 src/core/lib/iomgr/wakeup_fd_eventfd.cc create mode 100644 src/core/lib/iomgr/wakeup_fd_nospecial.cc create mode 100644 src/core/lib/iomgr/wakeup_fd_pipe.cc create mode 100644 src/core/lib/iomgr/wakeup_fd_pipe.h create mode 100644 src/core/lib/iomgr/wakeup_fd_posix.cc create mode 100644 src/core/lib/iomgr/wakeup_fd_posix.h create mode 100644 src/core/lib/iomgr/work_serializer.cc create mode 100644 src/core/lib/iomgr/work_serializer.h create mode 100644 src/core/lib/json/json.h create mode 100644 src/core/lib/json/json_reader.cc create mode 100644 src/core/lib/json/json_writer.cc create mode 100644 src/core/lib/profiling/basic_timers.cc create mode 100644 src/core/lib/profiling/stap_probes.d create mode 100644 src/core/lib/profiling/stap_timers.cc create mode 100644 src/core/lib/profiling/timers.h create mode 100644 src/core/lib/security/context/security_context.cc create mode 100644 src/core/lib/security/context/security_context.h create mode 100644 src/core/lib/security/credentials/alts/alts_credentials.cc create mode 100644 src/core/lib/security/credentials/alts/alts_credentials.h create mode 100644 src/core/lib/security/credentials/alts/check_gcp_environment.cc create mode 100644 src/core/lib/security/credentials/alts/check_gcp_environment.h create mode 100644 src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc create mode 100644 src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc create mode 100644 src/core/lib/security/credentials/alts/check_gcp_environment_windows.cc create mode 100644 src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc create mode 100644 src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc create mode 100644 src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h create mode 100644 src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc create mode 100644 src/core/lib/security/credentials/composite/composite_credentials.cc create mode 100644 src/core/lib/security/credentials/composite/composite_credentials.h create mode 100644 src/core/lib/security/credentials/credentials.cc create mode 100644 src/core/lib/security/credentials/credentials.h create mode 100644 src/core/lib/security/credentials/credentials_metadata.cc create mode 100644 src/core/lib/security/credentials/fake/fake_credentials.cc create mode 100644 src/core/lib/security/credentials/fake/fake_credentials.h create mode 100644 src/core/lib/security/credentials/google_default/credentials_generic.cc create mode 100644 src/core/lib/security/credentials/google_default/google_default_credentials.cc create mode 100644 src/core/lib/security/credentials/google_default/google_default_credentials.h create mode 100644 src/core/lib/security/credentials/iam/iam_credentials.cc create mode 100644 src/core/lib/security/credentials/iam/iam_credentials.h create mode 100644 src/core/lib/security/credentials/jwt/json_token.cc create mode 100644 src/core/lib/security/credentials/jwt/json_token.h create mode 100644 src/core/lib/security/credentials/jwt/jwt_credentials.cc create mode 100644 src/core/lib/security/credentials/jwt/jwt_credentials.h create mode 100644 src/core/lib/security/credentials/jwt/jwt_verifier.cc create mode 100644 src/core/lib/security/credentials/jwt/jwt_verifier.h create mode 100644 src/core/lib/security/credentials/local/local_credentials.cc create mode 100644 src/core/lib/security/credentials/local/local_credentials.h create mode 100644 src/core/lib/security/credentials/oauth2/oauth2_credentials.cc create mode 100644 src/core/lib/security/credentials/oauth2/oauth2_credentials.h create mode 100644 src/core/lib/security/credentials/plugin/plugin_credentials.cc create mode 100644 src/core/lib/security/credentials/plugin/plugin_credentials.h create mode 100644 src/core/lib/security/credentials/ssl/ssl_credentials.cc create mode 100644 src/core/lib/security/credentials/ssl/ssl_credentials.h create mode 100644 src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc create mode 100644 src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h create mode 100644 src/core/lib/security/credentials/tls/tls_credentials.cc create mode 100644 src/core/lib/security/credentials/tls/tls_credentials.h create mode 100644 src/core/lib/security/security_connector/alts/alts_security_connector.cc create mode 100644 src/core/lib/security/security_connector/alts/alts_security_connector.h create mode 100644 src/core/lib/security/security_connector/fake/fake_security_connector.cc create mode 100644 src/core/lib/security/security_connector/fake/fake_security_connector.h create mode 100644 src/core/lib/security/security_connector/load_system_roots.h create mode 100644 src/core/lib/security/security_connector/load_system_roots_fallback.cc create mode 100644 src/core/lib/security/security_connector/load_system_roots_linux.cc create mode 100644 src/core/lib/security/security_connector/load_system_roots_linux.h create mode 100644 src/core/lib/security/security_connector/local/local_security_connector.cc create mode 100644 src/core/lib/security/security_connector/local/local_security_connector.h create mode 100644 src/core/lib/security/security_connector/security_connector.cc create mode 100644 src/core/lib/security/security_connector/security_connector.h create mode 100644 src/core/lib/security/security_connector/ssl/ssl_security_connector.cc create mode 100644 src/core/lib/security/security_connector/ssl/ssl_security_connector.h create mode 100644 src/core/lib/security/security_connector/ssl_utils.cc create mode 100644 src/core/lib/security/security_connector/ssl_utils.h create mode 100644 src/core/lib/security/security_connector/ssl_utils_config.cc create mode 100644 src/core/lib/security/security_connector/ssl_utils_config.h create mode 100644 src/core/lib/security/security_connector/tls/tls_security_connector.cc create mode 100644 src/core/lib/security/security_connector/tls/tls_security_connector.h create mode 100644 src/core/lib/security/transport/auth_filters.h create mode 100644 src/core/lib/security/transport/client_auth_filter.cc create mode 100644 src/core/lib/security/transport/secure_endpoint.cc create mode 100644 src/core/lib/security/transport/secure_endpoint.h create mode 100644 src/core/lib/security/transport/security_handshaker.cc create mode 100644 src/core/lib/security/transport/security_handshaker.h create mode 100644 src/core/lib/security/transport/server_auth_filter.cc create mode 100644 src/core/lib/security/transport/target_authority_table.cc create mode 100644 src/core/lib/security/transport/target_authority_table.h create mode 100644 src/core/lib/security/transport/tsi_error.cc create mode 100644 src/core/lib/security/transport/tsi_error.h create mode 100644 src/core/lib/security/util/json_util.cc create mode 100644 src/core/lib/security/util/json_util.h create mode 100644 src/core/lib/slice/b64.cc create mode 100644 src/core/lib/slice/b64.h create mode 100644 src/core/lib/slice/percent_encoding.cc create mode 100644 src/core/lib/slice/percent_encoding.h create mode 100644 src/core/lib/slice/slice.cc create mode 100644 src/core/lib/slice/slice_buffer.cc create mode 100644 src/core/lib/slice/slice_hash_table.h create mode 100644 src/core/lib/slice/slice_intern.cc create mode 100644 src/core/lib/slice/slice_internal.h create mode 100644 src/core/lib/slice/slice_string_helpers.cc create mode 100644 src/core/lib/slice/slice_string_helpers.h create mode 100644 src/core/lib/slice/slice_traits.h create mode 100644 src/core/lib/slice/slice_utils.h create mode 100644 src/core/lib/slice/slice_weak_hash_table.h create mode 100644 src/core/lib/surface/README.md create mode 100644 src/core/lib/surface/api_trace.cc create mode 100644 src/core/lib/surface/api_trace.h create mode 100644 src/core/lib/surface/byte_buffer.cc create mode 100644 src/core/lib/surface/byte_buffer_reader.cc create mode 100644 src/core/lib/surface/call.cc create mode 100644 src/core/lib/surface/call.h create mode 100644 src/core/lib/surface/call_details.cc create mode 100644 src/core/lib/surface/call_log_batch.cc create mode 100644 src/core/lib/surface/call_test_only.h create mode 100644 src/core/lib/surface/channel.cc create mode 100644 src/core/lib/surface/channel.h create mode 100644 src/core/lib/surface/channel_init.cc create mode 100644 src/core/lib/surface/channel_init.h create mode 100644 src/core/lib/surface/channel_ping.cc create mode 100644 src/core/lib/surface/channel_stack_type.cc create mode 100644 src/core/lib/surface/channel_stack_type.h create mode 100644 src/core/lib/surface/completion_queue.cc create mode 100644 src/core/lib/surface/completion_queue.h create mode 100644 src/core/lib/surface/completion_queue_factory.cc create mode 100644 src/core/lib/surface/completion_queue_factory.h create mode 100644 src/core/lib/surface/event_string.cc create mode 100644 src/core/lib/surface/event_string.h create mode 100644 src/core/lib/surface/init.cc create mode 100644 src/core/lib/surface/init.h create mode 100644 src/core/lib/surface/init_secure.cc create mode 100644 src/core/lib/surface/init_unsecure.cc create mode 100644 src/core/lib/surface/lame_client.cc create mode 100644 src/core/lib/surface/lame_client.h create mode 100644 src/core/lib/surface/metadata_array.cc create mode 100644 src/core/lib/surface/server.cc create mode 100644 src/core/lib/surface/server.h create mode 100644 src/core/lib/surface/validate_metadata.cc create mode 100644 src/core/lib/surface/validate_metadata.h create mode 100644 src/core/lib/surface/version.cc create mode 100644 src/core/lib/transport/README.md create mode 100644 src/core/lib/transport/bdp_estimator.cc create mode 100644 src/core/lib/transport/bdp_estimator.h create mode 100644 src/core/lib/transport/byte_stream.cc create mode 100644 src/core/lib/transport/byte_stream.h create mode 100644 src/core/lib/transport/connectivity_state.cc create mode 100644 src/core/lib/transport/connectivity_state.h create mode 100644 src/core/lib/transport/error_utils.cc create mode 100644 src/core/lib/transport/error_utils.h create mode 100644 src/core/lib/transport/http2_errors.h create mode 100644 src/core/lib/transport/metadata.cc create mode 100644 src/core/lib/transport/metadata.h create mode 100644 src/core/lib/transport/metadata_batch.cc create mode 100644 src/core/lib/transport/metadata_batch.h create mode 100644 src/core/lib/transport/pid_controller.cc create mode 100644 src/core/lib/transport/pid_controller.h create mode 100644 src/core/lib/transport/static_metadata.cc create mode 100644 src/core/lib/transport/static_metadata.h create mode 100644 src/core/lib/transport/status_conversion.cc create mode 100644 src/core/lib/transport/status_conversion.h create mode 100644 src/core/lib/transport/status_metadata.cc create mode 100644 src/core/lib/transport/status_metadata.h create mode 100644 src/core/lib/transport/timeout_encoding.cc create mode 100644 src/core/lib/transport/timeout_encoding.h create mode 100644 src/core/lib/transport/transport.cc create mode 100644 src/core/lib/transport/transport.h create mode 100644 src/core/lib/transport/transport_impl.h create mode 100644 src/core/lib/transport/transport_op_string.cc create mode 100644 src/core/lib/uri/uri_parser.cc create mode 100644 src/core/lib/uri/uri_parser.h create mode 100644 src/core/plugin_registry/grpc_plugin_registry.cc create mode 100644 src/core/plugin_registry/grpc_unsecure_plugin_registry.cc create mode 100644 src/core/tsi/README.md create mode 100644 src/core/tsi/alts/crypt/aes_gcm.cc create mode 100644 src/core/tsi/alts/crypt/gsec.cc create mode 100644 src/core/tsi/alts/crypt/gsec.h create mode 100644 src/core/tsi/alts/frame_protector/alts_counter.cc create mode 100644 src/core/tsi/alts/frame_protector/alts_counter.h create mode 100644 src/core/tsi/alts/frame_protector/alts_crypter.cc create mode 100644 src/core/tsi/alts/frame_protector/alts_crypter.h create mode 100644 src/core/tsi/alts/frame_protector/alts_frame_protector.cc create mode 100644 src/core/tsi/alts/frame_protector/alts_frame_protector.h create mode 100644 src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.cc create mode 100644 src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.h create mode 100644 src/core/tsi/alts/frame_protector/alts_seal_privacy_integrity_crypter.cc create mode 100644 src/core/tsi/alts/frame_protector/alts_unseal_privacy_integrity_crypter.cc create mode 100644 src/core/tsi/alts/frame_protector/frame_handler.cc create mode 100644 src/core/tsi/alts/frame_protector/frame_handler.h create mode 100644 src/core/tsi/alts/handshaker/alts_handshaker_client.cc create mode 100644 src/core/tsi/alts/handshaker/alts_handshaker_client.h create mode 100644 src/core/tsi/alts/handshaker/alts_shared_resource.cc create mode 100644 src/core/tsi/alts/handshaker/alts_shared_resource.h create mode 100644 src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc create mode 100644 src/core/tsi/alts/handshaker/alts_tsi_handshaker.h create mode 100644 src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h create mode 100644 src/core/tsi/alts/handshaker/alts_tsi_utils.cc create mode 100644 src/core/tsi/alts/handshaker/alts_tsi_utils.h create mode 100644 src/core/tsi/alts/handshaker/proto/altscontext.proto create mode 100644 src/core/tsi/alts/handshaker/proto/handshaker.options create mode 100644 src/core/tsi/alts/handshaker/proto/handshaker.proto create mode 100644 src/core/tsi/alts/handshaker/proto/transport_security_common.proto create mode 100644 src/core/tsi/alts/handshaker/transport_security_common_api.cc create mode 100644 src/core/tsi/alts/handshaker/transport_security_common_api.h create mode 100644 src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc create mode 100644 src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.h create mode 100644 src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc create mode 100644 src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.h create mode 100644 src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol.h create mode 100644 src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc create mode 100644 src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h create mode 100644 src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc create mode 100644 src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.h create mode 100644 src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc create mode 100644 src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h create mode 100644 src/core/tsi/fake_transport_security.cc create mode 100644 src/core/tsi/fake_transport_security.h create mode 100644 src/core/tsi/local_transport_security.cc create mode 100644 src/core/tsi/local_transport_security.h create mode 100644 src/core/tsi/ssl/session_cache/ssl_session.h create mode 100644 src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc create mode 100644 src/core/tsi/ssl/session_cache/ssl_session_cache.cc create mode 100644 src/core/tsi/ssl/session_cache/ssl_session_cache.h create mode 100644 src/core/tsi/ssl/session_cache/ssl_session_openssl.cc create mode 100644 src/core/tsi/ssl_transport_security.cc create mode 100644 src/core/tsi/ssl_transport_security.h create mode 100644 src/core/tsi/ssl_types.h create mode 100644 src/core/tsi/test_creds/BUILD create mode 100644 src/core/tsi/test_creds/README create mode 100644 src/core/tsi/test_creds/badclient.key create mode 100644 src/core/tsi/test_creds/badclient.pem create mode 100644 src/core/tsi/test_creds/badserver.key create mode 100644 src/core/tsi/test_creds/badserver.pem create mode 100644 src/core/tsi/test_creds/ca-openssl.cnf create mode 100644 src/core/tsi/test_creds/ca.key create mode 100644 src/core/tsi/test_creds/ca.pem create mode 100644 src/core/tsi/test_creds/client.key create mode 100644 src/core/tsi/test_creds/client.pem create mode 100644 src/core/tsi/test_creds/multi-domain.key create mode 100644 src/core/tsi/test_creds/multi-domain.pem create mode 100644 src/core/tsi/test_creds/server0.key create mode 100644 src/core/tsi/test_creds/server0.pem create mode 100644 src/core/tsi/test_creds/server1-openssl.cnf create mode 100644 src/core/tsi/test_creds/server1.key create mode 100644 src/core/tsi/test_creds/server1.pem create mode 100644 src/core/tsi/transport_security.cc create mode 100644 src/core/tsi/transport_security.h create mode 100644 src/core/tsi/transport_security_grpc.cc create mode 100644 src/core/tsi/transport_security_grpc.h create mode 100644 src/core/tsi/transport_security_interface.h create mode 100644 src/cpp/Protobuf-C++.podspec create mode 100755 src/cpp/README.md create mode 100644 src/cpp/client/channel_cc.cc create mode 100644 src/cpp/client/channel_test_peer.cc create mode 100644 src/cpp/client/client_context.cc create mode 100644 src/cpp/client/client_interceptor.cc create mode 100644 src/cpp/client/create_channel.cc create mode 100644 src/cpp/client/create_channel_internal.cc create mode 100644 src/cpp/client/create_channel_internal.h create mode 100644 src/cpp/client/create_channel_posix.cc create mode 100644 src/cpp/client/credentials_cc.cc create mode 100644 src/cpp/client/cronet_credentials.cc create mode 100644 src/cpp/client/insecure_credentials.cc create mode 100644 src/cpp/client/secure_credentials.cc create mode 100644 src/cpp/client/secure_credentials.h create mode 100644 src/cpp/codegen/codegen_init.cc create mode 100644 src/cpp/common/alarm.cc create mode 100644 src/cpp/common/alts_context.cc create mode 100644 src/cpp/common/alts_util.cc create mode 100644 src/cpp/common/auth_property_iterator.cc create mode 100644 src/cpp/common/channel_arguments.cc create mode 100644 src/cpp/common/channel_filter.cc create mode 100644 src/cpp/common/channel_filter.h create mode 100644 src/cpp/common/completion_queue_cc.cc create mode 100644 src/cpp/common/core_codegen.cc create mode 100644 src/cpp/common/insecure_create_auth_context.cc create mode 100644 src/cpp/common/resource_quota_cc.cc create mode 100644 src/cpp/common/rpc_method.cc create mode 100644 src/cpp/common/secure_auth_context.cc create mode 100644 src/cpp/common/secure_auth_context.h create mode 100644 src/cpp/common/secure_channel_arguments.cc create mode 100644 src/cpp/common/secure_create_auth_context.cc create mode 100644 src/cpp/common/tls_credentials_options.cc create mode 100644 src/cpp/common/tls_credentials_options_util.cc create mode 100644 src/cpp/common/tls_credentials_options_util.h create mode 100644 src/cpp/common/validate_service_config.cc create mode 100644 src/cpp/common/version_cc.cc create mode 100644 src/cpp/ext/filters/census/channel_filter.cc create mode 100644 src/cpp/ext/filters/census/channel_filter.h create mode 100644 src/cpp/ext/filters/census/client_filter.cc create mode 100644 src/cpp/ext/filters/census/client_filter.h create mode 100644 src/cpp/ext/filters/census/context.cc create mode 100644 src/cpp/ext/filters/census/context.h create mode 100644 src/cpp/ext/filters/census/grpc_plugin.cc create mode 100644 src/cpp/ext/filters/census/grpc_plugin.h create mode 100644 src/cpp/ext/filters/census/measures.cc create mode 100644 src/cpp/ext/filters/census/measures.h create mode 100644 src/cpp/ext/filters/census/rpc_encoding.cc create mode 100644 src/cpp/ext/filters/census/rpc_encoding.h create mode 100644 src/cpp/ext/filters/census/server_filter.cc create mode 100644 src/cpp/ext/filters/census/server_filter.h create mode 100644 src/cpp/ext/filters/census/views.cc create mode 100644 src/cpp/ext/proto_server_reflection.cc create mode 100644 src/cpp/ext/proto_server_reflection.h create mode 100644 src/cpp/ext/proto_server_reflection_plugin.cc create mode 100644 src/cpp/server/async_generic_service.cc create mode 100644 src/cpp/server/channel_argument_option.cc create mode 100644 src/cpp/server/channelz/channelz_service.cc create mode 100644 src/cpp/server/channelz/channelz_service.h create mode 100644 src/cpp/server/channelz/channelz_service_plugin.cc create mode 100644 src/cpp/server/create_default_thread_pool.cc create mode 100644 src/cpp/server/dynamic_thread_pool.cc create mode 100644 src/cpp/server/dynamic_thread_pool.h create mode 100644 src/cpp/server/external_connection_acceptor_impl.cc create mode 100644 src/cpp/server/external_connection_acceptor_impl.h create mode 100644 src/cpp/server/health/default_health_check_service.cc create mode 100644 src/cpp/server/health/default_health_check_service.h create mode 100644 src/cpp/server/health/health_check_service.cc create mode 100644 src/cpp/server/health/health_check_service_server_builder_option.cc create mode 100644 src/cpp/server/insecure_server_credentials.cc create mode 100644 src/cpp/server/load_reporter/constants.h create mode 100644 src/cpp/server/load_reporter/get_cpu_stats.h create mode 100644 src/cpp/server/load_reporter/get_cpu_stats_linux.cc create mode 100644 src/cpp/server/load_reporter/get_cpu_stats_macos.cc create mode 100644 src/cpp/server/load_reporter/get_cpu_stats_unsupported.cc create mode 100644 src/cpp/server/load_reporter/get_cpu_stats_windows.cc create mode 100644 src/cpp/server/load_reporter/load_data_store.cc create mode 100644 src/cpp/server/load_reporter/load_data_store.h create mode 100644 src/cpp/server/load_reporter/load_reporter.cc create mode 100644 src/cpp/server/load_reporter/load_reporter.h create mode 100644 src/cpp/server/load_reporter/load_reporter_async_service_impl.cc create mode 100644 src/cpp/server/load_reporter/load_reporter_async_service_impl.h create mode 100644 src/cpp/server/load_reporter/load_reporting_service_server_builder_option.cc create mode 100644 src/cpp/server/load_reporter/load_reporting_service_server_builder_plugin.cc create mode 100644 src/cpp/server/load_reporter/load_reporting_service_server_builder_plugin.h create mode 100644 src/cpp/server/load_reporter/util.cc create mode 100644 src/cpp/server/secure_server_credentials.cc create mode 100644 src/cpp/server/secure_server_credentials.h create mode 100644 src/cpp/server/server_builder.cc create mode 100644 src/cpp/server/server_callback.cc create mode 100644 src/cpp/server/server_cc.cc create mode 100644 src/cpp/server/server_context.cc create mode 100644 src/cpp/server/server_credentials.cc create mode 100644 src/cpp/server/server_posix.cc create mode 100644 src/cpp/server/thread_pool_interface.h create mode 100644 src/cpp/thread_manager/thread_manager.cc create mode 100644 src/cpp/thread_manager/thread_manager.h create mode 100644 src/cpp/util/byte_buffer_cc.cc create mode 100644 src/cpp/util/core_stats.cc create mode 100644 src/cpp/util/core_stats.h create mode 100644 src/cpp/util/error_details.cc create mode 100644 src/cpp/util/status.cc create mode 100644 src/cpp/util/string_ref.cc create mode 100644 src/cpp/util/time_cc.cc create mode 100644 src/csharp/.editorconfig create mode 100644 src/csharp/.gitignore create mode 100644 src/csharp/BUILD-INTEGRATION.md create mode 100644 src/csharp/Directory.Build.props create mode 100644 src/csharp/Grpc.Auth/.gitignore create mode 100644 src/csharp/Grpc.Auth/GoogleAuthInterceptors.cs create mode 100644 src/csharp/Grpc.Auth/GoogleGrpcCredentials.cs create mode 100755 src/csharp/Grpc.Auth/Grpc.Auth.csproj create mode 100644 src/csharp/Grpc.Auth/Properties/AssemblyInfo.cs create mode 100644 src/csharp/Grpc.Core.Api/.gitignore create mode 100644 src/csharp/Grpc.Core.Api/AsyncAuthInterceptor.cs create mode 100644 src/csharp/Grpc.Core.Api/AsyncCallState.cs create mode 100644 src/csharp/Grpc.Core.Api/AsyncClientStreamingCall.cs create mode 100644 src/csharp/Grpc.Core.Api/AsyncDuplexStreamingCall.cs create mode 100644 src/csharp/Grpc.Core.Api/AsyncServerStreamingCall.cs create mode 100644 src/csharp/Grpc.Core.Api/AsyncStreamReaderExtensions.cs create mode 100644 src/csharp/Grpc.Core.Api/AsyncUnaryCall.cs create mode 100644 src/csharp/Grpc.Core.Api/AuthContext.cs create mode 100644 src/csharp/Grpc.Core.Api/AuthProperty.cs create mode 100644 src/csharp/Grpc.Core.Api/BindServiceMethodAttribute.cs create mode 100644 src/csharp/Grpc.Core.Api/CallCredentials.cs create mode 100644 src/csharp/Grpc.Core.Api/CallCredentialsConfiguratorBase.cs create mode 100644 src/csharp/Grpc.Core.Api/CallFlags.cs create mode 100644 src/csharp/Grpc.Core.Api/CallInvoker.cs create mode 100644 src/csharp/Grpc.Core.Api/CallOptions.cs create mode 100644 src/csharp/Grpc.Core.Api/ChannelBase.cs create mode 100644 src/csharp/Grpc.Core.Api/ChannelCredentials.cs create mode 100644 src/csharp/Grpc.Core.Api/ChannelCredentialsConfiguratorBase.cs create mode 100644 src/csharp/Grpc.Core.Api/ClientBase.cs create mode 100644 src/csharp/Grpc.Core.Api/ContextPropagationOptions.cs create mode 100644 src/csharp/Grpc.Core.Api/ContextPropagationToken.cs create mode 100644 src/csharp/Grpc.Core.Api/DeserializationContext.cs create mode 100755 src/csharp/Grpc.Core.Api/Grpc.Core.Api.csproj create mode 100644 src/csharp/Grpc.Core.Api/IAsyncStreamReader.cs create mode 100644 src/csharp/Grpc.Core.Api/IAsyncStreamWriter.cs create mode 100644 src/csharp/Grpc.Core.Api/IClientStreamWriter.cs create mode 100644 src/csharp/Grpc.Core.Api/IServerStreamWriter.cs create mode 100644 src/csharp/Grpc.Core.Api/Interceptors/CallInvokerExtensions.cs create mode 100644 src/csharp/Grpc.Core.Api/Interceptors/ChannelExtensions.cs create mode 100644 src/csharp/Grpc.Core.Api/Interceptors/ClientInterceptorContext.cs create mode 100644 src/csharp/Grpc.Core.Api/Interceptors/InterceptingCallInvoker.cs create mode 100644 src/csharp/Grpc.Core.Api/Interceptors/Interceptor.cs create mode 100644 src/csharp/Grpc.Core.Api/Internal/UnimplementedCallInvoker.cs create mode 100644 src/csharp/Grpc.Core.Api/KeyCertificatePair.cs create mode 100644 src/csharp/Grpc.Core.Api/Marshaller.cs create mode 100644 src/csharp/Grpc.Core.Api/Metadata.cs create mode 100644 src/csharp/Grpc.Core.Api/Method.cs create mode 100644 src/csharp/Grpc.Core.Api/Properties/AssemblyInfo.cs create mode 100644 src/csharp/Grpc.Core.Api/RpcException.cs create mode 100644 src/csharp/Grpc.Core.Api/SerializationContext.cs create mode 100644 src/csharp/Grpc.Core.Api/ServerCallContext.cs create mode 100644 src/csharp/Grpc.Core.Api/ServerMethods.cs create mode 100644 src/csharp/Grpc.Core.Api/ServerServiceDefinition.cs create mode 100644 src/csharp/Grpc.Core.Api/ServiceBinderBase.cs create mode 100644 src/csharp/Grpc.Core.Api/SslCredentials.cs create mode 100644 src/csharp/Grpc.Core.Api/Status.cs create mode 100644 src/csharp/Grpc.Core.Api/StatusCode.cs create mode 100644 src/csharp/Grpc.Core.Api/Utils/EncodingExtensions.cs create mode 100644 src/csharp/Grpc.Core.Api/Utils/GrpcPreconditions.cs create mode 100644 src/csharp/Grpc.Core.Api/VerifyPeerContext.cs create mode 100644 src/csharp/Grpc.Core.Api/Version.cs create mode 100644 src/csharp/Grpc.Core.Api/VersionInfo.cs create mode 100644 src/csharp/Grpc.Core.Api/WriteOptions.cs create mode 100644 src/csharp/Grpc.Core.NativeDebug/.gitignore create mode 100644 src/csharp/Grpc.Core.NativeDebug/Grpc.Core.NativeDebug.csproj create mode 100644 src/csharp/Grpc.Core.Testing/.gitignore create mode 100755 src/csharp/Grpc.Core.Testing/Grpc.Core.Testing.csproj create mode 100644 src/csharp/Grpc.Core.Testing/Properties/AssemblyInfo.cs create mode 100644 src/csharp/Grpc.Core.Testing/Settings.StyleCop create mode 100644 src/csharp/Grpc.Core.Testing/TestCalls.cs create mode 100644 src/csharp/Grpc.Core.Testing/TestServerCallContext.cs create mode 100644 src/csharp/Grpc.Core.Tests/.gitignore create mode 100644 src/csharp/Grpc.Core.Tests/AppDomainUnloadTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/AuthContextTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/AuthPropertyTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/CallCancellationTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/CallCredentialsTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/CallOptionsTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/ChannelConnectivityTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/ChannelCredentialsTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/ChannelOptionsTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/ChannelTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/ClientServerTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/CompressionTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/ContextPropagationTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/ContextualMarshallerTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/FakeCredentials.cs create mode 100755 src/csharp/Grpc.Core.Tests/Grpc.Core.Tests.csproj create mode 100644 src/csharp/Grpc.Core.Tests/GrpcEnvironmentTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/HalfcloseTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/Interceptors/ClientInterceptorTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/Interceptors/ServerInterceptorTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/Internal/AsyncCallServerTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/Internal/AsyncCallStateTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/Internal/AsyncCallTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/Internal/ChannelArgsSafeHandleTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/Internal/CompletionQueueEventTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/Internal/CompletionQueueSafeHandleTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/Internal/DefaultDeserializationContextTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/Internal/DefaultObjectPoolTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/Internal/DefaultSerializationContextTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/Internal/FakeBufferReaderManager.cs create mode 100644 src/csharp/Grpc.Core.Tests/Internal/FakeBufferReaderManagerTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/Internal/FakeNativeCall.cs create mode 100644 src/csharp/Grpc.Core.Tests/Internal/MetadataArraySafeHandleTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/Internal/ReusableSliceBufferTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/Internal/SliceBufferSafeHandleTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/Internal/SliceTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/Internal/TimespecTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/Internal/WellKnownStringsTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/MarshallerTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/MarshallingErrorsTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/MetadataTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/MockServiceHelper.cs create mode 100644 src/csharp/Grpc.Core.Tests/NUnitMain.cs create mode 100644 src/csharp/Grpc.Core.Tests/PInvokeTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/PerformanceTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/Properties/AssemblyInfo.cs create mode 100644 src/csharp/Grpc.Core.Tests/ResponseHeadersTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/SanityTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/ServerTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/ShutdownHookClientTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/ShutdownHookPendingCallTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/ShutdownHookServerTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/ShutdownTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/ThreadingModelTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/TimeoutsTest.cs create mode 100644 src/csharp/Grpc.Core.Tests/UserAgentStringTest.cs create mode 100644 src/csharp/Grpc.Core/.gitignore create mode 100644 src/csharp/Grpc.Core/CallInvocationDetails.cs create mode 100644 src/csharp/Grpc.Core/Calls.cs create mode 100644 src/csharp/Grpc.Core/Channel.cs create mode 100644 src/csharp/Grpc.Core/ChannelOptions.cs create mode 100644 src/csharp/Grpc.Core/ChannelState.cs create mode 100755 src/csharp/Grpc.Core/Common.csproj.include create mode 100644 src/csharp/Grpc.Core/CompressionLevel.cs create mode 100644 src/csharp/Grpc.Core/DefaultCallInvoker.cs create mode 100644 src/csharp/Grpc.Core/ForwardedTypes.cs create mode 100755 src/csharp/Grpc.Core/Grpc.Core.csproj create mode 100644 src/csharp/Grpc.Core/GrpcEnvironment.cs create mode 100644 src/csharp/Grpc.Core/Interceptors/ServerServiceDefinitionExtensions.cs create mode 100644 src/csharp/Grpc.Core/Internal/AsyncCall.cs create mode 100644 src/csharp/Grpc.Core/Internal/AsyncCallBase.cs create mode 100644 src/csharp/Grpc.Core/Internal/AsyncCallServer.cs create mode 100644 src/csharp/Grpc.Core/Internal/AtomicCounter.cs create mode 100644 src/csharp/Grpc.Core/Internal/AuthContextSafeHandle.cs create mode 100644 src/csharp/Grpc.Core/Internal/BatchContextSafeHandle.cs create mode 100644 src/csharp/Grpc.Core/Internal/CStringSafeHandle.cs create mode 100644 src/csharp/Grpc.Core/Internal/CallCredentialsSafeHandle.cs create mode 100644 src/csharp/Grpc.Core/Internal/CallError.cs create mode 100644 src/csharp/Grpc.Core/Internal/CallOptionsExtensions.cs create mode 100644 src/csharp/Grpc.Core/Internal/CallSafeHandle.cs create mode 100644 src/csharp/Grpc.Core/Internal/ChannelArgsSafeHandle.cs create mode 100644 src/csharp/Grpc.Core/Internal/ChannelCredentialsSafeHandle.cs create mode 100644 src/csharp/Grpc.Core/Internal/ChannelSafeHandle.cs create mode 100644 src/csharp/Grpc.Core/Internal/ClientRequestStream.cs create mode 100644 src/csharp/Grpc.Core/Internal/ClientResponseStream.cs create mode 100644 src/csharp/Grpc.Core/Internal/ClientSideStatus.cs create mode 100644 src/csharp/Grpc.Core/Internal/ClockType.cs create mode 100644 src/csharp/Grpc.Core/Internal/CompletionQueueEvent.cs create mode 100644 src/csharp/Grpc.Core/Internal/CompletionQueueSafeHandle.cs create mode 100644 src/csharp/Grpc.Core/Internal/CompletionRegistry.cs create mode 100644 src/csharp/Grpc.Core/Internal/ContextPropagationFlags.cs create mode 100644 src/csharp/Grpc.Core/Internal/ContextPropagationTokenImpl.cs create mode 100644 src/csharp/Grpc.Core/Internal/CoreErrorDetailException.cs create mode 100644 src/csharp/Grpc.Core/Internal/DebugStats.cs create mode 100644 src/csharp/Grpc.Core/Internal/DefaultCallCredentialsConfigurator.cs create mode 100644 src/csharp/Grpc.Core/Internal/DefaultChannelCredentialsConfigurator.cs create mode 100644 src/csharp/Grpc.Core/Internal/DefaultDeserializationContext.cs create mode 100644 src/csharp/Grpc.Core/Internal/DefaultObjectPool.cs create mode 100644 src/csharp/Grpc.Core/Internal/DefaultSerializationContext.cs create mode 100644 src/csharp/Grpc.Core/Internal/DefaultServerCallContext.cs create mode 100644 src/csharp/Grpc.Core/Internal/DefaultSslRootsOverride.cs create mode 100644 src/csharp/Grpc.Core/Internal/GrpcThreadPool.cs create mode 100644 src/csharp/Grpc.Core/Internal/INativeCall.cs create mode 100644 src/csharp/Grpc.Core/Internal/IObjectPool.cs create mode 100644 src/csharp/Grpc.Core/Internal/IPooledObject.cs create mode 100644 src/csharp/Grpc.Core/Internal/IServerResponseStream.cs create mode 100644 src/csharp/Grpc.Core/Internal/MarshalUtils.cs create mode 100644 src/csharp/Grpc.Core/Internal/MetadataArraySafeHandle.cs create mode 100644 src/csharp/Grpc.Core/Internal/MonoPInvokeCallbackAttribute.cs create mode 100644 src/csharp/Grpc.Core/Internal/NativeCallbackDispatcher.cs create mode 100644 src/csharp/Grpc.Core/Internal/NativeExtension.cs create mode 100644 src/csharp/Grpc.Core/Internal/NativeLogRedirector.cs create mode 100644 src/csharp/Grpc.Core/Internal/NativeMetadataCredentialsPlugin.cs create mode 100644 src/csharp/Grpc.Core/Internal/NativeMethods.Generated.cs create mode 100644 src/csharp/Grpc.Core/Internal/NativeMethods.cs create mode 100644 src/csharp/Grpc.Core/Internal/PlatformApis.cs create mode 100644 src/csharp/Grpc.Core/Internal/RequestCallContextSafeHandle.cs create mode 100644 src/csharp/Grpc.Core/Internal/ReusableSliceBuffer.cs create mode 100644 src/csharp/Grpc.Core/Internal/SafeHandleZeroIsInvalid.cs create mode 100644 src/csharp/Grpc.Core/Internal/ServerCallHandler.cs create mode 100644 src/csharp/Grpc.Core/Internal/ServerCalls.cs create mode 100644 src/csharp/Grpc.Core/Internal/ServerCredentialsSafeHandle.cs create mode 100644 src/csharp/Grpc.Core/Internal/ServerRequestStream.cs create mode 100644 src/csharp/Grpc.Core/Internal/ServerResponseStream.cs create mode 100644 src/csharp/Grpc.Core/Internal/ServerRpcNew.cs create mode 100644 src/csharp/Grpc.Core/Internal/ServerSafeHandle.cs create mode 100644 src/csharp/Grpc.Core/Internal/ServerServiceDefinitionExtensions.cs create mode 100644 src/csharp/Grpc.Core/Internal/Slice.cs create mode 100644 src/csharp/Grpc.Core/Internal/SliceBufferSafeHandle.cs create mode 100644 src/csharp/Grpc.Core/Internal/SliceMemoryManager.cs create mode 100644 src/csharp/Grpc.Core/Internal/Timespec.cs create mode 100644 src/csharp/Grpc.Core/Internal/UnimplementedCallInvoker.cs create mode 100644 src/csharp/Grpc.Core/Internal/UnmanagedLibrary.cs create mode 100644 src/csharp/Grpc.Core/Internal/WellKnownStrings.cs create mode 100644 src/csharp/Grpc.Core/Logging/ConsoleLogger.cs create mode 100644 src/csharp/Grpc.Core/Logging/ILogger.cs create mode 100644 src/csharp/Grpc.Core/Logging/LogLevel.cs create mode 100644 src/csharp/Grpc.Core/Logging/LogLevelFilterLogger.cs create mode 100644 src/csharp/Grpc.Core/Logging/NullLogger.cs create mode 100644 src/csharp/Grpc.Core/Logging/TextWriterLogger.cs create mode 100644 src/csharp/Grpc.Core/NativeDeps.Linux.csproj.include create mode 100644 src/csharp/Grpc.Core/NativeDeps.Mac.csproj.include create mode 100644 src/csharp/Grpc.Core/NativeDeps.Windows.csproj.include create mode 100755 src/csharp/Grpc.Core/NativeDeps.csproj.include create mode 100644 src/csharp/Grpc.Core/Profiling/IProfiler.cs create mode 100644 src/csharp/Grpc.Core/Profiling/ProfilerEntry.cs create mode 100644 src/csharp/Grpc.Core/Profiling/ProfilerScope.cs create mode 100644 src/csharp/Grpc.Core/Profiling/Profilers.cs create mode 100644 src/csharp/Grpc.Core/Properties/AssemblyInfo.cs create mode 100644 src/csharp/Grpc.Core/Server.cs create mode 100644 src/csharp/Grpc.Core/ServerCredentials.cs create mode 100644 src/csharp/Grpc.Core/ServerPort.cs create mode 100755 src/csharp/Grpc.Core/SourceLink.csproj.include create mode 100644 src/csharp/Grpc.Core/Utils/AsyncStreamExtensions.cs create mode 100644 src/csharp/Grpc.Core/Utils/BenchmarkUtil.cs create mode 100644 src/csharp/Grpc.Core/Utils/TaskUtils.cs create mode 100644 src/csharp/Grpc.Core/build/MonoAndroid10/Grpc.Core.targets create mode 100644 src/csharp/Grpc.Core/build/Xamarin.iOS10/Grpc.Core.targets create mode 100644 src/csharp/Grpc.Core/build/net45/Grpc.Core.targets create mode 100644 src/csharp/Grpc.Examples.MathClient/.gitignore create mode 100755 src/csharp/Grpc.Examples.MathClient/Grpc.Examples.MathClient.csproj create mode 100644 src/csharp/Grpc.Examples.MathClient/MathClient.cs create mode 100644 src/csharp/Grpc.Examples.MathClient/Properties/AssemblyInfo.cs create mode 100644 src/csharp/Grpc.Examples.MathServer/.gitignore create mode 100755 src/csharp/Grpc.Examples.MathServer/Grpc.Examples.MathServer.csproj create mode 100644 src/csharp/Grpc.Examples.MathServer/MathServer.cs create mode 100644 src/csharp/Grpc.Examples.MathServer/Properties/AssemblyInfo.cs create mode 100644 src/csharp/Grpc.Examples.Tests/.gitignore create mode 100755 src/csharp/Grpc.Examples.Tests/Grpc.Examples.Tests.csproj create mode 100644 src/csharp/Grpc.Examples.Tests/MathClientMockableTest.cs create mode 100644 src/csharp/Grpc.Examples.Tests/MathClientServerTests.cs create mode 100644 src/csharp/Grpc.Examples.Tests/MathServiceImplTestabilityTest.cs create mode 100644 src/csharp/Grpc.Examples.Tests/NUnitMain.cs create mode 100644 src/csharp/Grpc.Examples.Tests/Properties/AssemblyInfo.cs create mode 100644 src/csharp/Grpc.Examples/.gitignore create mode 100755 src/csharp/Grpc.Examples/Grpc.Examples.csproj create mode 100644 src/csharp/Grpc.Examples/Math.cs create mode 100644 src/csharp/Grpc.Examples/MathExamples.cs create mode 100644 src/csharp/Grpc.Examples/MathGrpc.cs create mode 100644 src/csharp/Grpc.Examples/MathServiceImpl.cs create mode 100644 src/csharp/Grpc.Examples/Properties/AssemblyInfo.cs create mode 100644 src/csharp/Grpc.Examples/Settings.StyleCop create mode 100644 src/csharp/Grpc.HealthCheck.Tests/.gitignore create mode 100755 src/csharp/Grpc.HealthCheck.Tests/Grpc.HealthCheck.Tests.csproj create mode 100644 src/csharp/Grpc.HealthCheck.Tests/HealthClientServerTest.cs create mode 100644 src/csharp/Grpc.HealthCheck.Tests/HealthServiceImplTest.cs create mode 100644 src/csharp/Grpc.HealthCheck.Tests/NUnitMain.cs create mode 100644 src/csharp/Grpc.HealthCheck.Tests/Properties/AssemblyInfo.cs create mode 100644 src/csharp/Grpc.HealthCheck.Tests/TestResponseStreamWriter.cs create mode 100644 src/csharp/Grpc.HealthCheck.Tests/TestServerCallContext.cs create mode 100644 src/csharp/Grpc.HealthCheck/.gitignore create mode 100755 src/csharp/Grpc.HealthCheck/Grpc.HealthCheck.csproj create mode 100644 src/csharp/Grpc.HealthCheck/Health.cs create mode 100644 src/csharp/Grpc.HealthCheck/HealthGrpc.cs create mode 100644 src/csharp/Grpc.HealthCheck/HealthServiceImpl.cs create mode 100644 src/csharp/Grpc.HealthCheck/Properties/AssemblyInfo.cs create mode 100644 src/csharp/Grpc.HealthCheck/Settings.StyleCop create mode 100644 src/csharp/Grpc.IntegrationTesting.Client/.gitignore create mode 100755 src/csharp/Grpc.IntegrationTesting.Client/Grpc.IntegrationTesting.Client.csproj create mode 100644 src/csharp/Grpc.IntegrationTesting.Client/Program.cs create mode 100644 src/csharp/Grpc.IntegrationTesting.Client/Properties/AssemblyInfo.cs create mode 100644 src/csharp/Grpc.IntegrationTesting.QpsWorker/.gitignore create mode 100755 src/csharp/Grpc.IntegrationTesting.QpsWorker/Grpc.IntegrationTesting.QpsWorker.csproj create mode 100644 src/csharp/Grpc.IntegrationTesting.QpsWorker/Program.cs create mode 100644 src/csharp/Grpc.IntegrationTesting.QpsWorker/Properties/AssemblyInfo.cs create mode 100644 src/csharp/Grpc.IntegrationTesting.Server/.gitignore create mode 100755 src/csharp/Grpc.IntegrationTesting.Server/Grpc.IntegrationTesting.Server.csproj create mode 100644 src/csharp/Grpc.IntegrationTesting.Server/Program.cs create mode 100644 src/csharp/Grpc.IntegrationTesting.Server/Properties/AssemblyInfo.cs create mode 100644 src/csharp/Grpc.IntegrationTesting.StressClient/.gitignore create mode 100755 src/csharp/Grpc.IntegrationTesting.StressClient/Grpc.IntegrationTesting.StressClient.csproj create mode 100644 src/csharp/Grpc.IntegrationTesting.StressClient/Program.cs create mode 100644 src/csharp/Grpc.IntegrationTesting.StressClient/Properties/AssemblyInfo.cs create mode 100644 src/csharp/Grpc.IntegrationTesting.XdsClient/.gitignore create mode 100755 src/csharp/Grpc.IntegrationTesting.XdsClient/Grpc.IntegrationTesting.XdsClient.csproj create mode 100644 src/csharp/Grpc.IntegrationTesting.XdsClient/Program.cs create mode 100644 src/csharp/Grpc.IntegrationTesting.XdsClient/Properties/AssemblyInfo.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/.gitignore create mode 100644 src/csharp/Grpc.IntegrationTesting/BenchmarkService.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/BenchmarkServiceGrpc.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/BenchmarkServiceImpl.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/ClientRunners.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/Control.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/ControlExtensions.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/CoreStats/Stats.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/CustomErrorDetailsTest.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/EchoMessages.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/Empty.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/EmptyService.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/EmptyServiceGrpc.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/ExternalDnsClientServerTest.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/ExternalDnsWithTracingClientServerTest.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/GeneratedClientTest.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/GeneratedServiceBaseTest.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/GenericService.cs create mode 100755 src/csharp/Grpc.IntegrationTesting/Grpc.IntegrationTesting.csproj create mode 100644 src/csharp/Grpc.IntegrationTesting/Histogram.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/HistogramTest.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/IClientRunner.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/IServerRunner.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/InterarrivalTimers.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/InteropClient.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/InteropClientServerTest.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/InteropServer.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/Messages.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/MetadataCredentialsTest.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/Metrics.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/MetricsGrpc.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/NUnitMain.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/Payloads.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/Properties/AssemblyInfo.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/QpsWorker.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/ReportQpsScenarioService.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/ReportQpsScenarioServiceGrpc.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/RunnerClientServerTest.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/ServerRunners.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/Settings.StyleCop create mode 100644 src/csharp/Grpc.IntegrationTesting/SslCredentialsTest.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/Stats.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/StressTestClient.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/Test.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/TestCredentials.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/TestGrpc.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/TestServiceImpl.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/TimeStats.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/UnobservedTaskExceptionTest.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/WorkerService.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/WorkerServiceGrpc.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/WorkerServiceImpl.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/XdsInteropClient.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/XdsInteropClientTest.cs create mode 100644 src/csharp/Grpc.IntegrationTesting/data/README create mode 100644 src/csharp/Grpc.IntegrationTesting/data/ca.pem create mode 100644 src/csharp/Grpc.IntegrationTesting/data/server1.key create mode 100644 src/csharp/Grpc.IntegrationTesting/data/server1.pem create mode 100644 src/csharp/Grpc.Microbenchmarks/.gitignore create mode 100644 src/csharp/Grpc.Microbenchmarks/AtomicCounterBenchmark.cs create mode 100644 src/csharp/Grpc.Microbenchmarks/CommonThreadedBase.cs create mode 100644 src/csharp/Grpc.Microbenchmarks/CompletionRegistryBenchmark.cs create mode 100644 src/csharp/Grpc.Microbenchmarks/Grpc.Microbenchmarks.csproj create mode 100644 src/csharp/Grpc.Microbenchmarks/PInvokeByteArrayBenchmark.cs create mode 100644 src/csharp/Grpc.Microbenchmarks/PingBenchmark.cs create mode 100644 src/csharp/Grpc.Microbenchmarks/Program.cs create mode 100644 src/csharp/Grpc.Microbenchmarks/ScalabityExampleBenchmark.cs create mode 100644 src/csharp/Grpc.Microbenchmarks/SendMessageBenchmark.cs create mode 100644 src/csharp/Grpc.Microbenchmarks/UnaryCallOverheadBenchmark.cs create mode 100644 src/csharp/Grpc.Microbenchmarks/Utf8Decode.cs create mode 100644 src/csharp/Grpc.Microbenchmarks/Utf8Encode.cs create mode 100644 src/csharp/Grpc.Reflection.Tests/.gitignore create mode 100755 src/csharp/Grpc.Reflection.Tests/Grpc.Reflection.Tests.csproj create mode 100644 src/csharp/Grpc.Reflection.Tests/NUnitMain.cs create mode 100644 src/csharp/Grpc.Reflection.Tests/Properties/AssemblyInfo.cs create mode 100644 src/csharp/Grpc.Reflection.Tests/ReflectionClientServerTest.cs create mode 100644 src/csharp/Grpc.Reflection.Tests/SymbolRegistryTest.cs create mode 100644 src/csharp/Grpc.Reflection/.gitignore create mode 100755 src/csharp/Grpc.Reflection/Grpc.Reflection.csproj create mode 100644 src/csharp/Grpc.Reflection/Properties/AssemblyInfo.cs create mode 100644 src/csharp/Grpc.Reflection/Reflection.cs create mode 100644 src/csharp/Grpc.Reflection/ReflectionGrpc.cs create mode 100644 src/csharp/Grpc.Reflection/ReflectionServiceImpl.cs create mode 100644 src/csharp/Grpc.Reflection/Settings.StyleCop create mode 100644 src/csharp/Grpc.Reflection/SymbolRegistry.cs create mode 100644 src/csharp/Grpc.Tools.Tests/CSharpGeneratorTest.cs create mode 100644 src/csharp/Grpc.Tools.Tests/CppGeneratorTest.cs create mode 100644 src/csharp/Grpc.Tools.Tests/DepFileUtilTest.cs create mode 100644 src/csharp/Grpc.Tools.Tests/GeneratorTest.cs create mode 100644 src/csharp/Grpc.Tools.Tests/Grpc.Tools.Tests.csproj create mode 100644 src/csharp/Grpc.Tools.Tests/NUnitMain.cs create mode 100644 src/csharp/Grpc.Tools.Tests/ProtoCompileBasicTest.cs create mode 100644 src/csharp/Grpc.Tools.Tests/ProtoCompileCommandLineGeneratorTest.cs create mode 100644 src/csharp/Grpc.Tools.Tests/ProtoCompileCommandLinePrinterTest.cs create mode 100644 src/csharp/Grpc.Tools.Tests/ProtoToolsPlatformTaskTest.cs create mode 100644 src/csharp/Grpc.Tools.Tests/Utils.cs create mode 100644 src/csharp/Grpc.Tools/Common.cs create mode 100644 src/csharp/Grpc.Tools/DepFileUtil.cs create mode 100644 src/csharp/Grpc.Tools/GeneratorServices.cs create mode 100644 src/csharp/Grpc.Tools/Grpc.Tools.csproj create mode 100644 src/csharp/Grpc.Tools/ProtoCompile.cs create mode 100644 src/csharp/Grpc.Tools/ProtoCompilerOutputs.cs create mode 100644 src/csharp/Grpc.Tools/ProtoReadDependencies.cs create mode 100644 src/csharp/Grpc.Tools/ProtoToolsPlatform.cs create mode 100644 src/csharp/Grpc.Tools/build/Grpc.Tools.props create mode 100644 src/csharp/Grpc.Tools/build/Grpc.Tools.targets create mode 100644 src/csharp/Grpc.Tools/build/_grpc/Grpc.CSharp.xml create mode 100644 src/csharp/Grpc.Tools/build/_grpc/README create mode 100644 src/csharp/Grpc.Tools/build/_grpc/_Grpc.Tools.props create mode 100644 src/csharp/Grpc.Tools/build/_grpc/_Grpc.Tools.targets create mode 100644 src/csharp/Grpc.Tools/build/_protobuf/Google.Protobuf.Tools.props create mode 100644 src/csharp/Grpc.Tools/build/_protobuf/Google.Protobuf.Tools.targets create mode 100644 src/csharp/Grpc.Tools/build/_protobuf/Protobuf.CSharp.xml create mode 100644 src/csharp/Grpc.Tools/build/_protobuf/README create mode 100644 src/csharp/Grpc.Tools/build/native/Grpc.Tools.props create mode 100644 src/csharp/Grpc.sln create mode 100644 src/csharp/Grpc/.gitignore create mode 100644 src/csharp/Grpc/Grpc.csproj create mode 100644 src/csharp/README.md create mode 100644 src/csharp/Settings.StyleCop create mode 100644 src/csharp/build/dependencies.props create mode 100755 src/csharp/build_packages_dotnetcli.bat create mode 100644 src/csharp/build_unitypackage.bat create mode 100644 src/csharp/doc/integration.md-fig.1-classic.png create mode 100644 src/csharp/doc/integration.md-fig.2-sdk.png create mode 100644 src/csharp/docfx/.gitignore create mode 100644 src/csharp/docfx/README.md create mode 100644 src/csharp/docfx/docfx.json create mode 100755 src/csharp/docfx/generate_reference_docs.sh create mode 100644 src/csharp/docfx/toc.yml create mode 100644 src/csharp/expand_dev_version.sh create mode 100644 src/csharp/experimental/README.md create mode 100755 src/csharp/experimental/build_native_ext_for_android.sh create mode 100755 src/csharp/experimental/build_native_ext_for_ios.sh create mode 100644 src/csharp/ext/grpc_csharp_ext.c create mode 100755 src/csharp/generate_proto_csharp.sh create mode 100644 src/csharp/install_dotnet_sdk.ps1 create mode 100644 src/csharp/keys/Grpc.public.snk create mode 100644 src/csharp/keys/Grpc.snk create mode 100644 src/csharp/keys/README.md create mode 100644 src/csharp/tests.json create mode 100644 src/csharp/unitypackage/README.md create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Google.Protobuf.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Google.Protobuf/lib.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Google.Protobuf/lib/net45.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Google.Protobuf/lib/net45/Google.Protobuf.dll.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Google.Protobuf/lib/net45/Google.Protobuf.xml.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core.Api.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core.Api/lib.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core.Api/lib/net45.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core.Api/lib/net45/Grpc.Core.Api.dll.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core.Api/lib/net45/Grpc.Core.Api.pdb.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core.Api/lib/net45/Grpc.Core.Api.xml.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/lib.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/lib/net45.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/lib/net45/Grpc.Core.dll.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/lib/net45/Grpc.Core.pdb.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/lib/net45/Grpc.Core.xml.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/android.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/android/arm64-v8a.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/android/arm64-v8a/libgrpc_csharp_ext.so.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/android/armeabi-v7a.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/android/armeabi-v7a/libgrpc_csharp_ext.so.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/android/x86.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/android/x86/libgrpc_csharp_ext.so.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/grpc_csharp_ext_dummy_stubs.c create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/grpc_csharp_ext_dummy_stubs.c.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/ios.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/ios/libgrpc.a.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/ios/libgrpc_csharp_ext.a.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/linux.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/linux/x64.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/linux/x64/libgrpc_csharp_ext.so.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/linux/x86.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/linux/x86/libgrpc_csharp_ext.so.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/osx.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/osx/x64.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/osx/x64/grpc_csharp_ext.bundle.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/osx/x86.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/osx/x86/grpc_csharp_ext.bundle.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/win.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/win/x64.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/win/x64/grpc_csharp_ext.dll.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/win/x86.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/win/x86/grpc_csharp_ext.dll.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/System.Buffers/lib.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/System.Buffers/lib/net45.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/System.Buffers/lib/net45/System.Buffers.dll.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/System.Buffers/lib/net45/System.Buffers.xml.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/System.Memory/lib.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/System.Memory/lib/net45.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/System.Memory/lib/net45/System.Memory.dll.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/System.Memory/lib/net45/System.Memory.xml.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/System.Runtime.CompilerServices.Unsafe/lib.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/System.Runtime.CompilerServices.Unsafe/lib/net45.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/System.Runtime.CompilerServices.Unsafe/lib/net45/System.Runtime.CompilerServices.Unsafe.dll.meta create mode 100644 src/csharp/unitypackage/unitypackage_skeleton/Plugins/System.Runtime.CompilerServices.Unsafe/lib/net45/System.Runtime.CompilerServices.Unsafe.xml.meta create mode 100644 src/objective-c/!ProtoCompiler-gRPCCppPlugin.podspec create mode 100644 src/objective-c/!ProtoCompiler-gRPCPlugin.podspec create mode 100644 src/objective-c/!ProtoCompiler.podspec create mode 100644 src/objective-c/BUILD create mode 100644 src/objective-c/BoringSSL-GRPC.podspec create mode 100644 src/objective-c/CronetFramework.podspec create mode 100644 src/objective-c/GRPCClient/GRPCCall+ChannelArg.h create mode 100644 src/objective-c/GRPCClient/GRPCCall+ChannelArg.m create mode 100644 src/objective-c/GRPCClient/GRPCCall+ChannelCredentials.h create mode 100644 src/objective-c/GRPCClient/GRPCCall+ChannelCredentials.m create mode 100644 src/objective-c/GRPCClient/GRPCCall+Cronet.h create mode 100644 src/objective-c/GRPCClient/GRPCCall+Cronet.m create mode 100644 src/objective-c/GRPCClient/GRPCCall+GID.h create mode 100644 src/objective-c/GRPCClient/GRPCCall+GID.m create mode 100644 src/objective-c/GRPCClient/GRPCCall+Interceptor.h create mode 100644 src/objective-c/GRPCClient/GRPCCall+Interceptor.m create mode 100644 src/objective-c/GRPCClient/GRPCCall+OAuth2.h create mode 100644 src/objective-c/GRPCClient/GRPCCall+OAuth2.m create mode 100644 src/objective-c/GRPCClient/GRPCCall+Tests.h create mode 100644 src/objective-c/GRPCClient/GRPCCall+Tests.m create mode 100644 src/objective-c/GRPCClient/GRPCCall.h create mode 100644 src/objective-c/GRPCClient/GRPCCall.m create mode 100644 src/objective-c/GRPCClient/GRPCCallLegacy.h create mode 100644 src/objective-c/GRPCClient/GRPCCallLegacy.m create mode 100644 src/objective-c/GRPCClient/GRPCCallOptions.h create mode 100644 src/objective-c/GRPCClient/GRPCCallOptions.m create mode 100644 src/objective-c/GRPCClient/GRPCDispatchable.h create mode 100644 src/objective-c/GRPCClient/GRPCInterceptor.h create mode 100644 src/objective-c/GRPCClient/GRPCInterceptor.m create mode 100644 src/objective-c/GRPCClient/GRPCTransport.h create mode 100644 src/objective-c/GRPCClient/GRPCTransport.m create mode 100644 src/objective-c/GRPCClient/GRPCTypes.h create mode 100644 src/objective-c/GRPCClient/GRPCTypes.m create mode 100644 src/objective-c/GRPCClient/README.md create mode 100644 src/objective-c/GRPCClient/internal/GRPCCallOptions+Internal.h create mode 100644 src/objective-c/GRPCClient/internal_testing/GRPCCall+InternalTests.h create mode 100644 src/objective-c/GRPCClient/internal_testing/GRPCCall+InternalTests.m create mode 100644 src/objective-c/GRPCClient/private/GRPCCore/ChannelArgsUtil.h create mode 100644 src/objective-c/GRPCClient/private/GRPCCore/ChannelArgsUtil.m create mode 100644 src/objective-c/GRPCClient/private/GRPCCore/GRPCCall+V2API.h create mode 100644 src/objective-c/GRPCClient/private/GRPCCore/GRPCCallInternal.h create mode 100644 src/objective-c/GRPCClient/private/GRPCCore/GRPCCallInternal.m create mode 100644 src/objective-c/GRPCClient/private/GRPCCore/GRPCChannel.h create mode 100644 src/objective-c/GRPCClient/private/GRPCCore/GRPCChannel.m create mode 100644 src/objective-c/GRPCClient/private/GRPCCore/GRPCChannelFactory.h create mode 100644 src/objective-c/GRPCClient/private/GRPCCore/GRPCChannelPool+Test.h create mode 100644 src/objective-c/GRPCClient/private/GRPCCore/GRPCChannelPool.h create mode 100644 src/objective-c/GRPCClient/private/GRPCCore/GRPCChannelPool.m create mode 100644 src/objective-c/GRPCClient/private/GRPCCore/GRPCCompletionQueue.h create mode 100644 src/objective-c/GRPCClient/private/GRPCCore/GRPCCompletionQueue.m create mode 100644 src/objective-c/GRPCClient/private/GRPCCore/GRPCCoreCronet/GRPCCoreCronetFactory.h create mode 100644 src/objective-c/GRPCClient/private/GRPCCore/GRPCCoreCronet/GRPCCoreCronetFactory.m create mode 100644 src/objective-c/GRPCClient/private/GRPCCore/GRPCCoreCronet/GRPCCronetChannelFactory.h create mode 100644 src/objective-c/GRPCClient/private/GRPCCore/GRPCCoreCronet/GRPCCronetChannelFactory.m create mode 100644 src/objective-c/GRPCClient/private/GRPCCore/GRPCCoreFactory.h create mode 100644 src/objective-c/GRPCClient/private/GRPCCore/GRPCCoreFactory.m create mode 100644 src/objective-c/GRPCClient/private/GRPCCore/GRPCHost.h create mode 100644 src/objective-c/GRPCClient/private/GRPCCore/GRPCHost.m create mode 100644 src/objective-c/GRPCClient/private/GRPCCore/GRPCInsecureChannelFactory.h create mode 100644 src/objective-c/GRPCClient/private/GRPCCore/GRPCInsecureChannelFactory.m create mode 100644 src/objective-c/GRPCClient/private/GRPCCore/GRPCOpBatchLog.h create mode 100644 src/objective-c/GRPCClient/private/GRPCCore/GRPCOpBatchLog.m create mode 100644 src/objective-c/GRPCClient/private/GRPCCore/GRPCReachabilityFlagNames.xmacro.h create mode 100644 src/objective-c/GRPCClient/private/GRPCCore/GRPCRequestHeaders.h create mode 100644 src/objective-c/GRPCClient/private/GRPCCore/GRPCRequestHeaders.m create mode 100644 src/objective-c/GRPCClient/private/GRPCCore/GRPCSecureChannelFactory.h create mode 100644 src/objective-c/GRPCClient/private/GRPCCore/GRPCSecureChannelFactory.m create mode 100644 src/objective-c/GRPCClient/private/GRPCCore/GRPCWrappedCall.h create mode 100644 src/objective-c/GRPCClient/private/GRPCCore/GRPCWrappedCall.m create mode 100644 src/objective-c/GRPCClient/private/GRPCCore/NSData+GRPC.h create mode 100644 src/objective-c/GRPCClient/private/GRPCCore/NSData+GRPC.m create mode 100644 src/objective-c/GRPCClient/private/GRPCCore/NSDictionary+GRPC.h create mode 100644 src/objective-c/GRPCClient/private/GRPCCore/NSDictionary+GRPC.m create mode 100644 src/objective-c/GRPCClient/private/GRPCCore/NSError+GRPC.h create mode 100644 src/objective-c/GRPCClient/private/GRPCCore/NSError+GRPC.m create mode 100644 src/objective-c/GRPCClient/private/GRPCTransport+Private.h create mode 100644 src/objective-c/GRPCClient/private/GRPCTransport+Private.m create mode 100644 src/objective-c/GRPCClient/version.h create mode 100644 src/objective-c/NetworkTransitionBehavior.md create mode 100644 src/objective-c/ProtoRPC/ProtoMethod.h create mode 100644 src/objective-c/ProtoRPC/ProtoMethod.m create mode 100644 src/objective-c/ProtoRPC/ProtoRPC.h create mode 100644 src/objective-c/ProtoRPC/ProtoRPC.m create mode 100644 src/objective-c/ProtoRPC/ProtoRPCLegacy.h create mode 100644 src/objective-c/ProtoRPC/ProtoRPCLegacy.m create mode 100644 src/objective-c/ProtoRPC/ProtoService.h create mode 100644 src/objective-c/ProtoRPC/ProtoService.m create mode 100644 src/objective-c/ProtoRPC/ProtoServiceLegacy.h create mode 100644 src/objective-c/ProtoRPC/ProtoServiceLegacy.m create mode 100644 src/objective-c/README-CFSTREAM.md create mode 100644 src/objective-c/README.md create mode 100644 src/objective-c/RxLibrary/GRXBufferedPipe.h create mode 100644 src/objective-c/RxLibrary/GRXBufferedPipe.m create mode 100644 src/objective-c/RxLibrary/GRXConcurrentWriteable.h create mode 100644 src/objective-c/RxLibrary/GRXConcurrentWriteable.m create mode 100644 src/objective-c/RxLibrary/GRXForwardingWriter.h create mode 100644 src/objective-c/RxLibrary/GRXForwardingWriter.m create mode 100644 src/objective-c/RxLibrary/GRXImmediateSingleWriter.h create mode 100644 src/objective-c/RxLibrary/GRXImmediateSingleWriter.m create mode 100644 src/objective-c/RxLibrary/GRXImmediateWriter.h create mode 100644 src/objective-c/RxLibrary/GRXImmediateWriter.m create mode 100644 src/objective-c/RxLibrary/GRXMappingWriter.h create mode 100644 src/objective-c/RxLibrary/GRXMappingWriter.m create mode 100644 src/objective-c/RxLibrary/GRXWriteable.h create mode 100644 src/objective-c/RxLibrary/GRXWriteable.m create mode 100644 src/objective-c/RxLibrary/GRXWriter+Immediate.h create mode 100644 src/objective-c/RxLibrary/GRXWriter+Immediate.m create mode 100644 src/objective-c/RxLibrary/GRXWriter+Transformations.h create mode 100644 src/objective-c/RxLibrary/GRXWriter+Transformations.m create mode 100644 src/objective-c/RxLibrary/GRXWriter.h create mode 100644 src/objective-c/RxLibrary/GRXWriter.m create mode 100644 src/objective-c/RxLibrary/NSEnumerator+GRXUtil.h create mode 100644 src/objective-c/RxLibrary/NSEnumerator+GRXUtil.m create mode 100644 src/objective-c/RxLibrary/README.md create mode 100644 src/objective-c/RxLibrary/private/GRXNSBlockEnumerator.h create mode 100644 src/objective-c/RxLibrary/private/GRXNSBlockEnumerator.m create mode 100644 src/objective-c/RxLibrary/private/GRXNSFastEnumerator.h create mode 100644 src/objective-c/RxLibrary/private/GRXNSFastEnumerator.m create mode 100644 src/objective-c/RxLibrary/private/GRXNSScalarEnumerator.h create mode 100644 src/objective-c/RxLibrary/private/GRXNSScalarEnumerator.m create mode 100755 src/objective-c/change-comments.py create mode 100644 src/objective-c/examples/BUILD create mode 100644 src/objective-c/examples/InterceptorSample/InterceptorSample.xcodeproj/project.pbxproj create mode 100644 src/objective-c/examples/InterceptorSample/InterceptorSample/AppDelegate.h create mode 100644 src/objective-c/examples/InterceptorSample/InterceptorSample/AppDelegate.m create mode 100644 src/objective-c/examples/InterceptorSample/InterceptorSample/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 src/objective-c/examples/InterceptorSample/InterceptorSample/Assets.xcassets/Contents.json create mode 100644 src/objective-c/examples/InterceptorSample/InterceptorSample/Base.lproj/LaunchScreen.storyboard create mode 100644 src/objective-c/examples/InterceptorSample/InterceptorSample/Base.lproj/Main.storyboard create mode 100644 src/objective-c/examples/InterceptorSample/InterceptorSample/CacheInterceptor.h create mode 100644 src/objective-c/examples/InterceptorSample/InterceptorSample/CacheInterceptor.m create mode 100644 src/objective-c/examples/InterceptorSample/InterceptorSample/Info.plist create mode 100644 src/objective-c/examples/InterceptorSample/InterceptorSample/ViewController.h create mode 100644 src/objective-c/examples/InterceptorSample/InterceptorSample/ViewController.m create mode 100644 src/objective-c/examples/InterceptorSample/InterceptorSample/main.m create mode 100644 src/objective-c/examples/InterceptorSample/Podfile create mode 100644 src/objective-c/examples/RemoteTestClient/RemoteTest.podspec create mode 100644 src/objective-c/examples/RemoteTestClient/messages.proto create mode 100644 src/objective-c/examples/RemoteTestClient/test.proto create mode 100644 src/objective-c/examples/Sample/Podfile create mode 100644 src/objective-c/examples/Sample/README.md create mode 100644 src/objective-c/examples/Sample/Sample.xcodeproj/project.pbxproj create mode 100644 src/objective-c/examples/Sample/Sample.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 src/objective-c/examples/Sample/Sample.xcodeproj/xcshareddata/xcschemes/Sample.xcscheme create mode 100644 src/objective-c/examples/Sample/Sample/AppDelegate.h create mode 100644 src/objective-c/examples/Sample/Sample/AppDelegate.m create mode 100644 src/objective-c/examples/Sample/Sample/Base.lproj/Main.storyboard create mode 100644 src/objective-c/examples/Sample/Sample/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 src/objective-c/examples/Sample/Sample/Info.plist create mode 100644 src/objective-c/examples/Sample/Sample/ViewController.h create mode 100644 src/objective-c/examples/Sample/Sample/ViewController.m create mode 100644 src/objective-c/examples/Sample/Sample/main.m create mode 100644 src/objective-c/examples/SwiftSample/AppDelegate.swift create mode 100644 src/objective-c/examples/SwiftSample/Base.lproj/Main.storyboard create mode 100644 src/objective-c/examples/SwiftSample/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 src/objective-c/examples/SwiftSample/Info.plist create mode 100644 src/objective-c/examples/SwiftSample/Podfile create mode 100644 src/objective-c/examples/SwiftSample/SwiftSample.xcodeproj/project.pbxproj create mode 100644 src/objective-c/examples/SwiftSample/SwiftSample.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 src/objective-c/examples/SwiftSample/SwiftSample.xcodeproj/xcshareddata/xcschemes/SwiftSample.xcscheme create mode 100644 src/objective-c/examples/SwiftSample/ViewController.swift create mode 100644 src/objective-c/examples/tvOS-sample/Podfile create mode 100644 src/objective-c/examples/tvOS-sample/tvOS-sample.xcodeproj/project.pbxproj create mode 100644 src/objective-c/examples/tvOS-sample/tvOS-sample.xcodeproj/xcshareddata/xcschemes/tvOS-sample.xcscheme create mode 100644 src/objective-c/examples/tvOS-sample/tvOS-sample/AppDelegate.h create mode 100644 src/objective-c/examples/tvOS-sample/tvOS-sample/AppDelegate.m create mode 100644 src/objective-c/examples/tvOS-sample/tvOS-sample/Base.lproj/Main.storyboard create mode 100644 src/objective-c/examples/tvOS-sample/tvOS-sample/Info.plist create mode 100644 src/objective-c/examples/tvOS-sample/tvOS-sample/ViewController.h create mode 100644 src/objective-c/examples/tvOS-sample/tvOS-sample/ViewController.m create mode 100644 src/objective-c/examples/tvOS-sample/tvOS-sample/main.m create mode 100644 src/objective-c/examples/watchOS-sample/Podfile create mode 100644 src/objective-c/examples/watchOS-sample/WatchKit-App/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 src/objective-c/examples/watchOS-sample/WatchKit-App/Base.lproj/Interface.storyboard create mode 100644 src/objective-c/examples/watchOS-sample/WatchKit-App/Info.plist create mode 100644 src/objective-c/examples/watchOS-sample/WatchKit-Extension/ExtensionDelegate.h create mode 100644 src/objective-c/examples/watchOS-sample/WatchKit-Extension/ExtensionDelegate.m create mode 100644 src/objective-c/examples/watchOS-sample/WatchKit-Extension/Info.plist create mode 100644 src/objective-c/examples/watchOS-sample/WatchKit-Extension/InterfaceController.h create mode 100644 src/objective-c/examples/watchOS-sample/WatchKit-Extension/InterfaceController.m create mode 100644 src/objective-c/examples/watchOS-sample/watchOS-sample.xcodeproj/project.pbxproj create mode 100644 src/objective-c/examples/watchOS-sample/watchOS-sample.xcodeproj/xcshareddata/xcschemes/watchOS-sample-WatchKit-App.xcscheme create mode 100644 src/objective-c/examples/watchOS-sample/watchOS-sample/AppDelegate.h create mode 100644 src/objective-c/examples/watchOS-sample/watchOS-sample/AppDelegate.m create mode 100644 src/objective-c/examples/watchOS-sample/watchOS-sample/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 src/objective-c/examples/watchOS-sample/watchOS-sample/Base.lproj/LaunchScreen.storyboard create mode 100644 src/objective-c/examples/watchOS-sample/watchOS-sample/Base.lproj/Main.storyboard create mode 100644 src/objective-c/examples/watchOS-sample/watchOS-sample/Info.plist create mode 100644 src/objective-c/examples/watchOS-sample/watchOS-sample/ViewController.h create mode 100644 src/objective-c/examples/watchOS-sample/watchOS-sample/ViewController.m create mode 100644 src/objective-c/examples/watchOS-sample/watchOS-sample/main.m create mode 100644 src/objective-c/format-all-comments.sh create mode 100644 src/objective-c/grpc_objc_internal_library.bzl create mode 100644 src/objective-c/manual_tests/AppDelegate.h create mode 100644 src/objective-c/manual_tests/AppDelegate.m create mode 100644 src/objective-c/manual_tests/GrpcIosTest.xcodeproj/project.pbxproj create mode 100644 src/objective-c/manual_tests/GrpcIosTest.xcodeproj/xcshareddata/xcschemes/GrpcIosTest.xcscheme create mode 100644 src/objective-c/manual_tests/GrpcIosTestUITests/GrpcIosTestUITests.m create mode 100644 src/objective-c/manual_tests/GrpcIosTestUITests/Info.plist create mode 100644 src/objective-c/manual_tests/Info.plist create mode 100644 src/objective-c/manual_tests/Main.storyboard create mode 100644 src/objective-c/manual_tests/Podfile create mode 100644 src/objective-c/manual_tests/ViewController.m create mode 100644 src/objective-c/manual_tests/main.m create mode 100644 src/objective-c/tests/BUILD create mode 100644 src/objective-c/tests/ConfigureCronet.h create mode 100644 src/objective-c/tests/ConfigureCronet.m create mode 100644 src/objective-c/tests/Connectivity/ConnectivityTestingApp.xcodeproj/project.pbxproj create mode 100644 src/objective-c/tests/Connectivity/ConnectivityTestingApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 src/objective-c/tests/Connectivity/ConnectivityTestingApp/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 src/objective-c/tests/Connectivity/ConnectivityTestingApp/Base.lproj/LaunchScreen.storyboard create mode 100644 src/objective-c/tests/Connectivity/ConnectivityTestingApp/Base.lproj/Main.storyboard create mode 100644 src/objective-c/tests/Connectivity/ConnectivityTestingApp/Info.plist create mode 100644 src/objective-c/tests/Connectivity/ConnectivityTestingApp/ViewController.m create mode 100644 src/objective-c/tests/Connectivity/ConnectivityTestingApp/main.m create mode 100644 src/objective-c/tests/Connectivity/Podfile create mode 100644 src/objective-c/tests/Connectivity/README.md create mode 100644 src/objective-c/tests/CronetTests/CoreCronetEnd2EndTests.mm create mode 100644 src/objective-c/tests/CronetTests/CronetUnitTests.mm create mode 100644 src/objective-c/tests/CronetTests/InteropTestsRemoteWithCronet.m create mode 100644 src/objective-c/tests/CronetTests/TransportRegistryTests.m create mode 100644 src/objective-c/tests/Hosts/ios-host/AppDelegate.h create mode 100644 src/objective-c/tests/Hosts/ios-host/AppDelegate.m create mode 100644 src/objective-c/tests/Hosts/ios-host/Info.plist create mode 100644 src/objective-c/tests/Hosts/ios-host/main.m create mode 100644 src/objective-c/tests/Info.plist create mode 100644 src/objective-c/tests/InteropTests/InteropTests.h create mode 100644 src/objective-c/tests/InteropTests/InteropTests.m create mode 100644 src/objective-c/tests/InteropTests/InteropTestsBlockCallbacks.h create mode 100644 src/objective-c/tests/InteropTests/InteropTestsBlockCallbacks.m create mode 100644 src/objective-c/tests/InteropTests/InteropTestsLocalCleartext.m create mode 100644 src/objective-c/tests/InteropTests/InteropTestsLocalSSL.m create mode 100644 src/objective-c/tests/InteropTests/InteropTestsMultipleChannels.m create mode 100644 src/objective-c/tests/InteropTests/InteropTestsRemote.m create mode 100644 src/objective-c/tests/MacTests/Info.plist create mode 100644 src/objective-c/tests/MacTests/StressTests.h create mode 100644 src/objective-c/tests/MacTests/StressTests.m create mode 100644 src/objective-c/tests/MacTests/StressTestsCleartext.m create mode 100644 src/objective-c/tests/MacTests/StressTestsSSL.m create mode 100644 src/objective-c/tests/PerfTests/PerfTests.h create mode 100644 src/objective-c/tests/PerfTests/PerfTests.m create mode 100644 src/objective-c/tests/PerfTests/PerfTestsBlockCallbacks.h create mode 100644 src/objective-c/tests/PerfTests/PerfTestsBlockCallbacks.m create mode 100644 src/objective-c/tests/PerfTests/PerfTestsCFStreamCleartext.m create mode 100644 src/objective-c/tests/PerfTests/PerfTestsCFStreamSSL.m create mode 100644 src/objective-c/tests/PerfTests/PerfTestsCronet.m create mode 100644 src/objective-c/tests/PerfTests/PerfTestsNoCFStreamCleartext.m create mode 100644 src/objective-c/tests/PerfTests/PerfTestsNoCFStreamSSL.m create mode 100644 src/objective-c/tests/PluginTest/imported-with-dash.proto create mode 100644 src/objective-c/tests/PluginTest/test-dash-filename.proto create mode 100644 src/objective-c/tests/Podfile create mode 100644 src/objective-c/tests/RemoteTestClient/RemoteTest.podspec create mode 100644 src/objective-c/tests/RemoteTestClient/messages.proto create mode 100644 src/objective-c/tests/RemoteTestClient/test.proto create mode 100644 src/objective-c/tests/TestBase.h create mode 100644 src/objective-c/tests/TestBase.m create mode 100644 src/objective-c/tests/TestCertificates.bundle/test-certificates.pem create mode 100644 src/objective-c/tests/Tests.xcodeproj/project.pbxproj create mode 100644 src/objective-c/tests/Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 src/objective-c/tests/Tests.xcodeproj/xcshareddata/xcschemes/CronetTests.xcscheme create mode 100644 src/objective-c/tests/Tests.xcodeproj/xcshareddata/xcschemes/InteropTests.xcscheme create mode 100644 src/objective-c/tests/Tests.xcodeproj/xcshareddata/xcschemes/MacTests.xcscheme create mode 100644 src/objective-c/tests/Tests.xcodeproj/xcshareddata/xcschemes/PerfTests.xcscheme create mode 100644 src/objective-c/tests/Tests.xcodeproj/xcshareddata/xcschemes/PerfTestsPosix.xcscheme create mode 100644 src/objective-c/tests/Tests.xcodeproj/xcshareddata/xcschemes/TvTests.xcscheme create mode 100644 src/objective-c/tests/Tests.xcodeproj/xcshareddata/xcschemes/UnitTests.xcscheme create mode 100644 src/objective-c/tests/TvTests/Info.plist create mode 100644 src/objective-c/tests/UnitTests/APIv2Tests.m create mode 100644 src/objective-c/tests/UnitTests/ChannelPoolTest.m create mode 100644 src/objective-c/tests/UnitTests/ChannelTests.m create mode 100644 src/objective-c/tests/UnitTests/GRPCClientTests.m create mode 100644 src/objective-c/tests/UnitTests/NSErrorUnitTests.m create mode 100644 src/objective-c/tests/UnitTests/RxLibraryUnitTests.m create mode 100644 src/objective-c/tests/UnitTests/TransportRegistryTests.m create mode 100644 src/objective-c/tests/UnitTests/TransportTests.m create mode 100755 src/objective-c/tests/build_one_example.sh create mode 100755 src/objective-c/tests/build_one_example_bazel.sh create mode 100755 src/objective-c/tests/build_tests.sh create mode 100755 src/objective-c/tests/examples_build_test.sh create mode 100755 src/objective-c/tests/run_one_test.sh create mode 100755 src/objective-c/tests/run_one_test_bazel.sh create mode 100755 src/objective-c/tests/run_plugin_tests.sh create mode 100755 src/objective-c/tests/verbose_time.sh create mode 100644 src/objective-c/tests/version.h create mode 100644 src/php/.gitignore create mode 100644 src/php/README.md create mode 100755 src/php/bin/build_all_docker_images.sh create mode 100755 src/php/bin/determine_extension_dir.sh create mode 100755 src/php/bin/generate_proto_php.sh create mode 100755 src/php/bin/interop_client.sh create mode 100755 src/php/bin/run_all_docker_images.sh create mode 100755 src/php/bin/run_gen_code_test.sh create mode 100755 src/php/bin/run_php_cs_fixer.sh create mode 100755 src/php/bin/run_tests.sh create mode 100755 src/php/bin/stress_client.sh create mode 100644 src/php/composer.json create mode 100644 src/php/docker/README.md create mode 100644 src/php/docker/alpine/Dockerfile create mode 100644 src/php/docker/centos7/Dockerfile create mode 100644 src/php/docker/fork-support/Dockerfile create mode 100644 src/php/docker/fork-support/fork.php create mode 100644 src/php/docker/grpc-ext/Dockerfile create mode 100644 src/php/docker/grpc-src/Dockerfile create mode 100644 src/php/docker/php-future/Dockerfile create mode 100644 src/php/docker/php-src/Dockerfile create mode 100644 src/php/docker/php-zts/Dockerfile create mode 100644 src/php/docker/php5/Dockerfile create mode 100644 src/php/ext/grpc/CREDITS create mode 100644 src/php/ext/grpc/LICENSE create mode 100644 src/php/ext/grpc/byte_buffer.c create mode 100644 src/php/ext/grpc/byte_buffer.h create mode 100644 src/php/ext/grpc/call.c create mode 100644 src/php/ext/grpc/call.h create mode 100644 src/php/ext/grpc/call_credentials.c create mode 100644 src/php/ext/grpc/call_credentials.h create mode 100644 src/php/ext/grpc/channel.c create mode 100644 src/php/ext/grpc/channel.h create mode 100644 src/php/ext/grpc/channel_credentials.c create mode 100644 src/php/ext/grpc/channel_credentials.h create mode 100644 src/php/ext/grpc/completion_queue.c create mode 100644 src/php/ext/grpc/completion_queue.h create mode 100755 src/php/ext/grpc/config.m4 create mode 100644 src/php/ext/grpc/php7_wrapper.h create mode 100644 src/php/ext/grpc/php_grpc.c create mode 100644 src/php/ext/grpc/php_grpc.h create mode 100644 src/php/ext/grpc/server.c create mode 100644 src/php/ext/grpc/server.h create mode 100644 src/php/ext/grpc/server_credentials.c create mode 100644 src/php/ext/grpc/server_credentials.h create mode 100644 src/php/ext/grpc/tests/grpc-basic.phpt create mode 100644 src/php/ext/grpc/tests/grpc-default-ini.phpt create mode 100644 src/php/ext/grpc/tests/grpc-set-ini.phpt create mode 100644 src/php/ext/grpc/timeval.c create mode 100644 src/php/ext/grpc/timeval.h create mode 100644 src/php/ext/grpc/version.h create mode 100644 src/php/lib/Grpc/AbstractCall.php create mode 100644 src/php/lib/Grpc/BaseStub.php create mode 100644 src/php/lib/Grpc/BidiStreamingCall.php create mode 100644 src/php/lib/Grpc/CallInvoker.php create mode 100644 src/php/lib/Grpc/ClientStreamingCall.php create mode 100644 src/php/lib/Grpc/DefaultCallInvoker.php create mode 100644 src/php/lib/Grpc/Interceptor.php create mode 100644 src/php/lib/Grpc/Internal/InterceptorChannel.php create mode 100644 src/php/lib/Grpc/RpcServer.php create mode 100644 src/php/lib/Grpc/ServerStreamingCall.php create mode 100644 src/php/lib/Grpc/UnaryCall.php create mode 100644 src/php/phpunit.xml create mode 100644 src/php/tests/MemoryLeakTest/MemoryLeakTest.php create mode 100644 src/php/tests/bootstrap.php create mode 100644 src/php/tests/data/README create mode 100755 src/php/tests/data/ca.pem create mode 100755 src/php/tests/data/server1.key create mode 100755 src/php/tests/data/server1.pem create mode 100644 src/php/tests/generated_code/AbstractGeneratedCodeTest.php create mode 100644 src/php/tests/generated_code/GPBMetadata/Math.php create mode 100755 src/php/tests/generated_code/GeneratedCodeTest.php create mode 100644 src/php/tests/generated_code/GeneratedCodeWithCallbackTest.php create mode 100644 src/php/tests/generated_code/Math/DivArgs.php create mode 100644 src/php/tests/generated_code/Math/DivReply.php create mode 100644 src/php/tests/generated_code/Math/FibArgs.php create mode 100644 src/php/tests/generated_code/Math/FibReply.php create mode 100644 src/php/tests/generated_code/Math/MathClient.php create mode 100644 src/php/tests/generated_code/Math/Num.php create mode 100644 src/php/tests/generated_code/math_client.php create mode 100644 src/php/tests/generated_code/math_server.js create mode 100644 src/php/tests/generated_code/package.json create mode 100644 src/php/tests/interop/GPBMetadata/Src/Proto/Grpc/Testing/Messages.php create mode 100644 src/php/tests/interop/GPBMetadata/Src/Proto/Grpc/Testing/PBEmpty.php create mode 100644 src/php/tests/interop/GPBMetadata/Src/Proto/Grpc/Testing/Test.php create mode 100644 src/php/tests/interop/Grpc/Testing/BoolValue.php create mode 100644 src/php/tests/interop/Grpc/Testing/EchoStatus.php create mode 100644 src/php/tests/interop/Grpc/Testing/EmptyMessage.php create mode 100644 src/php/tests/interop/Grpc/Testing/EmptyMessageMessage.php create mode 100644 src/php/tests/interop/Grpc/Testing/GrpclbRouteType.php create mode 100644 src/php/tests/interop/Grpc/Testing/LoadBalancerStatsRequest.php create mode 100644 src/php/tests/interop/Grpc/Testing/LoadBalancerStatsResponse.php create mode 100644 src/php/tests/interop/Grpc/Testing/LoadBalancerStatsServiceClient.php create mode 100644 src/php/tests/interop/Grpc/Testing/LoadBalancerStatsServiceStub.php create mode 100644 src/php/tests/interop/Grpc/Testing/Payload.php create mode 100644 src/php/tests/interop/Grpc/Testing/PayloadType.php create mode 100644 src/php/tests/interop/Grpc/Testing/ReconnectInfo.php create mode 100644 src/php/tests/interop/Grpc/Testing/ReconnectParams.php create mode 100644 src/php/tests/interop/Grpc/Testing/ReconnectServiceClient.php create mode 100644 src/php/tests/interop/Grpc/Testing/ResponseParameters.php create mode 100644 src/php/tests/interop/Grpc/Testing/SimpleRequest.php create mode 100644 src/php/tests/interop/Grpc/Testing/SimpleResponse.php create mode 100644 src/php/tests/interop/Grpc/Testing/StreamingInputCallRequest.php create mode 100644 src/php/tests/interop/Grpc/Testing/StreamingInputCallResponse.php create mode 100644 src/php/tests/interop/Grpc/Testing/StreamingOutputCallRequest.php create mode 100644 src/php/tests/interop/Grpc/Testing/StreamingOutputCallResponse.php create mode 100644 src/php/tests/interop/Grpc/Testing/TestServiceClient.php create mode 100644 src/php/tests/interop/Grpc/Testing/UnimplementedServiceClient.php create mode 100755 src/php/tests/interop/interop_client.php create mode 100644 src/php/tests/interop/metrics_client.php create mode 100644 src/php/tests/interop/stress_client.php create mode 100644 src/php/tests/interop/xds_client.php create mode 100644 src/php/tests/qps/client.php create mode 100644 src/php/tests/qps/composer.json create mode 100644 src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Core/Stats.php create mode 100644 src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/BenchmarkService.php create mode 100644 src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/CompilerTest.php create mode 100644 src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Control.php create mode 100644 src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/EchoMessages.php create mode 100644 src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/EmptyService.php create mode 100644 src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Messages.php create mode 100644 src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/PBEmpty.php create mode 100644 src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Payloads.php create mode 100644 src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/ProxyService.php create mode 100644 src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/ReportQpsScenarioService.php create mode 100644 src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Stats.php create mode 100644 src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Test.php create mode 100644 src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/WorkerService.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Core/Bucket.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Core/Histogram.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Core/Metric.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Core/Stats.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/BenchmarkServiceClient.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/BoolValue.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/ByteBufferParams.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/ChannelArg.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/ClientArgs.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/ClientConfig.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/ClientStats.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/ClientStatus.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/ClientType.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/ClosedLoopParams.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/ComplexProtoParams.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/CoreRequest.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/CoreResponse.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/DebugInfo.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/EchoRequest.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/EchoResponse.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/EchoStatus.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/EmptyMessage.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/EmptyServiceClient.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/ErrorStatus.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/GrpclbRouteType.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/HistogramData.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/HistogramParams.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/LoadBalancerStatsRequest.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/LoadBalancerStatsResponse.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/LoadBalancerStatsServiceClient.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/LoadParams.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/Mark.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/PBVoid.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/Payload.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/PayloadConfig.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/PayloadType.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/PoissonParams.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/ProxyClientServiceClient.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/ProxyStat.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/ReconnectInfo.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/ReconnectParams.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/ReconnectServiceClient.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/ReportQpsScenarioServiceClient.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/Request.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/RequestParams.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/RequestResultCount.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/Response.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/ResponseParameters.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/ResponseParams.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/RpcType.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/Scenario.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/ScenarioResult.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/ScenarioResultSummary.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/Scenarios.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/SecurityParams.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/ServerArgs.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/ServerConfig.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/ServerStats.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/ServerStatus.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/ServerType.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/ServiceAClient.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/ServiceBClient.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/SimpleProtoParams.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/SimpleRequest.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/SimpleResponse.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/StreamingInputCallRequest.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/StreamingInputCallResponse.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/StreamingOutputCallRequest.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/StreamingOutputCallResponse.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/TestServiceClient.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/UnimplementedServiceClient.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/WorkerServiceClient.php create mode 100644 src/php/tests/qps/histogram.php create mode 100644 src/php/tests/unit_tests/CallCredentials2Test.php create mode 100644 src/php/tests/unit_tests/CallCredentialsTest.php create mode 100644 src/php/tests/unit_tests/CallInvokerTest.php create mode 100644 src/php/tests/unit_tests/CallTest.php create mode 100644 src/php/tests/unit_tests/ChannelCredentialsTest.php create mode 100644 src/php/tests/unit_tests/ChannelTest.php create mode 100644 src/php/tests/unit_tests/EndToEndTest.php create mode 100644 src/php/tests/unit_tests/InterceptorTest.php create mode 100644 src/php/tests/unit_tests/PersistentChannelTests/PersistentChannelTest.php create mode 100644 src/php/tests/unit_tests/SecureEndToEndTest.php create mode 100644 src/php/tests/unit_tests/ServerTest.php create mode 100644 src/php/tests/unit_tests/TimevalTest.php create mode 100755 src/proto/gen_build_yaml.py create mode 100644 src/proto/grpc/binary_log/v1alpha/log.proto create mode 100644 src/proto/grpc/channelz/BUILD create mode 100644 src/proto/grpc/channelz/channelz.proto create mode 100644 src/proto/grpc/core/BUILD create mode 100644 src/proto/grpc/core/stats.proto create mode 100644 src/proto/grpc/gcp/BUILD create mode 100644 src/proto/grpc/gcp/altscontext.proto create mode 100644 src/proto/grpc/gcp/handshaker.proto create mode 100644 src/proto/grpc/gcp/transport_security_common.proto create mode 100644 src/proto/grpc/health/v1/BUILD create mode 100644 src/proto/grpc/health/v1/health.options create mode 100644 src/proto/grpc/health/v1/health.proto create mode 100644 src/proto/grpc/http_over_grpc/BUILD create mode 100644 src/proto/grpc/http_over_grpc/http_over_grpc.proto create mode 100644 src/proto/grpc/lb/v1/BUILD create mode 100644 src/proto/grpc/lb/v1/load_balancer.options create mode 100644 src/proto/grpc/lb/v1/load_balancer.proto create mode 100644 src/proto/grpc/lb/v1/load_reporter.proto create mode 100644 src/proto/grpc/reflection/v1alpha/BUILD create mode 100644 src/proto/grpc/reflection/v1alpha/reflection.proto create mode 100644 src/proto/grpc/status/BUILD create mode 100644 src/proto/grpc/status/README create mode 100644 src/proto/grpc/status/status.proto create mode 100644 src/proto/grpc/testing/BUILD create mode 100644 src/proto/grpc/testing/benchmark_service.proto create mode 100644 src/proto/grpc/testing/compiler_test.proto create mode 100644 src/proto/grpc/testing/control.proto create mode 100644 src/proto/grpc/testing/duplicate/BUILD create mode 100644 src/proto/grpc/testing/duplicate/echo_duplicate.proto create mode 100644 src/proto/grpc/testing/echo.proto create mode 100644 src/proto/grpc/testing/echo_messages.proto create mode 100644 src/proto/grpc/testing/empty.proto create mode 100644 src/proto/grpc/testing/empty_service.proto create mode 100644 src/proto/grpc/testing/messages.proto create mode 100644 src/proto/grpc/testing/metrics.proto create mode 100644 src/proto/grpc/testing/payloads.proto create mode 100644 src/proto/grpc/testing/proto2/BUILD.bazel create mode 100644 src/proto/grpc/testing/proto2/empty2.proto create mode 100644 src/proto/grpc/testing/proto2/empty2_extensions.proto create mode 100644 src/proto/grpc/testing/proxy-service.proto create mode 100644 src/proto/grpc/testing/report_qps_scenario_service.proto create mode 100644 src/proto/grpc/testing/simple_messages.proto create mode 100644 src/proto/grpc/testing/stats.proto create mode 100644 src/proto/grpc/testing/test.proto create mode 100644 src/proto/grpc/testing/worker_service.proto create mode 100644 src/proto/grpc/testing/xds/BUILD create mode 100644 src/proto/grpc/testing/xds/ads_for_test.proto create mode 100644 src/proto/grpc/testing/xds/cds_for_test.proto create mode 100644 src/proto/grpc/testing/xds/eds_for_test.proto create mode 100644 src/proto/grpc/testing/xds/lds_rds_for_test.proto create mode 100644 src/proto/grpc/testing/xds/lrs_for_test.proto create mode 100644 src/proto/grpc/testing/xds/orca_load_report_for_test.proto create mode 100644 src/proto/math/math.proto create mode 100644 src/python/.gitignore create mode 100644 src/python/grpcio/.gitignore create mode 100644 src/python/grpcio/README.rst create mode 100644 src/python/grpcio/_parallel_compile_patch.py create mode 100644 src/python/grpcio/_spawn_patch.py create mode 100644 src/python/grpcio/commands.py create mode 100644 src/python/grpcio/grpc/BUILD.bazel create mode 100644 src/python/grpcio/grpc/__init__.py create mode 100644 src/python/grpcio/grpc/_auth.py create mode 100644 src/python/grpcio/grpc/_channel.py create mode 100644 src/python/grpcio/grpc/_common.py create mode 100644 src/python/grpcio/grpc/_compression.py create mode 100644 src/python/grpcio/grpc/_cython/.gitignore create mode 100644 src/python/grpcio/grpc/_cython/BUILD.bazel create mode 100644 src/python/grpcio/grpc/_cython/README.rst create mode 100644 src/python/grpcio/grpc/_cython/__init__.py create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/__init__.py create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/_hooks.pxd.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/_hooks.pyx.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pxd.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pxd.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pxd.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pxd.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pxd.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/iomgr.pyx.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/resolver.pxd.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/resolver.pyx.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/socket.pxd.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/socket.pyx.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/timer.pxd.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/timer.pyx.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/aio/rpc_status.pxd.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/aio/rpc_status.pyx.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pxd.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/arguments.pxd.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/call.pxd.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/channel.pxd.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pxd.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/credentials.pxd.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/event.pxd.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/event.pyx.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pxd.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/fork_windows.pyx.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/grpc.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pxd.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/grpc_string.pyx.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/iomgr.pxd.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/iomgr.pyx.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/metadata.pxd.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/operation.pxd.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/propagation_bits.pxd.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/propagation_bits.pyx.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/records.pxd.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/security.pxd.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/server.pxd.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/tag.pxd.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/time.pxd.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/time.pyx.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/vtable.pxd.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/vtable.pyx.pxi create mode 100644 src/python/grpcio/grpc/_cython/cygrpc.pxd create mode 100644 src/python/grpcio/grpc/_cython/cygrpc.pyx create mode 100644 src/python/grpcio/grpc/_grpcio_metadata.py create mode 100644 src/python/grpcio/grpc/_interceptor.py create mode 100644 src/python/grpcio/grpc/_plugin_wrapping.py create mode 100644 src/python/grpcio/grpc/_server.py create mode 100644 src/python/grpcio/grpc/_simple_stubs.py create mode 100644 src/python/grpcio/grpc/_utilities.py create mode 100644 src/python/grpcio/grpc/beta/__init__.py create mode 100644 src/python/grpcio/grpc/beta/_client_adaptations.py create mode 100644 src/python/grpcio/grpc/beta/_metadata.py create mode 100644 src/python/grpcio/grpc/beta/_server_adaptations.py create mode 100644 src/python/grpcio/grpc/beta/implementations.py create mode 100644 src/python/grpcio/grpc/beta/interfaces.py create mode 100644 src/python/grpcio/grpc/beta/utilities.py create mode 100644 src/python/grpcio/grpc/experimental/BUILD.bazel create mode 100644 src/python/grpcio/grpc/experimental/__init__.py create mode 100644 src/python/grpcio/grpc/experimental/aio/__init__.py create mode 100644 src/python/grpcio/grpc/experimental/aio/_base_call.py create mode 100644 src/python/grpcio/grpc/experimental/aio/_base_channel.py create mode 100644 src/python/grpcio/grpc/experimental/aio/_base_server.py create mode 100644 src/python/grpcio/grpc/experimental/aio/_call.py create mode 100644 src/python/grpcio/grpc/experimental/aio/_channel.py create mode 100644 src/python/grpcio/grpc/experimental/aio/_interceptor.py create mode 100644 src/python/grpcio/grpc/experimental/aio/_metadata.py create mode 100644 src/python/grpcio/grpc/experimental/aio/_server.py create mode 100644 src/python/grpcio/grpc/experimental/aio/_typing.py create mode 100644 src/python/grpcio/grpc/experimental/aio/_utils.py create mode 100644 src/python/grpcio/grpc/experimental/gevent.py create mode 100644 src/python/grpcio/grpc/experimental/session_cache.py create mode 100644 src/python/grpcio/grpc/framework/BUILD.bazel create mode 100644 src/python/grpcio/grpc/framework/__init__.py create mode 100644 src/python/grpcio/grpc/framework/common/BUILD.bazel create mode 100644 src/python/grpcio/grpc/framework/common/__init__.py create mode 100644 src/python/grpcio/grpc/framework/common/cardinality.py create mode 100644 src/python/grpcio/grpc/framework/common/style.py create mode 100644 src/python/grpcio/grpc/framework/foundation/BUILD.bazel create mode 100644 src/python/grpcio/grpc/framework/foundation/__init__.py create mode 100644 src/python/grpcio/grpc/framework/foundation/abandonment.py create mode 100644 src/python/grpcio/grpc/framework/foundation/callable_util.py create mode 100644 src/python/grpcio/grpc/framework/foundation/future.py create mode 100644 src/python/grpcio/grpc/framework/foundation/logging_pool.py create mode 100644 src/python/grpcio/grpc/framework/foundation/stream.py create mode 100644 src/python/grpcio/grpc/framework/foundation/stream_util.py create mode 100644 src/python/grpcio/grpc/framework/interfaces/BUILD.bazel create mode 100644 src/python/grpcio/grpc/framework/interfaces/__init__.py create mode 100644 src/python/grpcio/grpc/framework/interfaces/base/BUILD.bazel create mode 100644 src/python/grpcio/grpc/framework/interfaces/base/__init__.py create mode 100644 src/python/grpcio/grpc/framework/interfaces/base/base.py create mode 100644 src/python/grpcio/grpc/framework/interfaces/base/utilities.py create mode 100644 src/python/grpcio/grpc/framework/interfaces/face/BUILD.bazel create mode 100644 src/python/grpcio/grpc/framework/interfaces/face/__init__.py create mode 100644 src/python/grpcio/grpc/framework/interfaces/face/face.py create mode 100644 src/python/grpcio/grpc/framework/interfaces/face/utilities.py create mode 100644 src/python/grpcio/grpc_core_dependencies.py create mode 100644 src/python/grpcio/grpc_version.py create mode 100644 src/python/grpcio/support.py create mode 100644 src/python/grpcio_channelz/.gitignore create mode 100644 src/python/grpcio_channelz/MANIFEST.in create mode 100644 src/python/grpcio_channelz/README.rst create mode 100644 src/python/grpcio_channelz/channelz_commands.py create mode 100644 src/python/grpcio_channelz/grpc_channelz/__init__.py create mode 100644 src/python/grpcio_channelz/grpc_channelz/v1/BUILD.bazel create mode 100644 src/python/grpcio_channelz/grpc_channelz/v1/__init__.py create mode 100644 src/python/grpcio_channelz/grpc_channelz/v1/_async.py create mode 100644 src/python/grpcio_channelz/grpc_channelz/v1/_servicer.py create mode 100644 src/python/grpcio_channelz/grpc_channelz/v1/channelz.py create mode 100644 src/python/grpcio_channelz/grpc_version.py create mode 100644 src/python/grpcio_channelz/setup.py create mode 100644 src/python/grpcio_health_checking/.gitignore create mode 100644 src/python/grpcio_health_checking/MANIFEST.in create mode 100644 src/python/grpcio_health_checking/README.rst create mode 100644 src/python/grpcio_health_checking/grpc_health/__init__.py create mode 100644 src/python/grpcio_health_checking/grpc_health/v1/BUILD.bazel create mode 100644 src/python/grpcio_health_checking/grpc_health/v1/__init__.py create mode 100644 src/python/grpcio_health_checking/grpc_health/v1/_async.py create mode 100644 src/python/grpcio_health_checking/grpc_health/v1/health.py create mode 100644 src/python/grpcio_health_checking/grpc_version.py create mode 100644 src/python/grpcio_health_checking/health_commands.py create mode 100644 src/python/grpcio_health_checking/setup.py create mode 100644 src/python/grpcio_reflection/.gitignore create mode 100644 src/python/grpcio_reflection/MANIFEST.in create mode 100644 src/python/grpcio_reflection/README.rst create mode 100644 src/python/grpcio_reflection/grpc_reflection/__init__.py create mode 100644 src/python/grpcio_reflection/grpc_reflection/v1alpha/BUILD.bazel create mode 100644 src/python/grpcio_reflection/grpc_reflection/v1alpha/__init__.py create mode 100644 src/python/grpcio_reflection/grpc_reflection/v1alpha/_async.py create mode 100644 src/python/grpcio_reflection/grpc_reflection/v1alpha/_base.py create mode 100644 src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py create mode 100644 src/python/grpcio_reflection/grpc_version.py create mode 100644 src/python/grpcio_reflection/reflection_commands.py create mode 100644 src/python/grpcio_reflection/setup.py create mode 100644 src/python/grpcio_status/.gitignore create mode 100644 src/python/grpcio_status/MANIFEST.in create mode 100644 src/python/grpcio_status/README.rst create mode 100644 src/python/grpcio_status/grpc_status/BUILD.bazel create mode 100644 src/python/grpcio_status/grpc_status/__init__.py create mode 100644 src/python/grpcio_status/grpc_status/_async.py create mode 100644 src/python/grpcio_status/grpc_status/_common.py create mode 100644 src/python/grpcio_status/grpc_status/rpc_status.py create mode 100644 src/python/grpcio_status/grpc_version.py create mode 100644 src/python/grpcio_status/setup.py create mode 100644 src/python/grpcio_status/status_commands.py create mode 100644 src/python/grpcio_testing/MANIFEST.in create mode 100644 src/python/grpcio_testing/README.rst create mode 100644 src/python/grpcio_testing/grpc_testing/__init__.py create mode 100644 src/python/grpcio_testing/grpc_testing/_channel/__init__.py create mode 100644 src/python/grpcio_testing/grpc_testing/_channel/_channel.py create mode 100644 src/python/grpcio_testing/grpc_testing/_channel/_channel_rpc.py create mode 100644 src/python/grpcio_testing/grpc_testing/_channel/_channel_state.py create mode 100644 src/python/grpcio_testing/grpc_testing/_channel/_invocation.py create mode 100644 src/python/grpcio_testing/grpc_testing/_channel/_multi_callable.py create mode 100644 src/python/grpcio_testing/grpc_testing/_channel/_rpc_state.py create mode 100644 src/python/grpcio_testing/grpc_testing/_common.py create mode 100644 src/python/grpcio_testing/grpc_testing/_server/__init__.py create mode 100644 src/python/grpcio_testing/grpc_testing/_server/_handler.py create mode 100644 src/python/grpcio_testing/grpc_testing/_server/_rpc.py create mode 100644 src/python/grpcio_testing/grpc_testing/_server/_server.py create mode 100644 src/python/grpcio_testing/grpc_testing/_server/_server_rpc.py create mode 100644 src/python/grpcio_testing/grpc_testing/_server/_service.py create mode 100644 src/python/grpcio_testing/grpc_testing/_server/_servicer_context.py create mode 100644 src/python/grpcio_testing/grpc_testing/_time.py create mode 100644 src/python/grpcio_testing/grpc_version.py create mode 100644 src/python/grpcio_testing/setup.py create mode 100644 src/python/grpcio_testing/testing_commands.py create mode 100644 src/python/grpcio_tests/.gitignore create mode 100644 src/python/grpcio_tests/commands.py create mode 100644 src/python/grpcio_tests/grpc_version.py create mode 100644 src/python/grpcio_tests/setup.py create mode 100644 src/python/grpcio_tests/tests/BUILD.bazel create mode 100644 src/python/grpcio_tests/tests/__init__.py create mode 100644 src/python/grpcio_tests/tests/_loader.py create mode 100644 src/python/grpcio_tests/tests/_result.py create mode 100644 src/python/grpcio_tests/tests/_runner.py create mode 100644 src/python/grpcio_tests/tests/_sanity/__init__.py create mode 100644 src/python/grpcio_tests/tests/_sanity/_sanity_test.py create mode 100644 src/python/grpcio_tests/tests/bazel_namespace_package_hack.py create mode 100644 src/python/grpcio_tests/tests/channelz/BUILD.bazel create mode 100644 src/python/grpcio_tests/tests/channelz/__init__.py create mode 100644 src/python/grpcio_tests/tests/channelz/_channelz_servicer_test.py create mode 100644 src/python/grpcio_tests/tests/fork/__init__.py create mode 100644 src/python/grpcio_tests/tests/fork/_fork_interop_test.py create mode 100644 src/python/grpcio_tests/tests/fork/client.py create mode 100644 src/python/grpcio_tests/tests/fork/methods.py create mode 100644 src/python/grpcio_tests/tests/health_check/BUILD.bazel create mode 100644 src/python/grpcio_tests/tests/health_check/__init__.py create mode 100644 src/python/grpcio_tests/tests/health_check/_health_servicer_test.py create mode 100644 src/python/grpcio_tests/tests/http2/negative_http2_client.py create mode 100644 src/python/grpcio_tests/tests/interop/BUILD.bazel create mode 100644 src/python/grpcio_tests/tests/interop/__init__.py create mode 100644 src/python/grpcio_tests/tests/interop/_insecure_intraop_test.py create mode 100644 src/python/grpcio_tests/tests/interop/_intraop_test_case.py create mode 100644 src/python/grpcio_tests/tests/interop/_secure_intraop_test.py create mode 100644 src/python/grpcio_tests/tests/interop/client.py create mode 100644 src/python/grpcio_tests/tests/interop/credentials/BUILD.bazel create mode 100644 src/python/grpcio_tests/tests/interop/credentials/README create mode 100755 src/python/grpcio_tests/tests/interop/credentials/ca.pem create mode 100755 src/python/grpcio_tests/tests/interop/credentials/server1.key create mode 100755 src/python/grpcio_tests/tests/interop/credentials/server1.pem create mode 100644 src/python/grpcio_tests/tests/interop/methods.py create mode 100644 src/python/grpcio_tests/tests/interop/resources.py create mode 100644 src/python/grpcio_tests/tests/interop/server.py create mode 100644 src/python/grpcio_tests/tests/interop/service.py create mode 100644 src/python/grpcio_tests/tests/protoc_plugin/__init__.py create mode 100644 src/python/grpcio_tests/tests/protoc_plugin/_python_plugin_test.py create mode 100644 src/python/grpcio_tests/tests/protoc_plugin/_split_definitions_test.py create mode 100644 src/python/grpcio_tests/tests/protoc_plugin/beta_python_plugin_test.py create mode 100644 src/python/grpcio_tests/tests/protoc_plugin/protos/__init__.py create mode 100644 src/python/grpcio_tests/tests/protoc_plugin/protos/invocation_testing/__init__.py create mode 100644 src/python/grpcio_tests/tests/protoc_plugin/protos/invocation_testing/same.proto create mode 100644 src/python/grpcio_tests/tests/protoc_plugin/protos/invocation_testing/split_messages/sub/messages.proto create mode 100644 src/python/grpcio_tests/tests/protoc_plugin/protos/invocation_testing/split_services/services.proto create mode 100644 src/python/grpcio_tests/tests/protoc_plugin/protos/payload/__init__.py create mode 100644 src/python/grpcio_tests/tests/protoc_plugin/protos/payload/test_payload.proto create mode 100644 src/python/grpcio_tests/tests/protoc_plugin/protos/requests/__init__.py create mode 100644 src/python/grpcio_tests/tests/protoc_plugin/protos/requests/r/__init__.py create mode 100644 src/python/grpcio_tests/tests/protoc_plugin/protos/requests/r/test_requests.proto create mode 100644 src/python/grpcio_tests/tests/protoc_plugin/protos/responses/__init__.py create mode 100644 src/python/grpcio_tests/tests/protoc_plugin/protos/responses/test_responses.proto create mode 100644 src/python/grpcio_tests/tests/protoc_plugin/protos/service/__init__.py create mode 100644 src/python/grpcio_tests/tests/protoc_plugin/protos/service/test_service.proto create mode 100644 src/python/grpcio_tests/tests/qps/BUILD.bazel create mode 100644 src/python/grpcio_tests/tests/qps/__init__.py create mode 100644 src/python/grpcio_tests/tests/qps/benchmark_client.py create mode 100644 src/python/grpcio_tests/tests/qps/benchmark_server.py create mode 100644 src/python/grpcio_tests/tests/qps/client_runner.py create mode 100644 src/python/grpcio_tests/tests/qps/histogram.py create mode 100644 src/python/grpcio_tests/tests/qps/qps_worker.py create mode 100644 src/python/grpcio_tests/tests/qps/worker_server.py create mode 100644 src/python/grpcio_tests/tests/reflection/BUILD.bazel create mode 100644 src/python/grpcio_tests/tests/reflection/__init__.py create mode 100644 src/python/grpcio_tests/tests/reflection/_reflection_servicer_test.py create mode 100644 src/python/grpcio_tests/tests/status/BUILD.bazel create mode 100644 src/python/grpcio_tests/tests/status/__init__.py create mode 100644 src/python/grpcio_tests/tests/status/_grpc_status_test.py create mode 100644 src/python/grpcio_tests/tests/stress/BUILD.bazel create mode 100644 src/python/grpcio_tests/tests/stress/__init__.py create mode 100644 src/python/grpcio_tests/tests/stress/client.py create mode 100644 src/python/grpcio_tests/tests/stress/metrics_server.py create mode 100644 src/python/grpcio_tests/tests/stress/test_runner.py create mode 100644 src/python/grpcio_tests/tests/stress/unary_stream_benchmark.proto create mode 100644 src/python/grpcio_tests/tests/stress/unary_stream_benchmark.py create mode 100644 src/python/grpcio_tests/tests/testing/BUILD.bazel create mode 100644 src/python/grpcio_tests/tests/testing/__init__.py create mode 100644 src/python/grpcio_tests/tests/testing/_application_common.py create mode 100644 src/python/grpcio_tests/tests/testing/_application_testing_common.py create mode 100644 src/python/grpcio_tests/tests/testing/_client_application.py create mode 100644 src/python/grpcio_tests/tests/testing/_client_test.py create mode 100644 src/python/grpcio_tests/tests/testing/_server_application.py create mode 100644 src/python/grpcio_tests/tests/testing/_server_test.py create mode 100644 src/python/grpcio_tests/tests/testing/_time_test.py create mode 100644 src/python/grpcio_tests/tests/testing/proto/__init__.py create mode 100644 src/python/grpcio_tests/tests/testing/proto/requests.proto create mode 100644 src/python/grpcio_tests/tests/testing/proto/services.proto create mode 100644 src/python/grpcio_tests/tests/tests.json create mode 100644 src/python/grpcio_tests/tests/unit/BUILD.bazel create mode 100644 src/python/grpcio_tests/tests/unit/__init__.py create mode 100644 src/python/grpcio_tests/tests/unit/_abort_test.py create mode 100644 src/python/grpcio_tests/tests/unit/_api_test.py create mode 100644 src/python/grpcio_tests/tests/unit/_auth_context_test.py create mode 100644 src/python/grpcio_tests/tests/unit/_auth_test.py create mode 100644 src/python/grpcio_tests/tests/unit/_channel_args_test.py create mode 100644 src/python/grpcio_tests/tests/unit/_channel_close_test.py create mode 100644 src/python/grpcio_tests/tests/unit/_channel_connectivity_test.py create mode 100644 src/python/grpcio_tests/tests/unit/_channel_ready_future_test.py create mode 100644 src/python/grpcio_tests/tests/unit/_compression_test.py create mode 100644 src/python/grpcio_tests/tests/unit/_credentials_test.py create mode 100644 src/python/grpcio_tests/tests/unit/_cython/.gitignore create mode 100644 src/python/grpcio_tests/tests/unit/_cython/BUILD.bazel create mode 100644 src/python/grpcio_tests/tests/unit/_cython/__init__.py create mode 100644 src/python/grpcio_tests/tests/unit/_cython/_cancel_many_calls_test.py create mode 100644 src/python/grpcio_tests/tests/unit/_cython/_channel_test.py create mode 100644 src/python/grpcio_tests/tests/unit/_cython/_common.py create mode 100644 src/python/grpcio_tests/tests/unit/_cython/_fork_test.py create mode 100644 src/python/grpcio_tests/tests/unit/_cython/_no_messages_server_completion_queue_per_call_test.py create mode 100644 src/python/grpcio_tests/tests/unit/_cython/_no_messages_single_server_completion_queue_test.py create mode 100644 src/python/grpcio_tests/tests/unit/_cython/_read_some_but_not_all_responses_test.py create mode 100644 src/python/grpcio_tests/tests/unit/_cython/_server_test.py create mode 100644 src/python/grpcio_tests/tests/unit/_cython/cygrpc_test.py create mode 100644 src/python/grpcio_tests/tests/unit/_cython/test_utilities.py create mode 100644 src/python/grpcio_tests/tests/unit/_dns_resolver_test.py create mode 100644 src/python/grpcio_tests/tests/unit/_empty_message_test.py create mode 100644 src/python/grpcio_tests/tests/unit/_error_message_encoding_test.py create mode 100644 src/python/grpcio_tests/tests/unit/_exit_scenarios.py create mode 100644 src/python/grpcio_tests/tests/unit/_exit_test.py create mode 100644 src/python/grpcio_tests/tests/unit/_from_grpc_import_star.py create mode 100644 src/python/grpcio_tests/tests/unit/_grpc_shutdown_test.py create mode 100644 src/python/grpcio_tests/tests/unit/_interceptor_test.py create mode 100644 src/python/grpcio_tests/tests/unit/_invalid_metadata_test.py create mode 100644 src/python/grpcio_tests/tests/unit/_invocation_defects_test.py create mode 100644 src/python/grpcio_tests/tests/unit/_local_credentials_test.py create mode 100644 src/python/grpcio_tests/tests/unit/_logging_test.py create mode 100644 src/python/grpcio_tests/tests/unit/_metadata_code_details_test.py create mode 100644 src/python/grpcio_tests/tests/unit/_metadata_flags_test.py create mode 100644 src/python/grpcio_tests/tests/unit/_metadata_test.py create mode 100644 src/python/grpcio_tests/tests/unit/_reconnect_test.py create mode 100644 src/python/grpcio_tests/tests/unit/_resource_exhausted_test.py create mode 100644 src/python/grpcio_tests/tests/unit/_rpc_test.py create mode 100644 src/python/grpcio_tests/tests/unit/_server_shutdown_scenarios.py create mode 100644 src/python/grpcio_tests/tests/unit/_server_shutdown_test.py create mode 100644 src/python/grpcio_tests/tests/unit/_server_ssl_cert_config_test.py create mode 100644 src/python/grpcio_tests/tests/unit/_server_test.py create mode 100644 src/python/grpcio_tests/tests/unit/_server_wait_for_termination_test.py create mode 100644 src/python/grpcio_tests/tests/unit/_session_cache_test.py create mode 100644 src/python/grpcio_tests/tests/unit/_signal_client.py create mode 100644 src/python/grpcio_tests/tests/unit/_signal_handling_test.py create mode 100644 src/python/grpcio_tests/tests/unit/_tcp_proxy.py create mode 100644 src/python/grpcio_tests/tests/unit/_version_test.py create mode 100644 src/python/grpcio_tests/tests/unit/beta/__init__.py create mode 100644 src/python/grpcio_tests/tests/unit/beta/_beta_features_test.py create mode 100644 src/python/grpcio_tests/tests/unit/beta/_connectivity_channel_test.py create mode 100644 src/python/grpcio_tests/tests/unit/beta/_implementations_test.py create mode 100644 src/python/grpcio_tests/tests/unit/beta/_not_found_test.py create mode 100644 src/python/grpcio_tests/tests/unit/beta/_utilities_test.py create mode 100644 src/python/grpcio_tests/tests/unit/beta/test_utilities.py create mode 100644 src/python/grpcio_tests/tests/unit/credentials/BUILD.bazel create mode 100644 src/python/grpcio_tests/tests/unit/credentials/README.md create mode 100755 src/python/grpcio_tests/tests/unit/credentials/ca.pem create mode 100644 src/python/grpcio_tests/tests/unit/credentials/certificate_hierarchy_1/certs/ca.cert.pem create mode 100644 src/python/grpcio_tests/tests/unit/credentials/certificate_hierarchy_1/intermediate/certs/client.cert.pem create mode 100644 src/python/grpcio_tests/tests/unit/credentials/certificate_hierarchy_1/intermediate/certs/intermediate.cert.pem create mode 100644 src/python/grpcio_tests/tests/unit/credentials/certificate_hierarchy_1/intermediate/certs/localhost-1.cert.pem create mode 100644 src/python/grpcio_tests/tests/unit/credentials/certificate_hierarchy_1/intermediate/private/client.key.pem create mode 100644 src/python/grpcio_tests/tests/unit/credentials/certificate_hierarchy_1/intermediate/private/localhost-1.key.pem create mode 100644 src/python/grpcio_tests/tests/unit/credentials/certificate_hierarchy_2/certs/ca.cert.pem create mode 100644 src/python/grpcio_tests/tests/unit/credentials/certificate_hierarchy_2/intermediate/certs/client.cert.pem create mode 100644 src/python/grpcio_tests/tests/unit/credentials/certificate_hierarchy_2/intermediate/certs/intermediate.cert.pem create mode 100644 src/python/grpcio_tests/tests/unit/credentials/certificate_hierarchy_2/intermediate/certs/localhost-1.cert.pem create mode 100644 src/python/grpcio_tests/tests/unit/credentials/certificate_hierarchy_2/intermediate/private/client.key.pem create mode 100644 src/python/grpcio_tests/tests/unit/credentials/certificate_hierarchy_2/intermediate/private/localhost-1.key.pem create mode 100755 src/python/grpcio_tests/tests/unit/credentials/server1.key create mode 100755 src/python/grpcio_tests/tests/unit/credentials/server1.pem create mode 100644 src/python/grpcio_tests/tests/unit/framework/__init__.py create mode 100644 src/python/grpcio_tests/tests/unit/framework/common/BUILD.bazel create mode 100644 src/python/grpcio_tests/tests/unit/framework/common/__init__.py create mode 100644 src/python/grpcio_tests/tests/unit/framework/common/test_constants.py create mode 100644 src/python/grpcio_tests/tests/unit/framework/common/test_control.py create mode 100644 src/python/grpcio_tests/tests/unit/framework/common/test_coverage.py create mode 100644 src/python/grpcio_tests/tests/unit/framework/foundation/BUILD.bazel create mode 100644 src/python/grpcio_tests/tests/unit/framework/foundation/__init__.py create mode 100644 src/python/grpcio_tests/tests/unit/framework/foundation/_logging_pool_test.py create mode 100644 src/python/grpcio_tests/tests/unit/framework/foundation/stream_testing.py create mode 100644 src/python/grpcio_tests/tests/unit/resources.py create mode 100644 src/python/grpcio_tests/tests/unit/test_common.py create mode 100644 src/python/grpcio_tests/tests/unit/thread_pool.py create mode 100644 src/python/grpcio_tests/tests_aio/__init__.py create mode 100644 src/python/grpcio_tests/tests_aio/_sanity/__init__.py create mode 100644 src/python/grpcio_tests/tests_aio/_sanity/_sanity_test.py create mode 100644 src/python/grpcio_tests/tests_aio/benchmark/BUILD.bazel create mode 100644 src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py create mode 100644 src/python/grpcio_tests/tests_aio/benchmark/benchmark_servicer.py create mode 100644 src/python/grpcio_tests/tests_aio/benchmark/server.py create mode 100644 src/python/grpcio_tests/tests_aio/benchmark/worker.py create mode 100644 src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py create mode 100644 src/python/grpcio_tests/tests_aio/channelz/BUILD.bazel create mode 100644 src/python/grpcio_tests/tests_aio/channelz/__init__.py create mode 100644 src/python/grpcio_tests/tests_aio/channelz/channelz_servicer_test.py create mode 100644 src/python/grpcio_tests/tests_aio/health_check/BUILD.bazel create mode 100644 src/python/grpcio_tests/tests_aio/health_check/__init__.py create mode 100644 src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py create mode 100644 src/python/grpcio_tests/tests_aio/interop/BUILD.bazel create mode 100644 src/python/grpcio_tests/tests_aio/interop/__init__.py create mode 100644 src/python/grpcio_tests/tests_aio/interop/client.py create mode 100644 src/python/grpcio_tests/tests_aio/interop/local_interop_test.py create mode 100644 src/python/grpcio_tests/tests_aio/interop/methods.py create mode 100644 src/python/grpcio_tests/tests_aio/interop/server.py create mode 100644 src/python/grpcio_tests/tests_aio/reflection/BUILD.bazel create mode 100644 src/python/grpcio_tests/tests_aio/reflection/__init__.py create mode 100644 src/python/grpcio_tests/tests_aio/reflection/reflection_servicer_test.py create mode 100644 src/python/grpcio_tests/tests_aio/status/BUILD.bazel create mode 100644 src/python/grpcio_tests/tests_aio/status/__init__.py create mode 100644 src/python/grpcio_tests/tests_aio/status/grpc_status_test.py create mode 100644 src/python/grpcio_tests/tests_aio/tests.json create mode 100644 src/python/grpcio_tests/tests_aio/unit/BUILD.bazel create mode 100644 src/python/grpcio_tests/tests_aio/unit/__init__.py create mode 100644 src/python/grpcio_tests/tests_aio/unit/_common.py create mode 100644 src/python/grpcio_tests/tests_aio/unit/_constants.py create mode 100644 src/python/grpcio_tests/tests_aio/unit/_metadata_test.py create mode 100644 src/python/grpcio_tests/tests_aio/unit/_test_base.py create mode 100644 src/python/grpcio_tests/tests_aio/unit/_test_server.py create mode 100644 src/python/grpcio_tests/tests_aio/unit/abort_test.py create mode 100644 src/python/grpcio_tests/tests_aio/unit/aio_rpc_error_test.py create mode 100644 src/python/grpcio_tests/tests_aio/unit/call_test.py create mode 100644 src/python/grpcio_tests/tests_aio/unit/channel_argument_test.py create mode 100644 src/python/grpcio_tests/tests_aio/unit/channel_ready_test.py create mode 100644 src/python/grpcio_tests/tests_aio/unit/channel_test.py create mode 100644 src/python/grpcio_tests/tests_aio/unit/client_stream_stream_interceptor_test.py create mode 100644 src/python/grpcio_tests/tests_aio/unit/client_stream_unary_interceptor_test.py create mode 100644 src/python/grpcio_tests/tests_aio/unit/client_unary_stream_interceptor_test.py create mode 100644 src/python/grpcio_tests/tests_aio/unit/client_unary_unary_interceptor_test.py create mode 100644 src/python/grpcio_tests/tests_aio/unit/close_channel_test.py create mode 100644 src/python/grpcio_tests/tests_aio/unit/compatibility_test.py create mode 100644 src/python/grpcio_tests/tests_aio/unit/compression_test.py create mode 100644 src/python/grpcio_tests/tests_aio/unit/connectivity_test.py create mode 100644 src/python/grpcio_tests/tests_aio/unit/done_callback_test.py create mode 100644 src/python/grpcio_tests/tests_aio/unit/init_test.py create mode 100644 src/python/grpcio_tests/tests_aio/unit/metadata_test.py create mode 100644 src/python/grpcio_tests/tests_aio/unit/secure_call_test.py create mode 100644 src/python/grpcio_tests/tests_aio/unit/server_interceptor_test.py create mode 100644 src/python/grpcio_tests/tests_aio/unit/server_test.py create mode 100644 src/python/grpcio_tests/tests_aio/unit/timeout_test.py create mode 100644 src/python/grpcio_tests/tests_aio/unit/wait_for_connection_test.py create mode 100644 src/python/grpcio_tests/tests_aio/unit/wait_for_ready_test.py create mode 100644 src/python/grpcio_tests/tests_py3_only/__init__.py create mode 100644 src/python/grpcio_tests/tests_py3_only/interop/BUILD.bazel create mode 100644 src/python/grpcio_tests/tests_py3_only/interop/xds_interop_client.py create mode 100644 src/python/grpcio_tests/tests_py3_only/unit/BUILD.bazel create mode 100644 src/python/grpcio_tests/tests_py3_only/unit/__init__.py create mode 100644 src/python/grpcio_tests/tests_py3_only/unit/_leak_test.py create mode 100644 src/python/grpcio_tests/tests_py3_only/unit/_simple_stubs_test.py create mode 100755 src/ruby/.gitignore create mode 100644 src/ruby/.rubocop.yml create mode 100644 src/ruby/.rubocop_todo.yml create mode 100644 src/ruby/CHANGELOG.md create mode 100644 src/ruby/README.md create mode 100755 src/ruby/bin/math_client.rb create mode 100644 src/ruby/bin/math_pb.rb create mode 100755 src/ruby/bin/math_server.rb create mode 100644 src/ruby/bin/math_services_pb.rb create mode 100755 src/ruby/bin/noproto_client.rb create mode 100755 src/ruby/bin/noproto_server.rb create mode 100644 src/ruby/end2end/README.md create mode 100755 src/ruby/end2end/call_credentials_timeout_driver.rb create mode 100755 src/ruby/end2end/channel_closing_client.rb create mode 100755 src/ruby/end2end/channel_closing_driver.rb create mode 100755 src/ruby/end2end/channel_state_client.rb create mode 100755 src/ruby/end2end/channel_state_driver.rb create mode 100755 src/ruby/end2end/client_memory_usage_client.rb create mode 100755 src/ruby/end2end/client_memory_usage_driver.rb create mode 100755 src/ruby/end2end/end2end_common.rb create mode 100755 src/ruby/end2end/errors_load_before_grpc_lib.rb create mode 100755 src/ruby/end2end/forking_client_client.rb create mode 100755 src/ruby/end2end/forking_client_driver.rb create mode 100644 src/ruby/end2end/gen_protos.sh create mode 100755 src/ruby/end2end/graceful_sig_handling_client.rb create mode 100755 src/ruby/end2end/graceful_sig_handling_driver.rb create mode 100755 src/ruby/end2end/graceful_sig_stop_client.rb create mode 100755 src/ruby/end2end/graceful_sig_stop_driver.rb create mode 100755 src/ruby/end2end/grpc_class_init_client.rb create mode 100755 src/ruby/end2end/grpc_class_init_driver.rb create mode 100755 src/ruby/end2end/killed_client_thread_client.rb create mode 100755 src/ruby/end2end/killed_client_thread_driver.rb create mode 100644 src/ruby/end2end/lib/client_control_pb.rb create mode 100644 src/ruby/end2end/lib/client_control_services_pb.rb create mode 100644 src/ruby/end2end/lib/echo_pb.rb create mode 100644 src/ruby/end2end/lib/echo_services_pb.rb create mode 100755 src/ruby/end2end/load_grpc_with_gc_stress_driver.rb create mode 100755 src/ruby/end2end/logger_load_before_grpc_lib.rb create mode 100755 src/ruby/end2end/multiple_killed_watching_threads_driver.rb create mode 100644 src/ruby/end2end/package_with_underscore_checker.rb create mode 100644 src/ruby/end2end/protos/client_control.proto create mode 100644 src/ruby/end2end/protos/echo.proto create mode 100644 src/ruby/end2end/protos/package_with_underscore/data.proto create mode 100644 src/ruby/end2end/protos/package_with_underscore/service.proto create mode 100755 src/ruby/end2end/sig_handling_client.rb create mode 100755 src/ruby/end2end/sig_handling_driver.rb create mode 100755 src/ruby/end2end/sig_int_during_channel_watch_client.rb create mode 100755 src/ruby/end2end/sig_int_during_channel_watch_driver.rb create mode 100755 src/ruby/end2end/status_codes_load_before_grpc_lib.rb create mode 100644 src/ruby/ext/grpc/ext-export.clang create mode 100644 src/ruby/ext/grpc/ext-export.gcc create mode 100644 src/ruby/ext/grpc/extconf.rb create mode 100644 src/ruby/ext/grpc/rb_byte_buffer.c create mode 100644 src/ruby/ext/grpc/rb_byte_buffer.h create mode 100644 src/ruby/ext/grpc/rb_call.c create mode 100644 src/ruby/ext/grpc/rb_call.h create mode 100644 src/ruby/ext/grpc/rb_call_credentials.c create mode 100644 src/ruby/ext/grpc/rb_call_credentials.h create mode 100644 src/ruby/ext/grpc/rb_channel.c create mode 100644 src/ruby/ext/grpc/rb_channel.h create mode 100644 src/ruby/ext/grpc/rb_channel_args.c create mode 100644 src/ruby/ext/grpc/rb_channel_args.h create mode 100644 src/ruby/ext/grpc/rb_channel_credentials.c create mode 100644 src/ruby/ext/grpc/rb_channel_credentials.h create mode 100644 src/ruby/ext/grpc/rb_completion_queue.c create mode 100644 src/ruby/ext/grpc/rb_completion_queue.h create mode 100644 src/ruby/ext/grpc/rb_compression_options.c create mode 100644 src/ruby/ext/grpc/rb_compression_options.h create mode 100644 src/ruby/ext/grpc/rb_enable_cpp.cc create mode 100644 src/ruby/ext/grpc/rb_event_thread.c create mode 100644 src/ruby/ext/grpc/rb_event_thread.h create mode 100644 src/ruby/ext/grpc/rb_grpc.c create mode 100644 src/ruby/ext/grpc/rb_grpc.h create mode 100644 src/ruby/ext/grpc/rb_grpc_imports.generated.c create mode 100644 src/ruby/ext/grpc/rb_grpc_imports.generated.h create mode 100644 src/ruby/ext/grpc/rb_loader.c create mode 100644 src/ruby/ext/grpc/rb_loader.h create mode 100644 src/ruby/ext/grpc/rb_server.c create mode 100644 src/ruby/ext/grpc/rb_server.h create mode 100644 src/ruby/ext/grpc/rb_server_credentials.c create mode 100644 src/ruby/ext/grpc/rb_server_credentials.h create mode 100644 src/ruby/lib/grpc.rb create mode 100644 src/ruby/lib/grpc/core/status_codes.rb create mode 100644 src/ruby/lib/grpc/core/time_consts.rb create mode 100644 src/ruby/lib/grpc/errors.rb create mode 100644 src/ruby/lib/grpc/generic/active_call.rb create mode 100644 src/ruby/lib/grpc/generic/bidi_call.rb create mode 100644 src/ruby/lib/grpc/generic/client_stub.rb create mode 100644 src/ruby/lib/grpc/generic/interceptor_registry.rb create mode 100644 src/ruby/lib/grpc/generic/interceptors.rb create mode 100644 src/ruby/lib/grpc/generic/rpc_desc.rb create mode 100644 src/ruby/lib/grpc/generic/rpc_server.rb create mode 100644 src/ruby/lib/grpc/generic/service.rb create mode 100644 src/ruby/lib/grpc/google_rpc_status_utils.rb create mode 100644 src/ruby/lib/grpc/grpc.rb create mode 100644 src/ruby/lib/grpc/logconfig.rb create mode 100644 src/ruby/lib/grpc/notifier.rb create mode 100644 src/ruby/lib/grpc/structs.rb create mode 100644 src/ruby/lib/grpc/version.rb create mode 100644 src/ruby/pb/README.md create mode 100755 src/ruby/pb/generate_proto_ruby.sh create mode 100644 src/ruby/pb/grpc/health/checker.rb create mode 100644 src/ruby/pb/grpc/health/v1/health_pb.rb create mode 100644 src/ruby/pb/grpc/health/v1/health_services_pb.rb create mode 100644 src/ruby/pb/grpc/testing/duplicate/echo_duplicate_services_pb.rb create mode 100644 src/ruby/pb/grpc/testing/metrics_pb.rb create mode 100644 src/ruby/pb/grpc/testing/metrics_services_pb.rb create mode 100644 src/ruby/pb/src/proto/grpc/testing/empty_pb.rb create mode 100644 src/ruby/pb/src/proto/grpc/testing/messages_pb.rb create mode 100644 src/ruby/pb/src/proto/grpc/testing/test_pb.rb create mode 100644 src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb create mode 100755 src/ruby/pb/test/client.rb create mode 100755 src/ruby/pb/test/server.rb create mode 100755 src/ruby/pb/test/xds_client.rb create mode 100644 src/ruby/qps/client.rb create mode 100644 src/ruby/qps/histogram.rb create mode 100755 src/ruby/qps/proxy-worker.rb create mode 100644 src/ruby/qps/qps-common.rb create mode 100644 src/ruby/qps/server.rb create mode 100644 src/ruby/qps/src/proto/grpc/core/stats_pb.rb create mode 100644 src/ruby/qps/src/proto/grpc/testing/benchmark_service_pb.rb create mode 100644 src/ruby/qps/src/proto/grpc/testing/benchmark_service_services_pb.rb create mode 100644 src/ruby/qps/src/proto/grpc/testing/control_pb.rb create mode 100644 src/ruby/qps/src/proto/grpc/testing/messages_pb.rb create mode 100644 src/ruby/qps/src/proto/grpc/testing/payloads_pb.rb create mode 100644 src/ruby/qps/src/proto/grpc/testing/proxy-service_pb.rb create mode 100644 src/ruby/qps/src/proto/grpc/testing/proxy-service_services_pb.rb create mode 100644 src/ruby/qps/src/proto/grpc/testing/report_qps_scenario_service_pb.rb create mode 100644 src/ruby/qps/src/proto/grpc/testing/report_qps_scenario_service_services_pb.rb create mode 100644 src/ruby/qps/src/proto/grpc/testing/stats_pb.rb create mode 100644 src/ruby/qps/src/proto/grpc/testing/worker_service_pb.rb create mode 100644 src/ruby/qps/src/proto/grpc/testing/worker_service_services_pb.rb create mode 100755 src/ruby/qps/worker.rb create mode 100644 src/ruby/spec/call_credentials_spec.rb create mode 100644 src/ruby/spec/call_spec.rb create mode 100644 src/ruby/spec/channel_connection_spec.rb create mode 100644 src/ruby/spec/channel_credentials_spec.rb create mode 100644 src/ruby/spec/channel_spec.rb create mode 100644 src/ruby/spec/client_auth_spec.rb create mode 100644 src/ruby/spec/client_server_spec.rb create mode 100644 src/ruby/spec/compression_options_spec.rb create mode 100644 src/ruby/spec/debug_message_spec.rb create mode 100644 src/ruby/spec/error_sanity_spec.rb create mode 100644 src/ruby/spec/errors_spec.rb create mode 100644 src/ruby/spec/generic/active_call_spec.rb create mode 100644 src/ruby/spec/generic/client_interceptors_spec.rb create mode 100644 src/ruby/spec/generic/client_stub_spec.rb create mode 100644 src/ruby/spec/generic/interceptor_registry_spec.rb create mode 100644 src/ruby/spec/generic/rpc_desc_spec.rb create mode 100644 src/ruby/spec/generic/rpc_server_pool_spec.rb create mode 100644 src/ruby/spec/generic/rpc_server_spec.rb create mode 100644 src/ruby/spec/generic/server_interceptors_spec.rb create mode 100644 src/ruby/spec/generic/service_spec.rb create mode 100644 src/ruby/spec/google_rpc_status_utils_spec.rb create mode 100644 src/ruby/spec/pb/codegen/grpc/testing/package_options.proto create mode 100644 src/ruby/spec/pb/codegen/grpc/testing/package_options_import.proto create mode 100644 src/ruby/spec/pb/codegen/grpc/testing/package_options_import2.proto create mode 100644 src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto create mode 100644 src/ruby/spec/pb/codegen/package_option_spec.rb create mode 100644 src/ruby/spec/pb/duplicate/codegen_spec.rb create mode 100644 src/ruby/spec/pb/health/checker_spec.rb create mode 100644 src/ruby/spec/server_credentials_spec.rb create mode 100644 src/ruby/spec/server_spec.rb create mode 100644 src/ruby/spec/spec_helper.rb create mode 100644 src/ruby/spec/support/helpers.rb create mode 100644 src/ruby/spec/support/services.rb create mode 100644 src/ruby/spec/testdata/README create mode 100755 src/ruby/spec/testdata/ca.pem create mode 100644 src/ruby/spec/testdata/client.key create mode 100644 src/ruby/spec/testdata/client.pem create mode 100755 src/ruby/spec/testdata/server1.key create mode 100755 src/ruby/spec/testdata/server1.pem create mode 100644 src/ruby/spec/time_consts_spec.rb create mode 100644 src/ruby/stress/metrics_server.rb create mode 100755 src/ruby/stress/stress_client.rb create mode 100644 src/ruby/tools/README.md create mode 100755 src/ruby/tools/bin/grpc_tools_ruby_protoc create mode 100755 src/ruby/tools/bin/grpc_tools_ruby_protoc_plugin create mode 100644 src/ruby/tools/grpc-tools.gemspec create mode 100644 src/ruby/tools/platform_check.rb create mode 100644 src/ruby/tools/version.rb create mode 100755 src/upb/gen_build_yaml.py create mode 100755 src/zlib/gen_build_yaml.py create mode 100644 summerofcode/2016/siddharth_shukla.md create mode 100644 summerofcode/2018/naresh.md create mode 100644 summerofcode/ideas.md create mode 100644 templates/BUILD.gn.template create mode 100644 templates/CMakeLists.txt.template create mode 100644 templates/Makefile.template create mode 100644 templates/README.md create mode 100644 templates/build_config.rb.template create mode 100644 templates/composer.json.template create mode 100644 templates/config.m4.template create mode 100644 templates/config.w32.template create mode 100644 templates/examples/php/echo/apache.Dockerfile.template create mode 100644 templates/examples/php/echo/base.Dockerfile.template create mode 100644 templates/examples/php/echo/cli.Dockerfile.template create mode 100644 templates/examples/php/echo/copy_from_grpc_base.include create mode 100644 templates/examples/php/echo/fpm.Dockerfile.template create mode 100644 templates/gRPC-C++.podspec.template create mode 100644 templates/gRPC-Core.podspec.template create mode 100644 templates/gRPC-ProtoRPC.podspec.template create mode 100644 templates/gRPC-RxLibrary.podspec.template create mode 100644 templates/gRPC.podspec.template create mode 100644 templates/grpc.def.template create mode 100644 templates/grpc.gemspec.template create mode 100644 templates/grpc.gyp.template create mode 100644 templates/include/grpc/module.modulemap.template create mode 100644 templates/package.xml.template create mode 100644 templates/src/core/lib/surface/version.cc.template create mode 100644 templates/src/cpp/common/version_cc.cc.template create mode 100644 templates/src/csharp/Grpc.Core.Api/VersionInfo.cs.template create mode 100644 templates/src/csharp/Grpc.Core/Internal/NativeMethods.Generated.cs.template create mode 100644 templates/src/csharp/Grpc.Core/Internal/native_methods.include create mode 100755 templates/src/csharp/build/dependencies.props.template create mode 100755 templates/src/csharp/build_unitypackage.bat.template create mode 100644 templates/src/csharp/unitypackage/unitypackage_skeleton/Plugins/Grpc.Core/runtimes/grpc_csharp_ext_dummy_stubs.c.template create mode 100644 templates/src/objective-c/!ProtoCompiler-gRPCCppPlugin.podspec.template create mode 100644 templates/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec.template create mode 100644 templates/src/objective-c/BoringSSL-GRPC.podspec.template create mode 100644 templates/src/objective-c/GRPCClient/version.h.template create mode 100644 templates/src/objective-c/tests/version.h.template create mode 100644 templates/src/php/composer.json.template create mode 100644 templates/src/php/docker/alpine/Dockerfile.template create mode 100644 templates/src/php/docker/centos7/Dockerfile.template create mode 100644 templates/src/php/docker/download_phpunit.include create mode 100644 templates/src/php/docker/grpc-ext/Dockerfile.template create mode 100644 templates/src/php/docker/grpc-src/Dockerfile.template create mode 100644 templates/src/php/docker/pecl_ext_build_src.include create mode 100644 templates/src/php/docker/php-future/Dockerfile.template create mode 100644 templates/src/php/docker/php-src/Dockerfile.template create mode 100644 templates/src/php/docker/php-zts/Dockerfile.template create mode 100644 templates/src/php/docker/php5/Dockerfile.template create mode 100644 templates/src/php/ext/grpc/version.h.template create mode 100644 templates/src/python/grpcio/grpc/_grpcio_metadata.py.template create mode 100644 templates/src/python/grpcio/grpc_core_dependencies.py.template create mode 100644 templates/src/python/grpcio/grpc_version.py.template create mode 100644 templates/src/python/grpcio_channelz/grpc_version.py.template create mode 100644 templates/src/python/grpcio_health_checking/grpc_version.py.template create mode 100644 templates/src/python/grpcio_reflection/grpc_version.py.template create mode 100644 templates/src/python/grpcio_status/grpc_version.py.template create mode 100644 templates/src/python/grpcio_testing/grpc_version.py.template create mode 100644 templates/src/python/grpcio_tests/grpc_version.py.template create mode 100644 templates/src/ruby/ext/grpc/rb_grpc_imports.generated.c.template create mode 100644 templates/src/ruby/ext/grpc/rb_grpc_imports.generated.h.template create mode 100644 templates/src/ruby/lib/grpc/version.rb.template create mode 100644 templates/src/ruby/tools/version.rb.template create mode 100644 templates/test/core/end2end/end2end_defs.include create mode 100644 templates/test/core/end2end/end2end_nosec_tests.cc.template create mode 100644 templates/test/core/end2end/end2end_tests.cc.template create mode 100644 templates/test/core/surface/public_headers_must_be_c89.c.template create mode 100644 templates/test/cpp/naming/resolver_component_tests_defs.include create mode 100644 templates/test/cpp/naming/resolver_component_tests_runner.py.template create mode 100644 templates/tools/distrib/python/grpcio_tools/grpc_version.py.template create mode 100644 templates/tools/dockerfile/apt_get_basic.include create mode 100644 templates/tools/dockerfile/apt_get_pyenv.include create mode 100644 templates/tools/dockerfile/apt_get_python_27.include create mode 100644 templates/tools/dockerfile/bazel.include create mode 100644 templates/tools/dockerfile/buildifier.include create mode 100644 templates/tools/dockerfile/clang_update.include create mode 100644 templates/tools/dockerfile/cmake_jessie_backports.include create mode 100644 templates/tools/dockerfile/compile_python_36.include create mode 100644 templates/tools/dockerfile/compile_python_38.include create mode 100755 templates/tools/dockerfile/csharp_build_interop.sh.include create mode 100644 templates/tools/dockerfile/csharp_deps.include create mode 100644 templates/tools/dockerfile/csharp_dotnetcli_deps.include create mode 100644 templates/tools/dockerfile/cxx_deps.include create mode 100644 templates/tools/dockerfile/debian_jessie_header.include create mode 100644 templates/tools/dockerfile/gcp_api_libraries.include create mode 100755 templates/tools/dockerfile/go_build_interop.sh.include create mode 100644 templates/tools/dockerfile/go_path.include create mode 100644 templates/tools/dockerfile/grpc_clang_format/Dockerfile.template create mode 100644 templates/tools/dockerfile/grpc_clang_tidy/Dockerfile.template create mode 100644 templates/tools/dockerfile/interoptest/grpc_interop_aspnetcore/Dockerfile.template create mode 100644 templates/tools/dockerfile/interoptest/grpc_interop_aspnetcore/build_interop.sh.template create mode 100644 templates/tools/dockerfile/interoptest/grpc_interop_csharp/Dockerfile.template create mode 100644 templates/tools/dockerfile/interoptest/grpc_interop_csharp/build_interop.sh.template create mode 100644 templates/tools/dockerfile/interoptest/grpc_interop_csharpcoreclr/Dockerfile.template create mode 100644 templates/tools/dockerfile/interoptest/grpc_interop_csharpcoreclr/build_interop.sh.template create mode 100644 templates/tools/dockerfile/interoptest/grpc_interop_cxx/Dockerfile.template create mode 100644 templates/tools/dockerfile/interoptest/grpc_interop_dart/Dockerfile.template create mode 100644 templates/tools/dockerfile/interoptest/grpc_interop_dart/build_interop.sh.template create mode 100644 templates/tools/dockerfile/interoptest/grpc_interop_go/Dockerfile.template create mode 100644 templates/tools/dockerfile/interoptest/grpc_interop_go/build_interop.sh.template create mode 100644 templates/tools/dockerfile/interoptest/grpc_interop_go1.11/Dockerfile.template create mode 100644 templates/tools/dockerfile/interoptest/grpc_interop_go1.11/build_interop.sh.template create mode 100644 templates/tools/dockerfile/interoptest/grpc_interop_go1.7/Dockerfile.template create mode 100644 templates/tools/dockerfile/interoptest/grpc_interop_go1.7/build_interop.sh.template create mode 100644 templates/tools/dockerfile/interoptest/grpc_interop_go1.8/Dockerfile.template create mode 100644 templates/tools/dockerfile/interoptest/grpc_interop_go1.8/build_interop.sh.template create mode 100644 templates/tools/dockerfile/interoptest/grpc_interop_http2/Dockerfile.template create mode 100644 templates/tools/dockerfile/interoptest/grpc_interop_java/Dockerfile.include create mode 100644 templates/tools/dockerfile/interoptest/grpc_interop_java/Dockerfile.template create mode 100644 templates/tools/dockerfile/interoptest/grpc_interop_java/build_interop.sh.template create mode 100644 templates/tools/dockerfile/interoptest/grpc_interop_node/Dockerfile.template create mode 100644 templates/tools/dockerfile/interoptest/grpc_interop_nodepurejs/Dockerfile.template create mode 100644 templates/tools/dockerfile/interoptest/grpc_interop_php/Dockerfile.template create mode 100644 templates/tools/dockerfile/interoptest/grpc_interop_php7/Dockerfile.template create mode 100644 templates/tools/dockerfile/interoptest/grpc_interop_python/Dockerfile.template create mode 100644 templates/tools/dockerfile/interoptest/grpc_interop_python/build_interop.sh.template create mode 100644 templates/tools/dockerfile/interoptest/grpc_interop_pythonasyncio/Dockerfile.template create mode 100644 templates/tools/dockerfile/interoptest/grpc_interop_pythonasyncio/build_interop.sh.template create mode 100644 templates/tools/dockerfile/interoptest/grpc_interop_ruby/Dockerfile.template create mode 100755 templates/tools/dockerfile/java_build_interop.sh.include create mode 100644 templates/tools/dockerfile/java_deps.include create mode 100644 templates/tools/dockerfile/libuv_install.include create mode 100644 templates/tools/dockerfile/node_deps.include create mode 100644 templates/tools/dockerfile/php7_deps.include create mode 100644 templates/tools/dockerfile/php_common_deps.include create mode 100644 templates/tools/dockerfile/php_deps.include create mode 100644 templates/tools/dockerfile/php_valgrind.include create mode 100644 templates/tools/dockerfile/python_build_interop.sh.include create mode 100644 templates/tools/dockerfile/python_debian10.include create mode 100644 templates/tools/dockerfile/python_deps.include create mode 100644 templates/tools/dockerfile/python_stretch.include create mode 100644 templates/tools/dockerfile/ruby_deps.include create mode 100644 templates/tools/dockerfile/run_tests_addons.include create mode 100644 templates/tools/dockerfile/test/bazel/Dockerfile.template create mode 100644 templates/tools/dockerfile/test/csharp_stretch_x64/Dockerfile.template create mode 100644 templates/tools/dockerfile/test/cxx_alpine_x64/Dockerfile.template create mode 100644 templates/tools/dockerfile/test/cxx_buster_x64/Dockerfile.template create mode 100644 templates/tools/dockerfile/test/cxx_jessie_x64/Dockerfile.template create mode 100644 templates/tools/dockerfile/test/cxx_jessie_x86/Dockerfile.template create mode 100644 templates/tools/dockerfile/test/cxx_sanitizers_jessie_x64/Dockerfile.template create mode 100644 templates/tools/dockerfile/test/cxx_ubuntu1404_x64/Dockerfile.template create mode 100644 templates/tools/dockerfile/test/cxx_ubuntu1604_x64/Dockerfile.template create mode 100644 templates/tools/dockerfile/test/cxx_ubuntu1804_x64/Dockerfile.template create mode 100644 templates/tools/dockerfile/test/fuzzer/Dockerfile.template create mode 100644 templates/tools/dockerfile/test/node_jessie_x64/Dockerfile.template create mode 100644 templates/tools/dockerfile/test/php7_jessie_x64/Dockerfile.template create mode 100644 templates/tools/dockerfile/test/php_jessie_x64/Dockerfile.template create mode 100644 templates/tools/dockerfile/test/python_stretch_2.7_x64/Dockerfile.template create mode 100644 templates/tools/dockerfile/test/python_stretch_3.5_x64/Dockerfile.template create mode 100644 templates/tools/dockerfile/test/python_stretch_3.6_x64/Dockerfile.template create mode 100644 templates/tools/dockerfile/test/python_stretch_3.7_x64/Dockerfile.template create mode 100644 templates/tools/dockerfile/test/python_stretch_3.8_x64/Dockerfile.template create mode 100644 templates/tools/dockerfile/test/python_stretch_default_x64/Dockerfile.template create mode 100644 templates/tools/dockerfile/test/ruby_jessie_x64/Dockerfile.template create mode 100644 templates/tools/dockerfile/test/sanity/Dockerfile.template create mode 100644 templates/tools/doxygen/Doxyfile.c++.internal.template create mode 100644 templates/tools/doxygen/Doxyfile.c++.template create mode 100644 templates/tools/doxygen/Doxyfile.core.internal.template create mode 100644 templates/tools/doxygen/Doxyfile.core.template create mode 100644 templates/tools/doxygen/Doxyfile.include create mode 100644 templates/tools/doxygen/Doxyfile.objc.include create mode 100644 templates/tools/doxygen/Doxyfile.objc.internal.template create mode 100644 templates/tools/doxygen/Doxyfile.objc.template create mode 100644 templates/tools/fuzzer/runners.template create mode 100644 templates/tools/run_tests/generated/configs.json.template create mode 100644 templates/tools/run_tests/generated/lb_interop_test_scenarios.json.template create mode 100644 templates/tools/run_tests/generated/tests.json.template create mode 100644 test/.clang-tidy create mode 100644 test/build/boringssl.c create mode 100644 test/build/c-ares.c create mode 100644 test/build/check_epollexclusive.c create mode 100644 test/build/empty.c create mode 100644 test/build/extra-semi.c create mode 100644 test/build/no-c++14-compat.cc create mode 100644 test/build/no-maybe-uninitialized.c create mode 100644 test/build/no-shift-negative-value.c create mode 100644 test/build/no-unknown-warning-option.c create mode 100644 test/build/no-unused-but-set-variable.c create mode 100644 test/build/openssl-alpn.c create mode 100644 test/build/perftools.c create mode 100644 test/build/protobuf.cc create mode 100644 test/build/shadow.c create mode 100644 test/build/systemtap.c create mode 100644 test/build/zlib.c create mode 100644 test/build_test/BUILD create mode 100644 test/core/avl/BUILD create mode 100644 test/core/avl/avl_test.cc create mode 100644 test/core/backoff/BUILD create mode 100644 test/core/backoff/backoff_test.cc create mode 100644 test/core/bad_client/BUILD create mode 100644 test/core/bad_client/bad_client.cc create mode 100644 test/core/bad_client/bad_client.h create mode 100755 test/core/bad_client/generate_tests.bzl create mode 100644 test/core/bad_client/tests/bad_streaming_id.cc create mode 100644 test/core/bad_client/tests/bad_timeout.headers create mode 100644 test/core/bad_client/tests/badreq.cc create mode 100644 test/core/bad_client/tests/badreq_2path.headers create mode 100644 test/core/bad_client/tests/badreq_algorithm.headers create mode 100644 test/core/bad_client/tests/badreq_content_type.headers create mode 100644 test/core/bad_client/tests/badreq_encoding.headers create mode 100644 test/core/bad_client/tests/badreq_te.headers create mode 100644 test/core/bad_client/tests/connection_prefix.cc create mode 100644 test/core/bad_client/tests/duplicate_header.cc create mode 100644 test/core/bad_client/tests/head_of_line_blocking.cc create mode 100644 test/core/bad_client/tests/headers.cc create mode 100644 test/core/bad_client/tests/initial_settings_frame.cc create mode 100644 test/core/bad_client/tests/large_metadata.cc create mode 100644 test/core/bad_client/tests/large_metadata.headers create mode 100644 test/core/bad_client/tests/out_of_bounds.cc create mode 100644 test/core/bad_client/tests/server_registered_method.cc create mode 100644 test/core/bad_client/tests/server_registered_method.headers create mode 100644 test/core/bad_client/tests/simple_request.cc create mode 100644 test/core/bad_client/tests/simple_request.headers create mode 100644 test/core/bad_client/tests/simple_request_unusual.headers create mode 100644 test/core/bad_client/tests/simple_request_unusual2.headers create mode 100644 test/core/bad_client/tests/unknown_frame.cc create mode 100644 test/core/bad_client/tests/window_overflow.cc create mode 100644 test/core/bad_connection/BUILD create mode 100644 test/core/bad_connection/close_fd_test.cc create mode 100644 test/core/bad_ssl/BUILD create mode 100644 test/core/bad_ssl/bad_ssl_test.cc create mode 100755 test/core/bad_ssl/generate_tests.bzl create mode 100644 test/core/bad_ssl/server_common.cc create mode 100644 test/core/bad_ssl/server_common.h create mode 100644 test/core/bad_ssl/servers/alpn.cc create mode 100644 test/core/bad_ssl/servers/cert.cc create mode 100644 test/core/channel/BUILD create mode 100644 test/core/channel/channel_args_test.cc create mode 100644 test/core/channel/channel_stack_builder_test.cc create mode 100644 test/core/channel/channel_stack_test.cc create mode 100644 test/core/channel/channel_trace_test.cc create mode 100644 test/core/channel/channelz_registry_test.cc create mode 100644 test/core/channel/channelz_test.cc create mode 100644 test/core/channel/minimal_stack_is_minimal_test.cc create mode 100644 test/core/channel/status_util_test.cc create mode 100644 test/core/client_channel/BUILD create mode 100644 test/core/client_channel/parse_address_test.cc create mode 100644 test/core/client_channel/parse_address_with_named_scope_id_test.cc create mode 100644 test/core/client_channel/resolvers/BUILD create mode 100644 test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc create mode 100644 test/core/client_channel/resolvers/dns_resolver_cooldown_test.cc create mode 100644 test/core/client_channel/resolvers/dns_resolver_test.cc create mode 100644 test/core/client_channel/resolvers/fake_resolver_test.cc create mode 100644 test/core/client_channel/resolvers/sockaddr_resolver_test.cc create mode 100644 test/core/client_channel/retry_throttle_test.cc create mode 100644 test/core/client_channel/service_config_test.cc create mode 100644 test/core/client_channel/uri_corpus/02d156dc5e6f2c11c90c2e06fcee04adf036a342 create mode 100644 test/core/client_channel/uri_corpus/042dc4512fa3d391c5170cf3aa61e6a638f84342 create mode 100644 test/core/client_channel/uri_corpus/0e9bbe975f2027e8c39c89f85f667530368e7d11 create mode 100644 test/core/client_channel/uri_corpus/1155aa6ea7ef262a81a63692513ea395f84dad6f create mode 100644 test/core/client_channel/uri_corpus/13856a5569ffd085a4d5c07af5f8e9310835a118 create mode 100644 test/core/client_channel/uri_corpus/14b57bcbf1e17b1db1de491ef2ba3768f704b7dc create mode 100644 test/core/client_channel/uri_corpus/1794310671a060eead6e5ee66ac978a18ec7e84f create mode 100644 test/core/client_channel/uri_corpus/1d30b2a79afbaf2828ff42b9a9647e942ba1ab80 create mode 100644 test/core/client_channel/uri_corpus/1fcf5d9c333b70596cf5ba04d1f7affdf445b971 create mode 100644 test/core/client_channel/uri_corpus/23162c8a8936e20b195404c21337ee734d02a6bc create mode 100644 test/core/client_channel/uri_corpus/23f3198b815ca60bdadcaae682b9f965dda387f1 create mode 100644 test/core/client_channel/uri_corpus/2ef3893b43f1f60b77b59ce06a6bce9815d78eaf create mode 100644 test/core/client_channel/uri_corpus/356c3c129e203b5c74550b4209764d74b9caefce create mode 100644 test/core/client_channel/uri_corpus/396568fc41c8ccb31ec925b4a862e4d29ead1327 create mode 100644 test/core/client_channel/uri_corpus/3b1e7526a99918006b87e499d2beb6c4ac9c3c0c create mode 100644 test/core/client_channel/uri_corpus/3b58860f3451d3e7aad99690a8d39782ca5116fc create mode 100644 test/core/client_channel/uri_corpus/41963cc10752f70c3af7e3d85868efb097a0ea9c create mode 100644 test/core/client_channel/uri_corpus/47b5228404451fc9d4071fa69192514bb4ce33c1 create mode 100644 test/core/client_channel/uri_corpus/56a2da4b2e6fb795243901023ed8d0aa083d1aab create mode 100644 test/core/client_channel/uri_corpus/574c2f13858a9a6d724654bd913ede9ae3abf822 create mode 100644 test/core/client_channel/uri_corpus/582f789c19033a152094cbf8565f14154a778ddb create mode 100644 test/core/client_channel/uri_corpus/636c5606fc23713a1bae88c8899c0541cfad4fd8 create mode 100644 test/core/client_channel/uri_corpus/63fe493b270b17426d77a27cbf3abac5b2c2794a create mode 100644 test/core/client_channel/uri_corpus/655300a902b62662296a8e46bfb04fbcb07182cb create mode 100644 test/core/client_channel/uri_corpus/6ae3acd9d8507b61bf235748026080a4138dba58 create mode 100644 test/core/client_channel/uri_corpus/6b70979a70a038ff6607d6cf85485ee95baf58e6 create mode 100644 test/core/client_channel/uri_corpus/7314ab3545a7535a26e0e8aad67caea5534d68b1 create mode 100644 test/core/client_channel/uri_corpus/7ff4d8b8d1ffd0d42c48bbb91e5856a9ec31aecb create mode 100644 test/core/client_channel/uri_corpus/87daa131e0973b77a232a870ed749ef29cf58e6d create mode 100644 test/core/client_channel/uri_corpus/884dcaee2908ffe5f12b65b8eba81016099c4266 create mode 100644 test/core/client_channel/uri_corpus/8d7e944fd5d0ede94097fcc98b47b09a3f9c76cb create mode 100644 test/core/client_channel/uri_corpus/9671149af0b444f59bbdf71340d3441dadd8a7b4 create mode 100644 test/core/client_channel/uri_corpus/96c8d266b7dc037288ef305c996608270f72e7fb create mode 100644 test/core/client_channel/uri_corpus/975536c71ade4800415a7e9c2f1b45c35a6d5ea8 create mode 100644 test/core/client_channel/uri_corpus/99750aa67d30beaea8af565c829d4999aa8cb91b create mode 100644 test/core/client_channel/uri_corpus/a1140f3f8b5cffc1010221b9a4084a25fb75c1f6 create mode 100644 test/core/client_channel/uri_corpus/a1f0f9b75bb354eb063d7cba4fcfa2d0b88d63de create mode 100644 test/core/client_channel/uri_corpus/a296eb3d1d436ed7df7195b10aa3c4de3896f98d create mode 100644 test/core/client_channel/uri_corpus/a8b8e66050b424f1b8c07d46f868199fb7f60e38 create mode 100644 test/core/client_channel/uri_corpus/aba1472880406a318ce207ee79815b7acf087757 create mode 100644 test/core/client_channel/uri_corpus/af55baf8c8855e563befdf1eefbcbd46c5ddb8d2 create mode 100644 test/core/client_channel/uri_corpus/b3c0bf66c2bf5d24ef1daf4cc5a9d6d5bd0e8bfd create mode 100644 test/core/client_channel/uri_corpus/c28a47409cf5d95bb372238d01e73d8b831408e4 create mode 100644 test/core/client_channel/uri_corpus/c3ef1d41888063a08700c3add1e4465aabcf8807 create mode 100644 test/core/client_channel/uri_corpus/c550a76af21f9b9cc92a386d5c8998b26f8f2e4d create mode 100644 test/core/client_channel/uri_corpus/c79721406d0ab80495f186fd88e37fba98637ae9 create mode 100644 test/core/client_channel/uri_corpus/ceb4e2264ba7a8d5be47d276b37ec09489e00245 create mode 100644 test/core/client_channel/uri_corpus/cf4395958f5bfb46fd6f535a39657d016c75114c create mode 100644 test/core/client_channel/uri_corpus/d46668372b7e20154a89409a7430a28e642afdca create mode 100644 test/core/client_channel/uri_corpus/d6fe7412a0a1d1c733160246f3fa425f4f97682a create mode 100644 test/core/client_channel/uri_corpus/dns.txt create mode 100644 test/core/client_channel/uri_corpus/e241f29957b0e30ec11aaaf91b2339f7015fa5fd create mode 100644 test/core/client_channel/uri_corpus/ea02d9fea9bad5b89cf353a0169238f584177e71 create mode 100644 test/core/client_channel/uri_corpus/ec4731dddf94ed3ea92ae4d5a71f145ab6e3f6ee create mode 100644 test/core/client_channel/uri_corpus/ed2f78646f19fc47dd85ff0877c232b71913ece2 create mode 100644 test/core/client_channel/uri_corpus/f6889f4a6350fea1596a3adea5cdac02bd5d1ff3 create mode 100644 test/core/client_channel/uri_corpus/f6f3bd030f0d321efe7c51ca3f057de23509af67 create mode 100644 test/core/client_channel/uri_corpus/f97598cff03306af3c70400608fec47268b5075d create mode 100644 test/core/client_channel/uri_corpus/f9e1ec1fc642b575bc9955618b7065747f56b101 create mode 100644 test/core/client_channel/uri_corpus/fe0630a3aeed2ec6f474f362e4c839478290d5c4 create mode 100644 test/core/client_channel/uri_corpus/ipv4.txt create mode 100644 test/core/client_channel/uri_corpus/ipv6.txt create mode 100644 test/core/client_channel/uri_corpus/unix.txt create mode 100644 test/core/client_channel/uri_fuzzer_test.cc create mode 100644 test/core/client_channel/uri_parser_test.cc create mode 100644 test/core/client_channel/xds_bootstrap_test.cc create mode 100644 test/core/compression/BUILD create mode 100644 test/core/compression/algorithm_test.cc create mode 100644 test/core/compression/compression_test.cc create mode 100644 test/core/compression/message_compress_corpus/dummy create mode 100644 test/core/compression/message_compress_fuzzer.cc create mode 100644 test/core/compression/message_compress_test.cc create mode 100644 test/core/compression/message_decompress_corpus/dummy create mode 100644 test/core/compression/message_decompress_fuzzer.cc create mode 100644 test/core/compression/stream_compression_corpus/dummy create mode 100644 test/core/compression/stream_compression_fuzzer.cc create mode 100644 test/core/compression/stream_compression_test.cc create mode 100644 test/core/compression/stream_decompression_corpus/dummy create mode 100644 test/core/compression/stream_decompression_fuzzer.cc create mode 100644 test/core/debug/BUILD create mode 100644 test/core/debug/stats_test.cc create mode 100644 test/core/end2end/BUILD create mode 100644 test/core/end2end/README create mode 100644 test/core/end2end/bad_server_response_test.cc create mode 100644 test/core/end2end/connection_refused_test.cc create mode 100644 test/core/end2end/cq_verifier.cc create mode 100644 test/core/end2end/cq_verifier.h create mode 100644 test/core/end2end/cq_verifier_internal.h create mode 100644 test/core/end2end/cq_verifier_native.cc create mode 100644 test/core/end2end/cq_verifier_uv.cc create mode 100644 test/core/end2end/data/client_certs.cc create mode 100644 test/core/end2end/data/server1_cert.cc create mode 100644 test/core/end2end/data/server1_key.cc create mode 100644 test/core/end2end/data/ssl_test_data.h create mode 100644 test/core/end2end/data/test_root_cert.cc create mode 100644 test/core/end2end/dualstack_socket_test.cc create mode 100644 test/core/end2end/end2end_nosec_tests.cc create mode 100755 test/core/end2end/end2end_test.sh create mode 100644 test/core/end2end/end2end_test_utils.cc create mode 100644 test/core/end2end/end2end_tests.cc create mode 100644 test/core/end2end/end2end_tests.h create mode 100644 test/core/end2end/engine_passthrough.cc create mode 100644 test/core/end2end/fixtures/h2_census.cc create mode 100644 test/core/end2end/fixtures/h2_compress.cc create mode 100644 test/core/end2end/fixtures/h2_fakesec.cc create mode 100644 test/core/end2end/fixtures/h2_fd.cc create mode 100644 test/core/end2end/fixtures/h2_full+pipe.cc create mode 100644 test/core/end2end/fixtures/h2_full+trace.cc create mode 100644 test/core/end2end/fixtures/h2_full+workarounds.cc create mode 100644 test/core/end2end/fixtures/h2_full.cc create mode 100644 test/core/end2end/fixtures/h2_http_proxy.cc create mode 100644 test/core/end2end/fixtures/h2_local_ipv4.cc create mode 100644 test/core/end2end/fixtures/h2_local_ipv6.cc create mode 100644 test/core/end2end/fixtures/h2_local_uds.cc create mode 100644 test/core/end2end/fixtures/h2_oauth2.cc create mode 100644 test/core/end2end/fixtures/h2_proxy.cc create mode 100644 test/core/end2end/fixtures/h2_sockpair+trace.cc create mode 100644 test/core/end2end/fixtures/h2_sockpair.cc create mode 100644 test/core/end2end/fixtures/h2_sockpair_1byte.cc create mode 100644 test/core/end2end/fixtures/h2_ssl.cc create mode 100644 test/core/end2end/fixtures/h2_ssl_cred_reload.cc create mode 100644 test/core/end2end/fixtures/h2_ssl_proxy.cc create mode 100644 test/core/end2end/fixtures/h2_tls.cc create mode 100644 test/core/end2end/fixtures/h2_uds.cc create mode 100644 test/core/end2end/fixtures/http_proxy_fixture.cc create mode 100644 test/core/end2end/fixtures/http_proxy_fixture.h create mode 100644 test/core/end2end/fixtures/inproc.cc create mode 100644 test/core/end2end/fixtures/local_util.cc create mode 100644 test/core/end2end/fixtures/local_util.h create mode 100644 test/core/end2end/fixtures/proxy.cc create mode 100644 test/core/end2end/fixtures/proxy.h create mode 100644 test/core/end2end/fuzzers/BUILD create mode 100644 test/core/end2end/fuzzers/client_fuzzer.cc create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/001946397b463a3562c5951f6325069d8a3a2ded create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/0083d5addbeca55271ed7ef93c8016bf7ca76903 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/00c8446b230bebbae2b473552b174a06b446337a create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/01b05a9eaa95950f697627264bbd5006060f68e5 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/01c9569f5835a576fc50ea03141662c7ef1aa088 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/025215e11687c7d2e0055e5b2b902d08e0436f78 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/02ba99615d1d69eb328adce99670f659959c1bc1 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/03abf728ac1d833c2d4a9ff7e0c912b949edc04c create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/03beeae554ed6952e94a0bf32cdbe9f97eb3ba43 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/0458afa7b507195f5d2cb51e887324d6361eb0c4 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/04bef86965e816c0cd330896ecd981dd3b14275c create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/050b79c8bf73ec690aca18072cdf95810c2efe8f create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/05b4eaa1e1a759aa6b23521c06d915174e8fec88 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/05cfa5deaead322efce84b710758a24440cef16e create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/07048654244e377ddf246e8cc18f71443035cd2b create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/078232947d7ff25557e836b4e9e907214e99b320 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/07b0bed3226eefac4a84000ec584e4ce06ebf1bf create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/07c4d3b37e850941d04ee067fcd356cf9bb4e0d7 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/07cec5c8d9c856a910c6fb57da2ae954f44beed0 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/08a8a647b6a8f47ae10852322d14832fc15021f1 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/0949f4ac376808482be6ab2dcb18a2ecb08d9a52 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/0b6fa6330bce65dfe7f758bcbfca2a2844dd07a6 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/0c0169947924a15b1b5fbe8f9013fd94d1931a36 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/0c27c9999302b39bf2256a90b0cdb767fb2b6fe3 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/0c30868720d5e1a19ff23c53740749c37a43540d create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/0c5e0660ddf5f14af8f3fbcc754a967506994c9b create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/0c6f2e0a2232788cb20c4f52ffa18d7ab8f0b938 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/0d36da88698737ec1ca7b55b30fe2b2036de7e19 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/0d407f099f8418de3dd94bd2146c858a8c6575ad create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/0d4d486aa9fd6e9c10cc9ca8967e922cadddb2fe create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/0d8c547f1d261ba07c2648bae009636c17709600 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/0d9ba07b57eb0e076b187c4455f662db085e730b create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/0dd33527db106a3e84172e8f2189734b00ced4ed create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/0e354d89d02c6c5cbba2f140dab7b609bf00793e create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/0e3a18f0f08dcb9dd174627bc997f74a5c7a1390 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/0f6b989cec08ef9da603dc83704d85900bd22f1f create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/0f7480eb0099b7706b221f610d2613b401d6d3eb create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/0f83cbec19c834f534f353f4fce20c0cd88231f5 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/0f98d7d56e9a99b97e5dc7eb122ef22e9684077b create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/0fd8859246740606c498755ab00d6147abcfec00 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/100bb8f2e6a0b41da13f4edb5c15d4a04e564840 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/101305ccd08c7a8bd0c2913c37d3dd0d39d4bb64 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/10b25b0726cb6d820165699e5a453691c7a9c343 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/10f5d1937cb068fee7f85e2654be2bfe77498bb9 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/110074f658208166d52897c9266fc46cbaa8af36 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/1160214cdb23e8fc187078a8d6796656c1ade925 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/118ffddb43ccf9dae8bdb4702232d1dc39b021f7 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/1231c6d007d9e43d169122348363e20d9f25ee93 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/1306c4c6ea714d4db0e4d814c944d8d40335e0fa create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/13a9b61e431c20734c19bb36d85883b6a501284e create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/1402bbcac6fa24eeb0475250e33f704096e2fb45 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/143e0d4f546bbb984a7c3ac1c60a37dcf85ea58d create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/1526ac4266e152b029b7c283255fe4fb6507f726 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/1576c915ee38f5bd19f285ed0ed47e36026518f2 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/15c8bfec99ff18b11211d464c824fc139cc791fd create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/1602788cf33d0354d6d48ead549e5137cd211979 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/1698ec182fad9d973b84615da3a683ecdf2d0b3b create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/169f579e66b4b8ff423891a40380e648e8d45247 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/16c85fba7b4510ac26c0fb91886d8bd166a7e780 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/175f16901997fdee41ac9ec88f7e018d46d774e7 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/17b1758fc7cd69a00d140f113b1ac894023ff20b create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/18185cbf9e9cfc1fd28d27ed0d651d7cee6a2c06 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/1859e2ee759e20fe195f67615a1576ce2b7d5bbd create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/1875a4acdcffe505ca92ea8af8d9d6b174736e80 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/18850965807039500c7f5450a907e86825cf823d create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/18926cdc608599e8df6b0f4df99d4ad856ef4373 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/1965cd58fc41578a837231c69075994da2e871d9 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/19876f91bd6e71eb4caf6748425ac645f3e73c5d create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/19e984af62c36fe982284c87421d8ee46173e9f0 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/1a9017db5ad8a9dc6cfe72305da1683a87a73452 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/1aee32faadffa3c2ec508e8fd30006423665488f create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/1ba08b63181066ffab948eb301a6a2363a81872d create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/1bd90335afc9e0a1e6a9296e3cc27c03c1201886 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/1be157b0fc79f0e7e1e05dfa3cbbe1ad71528bc2 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/1c222dae4e2cde1fca9f9bf6226200f70d625342 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/1ca51ab2fefef4f549c4a8e7f4910c6b5a4b4b1d create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/1cbcaad71950c62d41bab50f9c242d014cc0d904 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/1d19042e6db2a90c52fcc3cb0aa76f2fd335014e create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/1d458954e8174bbb5dd4d0053df47d6b7adf290a create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/1dc86d0febe4adc5353230cea24b5f7cce829283 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/1dfbb6d67ad8d2513a1841ca6f82faacc3783b61 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/1e64080289ea4168304417f3fbd86b01d7d6f431 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/1e84d42fcf18bbf81ef6e8a16a0c57abbf8d292a create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/1f040e756f76357979f317e0c6541f72fd93df06 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/1fe7d16ffc2084d5d3c5f23d16902ae8810a5393 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/1ffc4952225dda41de59603e487ff7fd3026b958 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/20216d27af2b3dcc83d944e5f7a489ed2eff98fd create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/204093594b568ada9c7857a971f2a4b42123ee1c create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/20539e464ced1a0a63d74bae731ca0a75db05967 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/205cf2b6994f10b783aa0a06938a5e47cb581126 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/207e12d6a84dc8fa020b3a60b3f75932ca4f8fa5 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/2086f83879663d7fd7fbd9a5b96ab6b5a555858e create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/20ea73876cc9cd5b3d3efa1bda21deb5eac2d61e create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/20ee437b7f456ebb19d98d94d9feb1d5e9174c65 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/20f43d29547f865e9832fd567c2a5a5899512c4d create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/2166c7093c424a2136c4cb8b10d0b124047320d4 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/2185f411bdb1edc610f16ffc86836ae366193e03 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/2197f63b9ae90f5374726d0c5b252e729014a9cd create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/21a6a133f3d1e06c077032ba56a7df4161f62efe create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/224fa2e83fd8ecaa9059ad37a55238f74b8e0829 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/22661803bd1c7198df4be6e08924ef6a48af9cd4 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/22741b8aa6129655a8130305da40ae1d1500b844 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/230527b90b0179139c961aca426187893191fdf2 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/23066692f06a4802954b513a98546b3ac9b9ab85 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/23e8c1377addaf67019ea36a084e0b68ca7a33db create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/2467fa0f8a9f4bd121f544892f0782498b2df533 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/246dcf347eba7f4d4e04d97dabc002f0acf2164e create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/252de25a5237c830ad8c5e4732c176e03785042b create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/25761748660a64111a8daa46f72ea1f336c2046a create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/2585dc7b6c095e978b56e0249fe9b5c61a4840af create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/25949b623930511f9d43fea4aa56a4389a28e11a create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/25d2969baf8bd256e15b2ab72707682b2d18b40a create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/26110f21dcb0fde99942e631366ebbd9d895860d create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/2663ce44ca5832381cbbdf7b252e39d6df021a93 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/269afce3bfff993c05c2a3b28c6cf3dfb3f461d7 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/26b8a9d27cef1ce4c3c5aefa2dee50001aab4b13 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/26f250ae38865f030176a8801ce992536351a326 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/2717067bbc0e9bfc1d90d15cddf6154800a25ec6 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/27bb1ffec59d4475dd9076b408b2cc4e4e17d229 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/27f37037525aac7a41ffbadd6ce52e5a1851a2b7 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/2825cfc19c9371f4fe70851283c68d49470d4d55 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/2862adc802092f1a422416a1666a5142f71d5d7f create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/28680d04887f96a1167dd913573ec8daa2a39625 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/289cdf83f89f70a13e9078259f764a339617c827 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/28ee8cae75efa07da9649933a9482d00643b5395 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/28f54e558b181e294e101447c7a79d976fe36fcb create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/29303c16f3afa18c2c0b84e77e587535a705a74c create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/299034b9e0cc8d91c049c489dca6d1a2b8b08959 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/29952a15459cce9c647255ab5d7486df0507eff4 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/299faa82b90ef12421d160148dfb6cd0077b57c0 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/29be7d33920998bae7329d77d4c81989eae91647 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/2a8260b23460f90f770cedcafa14868d24db201e create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/2b230a7b55b17f2f8e89c4be73a662d781f7fb3c create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/2b5eb5aac77af905877bd98ec2c4d746b247abb6 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/2b71439e9ebf611a92386b9f21ad44bde7926184 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/2c1c3047f9ca95e64cb158c09eac2ba17455e918 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/2c1ecf05c5dde692ed16502294e9570ac3b02600 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/2c342f8715556398d49bcf3343b5a249d968e19e create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/2c452818a10ddef09b90c89a53db14b9b56b21f3 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/2c6e69067c68c145dc5d3a60b86d8081fdf95d0d create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/2c79128c697b53256c56b9c57c7259866e0e2347 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/2cc43573f271ecd332551c1fb34ebc8645eaefe8 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/2d83097b3cbd2245b085e749fe923fb590790e0c create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/2dce4a1fc4bb00bfcd43d549a3785913c9280369 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/2deb1aeb93c2abca4177b1fe886eb354c83fe8af create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/2e888bda20346a2e19379e72ff04aa063897bf0c create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/2e9860242d55a74cec244bb5c5445eb2797a3157 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/2f288409c5f3cf2a10b3e1970a9c3d037dabe080 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/2f5f6d281a3d0473a04a17cbcbc6fd06cb73fd8b create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/2feb41037f5dd34e9f3465a2fbf1a6d355c8ce9d create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/300998021c7f743ff49d9cc192343ffd43eb47f2 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/301e10bb6d9f60d91efde4e0c48893203a5b8b88 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/302a11eb9b9687464b88c9a670da371f6a6c57e7 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/3104e3fcf2fe43d5a748772a04ae32a1c828e6d9 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/310b2aff5e2ec78b6004630bed39d49f8d13bb21 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/3128887b8e02f1873ed6b36766a870543269ea00 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/31545e9fe4c6aa43329dc0d4a735842574fcaaed create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/31d12a2b1378120d15b4097371d792daa95de0a9 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/320dc10f64b59b0eb0ae140912eded1ef9276556 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/3233f2ab3b6c9431289ef7dc4f40676d0128bcad create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/330dd22142ff48078b189f4533ccc56878d88f92 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/3336748264594689041e4080b51bc56f716d0689 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/333d0554d91872e693d118d6988132d95b7920ae create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/337d579ab5eb157d7d58e9287d447976062cbd8d create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/33c32a80db0ec311ee8744991c5b19345bfd8fe9 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/35fbd748458e3fd6068957d46a9fbb2b0113d2b3 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/3608078afee69879bcdbc2278e6f314469426bde create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/361c6f4374443671f039fd9659577e4460178020 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/3656614c7b0dc11d4dd7e1826f77fa96a88c420f create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/368c75135a7341a96627d0dcfc4b2081003d8979 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/370b2c16cc353621091eda4964d4c4329205ffc3 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/370f893353f792c99754ece93baed2105decd71e create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/375c2462d6ae891222686f9519294811fa5de010 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/379b177d55b1eb86ddb66dc3a037fd8283ee07c0 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/37c4aa3ff3947065ea7850574a82a29af35c1a39 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/3a01c85934363bd2067f76d0d40c491f9f846c8a create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/3a3eb65d51f30f4cd16cc6f8436a5b00702a5712 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/3ae87e3150628c422ada13002b08f2d9c5a9d78e create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/3afbc4c35885b79c6e6628afce93ce852d7767de create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/3b3b4f9a985ec49f6c54bae798208625e5adb777 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/3bb052abecc1b916cc869b9aad29c9dd55a95068 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/3c01b1f89d50fa37fcb3457cd3dd6502fe84e25b create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/3c5fa483ebfabe6e684831ce7c413176bc998c33 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/3c6444b64ace5cd6c145614ad4412382271a6120 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/3c7b516e302ad3503a933b5dcfb8c58acaea07a0 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/3d4d961511c1de95a81b129f2fe96390209de2e7 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/3da7577acd806e1d92d48211b22fd9db352fd834 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/3dec1981e8677ec6ad2517feba29869d53f8d884 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/3e8f531043a07df2280bca73fe4a7987d82ce67e create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/3fc7331ba0cf4e65fd120c9925ec0134fe683b22 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/3fcc2da89f438b247cb5b4b41e15aceccfa75b36 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/400e6759ebf559748bde92047368f7c612457edd create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/4040224f3df361afe45bce682d56d26f13829413 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/4045d25f065bb1d70a8b9c3751f7453d4b0625b9 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/407cedf992b14edac6e19f7d440ab73c88e72465 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/40948412b61caddaf558a73661caa8c1d2f858a4 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/4097094277bc09981f428280fc0cc0f590f20ded create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/411966ea7d9164fc432eeab55a55248ad808bb01 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/415dde26637ed3c0e803111c532a1a9ea9c49092 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/41aad2f11a7ab418213352e84de872d9997db8d2 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/41b499e86caed7b48c59aaaf51360c3c71029400 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/42554ddbe59429d30d718282ca606ed8b5a90eb3 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/42c395ab373346fb283ace021bdc1f6428f92f80 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/42ead79c94eccdf8a8c3d8036be73e14fa260dd5 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/43202ad9b1a689d919ab9ae91c2d0223394867bf create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/438789ebe8a5d676f6f03ef8329c3d77579aeba4 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/44153f8b7af5a3b27625a46af89e1712daa3ae8a create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/4492f9d9339873fc83bf248e392b0dcbe28c0f6f create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/44b6be630161765a3de5872629602ca14789c3bd create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/44d64196fb2e8d9506734a81304f6ef17b9bc29d create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/44f0973ec77d6fb9eac931e84fa7ec6fdadccca6 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/450f9f56c80c8b71e37302a254ba7c3f7298dfd7 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/451e69ab65e0fe0a5731622ed21ab2b5380df677 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/46dcb1c399e5a514267fbbd5a50939f34e0ad6be create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/4740e1ad2320dc991596716087180e2965a38863 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/47e8aee44c2c7bd870f15b50fc085c5a8030edfc create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/48521eae3d7e3f60237d1ed792a3c0f141919a19 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/489e9830136adcc53f4b191199c33504685b3737 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/48a3f2938fe5c8e383cbb028a36a943a64800f03 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/49112bf1277d93601eb6526fe9ee9d45864d759e create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/49c5568cb0de363bc9f9298f1eacaace6c8a268a create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/4a11af9ef42aeb36691185520be281c4760ad27b create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/4a4553c2e939cd50981bc38e8ddb1f2109ddb3a4 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/4b2ce115b15082ed951f4dc0b432da6a9d37bf85 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/4b585eb75ebca2187c0aa5a6abe4c8125aa80127 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/4b611a3748757e2fa89fcd2fb22d34444fbf5b42 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/4bed84590a55b06d7eb30d8faa4b00a881ba9b2c create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/4e05d6cf1c3f0c04f6ee92d09a53ee0fe35c085a create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/4e21c4b5c454df51c102f09ea1ba78c42133ee16 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/4eaff3c3515a1ca019d46b9be0b7318eaffb63d1 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/4ec113a0126fc5746fa3f955727d009040e8377f create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/4f5b9d5c707a35084918c272efd1295d301ca0b5 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/4f8b5b7489cca36225acec0f9aa7f5c556d79d8d create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/4fc34239f220392581520aa8cebc659daa65a7a6 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/50ece7ea16659b4e1a2284cea963fab662c19e6b create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/514c9cd7b6519b596900d924ff2caa173d688f4b create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/51c6c5297acebf9d21a8a7d6261d0a17c2adfb56 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/52939682304314f04897deddfbc9c7afa8ee50a9 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/52c00bde7f4af95a86deb0a6717d1faf2828a939 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/5323af7bd1b45a816c8f8e5c689f5a44fbb14a01 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/534c900ade27c8f7fccb1f3b7e7703f77f13a8f5 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/5360327e8bc8969f31b364df3081b51a1e03900c create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/5369926a559827d08bccf264876d592c7cae660d create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/53ef530f65b0cff2e338a51b469c224f53b628d7 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/542c958c84d1e319b9ba23c52de2c4bca08a8dc7 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/54555ceac4403855f4cf20367f7be05714c46c51 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/5482dc4af170def9c183315efaa48f9c186926a1 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/54d1bf3559344653a4f758f7360c46307cdad159 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/54e67ed1036f3f5b315e0e3c02948c30eba900fd create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/55ca8f6d9928c239a7abb32554463e6e1e1ee084 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/560c1057487e6b0d2d457748c3ad8434423eb263 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/564f203f678fb333c7b1f8f4df79237589ce346d create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/569d50f1d1307e63a549a8a8fa677c2a77acc0ac create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/56b0ac0636c57838f63415082b3ae2ec7a93f017 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/570ca8d2555dde94aa3b3121e8f5256e83eabe5e create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/578ef036a0278e79f7b935293be37bc8c0467269 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/57e7cb796ac65d2e3ea2255b162da4b9873c83f4 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/57ee6efc38f4c544a3ea3e5e73987e825bdf2980 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/5821752bf8923fdaebc8484662624d8acd382716 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/58a067ec6eda7191a5a910d8120633271d3af074 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/58bcbd601894835bb3312d2a0bc56f2e0f65984c create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/58d6dffb65a1fe1bc4e3fa970a15459587a32f77 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/58f6d7756d89ac2eaebb50c6d1d0b9f5fa0ce357 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/591d46b83d2e6babc0ce3c753c4606a10c46d7ce create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/591ef436ef8cc982b48fd827a4555b57cd9780e5 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/593792bfb0489b02828c93278cf869e6fc8bc230 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/598d346f284bcff26d1de997c4ba5c4794c90b68 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/59d28886db21f371ac9d999b68b116bcf425d971 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/59d78f6397f0483d139f5bd0a9f264156f34acc4 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/5a2447fdfdbf123f4592c1284007b7d50a01750b create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/5a52d683c9342dd301b0e699db36175aad715e1d create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/5a8cbd42a033b7899383d48c3929e517dafbb995 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/5b7ff7c113c2bcf125271d22c937f758a0cd2ee4 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/5c14b48da74ab06b3cc20c4fe355e24f7dd7852a create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/5ca233a53e3e425cc12e04b466a49789291eaa00 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/5dc7b2086a39f56d8b9135f524d34a01fcabafd8 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/5de72e607205dc17a45df703ec4e9b63c36821ec create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/5e1659e7cd840ab3f958273ebffdd215f2c81da6 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/5e25cf639ba8ea37543d944f5efa94824c6272ff create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/5f247d7b6753f7a8798cf952f49f303c532e017c create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/5f3fc3d381f07c2593cd70d9889182fe67ded2cf create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/605e474e9d9436488dfe084d348908e4dfab81a3 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/6066fc9e28b4ce704230f0e8cf21e7c3195aa2a3 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/607dac8012f188cb035b189fc3637028137023e0 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/60ece7fac04e244655a6091a7fc6eb76f07c7192 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/611343a6b8879b393ba2f38ed41c7f5355355920 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/616e55354ba3517ce6762d6cd56600f97915e646 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/622d46854c2d38b5fe632649d58a69b7da0803c0 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/629dd62ac0c44a5bb49a5b4b5e4d3f15852a0991 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/62c843359941660da3fc9eea62a5732aaa3be283 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/6353376941f932ad6ea7620be8673c27ec106aba create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/636a19b8f50c4efccccea83ab78a933d999e41fa create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/63a1cb41d219394c9bab947202921506f3574ad0 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/64696e93ead18265cdac3fb37dae29ad3be6d764 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/64af31c3b16ccf2e182998ef7739bc3d33781d8f create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/64c0e0b4d9c2d25fdcb1e2bdcb999487fc096dad create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/64cad305e1858eae27cd723778fb9f4b7052eaa5 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/64d27dc9f984c49d421a5b0cb0391992d5aac1a4 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/650f74738d3961af2d1fe85ad8fc8212ea13cbbf create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/653ec14661c40ea25bdbab4a7cb9371c669d10d9 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/65c7a3ead9676f7669f0e93c432af714c232e5d1 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/65cc92868683dcf3c5d1bd1a73db9473d6594bcf create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/65dff388749da6a44926b491cdc555f61d708171 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/66145518601b1405361df12570f6e0b2b9a2e5b3 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/662d81374a2c96f867ccd88a4295190827c45453 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/667ce3f1c874125b7106bd5520e60e865442a712 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/669256f857011c32f5757ec19b2e5b9a372f6c23 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/6749752b02f7d14fff9ac35f6b68dd62f5b49fcd create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/676adbb1e5b3f4f9e3cba51d3d4ef963ba4ea7e3 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/67e72cea2b7042f08e8dfba5191d27bb390e4d00 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/67f160446ded73c408f4e5a0665731b642b6edd4 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/6856c7cb02d2ba74a60fd47140f042701dda63b3 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/685fbddd9ea612b25e325a50bd659997b4d77da1 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/690158fb146f7f3b3ea820979307a8d8e6f38314 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/69542ed81b00a5ec8daaf4e8d509201eecd502c5 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/69be4179b28e408a0574935e893c6986bbca0de9 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/69e14b73af03e8f2d998cfcf16215f65bf589efb create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/69e52eef5dd0c51012b5c974cf70f4074ba814a9 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/6b1698d096095d4035ce67a8680b52eada00cce2 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/6bfd3679f4e30aaaa1808e96c980edcfa9cac1c0 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/6ca3910d5f4f7967311853724b072750716dcb48 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/6d054bad0bd3c522d23221d71e3987a0e6875150 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/6d1509889d26c2ea16f5d12d5f6490dba7f1565a create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/6e2796549e29e5066f780a5e926fd6e3bb362450 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/6e71553967212dfea2c9995f3641e582d8c2105b create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/6f30de3096eb71f697885fdd9cbddd9ee6ce46c4 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/70b8a3a8621ae1ede2b8a4a263060fc2e277bf2e create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/71106770243ccca03f5025aadb298ee3a825824b create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/717695057d76b81c344ed8c23cc024195caa9405 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/7353a7b2ea9f61325728b2f118416549e89dd79b create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/739228a1400cd69c47f110002c34dbe1661e8c41 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/7465a4955a064e8f1bb777d4b0de5b3df8469831 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/748c538708f0a2f586d7ff5f662643b8f9137a01 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/74e6831be67485fb59b8e226fb8a48d88faf57d6 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/74f8cfb3d1b8422927edac90107aa280a8a2a19c create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/753efc088d6023ca113a12acc54015a22f7daf9f create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/759a1e2e34cad14321a5e5790b1e6a783312fea1 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/77cff7548cafe87410e4a0dde3ba6892b25594d3 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/77ea9180617391d8503427a1c060538182f7729f create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/7885df741c88ca4b539798d9985c445f41cc2929 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/78abacff5d3a1e826a30f278ad52237661018a67 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/7a7e42cad11ed5ac39966d23efd04777265fc50f create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/7a9a12b15c798b88f1a599779f52d14edf9f4ef5 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/7af3156d286a32a6a6fede46d93ec12ded1ac138 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/7af41e5391204f4596cb1461792e2e23f9390b7b create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/7b8922ed2aef31167d305571a4ebbf7c182c502a create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/7beeb19272131701f3a0d1dd633f1b1969899366 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/7c2e48b0d08aaeb95b5ca26036384aa2cec9de77 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/7c73c0671308e37a8075a20863e70e180ef8b6ea create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/7e0e459a0794d4f91954eb6e0b6a09685fa71c78 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/7e18989175bba8d9aea34413d6f328549e1c6825 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/7f1530d4b702e68d043f89d9e63d314319dcd803 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/8021c689f0078c5c59419c9959f5c58472245bc7 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/807b8c4ca068cff4bc0fc8e854c1215a2fe65960 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/80bd4827db81a1da28fae8c150f5e2d46651c598 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/813d2c34c0df8d4a918e68e58cf0ae3703d0d46f create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/822cae715352b8551c840be2c7e2f98df455c9c4 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/824152f7bd022996b41327002f6971cd9900b265 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/829a1dc2bcb22a230df8aa20540def0e16864983 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/82c0e02a867a5fdfb805e01ebf1a008220311e27 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/83019387566fd48738546cdae398f750cccdc437 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/831248cea079b629bf0ef6d9d02c159d6f8ed41b create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/834527ef0bc1572c584938ca7fe5336961754708 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/8382c249fc9c7a248833d89de554e63807c475f7 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/83baac5cfbec61ec277114aae4384a11a576b8f7 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/83baaee9b46770d9eef0e161a6e52cda76e3b043 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/842cea88bccc41d7e2625dae8ff7268ee79e9f57 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/850c639595eae3cc9c2cfef473e28fd4e8174dc8 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/857ce08213a5106c746767352c6863d7bd134208 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/85a7e47ef707d3b31cad924ed6c697c3678ab569 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/86eb156ff8ddd7edc535840d412342ada6f3b184 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/871a2e4d73a7fbb50f71558517a2f704b7fdb868 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/8795e24f23db36e4f9ab609c9faff601b984eb6f create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/87967bf3b1412ff60c5bec8815f4b031aec26b4c create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/87c8549a5e524609c29e6a6ae32a3a301b72c286 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/87e97b460042d045629263ad10ff3de7b000f0a1 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/89cf42c02d7135afa6c81d8a0c2bc4c3df557769 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/8b0cf53ac17015fe066002cb3814933df9ee96be create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/8b5c4543923da5e468aca1de1ab880aed2ac4451 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/8b7b914723bfc23ec650cb91d209141641fba09f create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/8b8b9fcdfff1f891b1694614b7309cb4a2098f4b create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/8b8f6d58dff9ab0c37183ec93c9a600d5ba5d9e6 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/8ba00963037c9ff548b7a702497441799075f14b create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/8bacacba71bfa5c74fd74cb6577a49a7aec9cf1f create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/8c527bdf0f304a31866f71cdb298511041ecd320 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/8d352ea63259e26e1bb61f5a8f78254be4e3e7b1 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/8d9784f85e9662734e180ca8bec2164425ae8a87 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/8dfc4e78007040009f37109f9ca928c31b3ebb49 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/8e3f138d163022d6e105ab595788f4cfdd9b9db3 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/8ea624983d766ed45780378a3eec24eb2faeb229 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/8ecf066a6728b30e1153ad875562165db07b0d0a create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/8eeb8cf054ebd546ca0555ef1cd4ac6a08628917 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/8f05b8da748cc04e64b688c4b435fe64699bd481 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/8f980dd25f1c77e3536131c2c620aa32e8c13180 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/8fd4873d307af2d217f5d2bf02b495ba681fad74 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/8fd758e2603f1e3772cfcd295ff0f951988d7648 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/9018925b5e791ae4b3ae9c84b8a4d47d86671c2d create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/90a9c3390752b94ca19a58cb2fe6267bc818f718 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/911e2ea20b6c10431e48f70d9933987815926a9d create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/9125277ed9ec5d59e51f3e1a8d97d25ef88a5d4f create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/914464d372dcccf31ed5331293d84121e17616bb create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/91916df7c8f04d8c2b6b8f4aeaeee6972ce0de74 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/92cce6dc5c31acd62347b15d89d52ab94b507e0f create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/92ea0d3200665e1836ac12bed0837425cb9f43de create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/9329b80d0125cc994d7ad36540c7a8265d76983c create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/934a41b5027d1c5cca27ebda57560c38cb9e09ea create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/9354652806d96b09c8e7082b1b7d22e7c3fb9f0b create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/9398ac1c2b4015792661266a9c84b6d7a68c3155 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/93ac93b7deabdfb4f86eb37a1e9f6669957d14a6 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/94108ac8420347598c7cee743b2a158b1270fb8f create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/94cb0b9e26e4a800f3d413f3617111bde2438009 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/954ea72fdbeaf5b46d18c6d5bb77fc1a0f97569d create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/9552c3f6304af40224b800f3a3a5df3887a530f6 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/96e5126447131d3d59cc6547f6b91d3433ce37c8 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/970fccda0b34b59ade44d52e1212699b4d2419a8 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/97c4b73f72b248b4ebf4bf30892d0db828a85297 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/98c0c0a3c8c05aec3082755a4635e65baecf4752 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/98da5edafac67704810f093b38c86e4c77b75349 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/98dddd3f679af150e9933bd864ae20e20b7aa25a create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/99099024a3f3e389f57cb7b697eb34485846f316 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/9912de197918ac0e305f0c0107f863823e8ae818 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/998a54dc94ab6e7d6a6066415fb0dd9b52356171 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/999d0995c2f09beda8783eac95d7643a11d5c89a create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/9a21cda420d50994a8ed56e147f8316b75514db1 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/9a3f9531b10e8e0874699ce3e35031a35feee5d5 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/9a43f48d4f6219618f8cc9e876880fe81109ad72 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/9a4da2a37a26c114e1226bfbe1cf80ec5ca99a66 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/9abf980e8909aeb31936553ca22ccfd8680c4dab create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/9ad011d38bed7470e7f60780faf64d8f008b9b04 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/9b1355c6e2c43ce83001bbead09a79852e04feef create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/9b4d4ce0457f5300d6b4b309762acfdbc41e3965 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/9bd059ff0a90e86ada1ba7e5b90ae04637ae9e90 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/9c4eac3dd734a74673c76e6b21fd9c18cdfa831c create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/9d2dd744ba59c1e8ec091e23938e46d1bb5ee519 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/9d362d2aaeee243a5b54621d8187c4b16f87c9f5 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/9d43a08a964c82abba4a47246b1955d9e3609f6e create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/9d6947df24c9ebcbec72c568d9708d7b1ecae63c create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/9dfdce1b090a559a14f9a5852f78547413b1d1ed create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/9e2ab07030bd35a4c31df32c79aca5e76c1d04f8 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/9eaf2ad607a943141c29f334b2c66c2e59e99980 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/9f0ab521c728be21e93112b2730c52bc1d6c0021 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/9f2316ddcea948c947fbbf35ae87b767b8c1dc55 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/9f8e14ee5b4a2095f917084b60b5fda33f21d9fd create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/9f9ed47f98b4905f1f6ef2b552a66905bdf79b1b create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/9fee3212240d4bccfdab3696dbbc579b06d39982 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/a09ef34c93fe0ffc13045f67b7ecec683fb72e98 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/a210d629c305b89a34b7ff3c41ae4566cd22186b create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/a25b31398669b585ccab97bceadc31994de7ead7 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/a29a547671badd3154789e1a02bdb87332fcd6a4 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/a30fc2605f4e74f7003f902ea4a4c994e3ce9bfd create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/a33e1b28074a41fc5c2611a67161ae5638a47dd5 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/a39ac9e92b41d1889096ed415b4c2eb1aba6ed50 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/a3cd54d43d3b3bdfcf224d636dc11ce1b5ee4d30 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/a4874327383ca168f9d9d59cffe327f61e9a6610 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/a4e4a0473ac1f2b8de86efdf00fcb382a343126d create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/a502dbaf3c842bd86e9ae513e8782eb23c70ad7a create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/a5592f15d5424ab7e16a18e77027ab91c846d90a create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/a5c2fdae1a1c0487d00db0eec6e3429b12244b1f create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/a5cf80b996b2ba8c9580f8ecd22720c48de41044 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/a60ae4e21a913e84405814f18555f0c179c24167 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/a649093880c2a2f143f861893eaff5d30be95eb7 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/a6603e797695274d10bce000f66ca0a715f7d8c0 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/a6d4b6043d86c376e9b166d5ca395f3e099ae229 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/a6f0d1ed80393ec0a884718b44fe2dc9f852d38a create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/a706f2067bfbda7837eaad68972d60547e2957c3 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/a814c5743d492b96d2b402f9e819bf8406262224 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/a8249ebfe91327806446f14a6b2e7d9c8440257f create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/a8e306820fb76566b522c23ec68bdce0ad0536f2 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/a8e67676784506d2e6eab3a0dfa25e53a80b40a0 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/a97dbb159ef9bc6e39c9c25e04315752e871e739 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/a9d71e1ff2912d8874e38fc61cbd9a8ef28af4a9 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/aa878edb0100e876e00e310ae221b220fdb5e028 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/aaada46c7f3bff58c2dd6f4a8394135ed5f253ee create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/ab27fb527771c7d86f74afb6864e95402328ec0e create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/ab8d6e1ecbd80c6223b8623a386c61023502a57c create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/ab90bebd4c017827a6d5de61511445df81169eb6 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/abd52da5882855a63632a6917df3639538928cd3 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/ac38a6572f8420b4df37d9e39088d1905fced71d create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/ac727124e46a249419f088c8665324a11b357b84 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/adb9bf315315338bcad85929917b9def2aa098cb create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/ade2d2f0e120a9527487e9b92458ee6844800e4e create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/ae448bfe17f9a3a6eff074d4caa9f7261c94d2d5 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/ae8c538d4ad7f2996ac724bad7a075e1aea32556 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/ae8cdc02275a1436bc131bee52a17ee797e2e6c9 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/aef36c49d7dec0dcf8cdc224d9e9221fa2cb1db0 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/af8b24ffaecdfaf96c0cd7c76f31dc9e1b4d0935 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/afcce9e02e0696a2af073855a386f589cc12c94d create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/b00a32e8bfb75e75f31410dfe3592da6248275c6 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/b09f98e13e5b67a4dd7f74eff00bb247b9967844 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/b0af44b49dd7c2b2e02ed4fbc7658975338e352d create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/b10353c265bef989d8909055fd6cd52e49eef3e6 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/b24a0dd1bc0bfabb832f0d1c8410c018c4ddaf4e create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/b24c25c6d4b57a5f3d64a0adb205bf4f150c9138 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/b26a3a83d0b319ce13a9ae164e90fa6da1b05a57 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/b283eb8884c98dd50523995ce221aa1ecb3ca182 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/b2a79b262ee3966c5ce7c7b42dcffd55d7d0956b create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/b2aa4861b5104e8bb8bb173f4b023a2172a7b9a2 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/b306bbbf43b343ce3ea91f3ecf08501411c57e9d create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/b3376cb338d9ff88fdef2f8670a09e973f28f6c6 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/b33eb7e1bde4c69671dbbf9489b4d4b87c5d23fd create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/b387e46c23912785e6c353ab49b8ea4a92c2c2e5 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/b39bfaf6a3072d8a50984dcc54967e9246f8d3e5 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/b3cfcd55b0331ab0c931b8c61d4df41464587f10 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/b3f33b78433af7f607bc99b569b0cef95a1a6ca0 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/b46e762671a5e28c7061da3baee6fc41dcc0122b create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/b6d86bedf3cf19441114e463458a454709e627b4 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/b755933ad6e318ee9e0c430ff69be7a515d44def create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/b758f5c019696f33c50895168219c0e6cb04e11d create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/b7b664a39372dd6142b8ef7906857e4ab3f1fc84 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/b7c31bb5f6acc65b88e31400dcae71f7be392c86 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/b93fd0a15287dd035eac86e547e3ce42183bdb28 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/ba25be123c630bd3e4aeb9bda6304dd1a7e51365 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/ba3566735888b53712c6b2e6d52ff5f2197afd6a create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/ba942f8fb244b60561a067129c242c4bc4fdd5e1 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/baa28a5baedb645f4430940a4b4b1142f4b03e0f create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/baf7839388e10ff0c410a58797482cb83693b309 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/bbc03bf6274a79528d43e200e8f1aaa770a155d6 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/bc9e17fed43c5d0668a87e8d6354c344c5b4d00b create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/bcc7340f8876a7dff381ca676efc39d30eed9f48 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/bd0bef14e73aa1073eb5acb6e4cc901c976335f5 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/bd275178fd473028a5cedf7d5780b27e809882ee create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/be1208404991b11ef9e246d2f3537ffd65a57824 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/be3237e72b3d8d56eec0520145dd7d1a5064eede create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/be8cc5bab95e0ea7af538ca11175d710da6207d9 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/be988fc0c00a8422020dea3dc72451b09e25e1ad create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/beabbe93f1e9b2e56f729af30559ec03a00f53fa create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/c0deaead93c9b3f2fc211fb7f0711ac192715a40 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/c24143cf5f6f77f002e0ab82e3060906e2e7d062 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/c2f666569d0c6fbec701fc6772433afa22a1dad0 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/c3afa705dab02fea4d892134e7c01c3af270cb6e create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/c3de41124a14ea562360aabc9e12666851bff2fe create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/c4c53b4727e9e1f040c5d7870639dd3daa184ddb create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/c4e60ae7c05b12a90dd7c43fbc85ae4be7540f18 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/c5d0c169d326d79fc4ee8521b282dbcbf33c1d5c create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/c5dc5f5ba9c2a2af7e91e200a8e82ea2c44f3a56 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/c5dfb4a82f91d07041d4b0ca6cc34cfa1e9c7199 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/c685689a9d5b259afe237d857b7c6551dc95c176 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/c77087b4651f4c62a780d77a3b4c233490244e8a create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/c77ee0b6cb21ab7b7cf222c7f6563b3b1b1b6eed create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/c784ad2e205ba49b5bb1302746723dbc57320981 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/c7b17d6ae5f3b155532a5a9bf0239c098c35eec1 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/c84da54dacf04445b50448a70fb0ecdd08e9234a create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/c8b79e05649da58817a10ee6160a00d80b4a217c create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/c8cb20176e427d2e108187924f570ef1df6d440c create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/c916ea9c6901c1e77af764773bd2843baa2ebdc6 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/c97ebf43d8a5ce5cdb8e93a5d0362239c284ab4d create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/c9b92995f282262c51aa7106608eee6cade3245b create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/c9e2cf8be8a4dc2294020026c62840ef1fb4853b create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/ca0db313bf949ba3f87a5254646a7a7dc8a7f89d create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/caaf9a7751c0eccc34f0fc00a048012ab5ed2f37 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/cae3827ca308a477c16852cf8a435881a4058719 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/cb49955601d171fd14c9ac21137b221392c7dab1 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/cbaabef34763f2fd922e67ff5f2ea283347e9823 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/cbe59c62c6d36c7307c438159327e320cd2fcf57 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/cc4197d2381a75b674fe4944b8c690fe69a0b3b1 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/ccc36ee2c6a0daad65a4d929599fda5cd38b8fd1 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/cceb4c620c02337138e489383db0d4f4e2c7a722 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/cd4be18b1ae872c40580edc4fe8cbdf1fe2a3881 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/cd76ed6aff7e074b0cfdcc6305ec4e453d8304bb create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/cdb000a2d87e073efc9491c59707289f6bc18fd9 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/cdd1a4e358ee2396ece54b32c1f0a8d0a2e3f3dc create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/ce1c326f3b0147841550ce3b5126390764bae8e8 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/ce990633c0f2b2a2ddb66144ed942d4bc9bcd8fb create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/ceb297908903ba0fc24982ad4e6010e79dfbdd5e create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/cedd54df6d34491dbf7843c2621d6818418aca02 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/cf75632ee185df2cbbbe148e2e1ad5410f11d361 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/cf922d44bf08d223d3ebcd37a7e77d3e43555d08 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/cfa40fccc5ea4304e83ca26f4e567765c2c08627 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/clusterfuzz-testcase-minimized-grpc_client_fuzzer-5765697914404864 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/crash-12b69708d452b3cefe2da4a708a1030a661d37fc create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/crash-133500314833c9037b34a4c34ad779dd78a0fa8d create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/crash-14ed70cd9ea7987cdd0c8f6e39398ee7c60ee2ff create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/crash-17d5b79ce495f7d3f2e33d95588457281a5e8965 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/crash-3bd02c98286bfa7be8e13c5500ddb587bba74fbb create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/crash-3e52af52deb0ed5d6ef06487d7e475e8fb616972 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/crash-53e93a1906d8442d058500e7107929cdd3e84ff8 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/crash-570c79624a2e4d36be107745d2b25e74464553af create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/crash-8e546795782dffa5d5f5e94c9510aac178fcee39 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/crash-d5af12c391b7bf0ce63ee3dc656ee4410fe496eb create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/crash-d92bb454bbbd415175df541661e3696453ce3e43 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/crash-e470e9fd09a5c9ef303813a40361c897650289fd create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/crash-ff53a3d713e83ae945b8dd1782e21f5b51aa649a create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/d10f52ffae7857c5989e16960942179856f308f6 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/d17e9507af1855fcf9eca78e2d25c8fb2c40a34c create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/d194592e6f471dd487ca2625e6c3da7802ea372f create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/d1b1863b478e1ea71eafac9e03256080c8f0d1c5 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/d1cabc19ce0f9fbe365d96db68eda9f86e005eef create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/d21ca2b01baa21a666257d1a1e0275587eeb565d create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/d24d1b9d754391fd0b11b0456a2e8c6050cadee6 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/d250e525e8ff2ae4a9bddb2e478a90a1242155f0 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/d257c41db22b60cd937de16b9d90a44b9fa8e426 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/d2b5fa141432c1894be8b8242c27c248fd55cddd create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/d2df8e95436cf98ef2189191a75a3d9c78b1be6c create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/d2f71a800612876010558ce804c9a72ad0a1b9fc create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/d3141a71cdaa7a0915c8c55abf2c940b0fd00172 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/d3386702918881101368cdba2c4967e86ff3a7b9 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/d363f288f48fba8fde401978b7e764295735645e create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/d36e015b1e14ecb9559d67bb09c2851699f0aa35 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/d3d7a110638c6814e7bc8b388d25891349de14e4 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/d46c3dcede830286dd9f4a1ba02a20a0b1430664 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/d49450b97f489f0dea74a9f83c71abeba1066d3c create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/d4a72650e8218ec551fef6560ddd136d52828a4e create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/d4a744ef6dcef5cf08d5289e167b26270d39e9f2 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/d5a85ad91cfde27a96960b2e783d2ee43c50dcb9 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/d60440ebffe00597bedf89a47b7cac3346823a20 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/d60469c0b5b385f20d55aa5cca55bc2c801f3b95 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/d637cc9387087de633b9db535d19f64795c43be1 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/d70b2046ee62676b525490b70812c2157e5a3585 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/d727b7edb460c549d7b12b90f581048c9f4747e5 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/d86820c738718311fc75191b5a35cbe7029aaf18 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/d88bb0b7ff687af84f33e6af22d3516fcdac5534 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/d89026894e6c5f8b5c88dec12950f56c4b6924ba create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/d895ece988ad4712b87de8aa9bc273eee315e8b8 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/d90c312791129dee8c5f85cb3308323d0c39b70d create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/d91281daad9b821294db204dfc244b2d0d5496e4 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/da2ec14db88e6f93bb19ba2f0a7306408de37cf9 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/da322a6b88da87babb52d1527fe54cb4ac214b32 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/da424090e1b94c5d0e91e26f3f3dd6c4af18fcd5 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/da4d300d0a8e6f803ec053e3e7689c4b91eaef90 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/da538941f1613c627523cb1be71eb220d1ca2579 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/da8d4c7f02dbeaa543c159b3a4e527059978a429 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/daa680dc94232de7a6949ca6610eddcdbf13152c create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/data_frame.bin create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/db3a30a6d8e605dd587e51b214c42f68bc43cf19 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/dbe415d09cd20abd88c858b8c9b2a9e552fbd8d8 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/dc45008d5a94beeb4aba87c4b26ac6f87df1490e create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/dc4a248fa4c903ce3a571dd18aea575019445740 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/dc7ebba06558484af10b5aafd01ec4fd59276b12 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/dc815fd6d5e817898238481472f359bc50b510c4 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/dcb06a6e34cbed15515e5b3581ca666f704777bd create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/dccd1fd6d3394f5f68c87950ed7356a2e9ef0f6f create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/dd5ac34f5b220970447b2733848de78570c47883 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/dd662353bad317cee7d16191a39e094bfa4898f2 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/ddb283529bf32a85a79a57ac2f2f2d5f18631d92 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/de06dde2c760a56f63bafe6ff102663bf2d9339b create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/de9b9a35e1e7040e842b597b8d2fe4cd602e67f1 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/df20bbbb854cb997a73285ef30d227aa12d90e4e create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/df684493457bc8d87dec2ca0825f7b43978fecfd create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/e0375839ce86fa191b85662247d9b0598ec35a5d create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/e0aa94f5a63cea106ff86739ff2bd85115fd3df0 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/e0d1ee5e2e169dcae87f790f5c27e84a3453cedb create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/e13b774309bbdec8e9d3b1d3f6dbf7d6851e30ac create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/e18cab69ad5cc17c88f8b56ca9929ca8af3eed30 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/e1bd70aa5c802cd4462ff4833c09ed432ce4c9fa create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/e1f2e203d39ab2509d4a67f7a44265b1e6364334 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/e262f378a3d27bc519d472ce3650bdffcd48a055 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/e309e21c69e4b96ab37f675f4e87a52453512ef8 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/e30c4ef6423bd4d872792fbd6954ff8e47d31a97 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/e3422e8f5d63a9ef180aab552353955c7aba90b0 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/e3d12a2385b75443fe38d989e77c252e1f3cdb6d create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/e40b0fa5d814be8f2081ca2c8e0a4090d4893831 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/e442f9fd63bc5345de1c14803d4ca4bb6f1152cf create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/e4c0e27cfd3690b8255a8214d6dd055385d1d24e create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/e4dc0a111e77dc495c5db07df5e2917adb674697 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/e4f55281c481484bd9edc28fd10df0c2e0f7d546 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/e5319a8570a762bbdd67135b49579097324e369a create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/e5a7c086208248a15ee6fa5195fc4ce22469de15 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/e5ac3394971400b6636d029aec7ec665a94ecf29 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/e5e276acd665ccb47f868fe3bc36e647bbb840bd create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/e61f728210ce72ed8b2c066bd1b1ecf9e6824b77 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/e6a08259a7d47601eab5c0249cb6547024e002c7 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/e6b3c920b47e00055226d49b9f715c5d4353e3e5 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/e6c52f2f31db7595d1ecde2939a7390777f15182 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/e6f5cc0702a5f38b9e7339849e1dd2e4001e547d create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/e7c26599fb2e2b031346ff1ba09294fd758f7abe create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/e8323c817d18f0c920d3cf53be41a9bc0fd64b76 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/e969affd8af10a1b87dc63afd3b29cce3e58fbb2 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/e9f7f7f258c72222397a960652c01d2a37e2afe3 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/ea46b684f1e67a27c231f2d536c41da631189b9c create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/eb591d069d89f44150c17082e83c48c66c8e7fe3 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/eb969b9ab1b0d6b5d197795223ba7a091ebd8460 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/ebb0786acc21c6185356eae9a62490a03fddd1f2 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/ec180175f0edea0a6c3eea2ae719b006bc029ff8 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/ed6358fbe6721c9ac01a6f4cab4d2df377eb1f11 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/edee7f771a04e8ced659e7a5ddd6139e75055a7f create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/ee436743977b8e31feec22a91b1ce23dee96665e create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/ef1984d6146670122c7a7246374bca460e7284e5 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/ef2ae7dd190fdf0bd4cc2ae53c5cf1ea7db877fc create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/efdf3f43fb29720dde23c3335cce7be48b761fb7 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/eff9ad9144a2953fadc019fe72eb1cc3447c33fb create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/empty create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/error_refcount create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/f03120d1a8376638e071735bf4746454b6ede389 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/f09410ab7bc19ee1ff206f94e8eec2931faef15f create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/f09cd3e3a16658174717668e51e7382e491df1da create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/f11abb090bae8cdac1f7d9a2e344f2def0e50066 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/f1a5f3011be9748fb83e392e334e46c629a04379 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/f1b9b6803e41beabb1a762d511fc148116e09e78 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/f24f925945aaf5e8b5ee470935e5aa7f847e7a72 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/f2a6bb4e0137541e2b140b976764377d07d822d6 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/f391771de2dfbf761a3eb70af7aa5f0af4446116 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/f41f9319bda14ef21b925c46945b30728503dfaf create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/f4499e3d4bf60ae3ae929c485a13ea4dc2713369 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/f4ae2a2b692bfa83cdde75d007813426e14daef7 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/f4da422d640232e22f2613ebdacff33cecd61aea create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/f5a629c8fd5720236b66a875e96ea22e29c45965 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/f5b1eab444efb2664a295d4e6d087eb209c0c480 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/f6627c55881fe4f0c8e6999980fb226836e6f5ce create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/f66305230042fa83fcd1b98c469d90ffef3ff6da create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/f69aa5666fd60c1b6814198f12d049abb0e9f148 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/f6af3f46aacee395877d7f7909f8e412a6538efb create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/f74143e8160754e40eb4d21a182c970210707979 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/f7812b2aca4d12ffbdac67bcacc41b34524de6cb create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/f7aeceaf0b6d971038a677994b5d080fa0e18011 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/f803c87a92662898e2c8c847787b56d2c31f63b3 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/f81814b5f0191729c62ee5717775e1bb532efe7e create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/f8467d9574de94b9bb904f75a6a7e2405c36f105 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/f84f5d6188cf099465f0b70337b87ad8aa8efb78 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/f8981798dab237ea34051d18b5e903f2300a0653 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/f89ad475ff51a5a9fe18603df833453bed320f36 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/f8fb1348ec3ceeb75c2a03df6a2ead0de6f4127a create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/f91f76fa45a23adfed48a10ec9512cf16bfb6636 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/f9583b3a39c1aecbba6e81d71e7fe9b9519c8b08 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/f96843fdf2d6fdd661c26201d96ae7bec72c6c3d create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/f9940356ee9b212849fbdf0d818b17af1a4f3c6c create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/f9c875c00b7327df5bf21c3e051b55b0d2ed3cc8 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/fb340fff42a4d7ebf6b82adb9345655ffeeb05d9 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/fc3ef8b3cb43e4d2721b252e7fb578d83ed6605f create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/fcc557c9844892675be823fac8788eb694a3a118 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/fcefef90833e6ba74d3e74756105e1f32d985162 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/fda07f0de15cac77ccc54ec221d81cdade189bfd create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/fdb553b8d82e68270a7345b048772bf8367b1224 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/fe1390762579b5c335bbdea73e251b95b979c3c9 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/fea99272cd661a5fde2707e350d67a683a7c21a2 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/fecccfc70b1cf1a524b9f28a9ba2c153c8e14d0e create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/fef80aa34c31700ac8e53bede4a97131176ceef0 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/ffd52d31f9c59a346aa195a683f077dda5ecef6b create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/hdr_frame.bin create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/server_hanging_response_1_header create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/server_hanging_response_2_header2 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/settings_frame_1.bin create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/slow-unit-2b505c78b53599040622864c18644b32c345884f create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/slow-unit-53cf4d25741d5f6e7ad9147b286ff0b40cb500a9 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/slow-unit-82794c7583f365eece6a10ce776d59874490a2e7 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/slow-unit-96939ec880829d76392ba9de2c6ac5b3ff78d20a create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/slow-unit-bf008b5bfe748d33669c905f9b84be60856e57c8 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/slow-unit-d446c0fd59ce5bd844a954f0c4f7e40a891135d9 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/slow-unit-ff38df2c9451c2fd00fd746c53adef87a495da9d create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/timeout-6b847dcc217d2c51134ddf8939e3fe5153153ba5 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/timeout-76a0fb5e7896bbc694a45e713f9729248455aec5 create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/timeout-e4cc5c1a9ab8c5f3f7ae3ca97e395beb682d65b0 create mode 100755 test/core/end2end/fuzzers/generate_client_examples_of_bad_closing_streams.py create mode 100644 test/core/end2end/fuzzers/hpack.dictionary create mode 100644 test/core/end2end/fuzzers/server_fuzzer.cc create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/01c008fa.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/021ec59f.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/023517819bc642abe41d8735112fcacaf018c0cc create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/02918e4ad9e8928845f232c0cb043057add3c9a9 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/0336e1ff71939de9e2007fdb4aba891e35a37488 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/033dd2f6.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/0384345c.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/03a304b82629155af693978c2b53439e553f6450 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/03a72675e1969f836094f1ecfec2a7b34418e306 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/03b9be1fa172dff5d1543be079b9c64fa2c9a278 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/0416afd6875d9ba55f1e5f86a6456a5445d5e576 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/052c8f28e5884bb48f0d504461272cd3a5893215 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/05551028437699c8650f5d08eb5f95ee25adf436 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/05c3a0390d0f52d241728926fa901599a47e4606 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/05efe6d81ce606557691432634e81f61e68b0b81 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/06285b50669cc16463db009ac821f99cf1ec2e24 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/06bd2f82fefb9943787d63ea359f9b77072380c2 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/0766afc7c27c06ea18d896083470d587a380de3c create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/07ad7e0ea2aaecba37f2429a64e946fc6e2556f1 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/07c96c06eddbed5a3ce050436bc805f6821cbc9b create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/081e56ce6f6b1c57adb806fbc5baa9f93f87513a create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/08492d3d0994005206d1d3213b8747d1026ae1eb create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/084e9e02b8f2ed41ff9c22fef80e522e491227c5 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/08c42ef29eff83052c5887855f2fa3e07ebe470c create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/09938e3256d06a8e168eb038d8a58b8462f7f697 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/0aa599e20761777c2cb9b41cd89e5c2e18f82d9e create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/0aa7b949.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/0ab8698b211ee696f35f20a25c27e9429235fa41 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/0abd533e.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/0b275a7f.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/0c129f78eacfb0d0d3c89dd4e578724096a3cea0 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/0c413d2b361b2221585026d42f3046ff4135d2ff create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/0d10bb63.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/0e349b8762703d080b3a696600e21d64c23a2ed3 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/0f700e05.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/0ff4d220.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/10724098.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/108e270a272e312fc97ec23004b80fdc7bad3906 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/11516d58.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/11cda3f70be4b507ea936bca93af9ce5aaab3be7 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/11e90d0f3ecbf72ad5027051d476a31b8d7e0671 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/129382aa11fa2922053fa47ba691dddb98901260 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/13501419f349b7855d2e94060bd08b28923d1f37 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/1353e447b7b10fb3eabb02863a1fc5bc9bb50460 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/1421a8e9f045ac65a0f6938fae93fece1060c41d create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/146b7d66ad932c4b623eec8004e286d3705697d3 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/14f9a0cda0d64590430218aaf6dedd9be2a3533f create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/15ae78a8543a4794a27e6c79b0d34540322b97fd create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/15afdcf2cadb93f56dbe36233d8cd7ea9d2bd6fe create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/1650b19093c56a1e86ee192bd9cd8d2266a9e353 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/16753235697083ecc45c117287f1d8ce6ad1ad1a create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/1703a8f0c3b3c9dda9eba8d3850e69536436d57a create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/17d7c718ec2597353a5dd2c78d6717a3d6aabfae create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/18d8d274aa7c163fd6d0084d5c25c8623e10c541 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/18f00b5f.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/1928c455f3685f4abe7a04697f571ab864cae02e create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/1939a9021aba59ea2e49d3d0909e6fdf86ac3f9e create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/1a69d5fc.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/1aa6897b6eebb8c68c972cc5025b39c7e60c17fe create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/1ba889ea1543297824e99e641e6ca8b91f45732e create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/1cf17783de9e662f3720847f2d83d86dcdcab500 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/1cfdde7a.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/1d614f3d6b826f844178a77094bedb534748a362 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/1e92aaa5.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/1ea5651f.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/1f992057.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/20fd12d3670571283dc0c5dbb3fc139a8e943790 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/21475569.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/218c1b123428a07622570947e9b7cdb48c310ca5 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/21a2dcda.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/22ad891a.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/23c582f6e23c7bbc9ae7b039b3b4e2ccdea3d5d2 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/23f261e44d54a2736f6e288128d98db9e5015206 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/2463aea879c5ab49f8409d0e5c062c7e086b034b create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/24ed80095e58199c52997f174046272f61ce4a8d create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/25ab638f.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/26048c58bd5f2a94843f6fd1e4ab0be04b232636 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/26870785fd0564f552af4e0ca418738a85b21086 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/2701d1669c2996c097a74c5255d569615357b916 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/27ac2ae2.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/2814d70c.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/282b6585.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/29a8346696d6f0962072714b9626966c81dcef0c create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/2a688fd507072e1cfa2e3bc58652a7cd82dface3 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/2abe64b96e5e72adcf2dcc43444a69d0fb664b66 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/2ad6cedd32cd646ba8e25226c7c13a107c1d6447 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/2b14c6e618ec95754ea7e24fe6bc5a3a97df6897 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/2b40aa21723c7e67e92e74a3083df008461d591c create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/2bf69fe6b40734cc3f0abdd765757809b14b0b88 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/2c4c7e2ed6d977ec119b040b328ad09808909a70 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/2c6660ba.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/2cc6d1f3ee8933518e91b8410781fa6e105b3a15 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/2e4805c3.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/2f20e2decd09b6f211a5469c67efbada355e6c04 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/2f3b1cd6780fe475f76f17e9e36541963d993165 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/2fb017cd4c34f4af183d03c4a219d2bb36ee2dd6 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/30bba77d0f420c4f454011476f3c94e31c50c161 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/3224e6cd.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/326ec4d5.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/3292129aa7f6eba86b70fff64408f18fff895c12 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/32b11997.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/32cecacca27b249bd764f852168036c5f962bd16 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/330ad4b6.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/33b4cf1ac251f0ba0c014005ef8207afe1dea623 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/33e2ecd5c9bbc1f1dcab29d00195e0ab6d04642d create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/340b032d39e2b212828a2bd1a97e2b6b81dcd41b create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/34bba9e4.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/374262a5acf9cde1f480e7b7254c788e1936a4de create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/37ec9df8.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/38df7e63181cbd045e5af9dbee463360c8254618 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/395aea4fcfea081fc0d2733fff2d14405439fa72 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/39ea47bb.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/3aa82376296ab5a33f2921d7705b75b78b683c2d create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/3b09bf453c6f93983c24c4d5481e55d66213f93a create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/3b55d09b98e3982d6f80913a792463c3974766db create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/3ca5da2f.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/3d7ef8c7b05f26e914c479dedb1bef5e378d2d94 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/3dc665f93db294b9ccb8fcec94bcc2a91f3a04e7 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/3de41f3f.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/3e2077a4fd2def7b11e618d46245d0aa85824317 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/3e3ae35a.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/3e787760.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/3efcff3d4ca529a89061c05ef9e8035f36d564b1 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/3f3069cf26f761366f947e025f7049254d555e7f create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/3fd914fc88fbf1a8804c6715100793d27fefd21d create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/3ff171516486f77dda57bec1f757da1691547b9c create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/404e234751b01dd0b51f9e7610f787253b074528 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/407607d2.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/40af8d589c76d7912bec06c2ae1f2466065018e7 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/4123bd764c04385191342ea64918408140313714 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/416160124b3b64fc9355f24dd789b3d1fd097b8b create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/418f392319c44d06a018ce4c62569d527829177a create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/41b31ef0.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/422708b4.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/422fa704.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/4271fbb36e03cee79b21a4a5a65f37ceef58a8cd create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/42b0afca.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/43fc6abab9840be5ee614211f17395b5966f6070 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/44516839d35af9ccaf8a2c62f3ce6a723482445e create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/44f342a6.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/4558ddeb.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/459c0bf6.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/468cf8bf3e31e1013c7c6d2288baac47ff90aa63 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/47563391b73b6ef4bf987014c3e631fe2555a377 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/49cb33cbb60f041e8e99dd718993acd2c3354416 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/4aa883d0.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/4b7bcb4ae6c0222a1a24d1fb1a5d96519750ca5e create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/4c412cc1a775cea041fa270483d610afb72f463b create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/4d55d5ae.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/4d982c41efad2242f8c06630c23c68146153b47b create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/4db3d4075ed27f2a2311f85dd1d6df028cc5d083 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/4eb269c3.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/4ecfe1be695df0d2489dddb52da8bcdeb6ed779d create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/4f96a5fba4d11401eb22d4b1e365fbbb2d684f24 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/4f97bd97ab5dc6b4c0f62f8459be8a9593dc83b3 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/4ff50e49865768323f94116bd98d2314455273cc create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/508def44e4d60f237f18a40d7058e58a752a74e1 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/51a1abd1.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/52b5478161de7b2eba0f7bfbc29aea985c8d9ee7 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/52ecfedca3b2b26e6999b6afc846f3dbd5d35130 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/53d18398c0d484de00afd8d583fe802d55d4da44 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/53de507f.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/540ada69.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/5413b531fe06923ddf2c9e3eb958769374bc2445 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/5429f0da.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/5435005f.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/546367bfdd2b9464fbfe5d74f55d8cd220accbab create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/54aca6c103dbdf019a2bf45506786c095e470de1 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/54d0fc6c.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/552199651d942e7220141a93ec33dd8256210a18 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/55af20415ead0ddd417f37fa91a4c767b749ee34 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/55f6fb1a.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/5780565e.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/57918260.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/5841d898d2cd804f2d6373538e341dfba8a4dfab create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/58b88a24.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/59743fe120be6ae1aed1c02230ee1bb460f621ee create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/597fdab5.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/59ce7091c00075943d79e857c01ad1af5f38c78e create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/59d0b24d1acd01c749fb4bd6802a5f4dd003ce75 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/59dcfde4.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/5ac92c4a7fb476393f8275fe4b79a2b13e3bcad9 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/5d43ac923d7607a16e3d7bf8b838f52622871251 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/5d817877.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/5db8b96291c7ee12141eafc925be845c4f5ea069 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/5e2508e15c79fbe9c2e6c1a393b490356a17efbc create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/5f758756.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/5f820fa8d44229219d0b7c4724e3e40a2ace97f4 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/609706c57e848ea58d7ca14fe6cc253322f3e8ce create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/61e798bdd49b339983fea4ccfe18efe44afbd69b create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/62d05f336176a10a2c339c04d818f23b6e9a2637 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/6499e2db.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/64cdbb31d5eda779d07885fa7881812db7800c05 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/65077d2946cfb822cf92c9dfc44517a34589f277 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/65099066.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/652bfdce.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/65d5ae42e6acb429459a1e1a5fb35f09c0f95de2 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/65fd6cb3058ee0baae854cc7859b7c0c1e1c1166 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/6652f7be83a876214affc3f230040757f7db4ea8 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/67b04816.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/67ebf074c7f928c4fe32fef44e5c958cf441c93c create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/68f564fd8064233897ff704b5955b33a2e29293a create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/69891e9f.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/6c0ec181e81b915071766762f5d78e9b1ccc9128 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/6c5bb78b51cf5006c92258292de19550985c00ba create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/6c66271b74a11f4e7065a6acbc86e4611e7e0dcc create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/6db42d0c5471ac697d82e882c01867b73f71c71f create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/6dc4455c.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/6e050e98.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/6f3bd9f33ca05bebe3811f7b3ae6ed112e1e45b9 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/6f9d75e1af7ae7010d32872da888a582a25fddb4 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/70ebe7f32c63ca8940017eb83e6db4d8b39ee03c create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/712300b98afdb5f0d15c657c13cea76841164b13 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/71ab07577909ca4b766f8ea0c6b8ec2bc395fc66 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/72296cf9e1052ced4b60e2053aba9f1a569144e9 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/72db978194609ac138bca393650740a3eae8f448 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/7342b3febb07521e39abdf4ee976d16199d51239 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/746715fe.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/76294f12a5974e9f87d8f092d0df5429cf6c0466 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/769f5d079151d1b5cab388c47a74f3c297c18d58 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/7839f12a8410a73d66e191cb5183d36d09a375e8 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/7a946bf3cd91b63001f2cf3f40c515c747f2ecde create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/7b453adcb9c4bf31dbc448ff32c2bc90ebcbdf0f create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/7d25c28298fb4d0fe41209d0d14307e4aa67c59e create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/7ddfac7d7845b424bf670070781ca6ff8586c63b create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/7df75412d12894fc501bd2d8493fe9e5a753ad88 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/7f15bbce.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/7ffd05db.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/8138b18a9a743659befc2f2b23d23cb9c3086a09 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/8164d3c4af043c47cfd6966873bccd2353d072bf create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/81fb19dfcb3c3a18fd9e7c177356479503e75e6f create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/82dda42ddde662192ebaa96788945b7673bb486b create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/830e3f794c53f7b284eb5c635b2943db9ee9aaee create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/8338ebee.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/84a3c6cf853ff318ae163231ce295171a59d5871 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/86478f200fa3602b9859597fd1ae56a04027d7e9 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/8694fdefd4ed3d3fdb30fe1d7595f6ea6f5f5054 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/86a19d13cc65790696299c819cac17b14e337647 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/86e6dbf2.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/87155c97c3fc6276f7b8f13b50a50e2307b2d397 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/87e6640111fb02fa4cda7db9c1d51432b3b06212 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/88017b0894db1e6f4e3a6640ffe2876d31a54723 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/8846918f967dd6513040c6d382fcd68ff7099873 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/885fe25a0b441ef46ab176b88771c133e530cb73 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/88e1329b.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/89cd90fb47bb9eb289e8126b26021ee00d572d95 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/8b186384.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/8c04817a75fddd71f13779f2ad5b994f45c333a2 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/8c72c3f35e9b9fd168ad9024c953a703f33ae3c1 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/8c760938a2a72fa92b27e00e05005e2e4c429359 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/8da521d9.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/8de81717.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/8ec00f45afb097066f47d0bad256a8b856b1efe8 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/90224b8e.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/90240c7c.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/9099ac4e83f6460c80b5557c87f653e4c65aa091 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/914ed07570b6441365a3636d05850f7316c7f2a8 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/916b825da0ffc46fdb6120b1044e98ae158fce70 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/925011abb99fd56bb0f425ae5e0d92e6d341f804 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/92f1df2266f34a097e96dd22188d8633832d37b1 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/93beeba2.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/93c3ffcb7e3bcb5ed7e37a5b3dfb97b43ca42718 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/947f53c0978672e59be452395670fa949a33cb4f create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/9540d3ad3fa75bfb95c0d57cefd737611c7069a5 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/954337ef.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/95d25ba2e190fafa2b3ca1e1c467b9ef64868962 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/9764015f89a0b7a59f3b5359b0a037b38d6e39d7 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/97aed4bd.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/984886f71bcbb9e5c224ca15165d5c21d9daf13e create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/986c9ca7db83b2cddbae2a0db2dca87f52277074 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/9953eb28aa1ed661612a4710a9d16a15de4ae353 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/99a1acc96512c1155f91afa378e2345726d307c3 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/9a176b6f7e0dc5f681a1788d8954f76fabd08cad create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/9a6963b0d0fcb0e91a31748c47c6f0e1e842fea9 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/9bf7553a.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/9d2d18fce18c790035d8f67ed798703bdda0a949 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/9d7b307bf4ef07f46b2c99311b4486bf40884b1a create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/a112d484b70e778835fcd478fd651828720791e5 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/a24bf2dc.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/a32be0653ccc65463445b4aaf24a7a1164d5c642 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/a357658d.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/a3a2b1af.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/a40c3ba87b4206142b134f67485859b7c9b7c75c create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/a5348197.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/a5b529754606b96a8c801615ac12a1f6ee5c3f54 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/a5cc3762cb2b2cac316c60ddee794016057fb4ff create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/a5ccb8f124d8ddb5350b90bc0d6b96db280cb7c9 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/a7e64803.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/a7fac1265a384fe9e45a9ee3d708b79c4e80505e create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/a8305e9bb4a544eaef27e8bd21b4faabf524a84e create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/a8b4049240b53947a8bc76cadf8d4ff9a802c783 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/a8d229374635fa6f2a75ca1669892e1bc244e719 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/a8f2345b2c949e9e32a434c99accf771f405eb65 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/a9463428cdc47d37efb6e3c5633d1e5e78911f16 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/a9966f7181d08f6a9ff8158736ad77a285d743a6 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/a9e22d93.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/a9fc296cc61d020bc9afbdd0e7e5e3031e884176 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/aa3c8974.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/aa825693.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/aa8729d7.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/aaafca90a7f59184f3d768a1d6f9093e8f737b8a create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/aaf049720c707d4e14e47e7eb31d6a2dda60e66a create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/ab41d96d82d2dd3f41cd495c53ea031d7979b47a create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/ac4e19c9fe290afc54bbb1e5f6cfe84a9c1f3c29 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/ad810f7f.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/ae297426638eb5a0611324f403c3189515274f1b create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/aedefcd9bd7fc10b7bf60372da54c43e953523bd create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/aefcbc29f2caea5038cda4dbc927cdadd9b844c4 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/b06ce623.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/b1128694.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/b220d23a13d98d4815b1f7a3e4fe7dd8672b1c83 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/b28959dd.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/b431df13.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/b5acaa52.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/b74dcd9c2780f145e09a27d2e03119576889a301 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/b7ce4a4f6eea20c0b83d9f7fa8406a0730ee0040 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/b829143b.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/b887097732b9c30719f6c7ea7a7cbac531512a31 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/b924c842.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/bad4f467.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/bc9545cebdcb3af82406a5f0c1b286d28f9d4f5a create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/bd63e44a3b004e7ed471c2367c3efae2c58a676d create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/be9b6e78.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/bf5e21c32becb5839deeb81e9174cf6478a25473 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/bfb55acd5b66521eb5bd8ce6b57b3b6895883675 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/bfcbffa9.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/c004455e9d60bc2fff094e79cd0b38507023e018 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/c039ac9a5a570f8fd9064df9320890b885edf9c3 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/c1188b44.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/c12835aa9f3513d3f7179ee4f9976292713f7cb9 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/c13188118af1634061b6a3947b81618891aeb6a3 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/c2d2aa1977b17d6e38f906968aa756e98dd09ffa create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/c35968bf.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/c39c0192d0d4f2b24f05c25a9e669cc091bff9e9 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/c43d97f2.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/c4534867.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/c4a71cdd29759b51f9cc54175ad69c44b4ab6eb6 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/c4e4c7572e005e18d56eac407033da058737a5ab create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/c559f565.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/c56fada76f5c198232201a608072a1a63e3d3785 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/c5ff50ae447ac7a0c8fb3363b2458824d405e64c create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/c66e84d1.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/c6a1d2cc8935808b6e317a69baec1c3cb87cac94 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/c7c44b98faa21c8f0645a818a65b60d956d15952 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/c8073f5f41970fab4738215e42ec97a4383855e5 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/c81dec02.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/c8812dc8a1ab1592a2d7b71300e1a0a5da6a6382 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/ca843c66c4c4807ccb1615b472c79bc459e5c6cb create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/cbb04be69714f81f5cd09e36e8ea4e69ea73d618 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/cc97ece92b72cc2a4d045e16c0e2f2021bc014f8 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/cca29902.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/cdba6c45.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/clusterfuzz-testcase-5417405008314368 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/clusterfuzz-testcase-5595941564317696 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/clusterfuzz-testcase-6312731374256128 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/crash-0f4b135c0242669ce425d2662168e9440f8a628d create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/crash-239cc27a23827ea53b60ccbaee0ecc64dad2bff0 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/crash-41ab0e868e84612275f77118f9e832bc94ff45c5 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/crash-73923add5066617ae08f187b79d2639b4fd96138 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/crash-7af5da2a8da23d197d9336e32da72c9ff64c15b3 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/crash-7e121dd3be057176369bea160d873040b32a03dc create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/crash-901723090ff2042ecc5a008ccd7ae0845c1681cb create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/crash-c1f66840627e3bfdedf2e4c225bc4de0c267ed37 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/crash-ccf36bef9318fe6d5e5e1560c5485cdc87d0a701 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/crash-dae0f07934a527989f23f06e630710ff6ca8c809 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/crash-e097bf07afa8e55d7dd5f5df3569e34903ccf9a7 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/crash-e34b0a9a428001cb4094a9ebca76329f578811a4 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/d0f7eebc.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/d2031009d3783fcf083963fa30bb493f7f935541 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/d28155c6c92642c61dfb097f7b2eb1d6ced272c0 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/d297b3f84e3dee9f74bf1162718aff66a11a7f5c create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/d44d94764e1761cb7278ffe5cb17871abab7ed89 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/d6979f0f.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/d6bed9cc3c10338a8c5f41064ff8bec0bbc267ce create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/d8a1d141a9e3876b71c7decbe6e3affccf6de397 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/d9074e68.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/d95556cac07e720909aaf2ac09d876106420463f create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/d96da249094db51ea92b1413907abfd27a4f2426 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/da7e44a9.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/dab172ff.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/dad922e2daf84cf039f50cf8636eaa9dbd01ff83 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/db33559d4afb4c32e68525c000fde16a4c3300f5 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/dcabac1ef8b197ef39b188bcf5dc470f9749e903 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/dda9643679f8c8b796e64232a7d153e447d64991 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/df5d3cf5f05eab65ef9d385e263780ae73c42b19 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/df80b527a003e47a26099088a283228ec62a61c7 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/e021c5b9815f02ee9d1e5a003cbf3500e19db13c create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/e0d9a9a7.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/e2652fbb.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/e2c954e1.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/e3bab014.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/e7ad0c4b7d0f289c90a3988309e9e03b78f7eea3 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/e7b08e36420fa107f0aee652e62158af85a4ef15 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/e96ad9c17795e52edc810a08d4fc61fe8790002a create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/e9bbe2fe47b7b9c2683e7f17f4a33625c6ffbd8c create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/e9d96662.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/eb66106b.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/eba8472a.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/ec4949487fa84f0cead39521b51f837af9dc784a create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/ed8da77f.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/ee64e1ba4897bfd7c6baa1fb72d4c5f83b5654e4 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/f0387dfdd6b8c925d958113e669ec4a1897034b4 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/f1121b952e75463cc71137683dc2528f9cbc19b7 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/f3220426.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/f3a092425c89f49b50469d522c99abbdb1b6dedf create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/f3d084cf20b92a5f026fe7cc6e5af49bde28693d create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/f4024b01.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/f541d27e.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/f5424a9d7bd14317b6de7b15587df28bfde8362d create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/f5c877c4.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/f5f0615030439dda162e8862b6bbd09f81f14d81 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/f74b9428.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/f7bf0d7bb0dd6e1866ccef9fafc3cb295db2f07f create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/f826100f.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/f88ffb7f3066f2706cfcd9be077595e07834cc15 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/f8b46e92c7ceb4c2f2cdcb3452a6d8c58768eaa2 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/fa202a5f51cd49f8ea5af60c5f403f797c01c504 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/fa36b4280d9e28edd81c5e4d192d1a5c2765e5e4 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/fb3b0d80.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/fb84edfa9e8cbddba26a7184e7fdc219bde556c0 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/fc162db40f87facb73cff20751e23af2e1f5296e create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/fcb1dea251d1ce74e30351f13a3f71e3debec3d2 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/fd14bea45ecaf13af0053900edb2f17b71a0bf09 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/fd26e0a6.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/fd943e69304dffebf47e1e40b0849e12abeee287 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/fdf67df81857577361d319e76559c5e85a257b07 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/fe17c07ffbaa67f1165938d2578038637b93cf57 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/fe1957b9bc7c6bf9d8b6089c422d72a0f444da6e create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/fe66893c.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/fe69ddfa5827dd560bb0b5d4da7d982273f17ef9 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/fe740f8c4ffd07f79456c8cee24ef556ee348f55 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/ff227015.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/ff898c08.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/ff902ef808e01b0b2d167c1c7e8e263d6f561941 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/hope.bin create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-0292270056246b7a4ccd2e7d0356665cef307ef2 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-03c6f209b2f144734c83d81ed452839d9e244fe9 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-082763e16153cb6b8f3f5308cd060e822f475e5a create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-098ec93ded3a20e6043d11e9cc6066351e257f8e create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-0aa52e00ddd54f8e129430852c2da95650c354b0 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-129ecb5e7b80616f36791e3580844e520f2ba7d3 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-13501419f349b7855d2e94060bd08b28923d1f37 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-14862768a1fe076896fd37e2543ddd23192a9e3c create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-1a3ebf8f8bb0b5a0109a5ef44734cc64170377f9 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-1ae0ed17a042aab8a3c3199c83a809b0243d1424 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-1b6c4b5c1949adae3efd5e3264bb32a40eea524e create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-1dc659f500e7bee41a4fee4423ade8332c162cc0 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-30408c9d13f29804168fc62a0818cc894c6375ae create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-33d8bf197de7131be78244e10fbb0da5055cf266 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-350b5da741597222c98fe86768432507850317f5 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-395aea4fcfea081fc0d2733fff2d14405439fa72 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-3991c873ba814d0cd03a67d25fff0c8fe8713aca create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-3cec540a680b108dda1e0a8e0bfb2d44e5a4a4e8 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-45cf8ac5faa9c7b15baf9281e8d7e0b4e103f0e0 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-4c6da955e4c101b81a62b2f8e934d94a62ae534b create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-51cdbfa3e97a46ceefde405e6ab087a109c26907 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-523cb1bca5ad56690c618b4ceac7fceca1113b9d create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-58f116dfba8d428a01ca596174fca63f4ac523f0 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-59f6edc7cf4aeed49b4dc024052db4846d5d7fc8 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-60a9f77951c5059616764894e1963d83d478edfe create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-63ebf780ee6c2003eba622686a4bf94c503ad96e create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-68ed2d33c9d32f73343c097303c3d5a6a3467c83 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-6d37c5e6d7efee56319b1316725fdc5aee5a52c3 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-6e980a9d12c392175b5f66683e608626ae983276 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-7233d53f94386b0339b2c2b01ef2d348f5862f1f create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-7281d9eaed0d20b0b6b5e7709c57e78fefe9c315 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-73e0a41066bc09c8e3fbd0dd7628445bcdaabb4a create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-84f22ffca68c6e1590a44aa9f6dd0cef1f680c77 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-93cd6b3f9786ee107a0e2d135b40d13f96e652ed create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-97a338fa892093ed5013a76b96b35dd112df3342 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-9a176b6f7e0dc5f681a1788d8954f76fabd08cad create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-9de2e92150e54982d4e502b18f374f8cd8fd453b create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-a1b2cfcf0997acb13a32fc5c004f57d9e9bc4275 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-a1ed26e6f82ca0e81e3f415bd8b0b8b520d3927b create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-a61a28cf78149518466b87e5463ec5c771dc504e create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-a877fe99fd0e92721d162bc252bf72a4f67ba1ea create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-aa23c18f6badd88a7bec65e8b04f7801ba624ec6 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-adaac86cf1aa1e98e95240c5f92c3708456c3624 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-b281f018cc919301131cf3ed28449cfbd24b6bbf create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-ba0016a62a8576a57f000b90c364847ef6b12dcc create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-ba17346b8e46e6a05aaa7342a959a7c5ab0f1471 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-ba2b1fde90cc70d9abae22c4c4cb051aae8aa148 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-bd9d24f5c7c915174b6ca9d1a3573e16e0edee12 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-bda43d420a3e5d5228a5f5130207a1f11fc1c81f create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-c05c239719a7beeca2c126b7e5ef7251fa615b54 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-c151762e5f37e233142059c1b269ce55434cf6a6 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-cacd0e0c5f7d4169085735400100da4d36397185 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-ccafab6afdc6474610023b47bd7b3e1b9ea4647b create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-d3c3cba3897fafec97665411ea1f94a89bb4de7b create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-d3fcd80cd6f1bb05f5e5084ebb2ee801067863fb create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-dc57e96cd02ba32fa4a99c97b6490e9879d30be5 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-ddfe613d8791b2d377e14fbdffb18b84a89d49b6 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-f3c688876395bf7a529f29f7b91532726cf5cbce create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-f412afea6b01aa53da919a41a65ffbf9885f2d65 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-f67be653815f6c2c10eea55c8009e1167ac9c20b create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-f6c1042f96e15183dcc13b9658d971cc29426d53 create mode 100644 test/core/end2end/fuzzers/server_fuzzer_corpus/slow-unit-f9a2773d6502fd4b1ffa73df3c550b0da63af833 create mode 100755 test/core/end2end/gen_build_yaml.py create mode 100755 test/core/end2end/generate_tests.bzl create mode 100644 test/core/end2end/goaway_server_test.cc create mode 100644 test/core/end2end/h2_ssl_cert_test.cc create mode 100644 test/core/end2end/h2_ssl_session_reuse_test.cc create mode 100644 test/core/end2end/inproc_callback_test.cc create mode 100644 test/core/end2end/invalid_call_argument_test.cc create mode 100644 test/core/end2end/multiple_server_queues_test.cc create mode 100644 test/core/end2end/no_server_test.cc create mode 100644 test/core/end2end/tests/authority_not_supported.cc create mode 100644 test/core/end2end/tests/bad_hostname.cc create mode 100644 test/core/end2end/tests/bad_ping.cc create mode 100644 test/core/end2end/tests/binary_metadata.cc create mode 100644 test/core/end2end/tests/call_creds.cc create mode 100644 test/core/end2end/tests/call_host_override.cc create mode 100644 test/core/end2end/tests/cancel_after_accept.cc create mode 100644 test/core/end2end/tests/cancel_after_client_done.cc create mode 100644 test/core/end2end/tests/cancel_after_invoke.cc create mode 100644 test/core/end2end/tests/cancel_after_round_trip.cc create mode 100644 test/core/end2end/tests/cancel_before_invoke.cc create mode 100644 test/core/end2end/tests/cancel_in_a_vacuum.cc create mode 100644 test/core/end2end/tests/cancel_test_helpers.h create mode 100644 test/core/end2end/tests/cancel_with_status.cc create mode 100644 test/core/end2end/tests/channelz.cc create mode 100644 test/core/end2end/tests/client_streaming.cc create mode 100644 test/core/end2end/tests/compressed_payload.cc create mode 100644 test/core/end2end/tests/connectivity.cc create mode 100644 test/core/end2end/tests/default_host.cc create mode 100644 test/core/end2end/tests/disappearing_server.cc create mode 100644 test/core/end2end/tests/empty_batch.cc create mode 100644 test/core/end2end/tests/filter_call_init_fails.cc create mode 100644 test/core/end2end/tests/filter_causes_close.cc create mode 100644 test/core/end2end/tests/filter_context.cc create mode 100644 test/core/end2end/tests/filter_latency.cc create mode 100644 test/core/end2end/tests/filter_status_code.cc create mode 100644 test/core/end2end/tests/graceful_server_shutdown.cc create mode 100644 test/core/end2end/tests/high_initial_seqno.cc create mode 100644 test/core/end2end/tests/hpack_size.cc create mode 100644 test/core/end2end/tests/idempotent_request.cc create mode 100644 test/core/end2end/tests/invoke_large_request.cc create mode 100644 test/core/end2end/tests/keepalive_timeout.cc create mode 100644 test/core/end2end/tests/large_metadata.cc create mode 100644 test/core/end2end/tests/load_reporting_hook.cc create mode 100644 test/core/end2end/tests/max_concurrent_streams.cc create mode 100644 test/core/end2end/tests/max_connection_age.cc create mode 100644 test/core/end2end/tests/max_connection_idle.cc create mode 100644 test/core/end2end/tests/max_message_length.cc create mode 100644 test/core/end2end/tests/negative_deadline.cc create mode 100644 test/core/end2end/tests/no_error_on_hotpath.cc create mode 100644 test/core/end2end/tests/no_logging.cc create mode 100644 test/core/end2end/tests/no_op.cc create mode 100644 test/core/end2end/tests/payload.cc create mode 100644 test/core/end2end/tests/ping.cc create mode 100644 test/core/end2end/tests/ping_pong_streaming.cc create mode 100644 test/core/end2end/tests/proxy_auth.cc create mode 100644 test/core/end2end/tests/registered_call.cc create mode 100644 test/core/end2end/tests/request_with_flags.cc create mode 100644 test/core/end2end/tests/request_with_payload.cc create mode 100644 test/core/end2end/tests/resource_quota_server.cc create mode 100644 test/core/end2end/tests/retry.cc create mode 100644 test/core/end2end/tests/retry_cancellation.cc create mode 100644 test/core/end2end/tests/retry_disabled.cc create mode 100644 test/core/end2end/tests/retry_exceeds_buffer_size_in_initial_batch.cc create mode 100644 test/core/end2end/tests/retry_exceeds_buffer_size_in_subsequent_batch.cc create mode 100644 test/core/end2end/tests/retry_non_retriable_status.cc create mode 100644 test/core/end2end/tests/retry_non_retriable_status_before_recv_trailing_metadata_started.cc create mode 100644 test/core/end2end/tests/retry_recv_initial_metadata.cc create mode 100644 test/core/end2end/tests/retry_recv_message.cc create mode 100644 test/core/end2end/tests/retry_server_pushback_delay.cc create mode 100644 test/core/end2end/tests/retry_server_pushback_disabled.cc create mode 100644 test/core/end2end/tests/retry_streaming.cc create mode 100644 test/core/end2end/tests/retry_streaming_after_commit.cc create mode 100644 test/core/end2end/tests/retry_streaming_succeeds_before_replay_finished.cc create mode 100644 test/core/end2end/tests/retry_throttled.cc create mode 100644 test/core/end2end/tests/retry_too_many_attempts.cc create mode 100644 test/core/end2end/tests/server_finishes_request.cc create mode 100644 test/core/end2end/tests/shutdown_finishes_calls.cc create mode 100644 test/core/end2end/tests/shutdown_finishes_tags.cc create mode 100644 test/core/end2end/tests/simple_cacheable_request.cc create mode 100644 test/core/end2end/tests/simple_delayed_request.cc create mode 100644 test/core/end2end/tests/simple_metadata.cc create mode 100644 test/core/end2end/tests/simple_request.cc create mode 100644 test/core/end2end/tests/stream_compression_compressed_payload.cc create mode 100644 test/core/end2end/tests/stream_compression_payload.cc create mode 100644 test/core/end2end/tests/stream_compression_ping_pong_streaming.cc create mode 100644 test/core/end2end/tests/streaming_error_response.cc create mode 100644 test/core/end2end/tests/trailing_metadata.cc create mode 100644 test/core/end2end/tests/workaround_cronet_compression.cc create mode 100644 test/core/end2end/tests/write_buffering.cc create mode 100644 test/core/end2end/tests/write_buffering_at_end.cc create mode 100644 test/core/fling/BUILD create mode 100644 test/core/fling/client.cc create mode 100644 test/core/fling/fling_stream_test.cc create mode 100644 test/core/fling/fling_test.cc create mode 100644 test/core/fling/server.cc create mode 100644 test/core/gpr/BUILD create mode 100644 test/core/gpr/alloc_test.cc create mode 100644 test/core/gpr/arena_test.cc create mode 100644 test/core/gpr/cpu_test.cc create mode 100644 test/core/gpr/env_test.cc create mode 100644 test/core/gpr/log_test.cc create mode 100644 test/core/gpr/murmur_hash_test.cc create mode 100644 test/core/gpr/spinlock_test.cc create mode 100644 test/core/gpr/string_test.cc create mode 100644 test/core/gpr/sync_test.cc create mode 100644 test/core/gpr/time_test.cc create mode 100644 test/core/gpr/tls_test.cc create mode 100644 test/core/gpr/useful_test.cc create mode 100644 test/core/gprpp/BUILD create mode 100644 test/core/gprpp/fork_test.cc create mode 100644 test/core/gprpp/global_config_env_test.cc create mode 100644 test/core/gprpp/global_config_test.cc create mode 100644 test/core/gprpp/host_port_test.cc create mode 100644 test/core/gprpp/manual_constructor_test.cc create mode 100644 test/core/gprpp/mpscq_test.cc create mode 100644 test/core/gprpp/orphanable_test.cc create mode 100644 test/core/gprpp/ref_counted_ptr_test.cc create mode 100644 test/core/gprpp/ref_counted_test.cc create mode 100644 test/core/gprpp/thd_test.cc create mode 100644 test/core/handshake/BUILD create mode 100644 test/core/handshake/client_ssl.cc create mode 100644 test/core/handshake/readahead_handshaker_server_ssl.cc create mode 100644 test/core/handshake/server_ssl.cc create mode 100644 test/core/handshake/server_ssl_common.cc create mode 100644 test/core/handshake/server_ssl_common.h create mode 100644 test/core/handshake/verify_peer_options.cc create mode 100644 test/core/http/BUILD create mode 100644 test/core/http/format_request_test.cc create mode 100644 test/core/http/httpcli_test.cc create mode 100644 test/core/http/httpscli_test.cc create mode 100644 test/core/http/parser_test.cc create mode 120000 test/core/http/python_wrapper.sh create mode 100644 test/core/http/request_corpus/0299ca2580e4398d170c4a336e0c33eb2cd9d427 create mode 100644 test/core/http/request_corpus/05e613853d64a9669ea3cf41b0de777dc24931ba create mode 100644 test/core/http/request_corpus/069352518a1d1baa05f317c677d275cefda2ac97 create mode 100644 test/core/http/request_corpus/0925527c9358b1e10ec0f0387cd99f35204d9a34 create mode 100644 test/core/http/request_corpus/0c5b7c2569410b526605e308309a7f36574e530d create mode 100644 test/core/http/request_corpus/0ef3d0a84360bb5ad66274f1226f5cb273ecdbcf create mode 100644 test/core/http/request_corpus/1e1273f90187fdf5df3625764245610f86af6aa4 create mode 100644 test/core/http/request_corpus/1fbc57d118f3733287e9a9d808bb8947b3260e55 create mode 100644 test/core/http/request_corpus/24756c396bc72894fd720092bb6f9c03e66b469f create mode 100644 test/core/http/request_corpus/276def41311933421ae7a9ee42e906c85b6a4d3f create mode 100644 test/core/http/request_corpus/29daa75432381937fd005cb25e314e328de6e9f9 create mode 100644 test/core/http/request_corpus/2a75204bc492084ad853682f8de3fb137d5907bc create mode 100644 test/core/http/request_corpus/2d34ba249b755a880525cf53c665633a5e359305 create mode 100644 test/core/http/request_corpus/33f4ea0c7ea27c37d8f95cfa64d282370efdafd2 create mode 100644 test/core/http/request_corpus/35554617ea6418bd43161fe9a2c337ed82d7ec5b create mode 100644 test/core/http/request_corpus/35f0c561297cfc840ddaeebb9fc61091f4eadece create mode 100644 test/core/http/request_corpus/3787bcc22ef645e665cc5f722b8a633af86de9cf create mode 100644 test/core/http/request_corpus/3953688866ccb3b4f371f1a858570d6afdb6452d create mode 100644 test/core/http/request_corpus/39b19c41ba537f37511eff7727733715db432e76 create mode 100644 test/core/http/request_corpus/3e3c4756d5e40b5aa250954cbac86b826e70a7ac create mode 100644 test/core/http/request_corpus/3f03265921120c6ffa61b944e213e062a5538d4b create mode 100644 test/core/http/request_corpus/3fb034e66ee5494a67acae1b4e6ff64ba92a2046 create mode 100644 test/core/http/request_corpus/466059ed07a0d55d6ad5e522c7d367cbf278eaf9 create mode 100644 test/core/http/request_corpus/487725eb38511c79a9340bf4560a1411061fa6fa create mode 100644 test/core/http/request_corpus/48b9b205cae8ac21512a3f26f49fd53e21ee13c5 create mode 100644 test/core/http/request_corpus/4b1f1f79a0bfa3f942479dd5f8edb59a7c257c55 create mode 100644 test/core/http/request_corpus/5028c56a5116a186b7343ff59567b47347a0796d create mode 100644 test/core/http/request_corpus/533f62b3f495ce704babf3ee8d840f196a714dff create mode 100644 test/core/http/request_corpus/5892cbb284771fc9761caae37b19cd6e27dbc104 create mode 100644 test/core/http/request_corpus/5aeab6e4f7c2a1c09d4ac0dbdb3beac4893607ee create mode 100644 test/core/http/request_corpus/5b6292bdf009b0daecbc90b85cca30a88c36eec5 create mode 100644 test/core/http/request_corpus/5c1659b77678b41faa4fa13df7772dae3238d1c0 create mode 100644 test/core/http/request_corpus/5c81f61621e29ec9c6a64ac3af9b3b216141618e create mode 100644 test/core/http/request_corpus/657368df512ca6294b9df16adf935a3f374a8be2 create mode 100644 test/core/http/request_corpus/7fc4520094902ce2c760d70eaad5b674d2817337 create mode 100644 test/core/http/request_corpus/81f59a12b458ec3604035cb962165c604d1355e6 create mode 100644 test/core/http/request_corpus/8f41c50e88ee8c17ecad3d41d63d38fb12aca0b9 create mode 100644 test/core/http/request_corpus/97c16de7fe3c390a2e6c09ff5c28f17d5c67542c create mode 100644 test/core/http/request_corpus/97e4499d450c95660de86747f527e670f2012548 create mode 100644 test/core/http/request_corpus/9a996857196e0998a1278994a9bab3d35526e7f1 create mode 100644 test/core/http/request_corpus/9b7e00049ec356ecd84b1747e4e1941140139ae8 create mode 100644 test/core/http/request_corpus/9f0c38ec455cc363369b3674a2d32bc21c206de1 create mode 100644 test/core/http/request_corpus/a1dc7bc235e46eb21d91084d7b52d5ff9f45df85 create mode 100644 test/core/http/request_corpus/aa3bbb876eafa8ad8ca4ff2eabc6dd94341d2441 create mode 100644 test/core/http/request_corpus/ae8ba95d7dbe99926a8f5bfd80347fd6a4b616a0 create mode 100644 test/core/http/request_corpus/b04fea5c041c707db0ad9c09a81672557b52cc47 create mode 100644 test/core/http/request_corpus/c4acff8aa2ff886f35439f72625d05002990c940 create mode 100644 test/core/http/request_corpus/c55ce9995b002e88a102ae2891a71e8bacb346c8 create mode 100644 test/core/http/request_corpus/ca5a0c00b8969310acb73d15ad0d0c602f1bd0c2 create mode 100644 test/core/http/request_corpus/cce734f1b263de6994f7950e0df7bf0c81449f70 create mode 100644 test/core/http/request_corpus/d39c8ee11a697634a09b309460c0bbd967e7effa create mode 100644 test/core/http/request_corpus/d4c3e4cf5d035596433c30eaabbd2b2925f4b453 create mode 100644 test/core/http/request_corpus/d51f7fcc089f269c7afecaaca51966bab5fde629 create mode 100644 test/core/http/request_corpus/d936dad71c129cf659097dc3db64550c4dd467f4 create mode 100644 test/core/http/request_corpus/e275b0466a8fb8d9e0e15856e343ddc7112ae66b create mode 100644 test/core/http/request_corpus/e5c364b205855a2991ce07482aebb2a3a6147089 create mode 100644 test/core/http/request_corpus/ee2077e08c3cfccd9bd82adb574ac4fc7d429afb create mode 100644 test/core/http/request_corpus/fc5d4b9117ba9e87388174aee4f4970bdfe8d066 create mode 100644 test/core/http/request_corpus/fdeb2c7daa9e7704f67e141106384e6dd0042c0b create mode 100644 test/core/http/request_corpus/request1.txt create mode 100644 test/core/http/request_corpus/request2.txt create mode 100644 test/core/http/request_corpus/request3.txt create mode 100644 test/core/http/request_corpus/request4.txt create mode 100644 test/core/http/request_corpus/request5.txt create mode 100644 test/core/http/request_corpus/response1.txt create mode 100644 test/core/http/request_corpus/response2.txt create mode 100644 test/core/http/request_corpus/response3.txt create mode 100644 test/core/http/request_corpus/response4.txt create mode 100644 test/core/http/request_corpus/response5.txt create mode 100644 test/core/http/request_corpus/response6.txt create mode 100644 test/core/http/request_corpus/toolong.txt create mode 100644 test/core/http/request_fuzzer.cc create mode 100644 test/core/http/response_corpus/0299ca2580e4398d170c4a336e0c33eb2cd9d427 create mode 100644 test/core/http/response_corpus/05e613853d64a9669ea3cf41b0de777dc24931ba create mode 100644 test/core/http/response_corpus/069352518a1d1baa05f317c677d275cefda2ac97 create mode 100644 test/core/http/response_corpus/0925527c9358b1e10ec0f0387cd99f35204d9a34 create mode 100644 test/core/http/response_corpus/0c5b7c2569410b526605e308309a7f36574e530d create mode 100644 test/core/http/response_corpus/0ef3d0a84360bb5ad66274f1226f5cb273ecdbcf create mode 100644 test/core/http/response_corpus/1e1273f90187fdf5df3625764245610f86af6aa4 create mode 100644 test/core/http/response_corpus/1fbc57d118f3733287e9a9d808bb8947b3260e55 create mode 100644 test/core/http/response_corpus/24756c396bc72894fd720092bb6f9c03e66b469f create mode 100644 test/core/http/response_corpus/276def41311933421ae7a9ee42e906c85b6a4d3f create mode 100644 test/core/http/response_corpus/29daa75432381937fd005cb25e314e328de6e9f9 create mode 100644 test/core/http/response_corpus/2a75204bc492084ad853682f8de3fb137d5907bc create mode 100644 test/core/http/response_corpus/2d34ba249b755a880525cf53c665633a5e359305 create mode 100644 test/core/http/response_corpus/33f4ea0c7ea27c37d8f95cfa64d282370efdafd2 create mode 100644 test/core/http/response_corpus/35554617ea6418bd43161fe9a2c337ed82d7ec5b create mode 100644 test/core/http/response_corpus/35f0c561297cfc840ddaeebb9fc61091f4eadece create mode 100644 test/core/http/response_corpus/3787bcc22ef645e665cc5f722b8a633af86de9cf create mode 100644 test/core/http/response_corpus/3953688866ccb3b4f371f1a858570d6afdb6452d create mode 100644 test/core/http/response_corpus/39b19c41ba537f37511eff7727733715db432e76 create mode 100644 test/core/http/response_corpus/3e3c4756d5e40b5aa250954cbac86b826e70a7ac create mode 100644 test/core/http/response_corpus/3f03265921120c6ffa61b944e213e062a5538d4b create mode 100644 test/core/http/response_corpus/3fb034e66ee5494a67acae1b4e6ff64ba92a2046 create mode 100644 test/core/http/response_corpus/466059ed07a0d55d6ad5e522c7d367cbf278eaf9 create mode 100644 test/core/http/response_corpus/487725eb38511c79a9340bf4560a1411061fa6fa create mode 100644 test/core/http/response_corpus/48b9b205cae8ac21512a3f26f49fd53e21ee13c5 create mode 100644 test/core/http/response_corpus/4b1f1f79a0bfa3f942479dd5f8edb59a7c257c55 create mode 100644 test/core/http/response_corpus/5028c56a5116a186b7343ff59567b47347a0796d create mode 100644 test/core/http/response_corpus/533f62b3f495ce704babf3ee8d840f196a714dff create mode 100644 test/core/http/response_corpus/5892cbb284771fc9761caae37b19cd6e27dbc104 create mode 100644 test/core/http/response_corpus/5aeab6e4f7c2a1c09d4ac0dbdb3beac4893607ee create mode 100644 test/core/http/response_corpus/5b6292bdf009b0daecbc90b85cca30a88c36eec5 create mode 100644 test/core/http/response_corpus/5c1659b77678b41faa4fa13df7772dae3238d1c0 create mode 100644 test/core/http/response_corpus/5c81f61621e29ec9c6a64ac3af9b3b216141618e create mode 100644 test/core/http/response_corpus/657368df512ca6294b9df16adf935a3f374a8be2 create mode 100644 test/core/http/response_corpus/7fc4520094902ce2c760d70eaad5b674d2817337 create mode 100644 test/core/http/response_corpus/81f59a12b458ec3604035cb962165c604d1355e6 create mode 100644 test/core/http/response_corpus/8f41c50e88ee8c17ecad3d41d63d38fb12aca0b9 create mode 100644 test/core/http/response_corpus/97c16de7fe3c390a2e6c09ff5c28f17d5c67542c create mode 100644 test/core/http/response_corpus/97e4499d450c95660de86747f527e670f2012548 create mode 100644 test/core/http/response_corpus/9a996857196e0998a1278994a9bab3d35526e7f1 create mode 100644 test/core/http/response_corpus/9b7e00049ec356ecd84b1747e4e1941140139ae8 create mode 100644 test/core/http/response_corpus/9f0c38ec455cc363369b3674a2d32bc21c206de1 create mode 100644 test/core/http/response_corpus/a1dc7bc235e46eb21d91084d7b52d5ff9f45df85 create mode 100644 test/core/http/response_corpus/aa3bbb876eafa8ad8ca4ff2eabc6dd94341d2441 create mode 100644 test/core/http/response_corpus/ae8ba95d7dbe99926a8f5bfd80347fd6a4b616a0 create mode 100644 test/core/http/response_corpus/b04fea5c041c707db0ad9c09a81672557b52cc47 create mode 100644 test/core/http/response_corpus/c4acff8aa2ff886f35439f72625d05002990c940 create mode 100644 test/core/http/response_corpus/c55ce9995b002e88a102ae2891a71e8bacb346c8 create mode 100644 test/core/http/response_corpus/ca5a0c00b8969310acb73d15ad0d0c602f1bd0c2 create mode 100644 test/core/http/response_corpus/cce734f1b263de6994f7950e0df7bf0c81449f70 create mode 100644 test/core/http/response_corpus/d39c8ee11a697634a09b309460c0bbd967e7effa create mode 100644 test/core/http/response_corpus/d4c3e4cf5d035596433c30eaabbd2b2925f4b453 create mode 100644 test/core/http/response_corpus/d51f7fcc089f269c7afecaaca51966bab5fde629 create mode 100644 test/core/http/response_corpus/d936dad71c129cf659097dc3db64550c4dd467f4 create mode 100644 test/core/http/response_corpus/e275b0466a8fb8d9e0e15856e343ddc7112ae66b create mode 100644 test/core/http/response_corpus/e5c364b205855a2991ce07482aebb2a3a6147089 create mode 100644 test/core/http/response_corpus/ee2077e08c3cfccd9bd82adb574ac4fc7d429afb create mode 100644 test/core/http/response_corpus/fc5d4b9117ba9e87388174aee4f4970bdfe8d066 create mode 100644 test/core/http/response_corpus/fdeb2c7daa9e7704f67e141106384e6dd0042c0b create mode 100644 test/core/http/response_corpus/request1.txt create mode 100644 test/core/http/response_corpus/request2.txt create mode 100644 test/core/http/response_corpus/request3.txt create mode 100644 test/core/http/response_corpus/request4.txt create mode 100644 test/core/http/response_corpus/request5.txt create mode 100644 test/core/http/response_corpus/response1.txt create mode 100644 test/core/http/response_corpus/response2.txt create mode 100644 test/core/http/response_corpus/response3.txt create mode 100644 test/core/http/response_corpus/response4.txt create mode 100644 test/core/http/response_corpus/response5.txt create mode 100644 test/core/http/response_corpus/response6.txt create mode 100644 test/core/http/response_corpus/toolong.txt create mode 100644 test/core/http/response_fuzzer.cc create mode 100755 test/core/http/test_server.py create mode 100644 test/core/iomgr/BUILD create mode 100644 test/core/iomgr/buffer_list_test.cc create mode 100644 test/core/iomgr/combiner_test.cc create mode 100644 test/core/iomgr/endpoint_pair_test.cc create mode 100644 test/core/iomgr/endpoint_tests.cc create mode 100644 test/core/iomgr/endpoint_tests.h create mode 100644 test/core/iomgr/error_test.cc create mode 100644 test/core/iomgr/ev_epollex_linux_test.cc create mode 100644 test/core/iomgr/fd_conservation_posix_test.cc create mode 100644 test/core/iomgr/fd_posix_test.cc create mode 100644 test/core/iomgr/grpc_ipv6_loopback_available_test.cc create mode 100644 test/core/iomgr/ios/CFStreamTests/CFStreamClientTests.mm create mode 100644 test/core/iomgr/ios/CFStreamTests/CFStreamEndpointTests.mm create mode 100644 test/core/iomgr/ios/CFStreamTests/CFStreamTests.xcodeproj/project.pbxproj create mode 100644 test/core/iomgr/ios/CFStreamTests/CFStreamTests.xcodeproj/xcshareddata/xcschemes/CFStreamTests.xcscheme create mode 100644 test/core/iomgr/ios/CFStreamTests/CFStreamTests.xcodeproj/xcshareddata/xcschemes/CFStreamTests_Asan.xcscheme create mode 100644 test/core/iomgr/ios/CFStreamTests/CFStreamTests.xcodeproj/xcshareddata/xcschemes/CFStreamTests_Msan.xcscheme create mode 100644 test/core/iomgr/ios/CFStreamTests/CFStreamTests.xcodeproj/xcshareddata/xcschemes/CFStreamTests_Tsan.xcscheme create mode 100644 test/core/iomgr/ios/CFStreamTests/Info.plist create mode 100644 test/core/iomgr/ios/CFStreamTests/Podfile create mode 100755 test/core/iomgr/ios/CFStreamTests/build_and_run_tests.sh create mode 100755 test/core/iomgr/ios/CFStreamTests/build_tests.sh create mode 100644 test/core/iomgr/load_file_test.cc create mode 100644 test/core/iomgr/mpmcqueue_test.cc create mode 100644 test/core/iomgr/poller/BUILD create mode 100644 test/core/iomgr/poller/eventmanager_libuv_test.cc create mode 100644 test/core/iomgr/pollset_windows_starvation_test.cc create mode 100644 test/core/iomgr/resolve_address_posix_test.cc create mode 100644 test/core/iomgr/resolve_address_test.cc create mode 100644 test/core/iomgr/resource_quota_test.cc create mode 100644 test/core/iomgr/sockaddr_utils_test.cc create mode 100644 test/core/iomgr/socket_utils_test.cc create mode 100644 test/core/iomgr/tcp_client_posix_test.cc create mode 100644 test/core/iomgr/tcp_client_uv_test.cc create mode 100644 test/core/iomgr/tcp_posix_test.cc create mode 100644 test/core/iomgr/tcp_server_posix_test.cc create mode 100644 test/core/iomgr/tcp_server_uv_test.cc create mode 100644 test/core/iomgr/threadpool_test.cc create mode 100644 test/core/iomgr/time_averaged_stats_test.cc create mode 100644 test/core/iomgr/timer_heap_test.cc create mode 100644 test/core/iomgr/timer_list_test.cc create mode 100644 test/core/iomgr/udp_server_test.cc create mode 100644 test/core/iomgr/work_serializer_test.cc create mode 100644 test/core/json/BUILD create mode 100644 test/core/json/corpus/006d552e952c42b5340baaeb85c2cb80c81e78dd create mode 100644 test/core/json/corpus/007eb985c44b6089a34995a7d9ebf349f1c2bf18 create mode 100644 test/core/json/corpus/03b74a08f23734691512cb12d0b38d189a8df905 create mode 100644 test/core/json/corpus/0495693af07325fb0d52eafd2d4c4d802c6457c6 create mode 100644 test/core/json/corpus/05454ab015cf74e9c3e8574d995517e05dd56751 create mode 100644 test/core/json/corpus/0716d9708d321ffb6a00818614779e779925365c create mode 100644 test/core/json/corpus/0a9b3522a8e711e3bd53e2c2eb9d28b34a003acc create mode 100644 test/core/json/corpus/0ade7c2cf97f75d009975f4d720d1fa6c19f4897 create mode 100644 test/core/json/corpus/0b1fcf0ac07e1e50cfe27316c7e1c8cc997f1318 create mode 100644 test/core/json/corpus/0bc13548356d08009703d35e9c8d74397367bdfb create mode 100644 test/core/json/corpus/0ea9a160c57f2c705dce037196e360bf9be739c5 create mode 100644 test/core/json/corpus/0f20d9c46991c0e97419e2cca07c7389f1d6bdf8 create mode 100644 test/core/json/corpus/0f2e2e6346f70c419300b661251754d50f7ca8ea create mode 100644 test/core/json/corpus/108b310facc1a193833fc2971fd83081f775ea0c create mode 100644 test/core/json/corpus/108e5bcd69b19ad0df743641085163b84f376fe8 create mode 100644 test/core/json/corpus/10e3ecd5624465020fdf0662a67e0f0885536cae create mode 100644 test/core/json/corpus/113c8c97cbb0a2b6176d75eaa9ac9baaa7ccddcc create mode 100644 test/core/json/corpus/11479d936dd006410a5946b6081a94d573bf8efd create mode 100644 test/core/json/corpus/11aa091189b78d1cc35c7ff4907ac16a73aba547 create mode 100644 test/core/json/corpus/1227907b2ee5a9492a890beed55332e4560834c8 create mode 100644 test/core/json/corpus/134d65130947ec69cf8df8483424b45e99cf04e3 create mode 100644 test/core/json/corpus/13584505caa892d94982a968bbc4391ebcfe0d06 create mode 100644 test/core/json/corpus/137f554ee0f6b903acb81ab4e1f98c11fe92b008 create mode 100644 test/core/json/corpus/1401ea03ec78b8f20dc7be952555004d7147f0f5 create mode 100644 test/core/json/corpus/141d45a59b073aeec4443cd7bcf20f7833ddbc95 create mode 100644 test/core/json/corpus/15a8f2e7f94aa00b46f1b991416aa015dd633580 create mode 100644 test/core/json/corpus/15c9c1284c27c8893559e15c9b2a50cbd5bbb56f create mode 100644 test/core/json/corpus/15d1a6cda48ef569b368a0c4627435bc2c80a988 create mode 100644 test/core/json/corpus/17a29f2ac6df774585d7713091b299729738030c create mode 100644 test/core/json/corpus/17b815f1f72cb64481bc40263e91ce063040f739 create mode 100644 test/core/json/corpus/182d57403d2c973a394055017d35b7621aa0aa05 create mode 100644 test/core/json/corpus/190fbe2da448f6bdec0706c5301ad13363ae3ad9 create mode 100644 test/core/json/corpus/1b045a24b8f1f1fd6e8234d5019952ee7713a8b7 create mode 100644 test/core/json/corpus/1b6453892473a467d07372d45eb05abc2031647a create mode 100644 test/core/json/corpus/1c6463aa2dabcb4fadc8e5441d8b418535e768af create mode 100644 test/core/json/corpus/1dea95b5050b766274ef80847505c0e4f47f3ebb create mode 100644 test/core/json/corpus/1df0754d3e7970b3afe549b11ca128dcd0d4832b create mode 100644 test/core/json/corpus/1dfe267b623b20cd97c6e8969d8b9148af9f4a2c create mode 100644 test/core/json/corpus/1e5c2f367f02e47a8c160cda1cd9d91decbac441 create mode 100644 test/core/json/corpus/20efdba13ca7a3657d071b3d56997aa3b083068a create mode 100644 test/core/json/corpus/215a956168f77421253e947c2436371d56aa7ea1 create mode 100644 test/core/json/corpus/2174b9ab6bf4f7c21fe1ed56957f1776ef611959 create mode 100644 test/core/json/corpus/232f4bced4075545bb1469d5c2360f083ec7ec65 create mode 100644 test/core/json/corpus/26aca41ee8f199e7c0c7cf31d979952571c53fc9 create mode 100644 test/core/json/corpus/27d84210636e9e83786be9e9b96b69f70b743b86 create mode 100644 test/core/json/corpus/27da426a5883662d19ea78f306d7a992be52f827 create mode 100644 test/core/json/corpus/296dcda6f7e6979e68ddef7cbc1206a355084ad3 create mode 100644 test/core/json/corpus/29b08c03ca5a6851fa4604a984cb7ff44433a5a5 create mode 100644 test/core/json/corpus/2a3d964ec4527ad9f02129fcbf087b67a6ea6444 create mode 100644 test/core/json/corpus/2b04974149815b143afb17af4388d751217e54ec create mode 100644 test/core/json/corpus/2b3b1ad952e3acb566e32a84e2d503acde13eb53 create mode 100644 test/core/json/corpus/2cc301a6ed7f01e2cd339f02bd0fda20c227a17e create mode 100644 test/core/json/corpus/2d3d5b9275553430b4cfa68114099120ad7809ee create mode 100644 test/core/json/corpus/2d5dbf403e0c12e2fe21b04ca3daff171c028ab7 create mode 100644 test/core/json/corpus/2d7c769bed62004270034b976b1d940a5686106b create mode 100644 test/core/json/corpus/2db120231eea12d9cdc6a00f30839b3cef2046be create mode 100644 test/core/json/corpus/2db610e1a230409a205cf22fbad3348a54cbe703 create mode 100644 test/core/json/corpus/2df1dd2e2f5d57e7d9d4e60a756a86e603573225 create mode 100644 test/core/json/corpus/2e32faacd3ea4461ec7aace297b4be6904d9a389 create mode 100644 test/core/json/corpus/2e756d91759d7e74f5b776c0d2a1935292f576d1 create mode 100644 test/core/json/corpus/2f09b24f9f5fa0af2c29b604b4b0f97fa6163895 create mode 100644 test/core/json/corpus/3027d901361162b38fcaf17f97ba7d9646e32495 create mode 100644 test/core/json/corpus/30d4467ecb771ece9ed6c78a46adc299072d9db9 create mode 100644 test/core/json/corpus/311048bbf4c4bbabcde73607d7e76915cee9312e create mode 100644 test/core/json/corpus/323b48969d7bf9a50aacf0912f1b5cb02119e2ab create mode 100644 test/core/json/corpus/33400a242baeb5c46ddb1578c28b10d32a9c3cd3 create mode 100644 test/core/json/corpus/356a192b7913b04c54574d18c28d46e6395428ab create mode 100644 test/core/json/corpus/35e995c107a71caeb833bb3b79f9f54781b33fa1 create mode 100644 test/core/json/corpus/373769c15c145472c8ec3bdde8fc84e85ec79211 create mode 100644 test/core/json/corpus/3795d911970a1fd8416b93649051b418948e3edf create mode 100644 test/core/json/corpus/37d3333e1e2a384c3ba14a52682ca29f061d1ac7 create mode 100644 test/core/json/corpus/38cd33bb390445e35b6514024b1317902cb7ba1b create mode 100644 test/core/json/corpus/3a90c688f44447a78efc111872b061a001f04d2b create mode 100644 test/core/json/corpus/3b1e7b56ad4465d126ea994d34d20dcecbb3a50a create mode 100644 test/core/json/corpus/3c0a8d6c31edaca124714624eb64cb8ec0cbab13 create mode 100644 test/core/json/corpus/3cc0c9adcf3882f01409c70391c3cd30588ef34c create mode 100644 test/core/json/corpus/3d0d9878b812ce4634962ba3dd755c0953550200 create mode 100644 test/core/json/corpus/3d4d5887a2fcdc5dd360b8a6f89dbce6500d8580 create mode 100644 test/core/json/corpus/3efb5b7ff94c5b9d411c93da9a70e1cc547f4c59 create mode 100644 test/core/json/corpus/421b7e8ea86e3c07474af16ab3ccef55d1857205 create mode 100644 test/core/json/corpus/428d051e437dd260f2a2f7ed920d9734ca34dc90 create mode 100644 test/core/json/corpus/42adc281578ffb1b8684b78b47aa40a16d10b6e7 create mode 100644 test/core/json/corpus/43620ecd2e2fd58fe5650da2e9783f980f29ec07 create mode 100644 test/core/json/corpus/43b1ffcda49477adb1632822202631990ed3a269 create mode 100644 test/core/json/corpus/45279f85bf2f533a629073caf89403006279fab2 create mode 100644 test/core/json/corpus/455d9bb597f08bf698454157ecd86647b5dec4e0 create mode 100644 test/core/json/corpus/4561eb5c7e43cae048c06aaaad3d5f5218b376e9 create mode 100644 test/core/json/corpus/46417b001eeb87c32b642499fd5e1690d5d88c7f create mode 100644 test/core/json/corpus/468af040024e96e9878ef33cc52755c5e7f5cbd5 create mode 100644 test/core/json/corpus/469e5ed2547e9e55a96e96eb832c615631e3b576 create mode 100644 test/core/json/corpus/472b07b9fcf2c2451e8781e944bf5f77cd8457c8 create mode 100644 test/core/json/corpus/486da8aff04083c5e0fe112e733f2ae510e312a1 create mode 100644 test/core/json/corpus/488a5ed641e340ae51992e04ce6590bdec587218 create mode 100644 test/core/json/corpus/4a0a19218e082a343a1b17e5333409af9d98f0f5 create mode 100644 test/core/json/corpus/4a6644a1a3d5218f4bbd60220cab79c0b7bef45e create mode 100644 test/core/json/corpus/4b39d4b8a9a04b9469e8fe4016322327fe540882 create mode 100644 test/core/json/corpus/4bb0294e14946fb1f64213384097a676d3ef94f0 create mode 100644 test/core/json/corpus/4cd66dfabbd964f8c6c4414b07cdb45dae692e19 create mode 100644 test/core/json/corpus/4d134bc072212ace2df385dae143139da74ec0ef create mode 100644 test/core/json/corpus/4efa35221b2088e785048d0ff8fd99b03d5316fc create mode 100644 test/core/json/corpus/4fa2a4a5a2f7dc4ddbdecae3ee85c787817b4cf8 create mode 100644 test/core/json/corpus/4fed4bf2dc6259d9de54e9fa7db4fd5a61f2535e create mode 100644 test/core/json/corpus/4ff800de0863adb5851fa26935159aa53b11cba7 create mode 100644 test/core/json/corpus/4ff99a030518a132748c44bc1d836018e5b82cd0 create mode 100644 test/core/json/corpus/531c87b9772e54e3e183ef729f0a7d5a0d584f46 create mode 100644 test/core/json/corpus/534d66e7b0709d1e7692faae9e7f7299c92bba4b create mode 100644 test/core/json/corpus/548775f9d7d13339dba3001f8238b84e9a457533 create mode 100644 test/core/json/corpus/54ec3b2d8a9b7a6d8204712eb1b90da703cf8a79 create mode 100644 test/core/json/corpus/552cfe1d8958e6d003ec8e883c4983dd67ef255e create mode 100644 test/core/json/corpus/55f0c61d096a08506076489ded3b868db4086770 create mode 100644 test/core/json/corpus/56cd60743c2cee939f5f357905bd36ec9363f441 create mode 100644 test/core/json/corpus/56e5f35e3d08b4e17e3558cacddf9e5ed13a0159 create mode 100644 test/core/json/corpus/580b03c49fba02bb8e399500eb66f2ff0482b22a create mode 100644 test/core/json/corpus/5852643fbbcf92b0181327b69b4874c6ba6fa9f4 create mode 100644 test/core/json/corpus/58f497e5efaf9f69080f9eef63b0b9dabcfdbc0d create mode 100644 test/core/json/corpus/59129aacfb6cebbe2c52f30ef3424209f7252e82 create mode 100644 test/core/json/corpus/598a287a3e56caae23ed63abc95d5f3457165eef create mode 100644 test/core/json/corpus/5a37a26dd2482226f534f79d321d28e7a615ab72 create mode 100644 test/core/json/corpus/5a710dcd4c78ca1a74ceb9fbfb011f7ac86a5f7b create mode 100644 test/core/json/corpus/5ae7b87f5377d5ffc16fd3f69b4a4aa7be8b1184 create mode 100644 test/core/json/corpus/5b3fe86d5a309a6ba745881bd220fe1100b271ce create mode 100644 test/core/json/corpus/5c38b7da113ab4535dbc22777ce8a1480c1c9d1e create mode 100644 test/core/json/corpus/5ca6c45a8d2e11c782806df43e7668beb4aba8f5 create mode 100644 test/core/json/corpus/5da7b543313339f84fd52e96bacf3a73368a1d2c create mode 100644 test/core/json/corpus/5e12ae9117668bcc22832640cc626315940aeba8 create mode 100644 test/core/json/corpus/5e397439a2680ed827c46704969c6711dabbda84 create mode 100644 test/core/json/corpus/5e629dfb8b7533c7c2d173d4c3d587c88112cc29 create mode 100644 test/core/json/corpus/5e785c7c26813577f3e30ef8f7e37ab2a9ffe39c create mode 100644 test/core/json/corpus/5f3394f5058822cc044b92654837625897176480 create mode 100644 test/core/json/corpus/5fb9bcbbb30a377209eab0541d144e44e71508d7 create mode 100644 test/core/json/corpus/6008213a61d06b4382b223768530c3452968b7b3 create mode 100644 test/core/json/corpus/60ba4b2daa4ed4d070fec06687e249e0e6f9ee45 create mode 100644 test/core/json/corpus/625ed64c30c8ab2f0b3bc75690f9faa4270f0041 create mode 100644 test/core/json/corpus/6314c2b304d04dc0108a95d29a93515e85e2b0b0 create mode 100644 test/core/json/corpus/6462d8079d2ea921617e7d073b85cfab706800d3 create mode 100644 test/core/json/corpus/6474383282788e556aa86f57fc8650137ad264d0 create mode 100644 test/core/json/corpus/648c3f58ecc8fb4b8c779e6b11006ab5b1986dad create mode 100644 test/core/json/corpus/66328e03a2ccd5e54dab23b816182786e6f518b6 create mode 100644 test/core/json/corpus/683e9045bc95e0cb5fc16ec64b118433475ba559 create mode 100644 test/core/json/corpus/689f13680f4682303c8aa6828b67955959dc9669 create mode 100644 test/core/json/corpus/68c6ba7f0602a5410d1fa3c5de24fe264436b993 create mode 100644 test/core/json/corpus/699cafde80b1e1777306f781186d1253f018ab23 create mode 100644 test/core/json/corpus/69ab053b59e235fd6af246c5180f15bd95295113 create mode 100644 test/core/json/corpus/69afa12510b2e653b0af7c7030832647b2d63c37 create mode 100644 test/core/json/corpus/6b75857f86be5c51b21a97f4a61e69e8bb6cd698 create mode 100644 test/core/json/corpus/6c75e71ecde9f073a7bad89f4831c8cde0bc1830 create mode 100644 test/core/json/corpus/6ce5170dc4f2eee3b31a875b6a41f2444959f3dd create mode 100644 test/core/json/corpus/6d2859436fbbee637f0a5981ca82e8f88a1d0d28 create mode 100644 test/core/json/corpus/6d63e39f56d1d537bab9c2830303cabab3cd9035 create mode 100644 test/core/json/corpus/6e05a0a240fe2974e14527bbe390d294564156e2 create mode 100644 test/core/json/corpus/6e6c9d301adb0f0ddffd79cdf3426a2de99bad48 create mode 100644 test/core/json/corpus/6e989edf725ec64849377681ce02641c3d1870e8 create mode 100644 test/core/json/corpus/70142f66475ae2fb33722d8d4750f386ecfefe7b create mode 100644 test/core/json/corpus/719edbe667ce2729ac78a22dac29263c91144029 create mode 100644 test/core/json/corpus/71f99ca2bda6ef2e15b965479a79587f9d794be0 create mode 100644 test/core/json/corpus/743e89b768af4bd591ea7228118550b1bfb8e7d1 create mode 100644 test/core/json/corpus/7714a1a32872442a2eaff472685f3ea69451a732 create mode 100644 test/core/json/corpus/7719a1c782a1ba91c031a682a0a2f8658209adbf create mode 100644 test/core/json/corpus/775e8ffda1f5d340dba472d06dc7c8bf8159e379 create mode 100644 test/core/json/corpus/77de68daecd823babbb58edb1c8e14d7106e83bb create mode 100644 test/core/json/corpus/7957dc9aac31e6a6783fb3a6ee073688fed6cf9d create mode 100644 test/core/json/corpus/7ae893cbbf9b11ff411640b80985ce618907559c create mode 100644 test/core/json/corpus/7b20ac50954063e3ad00813acab4a98b2bfdb858 create mode 100644 test/core/json/corpus/7b6273145fb090de1c6163586f884a1da4b5cfbf create mode 100644 test/core/json/corpus/7cf84b5a78281e6c6b5a9884110f3dbc6a40e310 create mode 100644 test/core/json/corpus/7ef13b83e6bde582d9000be043e729cd3221c150 create mode 100644 test/core/json/corpus/82059e250904b478f65daa0e647c1647ba6d6a3d create mode 100644 test/core/json/corpus/8207fdf4bd302d6b6b1894990b353944a8716aa7 create mode 100644 test/core/json/corpus/831a49ad81b59025c241ac9e58bd88463fd798eb create mode 100644 test/core/json/corpus/84582c1dbe026475319df14c19967d1dd0bf751f create mode 100644 test/core/json/corpus/860d4ad0b7c026d1fcf51932b5e46500be7860a6 create mode 100644 test/core/json/corpus/865c7cf36a4f4499a6242e51b77b58b868a7447b create mode 100644 test/core/json/corpus/87a2b80f9272583517c0207af176fc40ea55022c create mode 100644 test/core/json/corpus/887309d048beef83ad3eabf2a79a64a389ab1c9f create mode 100644 test/core/json/corpus/88d89860ccaf21e5f0f002303a2cd853ecbb2acb create mode 100644 test/core/json/corpus/88f658400b1870ddf081fb03020c3098b0b1e083 create mode 100644 test/core/json/corpus/88f8b0984bb2f081918ad883c8f0ffacb5a8ff0a create mode 100644 test/core/json/corpus/89304953495f060c7abd3584d83cb1c8e6d6653b create mode 100644 test/core/json/corpus/8a5f6dc6873e3fd51fd866854d85258f8aa83a02 create mode 100644 test/core/json/corpus/8a87261277c15667e2957dd52c5db6757ebc8e88 create mode 100644 test/core/json/corpus/8aa61d8bd260942521bb1ba82cd4cce2324fdbee create mode 100644 test/core/json/corpus/8d8874439569824e371a0284460440175cdb8a27 create mode 100644 test/core/json/corpus/8d952ec2e33b2a6a1c7876898719a610f5546388 create mode 100644 test/core/json/corpus/8e6fec8a05b24f221b6e94fdfe205e5bf7709a2c create mode 100644 test/core/json/corpus/8e7fda77644ff91578d25243fad51a3cd6d60860 create mode 100644 test/core/json/corpus/8ea6295ff82bb119acd44a91b463b19fedafb226 create mode 100644 test/core/json/corpus/8ee51caaa2c2f4ee2e5b4b7ef5a89db7df1068d7 create mode 100644 test/core/json/corpus/8ef4dd9f2d0f9d770c937d9a43413d24df83f09b create mode 100644 test/core/json/corpus/8efd86fb78a56a5145ed7739dcb00c78581c5375 create mode 100644 test/core/json/corpus/8f0ba762c2fed0fc993feb91948902ac397b0919 create mode 100644 test/core/json/corpus/8fe81e450694cac1eb4c4a5c966ffbc56ade3513 create mode 100644 test/core/json/corpus/902ba3cda1883801594b6e1b452790cc53948fda create mode 100644 test/core/json/corpus/910a1528b28ebc6ff2f2a4fedb013c86de4103e2 create mode 100644 test/core/json/corpus/92049bf3d8a0ec93c2d1633631c0082e66ca69e7 create mode 100644 test/core/json/corpus/920a3c318f3127b9c30ab02a077555c7dfbb6edb create mode 100644 test/core/json/corpus/925fc05dd661aeb4a776dcbc5df3dcb2cefaf0a6 create mode 100644 test/core/json/corpus/9367ba65affd5bf7aabf79c28e783cc5d93518e8 create mode 100644 test/core/json/corpus/939f5049b1eefb91ccbd3fcecaed8cb21ea6b285 create mode 100644 test/core/json/corpus/9405c2b00eaa5526f71cc78914dbd3ecaf093b6e create mode 100644 test/core/json/corpus/94d3598751569d2a5be258e59665cbbf0692dfbe create mode 100644 test/core/json/corpus/94f96d95d01e98fd2f04ce26c0913e5f9a882fb4 create mode 100644 test/core/json/corpus/95b54a84db75abab401d282fdb04440a879a9708 create mode 100644 test/core/json/corpus/96189202e587ec951d5795da3e03062f2fb5d708 create mode 100644 test/core/json/corpus/9711703428704ce2827a719eddb9d54be23a0cb7 create mode 100644 test/core/json/corpus/9734597e96eebe99b2243121a51d178a338ec46f create mode 100644 test/core/json/corpus/9747c85a9510011bf87c23a80b029b9f2d04c37d create mode 100644 test/core/json/corpus/97d170e1550eee4afc0af065b78cda302a97674c create mode 100644 test/core/json/corpus/98e02e7fc96479e8d10ff2cc7610be772e2d6fba create mode 100644 test/core/json/corpus/996156b191b619eff79b2fcbb7598518a09b06bc create mode 100644 test/core/json/corpus/99667fcfa6d583a742fb5450527fc86dfb78ebbf create mode 100644 test/core/json/corpus/9b1ead2dbeeb1a3e9a7bebcf6964c3cfbc7e8867 create mode 100644 test/core/json/corpus/9b7669e201574bfb979d56110539a90da5aca2c0 create mode 100644 test/core/json/corpus/9c24b456af3cb51a1ff2780c2d9cbdd7d93f6c76 create mode 100644 test/core/json/corpus/9d0441f23ae7d5a3a5b1140497868ee6eeab656b create mode 100644 test/core/json/corpus/9d890bd3139a8f9a44d435ff8edfbeb5b072ded0 create mode 100644 test/core/json/corpus/9e6a55b6b4563e652a23be9d623ca5055c356940 create mode 100644 test/core/json/corpus/9ec88420ef0408642f6930996e35f5b9f18ec88c create mode 100644 test/core/json/corpus/9edd067c569315d5e93b0d14c7eac9fa6d81d3cd create mode 100644 test/core/json/corpus/9fbda4f714043d975389b536b4497c6d713452e5 create mode 100644 test/core/json/corpus/9fc8cb8ab3b05e306e5e81d9d949e69f931244ea create mode 100644 test/core/json/corpus/a02b857f2eff73e8e188f35529dd91f8144b23b9 create mode 100644 test/core/json/corpus/a060d5bfd1235cbbe4bcecf332fa3b03bc2282e3 create mode 100644 test/core/json/corpus/a0931fae1d43e7887c1cabde83fdfc52eaeedba8 create mode 100644 test/core/json/corpus/a0d4af29c6c223b48fe34d6a09b3a7466242f33c create mode 100644 test/core/json/corpus/a1abe8a785030d475a7350438fd23a05c382c110 create mode 100644 test/core/json/corpus/a1fb86293eac950c2b4f5182d9e4b5d9e0982ef6 create mode 100644 test/core/json/corpus/a2d4e3d6f5ba43c9199d5d2011678f82cfd55afc create mode 100644 test/core/json/corpus/a39653cb3d97c58c44013197f4d7557577700177 create mode 100644 test/core/json/corpus/a4c74ad56ae0e94e96101a8f2ce9b1e588df5e44 create mode 100644 test/core/json/corpus/a6b34b06b00e9226f2bd961483f9da81d8de99a8 create mode 100644 test/core/json/corpus/a72c3b9cc71eb7f0e0e4dabcd2dcd2b997f21c07 create mode 100644 test/core/json/corpus/a749d24bac55bc19465acc92b12244c56ca0f20d create mode 100644 test/core/json/corpus/a78009ff8b3f4d722ee0eb84795e857e74a58aea create mode 100644 test/core/json/corpus/a7ae4b16677806d78d0016c276b6722eba8eef3c create mode 100644 test/core/json/corpus/a806f43dd48e35e75c27814c13a2a96c12449bd1 create mode 100644 test/core/json/corpus/a90a858013f90d2a94e0d62a7156ffd6848bf238 create mode 100644 test/core/json/corpus/a94bfbfe16d026b52d7f73cf78fdf7d6a6c5c58b create mode 100644 test/core/json/corpus/a9718f029d11a9335ef596cbd42794de5b0b18b5 create mode 100644 test/core/json/corpus/aa6e08a488d1ed00aa51f20c2477fc89e7b0a852 create mode 100644 test/core/json/corpus/aaa038513c192fec501e4e7302156872ce2fde37 create mode 100644 test/core/json/corpus/ac2686c095a5a1c92a1d4209a6c287778720c86d create mode 100644 test/core/json/corpus/ac3478d69a3c81fa62e60f5c3696165a4e5e6ac4 create mode 100644 test/core/json/corpus/ac9231da4082430afe8f4d40127814c613648d8e create mode 100644 test/core/json/corpus/adc83b19e793491b1c6ea0fd8b46cd9f32e592fc create mode 100644 test/core/json/corpus/aff25e569bd8c93157e08cd18ebcd896438e34c9 create mode 100644 test/core/json/corpus/affced8168ec801de89deac663f708f0c96cf1a4 create mode 100644 test/core/json/corpus/b015dfc2f62b640d7c25adab7b38c5fcb5cb64c8 create mode 100644 test/core/json/corpus/b021dd7cd98b63092685ea092df0dc01c8f63334 create mode 100644 test/core/json/corpus/b17485b8bdec8809b3819a83753ca893871df403 create mode 100644 test/core/json/corpus/b32ef51eca9c6c658e6fb75fdf96bbba066404e7 create mode 100644 test/core/json/corpus/b3f0c7f6bb763af1be91d9e74eabfeb199dc1f1f create mode 100644 test/core/json/corpus/b45a1635ec526bcc890f9d735976704e516c5f19 create mode 100644 test/core/json/corpus/b50ce51a7baa28cd298ebd05b4a3b9b70f9d4370 create mode 100644 test/core/json/corpus/b5126721812b925426b30d283d2bb8b6969f230a create mode 100644 test/core/json/corpus/b57af943a3ee411bffeaa3872eec9c6fb01569a4 create mode 100644 test/core/json/corpus/b5abf6fd22ed0f852781de35d043059d0f86f3cd create mode 100644 test/core/json/corpus/b6589fc6ab0dc82cf12099d1c2d40ab994e8410c create mode 100644 test/core/json/corpus/b6f19238d2b04c5b86a17369093dafda34f332e7 create mode 100644 test/core/json/corpus/b858cb282617fb0956d960215c8e84d1ccf909c6 create mode 100644 test/core/json/corpus/b9c38fad09c80db7781fefbe51039752de575ecc create mode 100644 test/core/json/corpus/bb407c8992800444201dccfe744dac49c0295fde create mode 100644 test/core/json/corpus/bc335734f73502b92d2bd3587259ce915985f0ee create mode 100644 test/core/json/corpus/bd113c2c8a2328e3674c680c7cff829a6c8ab924 create mode 100644 test/core/json/corpus/be051d58015d4af1977a5dfd14ef3fd070ecc9d2 create mode 100644 test/core/json/corpus/be461a0cd1fda052a69c3fd94f8cf5f6f86afa34 create mode 100644 test/core/json/corpus/bef524502f8dbbc45af717ece01ec88edd7f903b create mode 100644 test/core/json/corpus/bf21a9e8fbc5a3846fb05b4fa0859e0917b2202f create mode 100644 test/core/json/corpus/c0b6a90832b78ed5f6d129d3640c612540527c85 create mode 100644 test/core/json/corpus/c18d315f0d35849b2aae4a47cab4608204b85d76 create mode 100644 test/core/json/corpus/c257fd6bc9e5254a733378ab4ddd39629c4a3069 create mode 100644 test/core/json/corpus/c2bf7f49d8f2e13a60af4473b3b3451b65b3aa9a create mode 100644 test/core/json/corpus/c308517acf6f7088634d491a1608240f83a3ac95 create mode 100644 test/core/json/corpus/c3badd71ef8a51b97ce93cbfe99f6778048f2128 create mode 100644 test/core/json/corpus/c482a632702ae7f532d126e70149dda4fadc3cd7 create mode 100644 test/core/json/corpus/c541bb86e55b98e083b141114066f9c17d853374 create mode 100644 test/core/json/corpus/c5b50b9015b6aaedd7eb1077b1204858f837b53c create mode 100644 test/core/json/corpus/c62ef0dbd1350da9ea5a32e56672d385837643e7 create mode 100644 test/core/json/corpus/c7a34d6d49e1da1ccd490350c2df3a168ed09ae8 create mode 100644 test/core/json/corpus/c88c4bec8d440c56d3ea7abce39276f0927dbe0a create mode 100644 test/core/json/corpus/c92f147bfc034003ac42ed9e62a16c84102ab417 create mode 100644 test/core/json/corpus/c96b0fe6034668edf37ef0f5f391d5107953dc06 create mode 100644 test/core/json/corpus/cac74aa5d7aab7fce0253f00c1a025980c1f9b7a create mode 100644 test/core/json/corpus/caea0a0e6d8708cf682eaa446c344da56a7d5515 create mode 100644 test/core/json/corpus/cc8a3dd2678d4b400ad630f402012b894e841b05 create mode 100644 test/core/json/corpus/cd851bec7adad52f79777fb9347d5fd2f9486aa7 create mode 100644 test/core/json/corpus/ce3899b62ba3efe00eb31ddad2861ffe16a30d06 create mode 100644 test/core/json/corpus/ce8b76fdcdbf1c951afc2b115be9acc8a6358b32 create mode 100644 test/core/json/corpus/cec87b67871fc7a59652bc3546fbbb68e4d31e28 create mode 100644 test/core/json/corpus/cf32406111908544e504c84731147f072cdf2fbd create mode 100644 test/core/json/corpus/cf35dc76bf9a2052636c1ecc92942161830dcdc3 create mode 100644 test/core/json/corpus/cf6a5e6bfe4f15b43e411dd2782e10f1670c9767 create mode 100644 test/core/json/corpus/cfc45616f5f0e7c25df91f6984ff5f6f1648beab create mode 100644 test/core/json/corpus/cff891e5858ae68d08ecc8470ca6a68c9438bfa3 create mode 100644 test/core/json/corpus/cfff4e9d08cba81b663dd1999710008342851e19 create mode 100644 test/core/json/corpus/crash-f21867fe8b6df0b54c13e2e6e613dce871ecf0f0 create mode 100644 test/core/json/corpus/d1db03c626fb16c3b9cd44cc38cf40ebd355a194 create mode 100644 test/core/json/corpus/d85ca051da784c0441898c5affbf11a2ae8f56bc create mode 100644 test/core/json/corpus/da03f536ceaf609972aa2a699687cc6f73ac0dcd create mode 100644 test/core/json/corpus/da4b9237bacccdf19c0760cab7aec4a8359010b0 create mode 100644 test/core/json/corpus/dcc45e405208d7a2db33d0b5b9da2a2f1b034957 create mode 100644 test/core/json/corpus/dcc60d3aaa1fc4d00201a3512284fcb79b5b68ef create mode 100644 test/core/json/corpus/dd0567ae57bf3cc85891a1ca988c2945d9186678 create mode 100644 test/core/json/corpus/dd890a5a32e9f0489c6c77695f2155041f00fc9a create mode 100644 test/core/json/corpus/df88e2baf7b76ffb2e94b9da57fd8d137f44b1ef create mode 100644 test/core/json/corpus/e00ee378c3f6e0b3cd89bd6e7517478d093f73dd create mode 100644 test/core/json/corpus/e0c124e90d068e2a70a3e148052869033453ec58 create mode 100644 test/core/json/corpus/e0d87b1f3e54e5adc5c2205f9e14772822a25766 create mode 100644 test/core/json/corpus/e1199df649697c570db5d6b2ea09d755eddd32b7 create mode 100644 test/core/json/corpus/e235f6f2a8b6a22117f1baa932fb6c69799e1136 create mode 100644 test/core/json/corpus/e3a654055a867ae62d8e68fa2c410228ac55cb6d create mode 100644 test/core/json/corpus/e3c680aac46b9c46392e3b2c43ecdcc1547f2023 create mode 100644 test/core/json/corpus/e3d134b35cc25a4861d90023c95988ec6103ddd5 create mode 100644 test/core/json/corpus/e3ff65de4b1622315c3b34b7a5e39bffb275489d create mode 100644 test/core/json/corpus/e4a4085cc31476f5de9047422851d8ccf86339df create mode 100644 test/core/json/corpus/e4e3c69da200af932c8a79fa055d7aeea28eb1d1 create mode 100644 test/core/json/corpus/e6c3dd630428fd54834172b8fd2735fed9416da4 create mode 100644 test/core/json/corpus/e71eb37fca2070521e1e07c503c2bcd6445b35ea create mode 100644 test/core/json/corpus/e760e6e22ae8cd1ea78fe28b5eb1f3d7b5fdc536 create mode 100644 test/core/json/corpus/e95ff1142118a2ca5b84935612a8a64d55360e64 create mode 100644 test/core/json/corpus/e9c5e2c67930513941753c2d54591c7098c82f6c create mode 100644 test/core/json/corpus/eb26070d17ffa908204912e75cb4313835042038 create mode 100644 test/core/json/corpus/ebc6aee49e5ae57722df86e7fa33c420f045a449 create mode 100644 test/core/json/corpus/ed1dc11d713e7487de18ce8317b62916959206d0 create mode 100644 test/core/json/corpus/ede3f66106acd7796da8b3942d029fe213058286 create mode 100644 test/core/json/corpus/eed7bd220cd511b6d42ce6553019266a22a3d56a create mode 100644 test/core/json/corpus/f090932162756b798b1a050b05e3d36a3437c4fc create mode 100644 test/core/json/corpus/f1905eaa84ba6a3593ec6ac0486a5b42893c01f1 create mode 100644 test/core/json/corpus/f4635fbbf765ead81a261ca152df02622e182d2c create mode 100644 test/core/json/corpus/f46eeb1020c7c4153e742a50bc24c2c6939dab1e create mode 100644 test/core/json/corpus/f473451610783521d51bc08cdd920ddd97f8a71f create mode 100644 test/core/json/corpus/f63aa599600f6e7d648c4287905e16e8e6e479fd create mode 100644 test/core/json/corpus/f667dcf1c06e87db2dc49d86ea1c285e796f8f8c create mode 100644 test/core/json/corpus/f8d0f85975e49b959799cc52847110cc940b9db1 create mode 100644 test/core/json/corpus/f92c47e35da42d79a48beff54b93cd28f55f05fb create mode 100644 test/core/json/corpus/f9a33bb8bd78d869fbafa402d9be58940ce2c318 create mode 100644 test/core/json/corpus/fbf6f3156c1bd4bb701839bc0e26533bdccd1c9a create mode 100644 test/core/json/corpus/fe2ef495a1152561572949784c16bf23abb28057 create mode 100644 test/core/json/corpus/fe5dbbcea5ce7e2988b8c69bcfdfde8904aabc1f create mode 100644 test/core/json/corpus/ff8fb34603c7f772768d61504954553e6bed173c create mode 100644 test/core/json/corpus/test1.json create mode 100644 test/core/json/corpus/test2.json create mode 100644 test/core/json/corpus/test3.json create mode 100644 test/core/json/corpus/test4.json create mode 100644 test/core/json/corpus/test5.json create mode 100644 test/core/json/corpus/test6.json create mode 100644 test/core/json/corpus/test7.json create mode 100644 test/core/json/corpus/test8.json create mode 100644 test/core/json/corpus/test9.json create mode 100644 test/core/json/fuzzer.cc create mode 100644 test/core/json/json_test.cc create mode 100644 test/core/nanopb/BUILD create mode 100644 test/core/nanopb/corpus_response/0052f8fb6a7884ced8a6754aa13441be1f7dcd51 create mode 100644 test/core/nanopb/corpus_response/0c35544f40d428d103e9c5b969ad9cd16767b110 create mode 100644 test/core/nanopb/corpus_response/0c60ee9ed55c9af6190b132ef6636c1d2abe4540 create mode 100644 test/core/nanopb/corpus_response/0ecb3e69889c036a86d21eb942077dc9abd649be create mode 100644 test/core/nanopb/corpus_response/1324c95dafe597fe05f9babe92fe6fbf181c1897 create mode 100644 test/core/nanopb/corpus_response/14eb42f7423081b455820daa2c02b358315dc0fa create mode 100644 test/core/nanopb/corpus_response/1e2dd3a96d4c5142da19b2dd64014d9358504536 create mode 100644 test/core/nanopb/corpus_response/2277a90ab01e3f27a4a8caf34ecd9997f3ffbf19 create mode 100644 test/core/nanopb/corpus_response/23121c5f633db5d7c1a9f2225240754246fee513 create mode 100644 test/core/nanopb/corpus_response/235548307ee9f2b0855fded42a871990d9ade956 create mode 100644 test/core/nanopb/corpus_response/28ed3a797da3c48c309a4ef792147f3c56cfec40 create mode 100644 test/core/nanopb/corpus_response/2bf123dbfa1d37a04493b5662a4b3b9c147485fc create mode 100644 test/core/nanopb/corpus_response/2d4c0908ecc0310ea234d10b6bdb4f4ca3c41dd1 create mode 100644 test/core/nanopb/corpus_response/30084b06df1cfb2bf2e1cfa8f8024c5af47a4d80 create mode 100644 test/core/nanopb/corpus_response/304e8cdc9122b709ec2c063a5c8c38489a788033 create mode 100644 test/core/nanopb/corpus_response/324d4a2aed8bc1840fee212fd38dadec80a72ea2 create mode 100644 test/core/nanopb/corpus_response/32d5dad0f831572fbbd32ea3de5df43e27568f34 create mode 100644 test/core/nanopb/corpus_response/33353a0b011901a13d010c6b165074ccdaa717ac create mode 100644 test/core/nanopb/corpus_response/37dfead09389fcd9b9d24ef817a0fed13d8ff2b0 create mode 100644 test/core/nanopb/corpus_response/47879cc364be304754f6af15563ad6f9a538da41 create mode 100644 test/core/nanopb/corpus_response/49a5cef4c730ecab22712b156ddba5106f165afd create mode 100644 test/core/nanopb/corpus_response/4bbbbb794a098deeacff73b774c30f12c54ceacb create mode 100644 test/core/nanopb/corpus_response/4bd815b34ddfbbc45c780d1e7a97341796ee8471 create mode 100644 test/core/nanopb/corpus_response/4c498ce69c8476f745693deb23272930e05cad60 create mode 100644 test/core/nanopb/corpus_response/4fb5e3085c32e9bccac9e18343cca07017d037de create mode 100644 test/core/nanopb/corpus_response/4fe5e46c1299e7f3e8a41dde3ae1bf1b60b4a43c create mode 100644 test/core/nanopb/corpus_response/595b8d51971c1d15146909567e539a1bb39b1af5 create mode 100644 test/core/nanopb/corpus_response/670cc6bae958cb4f15e7297fe63959ac5799aa42 create mode 100644 test/core/nanopb/corpus_response/675f3263af7d1bbb084872f2b23f6d363227e85d create mode 100644 test/core/nanopb/corpus_response/67fe0d2acc727c8a39a707b92c6cebda9bd20986 create mode 100644 test/core/nanopb/corpus_response/6995dd153f712ad257ab5a365e5a4b84dc676ed3 create mode 100644 test/core/nanopb/corpus_response/6d15065785eb8f4b5f17357a520cb4815a2cb355 create mode 100644 test/core/nanopb/corpus_response/706b579bfc3db01ef7216d77ce231ea477c2fae2 create mode 100644 test/core/nanopb/corpus_response/71ec91b3a142105bc25dfa5b84ca0bd893e1db28 create mode 100644 test/core/nanopb/corpus_response/73285d7a70d73b517648067520d921e4477dbbfa create mode 100644 test/core/nanopb/corpus_response/747d1ed8bee4c6f0438beaf88ae76d8ef9f63da2 create mode 100644 test/core/nanopb/corpus_response/74c9d6b5d7d31a7c48c842311857c319fafedd64 create mode 100644 test/core/nanopb/corpus_response/763878a34b3adeb99a03b54d09768a4451617016 create mode 100644 test/core/nanopb/corpus_response/7b4b0c2555178333ba15203a930c88ef7e7500e7 create mode 100644 test/core/nanopb/corpus_response/7b8a91aa46e370eb61307b4998889dc89775462f create mode 100644 test/core/nanopb/corpus_response/7cd11836c64f98742fa7beccec5c981ef4dd62ae create mode 100644 test/core/nanopb/corpus_response/7d8f4f045e70e8a2cb45dc3c001504f5c2614b16 create mode 100644 test/core/nanopb/corpus_response/7e9848558fb004e14795b3ebd3e1488dcde1db8c create mode 100644 test/core/nanopb/corpus_response/8707d3367be279eba1ddb5ffb990e40a3141c7d0 create mode 100644 test/core/nanopb/corpus_response/89734c37ee267e69a6950c6d60ee541c1be5ccff create mode 100644 test/core/nanopb/corpus_response/899ef237274b4a44b5478d7ec880680a0cb7dd88 create mode 100644 test/core/nanopb/corpus_response/9034aaf45143996a2b14465c352ab0c6fa26b221 create mode 100644 test/core/nanopb/corpus_response/91e3b6a3484ab4b95cdeecc5aefe1291824060e8 create mode 100644 test/core/nanopb/corpus_response/95cd94c858e5e97f7df4a5eb7552e5e0d5ce1ec4 create mode 100644 test/core/nanopb/corpus_response/971f42d5a4d9816145ebc9dd28ba33ed3f5860b0 create mode 100644 test/core/nanopb/corpus_response/9849ff4673525f3c6ad567fc681b224a818da732 create mode 100644 test/core/nanopb/corpus_response/9db3a1854de87fd643b910aeab50553afc73e667 create mode 100644 test/core/nanopb/corpus_response/a10e7effe8b9a50ef55b5e0244ea4dba5c48e9f3 create mode 100644 test/core/nanopb/corpus_response/a147873135c6c52d4da03c260a0165bc0ab1b979 create mode 100644 test/core/nanopb/corpus_response/a20fa4d2633e9a401cb765470913483b848721d1 create mode 100644 test/core/nanopb/corpus_response/a710eead945dabbbffa213a980c75f9463a27398 create mode 100644 test/core/nanopb/corpus_response/a72406e3ca06d941fe8e168bbf67da88a81c947b create mode 100644 test/core/nanopb/corpus_response/a8a62a7ebb7d68b211ae319e082575935c07d188 create mode 100644 test/core/nanopb/corpus_response/a8abd012eb59b862bf9bc1ea443d2f35a1a2e222 create mode 100644 test/core/nanopb/corpus_response/aab56035a3533b5d83a32a439f179eb678250113 create mode 100644 test/core/nanopb/corpus_response/ac174acef2c5da26fadc7270bab9c8c4e938c463 create mode 100644 test/core/nanopb/corpus_response/acbbd60eeb76e41ce254d0fef353b92abe69c831 create mode 100644 test/core/nanopb/corpus_response/b24237aa77b5f09208a7eb80b6178aeb2d53d24a create mode 100644 test/core/nanopb/corpus_response/b8e1c06314e52491ba955b72e13161c74e9b1422 create mode 100644 test/core/nanopb/corpus_response/c1eed32e1e353737987da851ad760312ea8e557c create mode 100644 test/core/nanopb/corpus_response/c4214ace2c4bab24bb356f71aedca08544baad70 create mode 100644 test/core/nanopb/corpus_response/c4f87a6290aee1acfc1f26083974ce94621fca64 create mode 100644 test/core/nanopb/corpus_response/c6fa750d7de79b2547531ed597ab7f1c4cd74193 create mode 100644 test/core/nanopb/corpus_response/d285d78d3ba966b4b199453d38ead1aa36a7484f create mode 100644 test/core/nanopb/corpus_response/df5200f371cff3cae0e1595cd86d641725f5d1ba create mode 100644 test/core/nanopb/corpus_response/dfc66cb172919102f3ba14f6816228aa46f78154 create mode 100644 test/core/nanopb/corpus_response/e53e789a4c175c6a2c468472f1047d0fe8db1177 create mode 100644 test/core/nanopb/corpus_response/e67fe6794e755ea801272980f2c272edb027f6dc create mode 100644 test/core/nanopb/corpus_response/ead61e86fedf118df8e44ed70ce002be651cf291 create mode 100644 test/core/nanopb/corpus_response/eced8b29efbdc82eb8a1d0865c5f382f0ff78446 create mode 100644 test/core/nanopb/corpus_response/f107c60f00da44a2c412c5b89c733efe5f9be4aa create mode 100644 test/core/nanopb/corpus_response/f58a9135d07ea9a5e3e710f6b3bf6d48d5942dfd create mode 100644 test/core/nanopb/corpus_response/f70e0dfc4185374b764189b1a96f3b4b7581ce0c create mode 100644 test/core/nanopb/corpus_response/f8c2c4ddd2f474b4839f13a9be862c00ab0ece77 create mode 100644 test/core/nanopb/corpus_response/faa1781e1444bba5b8c677bc5e2a38d023a1ec65 create mode 100644 test/core/nanopb/corpus_response/fb60def26b39a737e29e850194a0c2047e378900 create mode 100644 test/core/nanopb/corpus_response/fccda587af845f0685275960649d8f4a45272a95 create mode 100644 test/core/nanopb/corpus_response/timeout-3ec5d82cc22b6f35ab7d281faf1cc5e66f0e3bfb create mode 100644 test/core/nanopb/corpus_response/timeout-6995dd153f712ad257ab5a365e5a4b84dc676ed3 create mode 100644 test/core/nanopb/corpus_response/timeout-e5609086439f47e81c775bf80a7213fb73eb028c create mode 100644 test/core/nanopb/corpus_serverlist/000def12957806bb0d40005cb651d35b4cde7b4e create mode 100644 test/core/nanopb/corpus_serverlist/0068af2acc3020f344ee84b2c8adfb90492354c3 create mode 100644 test/core/nanopb/corpus_serverlist/009132022c3a1660b701728ac92e26baf82e8eac create mode 100644 test/core/nanopb/corpus_serverlist/00bf0233aa1155b34a3081e4a2b7a1c9cdf8ea1e create mode 100644 test/core/nanopb/corpus_serverlist/013197cfb12b59755b807501c6d6615859f9cd3f create mode 100644 test/core/nanopb/corpus_serverlist/018a4332eb19f2398162317cb6ad2e8cf700dfd6 create mode 100644 test/core/nanopb/corpus_serverlist/0273d3496bf5f4594e59083ac319f8f863a15be0 create mode 100644 test/core/nanopb/corpus_serverlist/0355002521e74dcdb3a0c633338bd02ab1d85312 create mode 100644 test/core/nanopb/corpus_serverlist/053d8d6ceeba9453c97d0ee5374db863e6f77ad4 create mode 100644 test/core/nanopb/corpus_serverlist/0628c29e3ae264f8fa08652435bb3e61afe60883 create mode 100644 test/core/nanopb/corpus_serverlist/065e91578e5359b70a668164310af6f0dd40e922 create mode 100644 test/core/nanopb/corpus_serverlist/06b4b617d5937da8a7b58aed5341dc5ef6d1bcd7 create mode 100644 test/core/nanopb/corpus_serverlist/07216a4f5934890b89d845f6256546c2681350ce create mode 100644 test/core/nanopb/corpus_serverlist/08584e8308b7f52f0fe380358800d7f585cba89c create mode 100644 test/core/nanopb/corpus_serverlist/085a37568e99ec5855bd96affd259921515479e8 create mode 100644 test/core/nanopb/corpus_serverlist/0903d1e9297179c18de6a3707b16f27d0d54ed67 create mode 100644 test/core/nanopb/corpus_serverlist/0aa20a75bff4e8af10330c66d288e900146f1a39 create mode 100644 test/core/nanopb/corpus_serverlist/0ae76e2b24ca999bd5e09e517aa4d88f5b5f58a4 create mode 100644 test/core/nanopb/corpus_serverlist/0c3025fdfb008a6563ea2a2bb6cbc79b8ccbf8f3 create mode 100644 test/core/nanopb/corpus_serverlist/0d219165cd317142afa36b8b5476cc022c95c4e6 create mode 100644 test/core/nanopb/corpus_serverlist/0e053123dd6256de5aff55b0731f913de250c18e create mode 100644 test/core/nanopb/corpus_serverlist/0e065f98325849ac05eed515865b33dba0264cd4 create mode 100644 test/core/nanopb/corpus_serverlist/0e4ff715d491c9f0b471c400b71804739b6d400a create mode 100644 test/core/nanopb/corpus_serverlist/0ec94942046cd7e00bc058204c1d046075ca9531 create mode 100644 test/core/nanopb/corpus_serverlist/0f0e8da530eb8c924cee6985d9c3dfd93274ef8c create mode 100644 test/core/nanopb/corpus_serverlist/0ff365225c981d74b89499d1e708684ed4d0b570 create mode 100644 test/core/nanopb/corpus_serverlist/113b1efff1677c1b9a24f89aec0c3ecc228ddf62 create mode 100644 test/core/nanopb/corpus_serverlist/11697d621eab6743ba22715722d5b23830b79075 create mode 100644 test/core/nanopb/corpus_serverlist/12463318b795c756f389bc0fb1cca9645eafef28 create mode 100644 test/core/nanopb/corpus_serverlist/12784250cf16ec999529f601ae5c5798e853d34a create mode 100644 test/core/nanopb/corpus_serverlist/13122d08c1cee0dae6434605917d4cc6d8ea8cc5 create mode 100644 test/core/nanopb/corpus_serverlist/148a1118649dd8aa9b4ed778efdf7c1611aa5d27 create mode 100644 test/core/nanopb/corpus_serverlist/15dea2bb5fb36a3dd5172796da66a821a32918e7 create mode 100644 test/core/nanopb/corpus_serverlist/16488fe15a7e33cb41f2b7c159c99154464b3fd3 create mode 100644 test/core/nanopb/corpus_serverlist/1870a48a3c9c1dd9027cbd85beb503b43cff6e89 create mode 100644 test/core/nanopb/corpus_serverlist/1900b6a9123667a79020319aa7fd54d230bc7073 create mode 100644 test/core/nanopb/corpus_serverlist/1a000f1cbccd2ab6f7e623e015ed2e84284c9dbf create mode 100644 test/core/nanopb/corpus_serverlist/1c1d403f6175d52ac4430d1ef2401b549761707e create mode 100644 test/core/nanopb/corpus_serverlist/1c2ae0e1915e18dffc2215e9121f1afe0e4335c4 create mode 100644 test/core/nanopb/corpus_serverlist/1c5d2eef52426db9d0842f3d57b27a219434c512 create mode 100644 test/core/nanopb/corpus_serverlist/1d0676867c1ebce84531035fa7eb86ed00762df5 create mode 100644 test/core/nanopb/corpus_serverlist/1d92b263fa70450b0d0aeb81bf5d2f69eefbbd99 create mode 100644 test/core/nanopb/corpus_serverlist/1e843ed4864d6a808b671dd6769ae191ac8a13ad create mode 100644 test/core/nanopb/corpus_serverlist/1eb06a34ee568d584c4b33472788889bc68af3f5 create mode 100644 test/core/nanopb/corpus_serverlist/2169c2b4d560d74a5487df68b56f3af1d648f544 create mode 100644 test/core/nanopb/corpus_serverlist/21f8f7583e58c1c81a3ac8237b5fa58071edf8a4 create mode 100644 test/core/nanopb/corpus_serverlist/231e348407fdcb14412c691b0b20982940160ccd create mode 100644 test/core/nanopb/corpus_serverlist/27b8f060e3296eaef77dcdd4c2cd11d5650604ac create mode 100644 test/core/nanopb/corpus_serverlist/28ed3a797da3c48c309a4ef792147f3c56cfec40 create mode 100644 test/core/nanopb/corpus_serverlist/291fcc6e043942638fa3c865c0a1be5e4dcc0e70 create mode 100644 test/core/nanopb/corpus_serverlist/2a7f6c1f8fdc090b24ceb90ab4f3a7b331c06c86 create mode 100644 test/core/nanopb/corpus_serverlist/2b85f180fe56f84925b274819ce10a8972a594e7 create mode 100644 test/core/nanopb/corpus_serverlist/2dea73d7d10ba0dcfd103f7542bdf7458e772b2b create mode 100644 test/core/nanopb/corpus_serverlist/2e9c19f98ef88b83ec2dea8b1b7f92b8337f757b create mode 100644 test/core/nanopb/corpus_serverlist/2fbd59ffb74aba392b86f4fe2ff8067b6d45cce8 create mode 100644 test/core/nanopb/corpus_serverlist/31059c32ea28d37b7442f51b20e966665662783c create mode 100644 test/core/nanopb/corpus_serverlist/31f78e35feb36037864df5f8f47136f8e6e4768a create mode 100644 test/core/nanopb/corpus_serverlist/326d322d1aa31696a14518830e544770f12146ee create mode 100644 test/core/nanopb/corpus_serverlist/337df26552e0884ff133cc1be8e72020be38f457 create mode 100644 test/core/nanopb/corpus_serverlist/33a2a0aa86956097e034b5ee16aeceacee7efc34 create mode 100644 test/core/nanopb/corpus_serverlist/33d175d1ecb3a85be7dd93d24efc3ddda0a85ad6 create mode 100644 test/core/nanopb/corpus_serverlist/3718a1b790db16bcfc4ec30691fab24ea7bb0b74 create mode 100644 test/core/nanopb/corpus_serverlist/37aa3946054035b712102a62b71c94747dfd1491 create mode 100644 test/core/nanopb/corpus_serverlist/37b697adc0708ad12e4ed7355f3f8fdf1b7919ca create mode 100644 test/core/nanopb/corpus_serverlist/37bf4642c5e5a806e2042cdf5ead9bf3c97b9ac1 create mode 100644 test/core/nanopb/corpus_serverlist/37d94ca6a20303389b35404f3dfd20aaa9ff0851 create mode 100644 test/core/nanopb/corpus_serverlist/39278604f6a1102366464bbe769ae846e542bc56 create mode 100644 test/core/nanopb/corpus_serverlist/396b57d9a11a1b135e36ad266e155cc0c3b77d21 create mode 100644 test/core/nanopb/corpus_serverlist/39a49db120a807fe4e80c502254a5009625c7599 create mode 100644 test/core/nanopb/corpus_serverlist/39f04d1c6d4beefa3e3d6eae3a5317d969787055 create mode 100644 test/core/nanopb/corpus_serverlist/3b199b80209fa0b8ffedba4381019f8729cc09d6 create mode 100644 test/core/nanopb/corpus_serverlist/3ccf7ffb96c3e4789409db33cc12bfd8ddc24c1a create mode 100644 test/core/nanopb/corpus_serverlist/3d04382d1fe11ff3b717100aece7f9eff2d04b9b create mode 100644 test/core/nanopb/corpus_serverlist/3d4eb9f836bb40cf4c734073bcba8b73e4cc93ae create mode 100644 test/core/nanopb/corpus_serverlist/41dc8c55e41d32c30865f9761931ddd4c5b740f8 create mode 100644 test/core/nanopb/corpus_serverlist/41ef7b74d212f8f7f6681edcffd0db719030d31d create mode 100644 test/core/nanopb/corpus_serverlist/431187b5926fa7d0823305a9f87635616ea3ef27 create mode 100644 test/core/nanopb/corpus_serverlist/44c6da04b8378986721f7225e70a1514695c176c create mode 100644 test/core/nanopb/corpus_serverlist/450161236e37a1dfc0da6398c4876df82ff640ac create mode 100644 test/core/nanopb/corpus_serverlist/45257a176ca6a05ec65a6df430bbb6b85d0a676f create mode 100644 test/core/nanopb/corpus_serverlist/46d1c2f2edcc9cdc0d1698fa0c8853cb19a6e7d9 create mode 100644 test/core/nanopb/corpus_serverlist/4764bd4297bf0c405348d2bb87b8fbc02beadcb8 create mode 100644 test/core/nanopb/corpus_serverlist/48199bfd0e2c160f56d03e881bb5dfe276eec462 create mode 100644 test/core/nanopb/corpus_serverlist/48e865c56e8db13640d6ecbfc0f2486eb77e07d1 create mode 100644 test/core/nanopb/corpus_serverlist/499b003b8b98edd9dbe2668c8c6af948769d7e87 create mode 100644 test/core/nanopb/corpus_serverlist/4a55591c4b390c5a36cecc6f1b6f5105300b546b create mode 100644 test/core/nanopb/corpus_serverlist/4d33f97ec69c64e14dcf205be36a6319ddb8a20d create mode 100644 test/core/nanopb/corpus_serverlist/4dbfb08904739928e19c2f459040b35ac410f699 create mode 100644 test/core/nanopb/corpus_serverlist/501bd6fe1de2719cf8d2c517a071e5d883fbe766 create mode 100644 test/core/nanopb/corpus_serverlist/5208871ea8948223b64b304336cea41ac3240244 create mode 100644 test/core/nanopb/corpus_serverlist/5348c71be34967458403bd4b58bb2a8a744d35ee create mode 100644 test/core/nanopb/corpus_serverlist/54362c2f6965268d0835a992c3ba656171b8f044 create mode 100644 test/core/nanopb/corpus_serverlist/54411aa13f6d9118028171935322bbbc74c15329 create mode 100644 test/core/nanopb/corpus_serverlist/54c50af22d147f192918499b4b3819eb389468a4 create mode 100644 test/core/nanopb/corpus_serverlist/55441aac903d96b36bf8a11bc804234bcf0c04da create mode 100644 test/core/nanopb/corpus_serverlist/56e1a7c279482a57fcbca43468df96a791ee22b4 create mode 100644 test/core/nanopb/corpus_serverlist/57cbea7c563d5c4b6b290271b0009c3f348d92da create mode 100644 test/core/nanopb/corpus_serverlist/57e11c7a62f0fc807d7b51bb1ef0f0e22f43795b create mode 100644 test/core/nanopb/corpus_serverlist/585183c1a240df6926689fe1bd8cb434664db4d8 create mode 100644 test/core/nanopb/corpus_serverlist/5b2ee8ca40508bf108a729dcb228191670ec34d6 create mode 100644 test/core/nanopb/corpus_serverlist/5b47eabaf74479348fd0318f174d649dbe96e7d2 create mode 100644 test/core/nanopb/corpus_serverlist/5ba93c9db0cff93f52b521d7420e43f6eda2784f create mode 100644 test/core/nanopb/corpus_serverlist/5cc827e33932ccf8c72c6a839074e856d93463d8 create mode 100644 test/core/nanopb/corpus_serverlist/5cc89bbf687f94ff87241a8f935905e1c441de33 create mode 100644 test/core/nanopb/corpus_serverlist/5ec6596f12462fe9f36924c262f97408b54bbba8 create mode 100644 test/core/nanopb/corpus_serverlist/5f8f3af69295223fb04c37d28035bb75b4cbd705 create mode 100644 test/core/nanopb/corpus_serverlist/5fd76d48b9fefecbdabd4511decc161b25db79dd create mode 100644 test/core/nanopb/corpus_serverlist/614cf839ccac2d896d61a0ba0ab1f42b2fabafea create mode 100644 test/core/nanopb/corpus_serverlist/618305cc2d3d3814d78b77ffbf421b769bd862cf create mode 100644 test/core/nanopb/corpus_serverlist/61dfcd913c4f0a8d005bd089c34e95d8dbbf1897 create mode 100644 test/core/nanopb/corpus_serverlist/65a89e10aab00039680e1f7d014737b634c74d8d create mode 100644 test/core/nanopb/corpus_serverlist/66a273dbf5e37410efd45518a42b06a65cffe1f0 create mode 100644 test/core/nanopb/corpus_serverlist/673ff0de0702e8098892060a5365c175d8ef18fc create mode 100644 test/core/nanopb/corpus_serverlist/68465c782c37bfdd98ac493b0458444bb94336e5 create mode 100644 test/core/nanopb/corpus_serverlist/688451dee13d0be420598c6e205a3bc419173e18 create mode 100644 test/core/nanopb/corpus_serverlist/68a1d9150e1380c219e0a1deb3993f321e000ecd create mode 100644 test/core/nanopb/corpus_serverlist/69f49bf7ae8886f5b4c6296fdb1c570256919604 create mode 100644 test/core/nanopb/corpus_serverlist/6a425f414cd69ffffdbaa34d03eb43841b432e11 create mode 100644 test/core/nanopb/corpus_serverlist/6ca9e6e85f9b007a0920b0112decbd1403d506da create mode 100644 test/core/nanopb/corpus_serverlist/6cd62e3d67b4154639adbe753115bfdd770edddb create mode 100644 test/core/nanopb/corpus_serverlist/6d4f2de4cc427417d6335ff5396ea2588509bb5b create mode 100644 test/core/nanopb/corpus_serverlist/6ea84030dd0b5b03e4720c244ea8b4ec65e1f236 create mode 100644 test/core/nanopb/corpus_serverlist/710c1fc8cf7dc1386312c34de5057933fcf868b3 create mode 100644 test/core/nanopb/corpus_serverlist/720e81dcaf83f867288a90293c5de3b088d5c556 create mode 100644 test/core/nanopb/corpus_serverlist/72cdc8f78ab5237f96ed354264c726ac79ec429c create mode 100644 test/core/nanopb/corpus_serverlist/73535a4f7af7e4c6aa23556cacd63f6929ac33fe create mode 100644 test/core/nanopb/corpus_serverlist/73d7b933a5673a4d6f5905006ef6266dda1e4fba create mode 100644 test/core/nanopb/corpus_serverlist/753aea13c82d1f8841c2bd4309b1b55d0ae2ba8d create mode 100644 test/core/nanopb/corpus_serverlist/754428e00e8a1d0471e00bd9e8f060ab88ab640e create mode 100644 test/core/nanopb/corpus_serverlist/761c29151b23b4d14ce6261626641df1182f7a96 create mode 100644 test/core/nanopb/corpus_serverlist/7658451dd805f277a5b1c3d4065d752d2d8de5f4 create mode 100644 test/core/nanopb/corpus_serverlist/767e91cedcd9bc1bdac882acc34a53cc23cf4d02 create mode 100644 test/core/nanopb/corpus_serverlist/77d3754bdd4ea358369c936ed36b974b4181f6ab create mode 100644 test/core/nanopb/corpus_serverlist/7a95295bebe6237f65deb15ffeccab22716d574d create mode 100644 test/core/nanopb/corpus_serverlist/7ad88b82e87fbfb3d4bddaa2f6e201a151e3a007 create mode 100644 test/core/nanopb/corpus_serverlist/7b1010cc012e34af1d03e8845868ff0e1db3a601 create mode 100644 test/core/nanopb/corpus_serverlist/7d3ddbd11e82807321c9a53835ea897cf43aa7f2 create mode 100644 test/core/nanopb/corpus_serverlist/7da9c5ab5f049da297b0f4c1322edd696202d02a create mode 100644 test/core/nanopb/corpus_serverlist/7e265a019c02e5d089152849ac00bb005fa644f5 create mode 100644 test/core/nanopb/corpus_serverlist/7f33bff4f740eb898b908374b0c1badd47566947 create mode 100644 test/core/nanopb/corpus_serverlist/81f13b9b65891f2bfce77cb183a06045c461fee6 create mode 100644 test/core/nanopb/corpus_serverlist/846a14a480ffa1ad0f6333f3ecf2be3057ce6aed create mode 100644 test/core/nanopb/corpus_serverlist/87373a7f89feba2d50591b433f69877044155af2 create mode 100644 test/core/nanopb/corpus_serverlist/8833ba4c780c94fc6c3c466f849c0387acefdb20 create mode 100644 test/core/nanopb/corpus_serverlist/8c23a5ecd20db4da2c061f3463254e9de104c8b9 create mode 100644 test/core/nanopb/corpus_serverlist/8d883f1577ca8c334b7c6d75ccb71209d71ced13 create mode 100644 test/core/nanopb/corpus_serverlist/8dc80bd5f5d1fea64412203e304432edcf5f52c4 create mode 100644 test/core/nanopb/corpus_serverlist/8fc9a9ea6ad7d6d51e770076eaddacad9f970c6f create mode 100644 test/core/nanopb/corpus_serverlist/8fd167de17534776ef57aba2f27675789a11b8db create mode 100644 test/core/nanopb/corpus_serverlist/9117d3e51560813b3ce4615dced18fa0e4d0a25a create mode 100644 test/core/nanopb/corpus_serverlist/921c68eaa8776f7544e195ae52224355d08a2d4d create mode 100644 test/core/nanopb/corpus_serverlist/9293945411fca2dc81fc34b36b575a384e6d489e create mode 100644 test/core/nanopb/corpus_serverlist/933287d66c3ff3f0a21f2c583c763f2f65872ef8 create mode 100644 test/core/nanopb/corpus_serverlist/933d1d91283403f0a56571f533f482e9744eb735 create mode 100644 test/core/nanopb/corpus_serverlist/93855fc41b3e3004ca6ba85f34b985042d4c9869 create mode 100644 test/core/nanopb/corpus_serverlist/9544f445c39470f05785b52cfc31bb73bda22659 create mode 100644 test/core/nanopb/corpus_serverlist/97757217fde05ff4fc15c864bf29e9f560fd1c62 create mode 100644 test/core/nanopb/corpus_serverlist/9877c0f2d40dd43878bb0209bbc4b5fa93bec55a create mode 100644 test/core/nanopb/corpus_serverlist/98bc5065f79dd9d20cdac14ba28f0cf39908cb5f create mode 100644 test/core/nanopb/corpus_serverlist/992860817f7fb0e49423607355dab973aa7ab815 create mode 100644 test/core/nanopb/corpus_serverlist/995ee3d74bc6042fd6a8908c9df5a4cb530378d8 create mode 100644 test/core/nanopb/corpus_serverlist/9a38c24a6e87e99a72a3a4f007b117ec191a1705 create mode 100644 test/core/nanopb/corpus_serverlist/9aa97a0ffcdc37a8ef487355fb7271eb6891deaa create mode 100644 test/core/nanopb/corpus_serverlist/9b9fddc17ed7bc05a81c18f01e800a4e9efd0c8d create mode 100644 test/core/nanopb/corpus_serverlist/a0d4cb9a5a30bb01e8e4f68d636fb173632ed29d create mode 100644 test/core/nanopb/corpus_serverlist/a1e070288ec564d10a8c59779aa07fa771fa1d4f create mode 100644 test/core/nanopb/corpus_serverlist/a23d10723415d20f4ef1ed9b14d9dc24494856a0 create mode 100644 test/core/nanopb/corpus_serverlist/a245750cfe4212dca7bfde918de85f64eb053232 create mode 100644 test/core/nanopb/corpus_serverlist/a24bbe3600f4dfd61bb8415c6a291e0521e4f267 create mode 100644 test/core/nanopb/corpus_serverlist/a25104d039a549c8d457ecea3b55369ed312f086 create mode 100644 test/core/nanopb/corpus_serverlist/a33c4fcabe6aebe012cd01c8cb851a9ab0a12098 create mode 100644 test/core/nanopb/corpus_serverlist/a393e1727b0decca9f193179765c3a83d7096437 create mode 100644 test/core/nanopb/corpus_serverlist/a5507f06be4735a3a9e416ea986d52c1a6a20909 create mode 100644 test/core/nanopb/corpus_serverlist/a5adf028c902d17dd6a7ddeadabbed2b36420313 create mode 100644 test/core/nanopb/corpus_serverlist/a6aa1237a282ee3a93f2544bb6bb7704e565209e create mode 100644 test/core/nanopb/corpus_serverlist/a871185cabce7b96c9e2f6ffb40d9901c774b335 create mode 100644 test/core/nanopb/corpus_serverlist/a89d0e67bf53e22533a635f103d1fd400969ad56 create mode 100644 test/core/nanopb/corpus_serverlist/a8d1b4e5672a501d7a6cd14b2929297f3a82e035 create mode 100644 test/core/nanopb/corpus_serverlist/aa614cc8d05a3a58c30a890c10b9a0c1d609b228 create mode 100644 test/core/nanopb/corpus_serverlist/aa65320376f63805cc82b247612b2e05b87bdbee create mode 100644 test/core/nanopb/corpus_serverlist/abd3f6e2cc8887942de20e1c257427b825aed0ad create mode 100644 test/core/nanopb/corpus_serverlist/ad0653a3a63675a7ce797e69b4673866b88ace33 create mode 100644 test/core/nanopb/corpus_serverlist/ae2ce27806f67312e0d0e29a492db9ab9cb9bf4e create mode 100644 test/core/nanopb/corpus_serverlist/ae4c0e671bd004165a1e7877d9c67249a165d2df create mode 100644 test/core/nanopb/corpus_serverlist/af75c24dff7e22948ed141c763a1309e6f540bcc create mode 100644 test/core/nanopb/corpus_serverlist/b0f228c6d0cbbc9f10117f344d5aae6f001d00fa create mode 100644 test/core/nanopb/corpus_serverlist/b2c6eab05580b85cda591093d3f05c44bf453fce create mode 100644 test/core/nanopb/corpus_serverlist/b35281c0aae174d1ddc8999d97b9713f8004f285 create mode 100644 test/core/nanopb/corpus_serverlist/b484ae40795cf9730ba94d5a4ca40aa47b88eacb create mode 100644 test/core/nanopb/corpus_serverlist/b49c2fed1417a981ba29b32be73ee1700bea7ec9 create mode 100644 test/core/nanopb/corpus_serverlist/b68542373c05c0ed25231d09955b2c699d37c45b create mode 100644 test/core/nanopb/corpus_serverlist/b6d42cbe913f7275b574a71f0768781bdb6f45b7 create mode 100644 test/core/nanopb/corpus_serverlist/b80b6c2cae83c2097c7e4c1fb181d47cb8fd0519 create mode 100644 test/core/nanopb/corpus_serverlist/b90ab62d8591182fd90cd21cdb893178d97f7e0e create mode 100644 test/core/nanopb/corpus_serverlist/ba45c93ee6b8b286798d8791ec049207c448f7cd create mode 100644 test/core/nanopb/corpus_serverlist/ba67e81ef0f9a14bf5a1ca228bff87c681e83a44 create mode 100644 test/core/nanopb/corpus_serverlist/bbd1f06ddee4fbbd0e5c9c915889862e5df34f9c create mode 100644 test/core/nanopb/corpus_serverlist/bd982feb5dd4362e6bd9746ed216c25ce2749df4 create mode 100644 test/core/nanopb/corpus_serverlist/be77053335e6496288fcf8b6c4d0b4abf86493ff create mode 100644 test/core/nanopb/corpus_serverlist/bfb53203499969fac4f4be48e1bcd9235c2fa101 create mode 100644 test/core/nanopb/corpus_serverlist/c143576bdb5b34ad89fa3319507ae382a721f587 create mode 100644 test/core/nanopb/corpus_serverlist/c1ac502a15c53a90a1934f4a31d30f93db36dc8a create mode 100644 test/core/nanopb/corpus_serverlist/c1b29883768551fa5aadc38ba6eaad8007b9b85b create mode 100644 test/core/nanopb/corpus_serverlist/c2331fe0660ab5e411f6d38968c706aed390d8f6 create mode 100644 test/core/nanopb/corpus_serverlist/c32647119c244cc018bb1863853d5c7bd37090df create mode 100644 test/core/nanopb/corpus_serverlist/c4098733900c27861bbf74a71afcbbd93d62f8ee create mode 100644 test/core/nanopb/corpus_serverlist/c4f5769bf3b4f2a55c006b4cf5a3bba44b347241 create mode 100644 test/core/nanopb/corpus_serverlist/c6ea7b2d47402a458d5d03235bb042b61e05b2e8 create mode 100644 test/core/nanopb/corpus_serverlist/c7255dc48b42d44f6c0676d6009051b7e1aa885b create mode 100644 test/core/nanopb/corpus_serverlist/c7d77af55176ae0ae5e59f46e48e1e6ea108d799 create mode 100644 test/core/nanopb/corpus_serverlist/c80827341dcdf1c21b303b82ec7e6df7eaf63f3d create mode 100644 test/core/nanopb/corpus_serverlist/c9501031a75c067b6602e2831f03421b87be4496 create mode 100644 test/core/nanopb/corpus_serverlist/c98f88d962dfbc2a83e08bfbd8a87b0cc5a8b330 create mode 100644 test/core/nanopb/corpus_serverlist/ccd33fa22b2983978f9617b3cde76ea05b683c2c create mode 100644 test/core/nanopb/corpus_serverlist/cd0e7701fd79879c56f680817a0d2705751b1f44 create mode 100644 test/core/nanopb/corpus_serverlist/cd1c2b5c2684d831aab5265e9cd6f1ee045dab9b create mode 100644 test/core/nanopb/corpus_serverlist/cf98e8b01e7a759f28a9c5f59c896317d74ac47c create mode 100644 test/core/nanopb/corpus_serverlist/d1d171589e035be85dc347278f0735151a342d68 create mode 100644 test/core/nanopb/corpus_serverlist/d243143bf9b8adf6be92a157428ec6cbfd785423 create mode 100644 test/core/nanopb/corpus_serverlist/d2cd278979f2842ebd890f1d84712750273ad0fc create mode 100644 test/core/nanopb/corpus_serverlist/d2e96eb2699c7dd4a183f13d3a063a1aa9c192fd create mode 100644 test/core/nanopb/corpus_serverlist/d3178f8b0d26275667c27bb8533a61643213e4d8 create mode 100644 test/core/nanopb/corpus_serverlist/d46f536ea4b601c0ff313a5eb5b47e2b55aa9eb0 create mode 100644 test/core/nanopb/corpus_serverlist/d4be3038631eac422022ee23f43b47905a15b2b5 create mode 100644 test/core/nanopb/corpus_serverlist/d56b30a2d1b5a2a13ae00392bcb4ca72085310d9 create mode 100644 test/core/nanopb/corpus_serverlist/d67f85948143218d11e2fb7936a119741036045d create mode 100644 test/core/nanopb/corpus_serverlist/d6930ea81dfd91856a06a0c16483e47616642b4b create mode 100644 test/core/nanopb/corpus_serverlist/d737c10038a92add90e2ebea5c174ed249de8018 create mode 100644 test/core/nanopb/corpus_serverlist/d758a67f018b176dfc7d29630cf8cb587f5b2a6b create mode 100644 test/core/nanopb/corpus_serverlist/dc7139105787f3ba67d7971d80796e9cf5786a91 create mode 100644 test/core/nanopb/corpus_serverlist/dc8ec35f43e994b9c4ac61275d6b934990d42181 create mode 100644 test/core/nanopb/corpus_serverlist/dd2694fe12a018bc6af6f288b5c22a030eec8049 create mode 100644 test/core/nanopb/corpus_serverlist/de7424f44508582a953f137195533b7a0191eda7 create mode 100644 test/core/nanopb/corpus_serverlist/de91a02040d792dfcb71a4cb5aa4c1c006201273 create mode 100644 test/core/nanopb/corpus_serverlist/deb576067b11f6e2a3a39b0f2ef38ddae5c67b18 create mode 100644 test/core/nanopb/corpus_serverlist/df58248c414f342c81e056b40bee12d17a08bf61 create mode 100644 test/core/nanopb/corpus_serverlist/e076020b2826abd3a4b960fb33a35fd7d0606dd8 create mode 100644 test/core/nanopb/corpus_serverlist/e0bcf682342967c002621acd2563a2157826d156 create mode 100644 test/core/nanopb/corpus_serverlist/e1edca08a7654b42a64647abb0e773eddddb580b create mode 100644 test/core/nanopb/corpus_serverlist/e2fa528289b5971f5b40b3687a2a6f0d17348de6 create mode 100644 test/core/nanopb/corpus_serverlist/e52af0ba8750572b98f3a8968de77811ddff0893 create mode 100644 test/core/nanopb/corpus_serverlist/e5a0f40647f805b5001645ce2d94505e72fa64f3 create mode 100644 test/core/nanopb/corpus_serverlist/e69762f0c6a2750c0b03503a6aec90ffc94bcb72 create mode 100644 test/core/nanopb/corpus_serverlist/e7064f0b80f61dbc65915311032d27baa569ae2a create mode 100644 test/core/nanopb/corpus_serverlist/e863a4420854c36168d2b8dd39ce474ebe11cd26 create mode 100644 test/core/nanopb/corpus_serverlist/e8993f97bb9c83f87c64cfc429095eeaccf32953 create mode 100644 test/core/nanopb/corpus_serverlist/e9875d9a54b3ebc57df4da886cd30a39252ac666 create mode 100644 test/core/nanopb/corpus_serverlist/e98a9d92bbbac9b1e64c0641e967adebd681b2aa create mode 100644 test/core/nanopb/corpus_serverlist/eb7c31f48c77b742fa29126ac78a2c06c41208e8 create mode 100644 test/core/nanopb/corpus_serverlist/ec174492517f988010ed3ddbd003cb388f477bb6 create mode 100644 test/core/nanopb/corpus_serverlist/ec4d6a393be7ec80ccb8c531337a7fc3ef140e66 create mode 100644 test/core/nanopb/corpus_serverlist/ecd40909ab5e2c61841d9fb95b8aacc87651100c create mode 100644 test/core/nanopb/corpus_serverlist/ed17c8ddb6cc8a0b653dc87aca999d31e80c781a create mode 100644 test/core/nanopb/corpus_serverlist/ee0b476126bb1c2249b299323718ecef1250645e create mode 100644 test/core/nanopb/corpus_serverlist/ee1fb6a0b4139c07f1cf6bce850eaac9a2db29ba create mode 100644 test/core/nanopb/corpus_serverlist/eeac145c017ed35305f0ae69f820fc41e26e7997 create mode 100644 test/core/nanopb/corpus_serverlist/efac7390c6e3a653d3ce93c3d6902f2f1c281ce0 create mode 100644 test/core/nanopb/corpus_serverlist/f0f0dace93d51cd8e045aeacca89424fc836eebc create mode 100644 test/core/nanopb/corpus_serverlist/f3341b8cc55c0bb6e2d0a1f7f06d68e4f04057f5 create mode 100644 test/core/nanopb/corpus_serverlist/f59ff56e341b94f2bddfd718b48ae9ab1692d720 create mode 100644 test/core/nanopb/corpus_serverlist/f5a1824b9fd9f124df8097017607bcfa00eccfce create mode 100644 test/core/nanopb/corpus_serverlist/f5b92b69853a5d123bffdc6b0ab093f767ec30ad create mode 100644 test/core/nanopb/corpus_serverlist/f6aea4c380e41ddef2489ee581ab35e17fa3e8dd create mode 100644 test/core/nanopb/corpus_serverlist/f7b7254a3af7c41cb86e4b23bb93c5a6d55e2583 create mode 100644 test/core/nanopb/corpus_serverlist/f7bdc1b174f53a49c6ef8f8cdb9b8e74e0a5d4ab create mode 100644 test/core/nanopb/corpus_serverlist/f98c78c028baf22f39c77faf6e70edb86ac1d927 create mode 100644 test/core/nanopb/corpus_serverlist/fb440171bca6ff922727e9ff2a4ac40d8d7905ff create mode 100644 test/core/nanopb/corpus_serverlist/fc76cc4030b422e4cb5c145c3e8ed122e242acf0 create mode 100644 test/core/nanopb/corpus_serverlist/fcab3b80624b431e464dc12d3b6da1cf538bd15e create mode 100644 test/core/nanopb/corpus_serverlist/fdb3a9b59798d7e851d9074db69422b1d2df38dd create mode 100644 test/core/nanopb/corpus_serverlist/fe5de5f387e31b029d589d9b1777fd0d6b3e47b3 create mode 100644 test/core/nanopb/corpus_serverlist/ff52d938aaa10c08b2eb0830fc0066c3b57e040f create mode 100644 test/core/nanopb/fuzzer_response.cc create mode 100644 test/core/nanopb/fuzzer_serverlist.cc create mode 100644 test/core/network_benchmarks/BUILD create mode 100644 test/core/network_benchmarks/low_level_ping_pong.cc create mode 100644 test/core/profiling/mark_timings.stp create mode 100644 test/core/security/BUILD create mode 100644 test/core/security/alts_credentials_fuzzer.cc create mode 100644 test/core/security/alts_security_connector_test.cc create mode 100644 test/core/security/auth_context_test.cc create mode 100644 test/core/security/check_gcp_environment_linux_test.cc create mode 100644 test/core/security/check_gcp_environment_windows_test.cc create mode 100644 test/core/security/corpus/alts_credentials_corpus/0149b46b88d583e05be0fb1423d10f2a14d36c48 create mode 100644 test/core/security/corpus/alts_credentials_corpus/047fc351e73f760d329d5a8845944720be9ce773 create mode 100644 test/core/security/corpus/alts_credentials_corpus/04ef96c66d8222d1a2c07e6b2a6548e6a527042b create mode 100644 test/core/security/corpus/alts_credentials_corpus/05a7e16c1d7f92111f43e9c777421879920e79a4 create mode 100644 test/core/security/corpus/alts_credentials_corpus/063eb46f202fdfe7935c30ca38d7eb81c82db419 create mode 100644 test/core/security/corpus/alts_credentials_corpus/064773597c295fa871c184fc12d17b6de8aab31b create mode 100644 test/core/security/corpus/alts_credentials_corpus/087449740758b114d16790067707934479946bd6 create mode 100644 test/core/security/corpus/alts_credentials_corpus/0a5d068feb57a2782c6eba57b637abe8668ac82f create mode 100644 test/core/security/corpus/alts_credentials_corpus/0b81e6d89bf7df80e87e5ee7c49f7cc1431f77e8 create mode 100644 test/core/security/corpus/alts_credentials_corpus/11409339cec708a5e353893101bfe76364337d5c create mode 100644 test/core/security/corpus/alts_credentials_corpus/147696a264cd6f197adb7c68aff834c30b1b77f8 create mode 100644 test/core/security/corpus/alts_credentials_corpus/160e5cac38c5c9e919ed6e4fbafee76907d63044 create mode 100644 test/core/security/corpus/alts_credentials_corpus/173d02167db431040b0540d98f6fc5e8b456587d create mode 100644 test/core/security/corpus/alts_credentials_corpus/18a3fe239806b3c7d1af24bcd2bd23aeeb072d5c create mode 100644 test/core/security/corpus/alts_credentials_corpus/195abd83b2e9d32b1b5b854fe33da44b6db40880 create mode 100644 test/core/security/corpus/alts_credentials_corpus/19af2509c7d84334b9ec64de4767a07d5294fd72 create mode 100644 test/core/security/corpus/alts_credentials_corpus/1b9864b948fcf08b062fd4401ef55b214c259535 create mode 100644 test/core/security/corpus/alts_credentials_corpus/1edddfa67de854d7faaba41418fda845e9c6a89d create mode 100644 test/core/security/corpus/alts_credentials_corpus/20031bb00e6608e1b570aa96e6afb9de06d42167 create mode 100644 test/core/security/corpus/alts_credentials_corpus/22b4c7ce7db99b0df63c9eae9265de484b695922 create mode 100644 test/core/security/corpus/alts_credentials_corpus/27416437ad287bd3cc1c5efdecebc39f20df73c1 create mode 100644 test/core/security/corpus/alts_credentials_corpus/27e8cd785c2b9346f68dba75761b52fbabaf2b72 create mode 100644 test/core/security/corpus/alts_credentials_corpus/28236f860d3d8e5ea11176746cb4c1c5c4f1f6c0 create mode 100644 test/core/security/corpus/alts_credentials_corpus/29e15b492c5a409938092a30c003c5c34df7e283 create mode 100644 test/core/security/corpus/alts_credentials_corpus/2a47864d77749aa042b772895dbdf46f608ccc6d create mode 100644 test/core/security/corpus/alts_credentials_corpus/2cca5cb1b135c35f6e5e1ec4c37deb9e12d37dc0 create mode 100644 test/core/security/corpus/alts_credentials_corpus/2df27b6c42dbaee382a29a87338d64ee87354acb create mode 100644 test/core/security/corpus/alts_credentials_corpus/2e9ddd1339d8e599cef658a08965985c4f45e428 create mode 100644 test/core/security/corpus/alts_credentials_corpus/31a2d12a84a7a56ace831a9668d6ab4847390679 create mode 100644 test/core/security/corpus/alts_credentials_corpus/33cb9ec0ce3538ed6079b5fcb127649a5d05955b create mode 100644 test/core/security/corpus/alts_credentials_corpus/348d9ae6eebb2e1644addf7f07231d108cf6f3b8 create mode 100644 test/core/security/corpus/alts_credentials_corpus/359f76f3c802292e92b0640de2bfe051e780a3b6 create mode 100644 test/core/security/corpus/alts_credentials_corpus/35a479988e965a6e3e75138b64b0bd1f45073e2f create mode 100644 test/core/security/corpus/alts_credentials_corpus/362b00d713686ff70cb0199f3d7d0058e5a1a27a create mode 100644 test/core/security/corpus/alts_credentials_corpus/3849c1625071791ceae709b9c6c705b28d099d67 create mode 100644 test/core/security/corpus/alts_credentials_corpus/39ef03c66ee2d4bcfb6c8da50486dcd40f02fb12 create mode 100644 test/core/security/corpus/alts_credentials_corpus/3a3ca061863499ebc171a4f910fa1b49523baad4 create mode 100644 test/core/security/corpus/alts_credentials_corpus/3a890f3fd01b048ac9db65a9a9b4f4443268b91a create mode 100644 test/core/security/corpus/alts_credentials_corpus/3b9554038a425bd1fae057ba41f9366bb467e946 create mode 100644 test/core/security/corpus/alts_credentials_corpus/3ce0ae4aa226f205a3a4e66bbb253419d9d754bf create mode 100644 test/core/security/corpus/alts_credentials_corpus/3dccc5523986c37e27684659bba8a1037e7a92e8 create mode 100644 test/core/security/corpus/alts_credentials_corpus/3e0908c15b1cede4541d25f388b1345e8641e221 create mode 100644 test/core/security/corpus/alts_credentials_corpus/3fcb181ff6a8c8e2ba38ed34cf78f7482eb55cb7 create mode 100644 test/core/security/corpus/alts_credentials_corpus/41c9b5f720eb8f8fa04c840375a881781a849b43 create mode 100644 test/core/security/corpus/alts_credentials_corpus/4257a018f08f13a3a9adc848ef808e1be50bc4cf create mode 100644 test/core/security/corpus/alts_credentials_corpus/42dfc5c4d13261b7259e65cd692df9c9d607194e create mode 100644 test/core/security/corpus/alts_credentials_corpus/43144664aedb585d45d42aa5249ddbfe81afe470 create mode 100644 test/core/security/corpus/alts_credentials_corpus/43e5ad495a47593b17dbcbd3e70c2e25a417bb6e create mode 100644 test/core/security/corpus/alts_credentials_corpus/446614e45b7bef49118b17e031c48faf167ebe3e create mode 100644 test/core/security/corpus/alts_credentials_corpus/46492477fa84ca88e85df914801af0b09b0939f6 create mode 100644 test/core/security/corpus/alts_credentials_corpus/47157f83b166b57e0052c98a65c6db864fa6cb9b create mode 100644 test/core/security/corpus/alts_credentials_corpus/473fc9b6d768a925527d3ad805ca363d490dc741 create mode 100644 test/core/security/corpus/alts_credentials_corpus/483c0b4015100eee00f6b23d1100d8c4953dd3b1 create mode 100644 test/core/security/corpus/alts_credentials_corpus/48be2dc4cdc5462407b319caa855d976cda88153 create mode 100644 test/core/security/corpus/alts_credentials_corpus/4e84eb54a0e438052b0c2e83653135042d9eb59a create mode 100644 test/core/security/corpus/alts_credentials_corpus/50839d5c8bf33f0970986dcc4b73b024f11a95b7 create mode 100644 test/core/security/corpus/alts_credentials_corpus/523d964986d8ad966ae07e540a608681098813f9 create mode 100644 test/core/security/corpus/alts_credentials_corpus/5410b8190c95dacd36d6e6ec75b7538a630e08de create mode 100644 test/core/security/corpus/alts_credentials_corpus/549b2891ac79f504a7c9ea00f6d7527c34ce04e6 create mode 100644 test/core/security/corpus/alts_credentials_corpus/55321649e7b7f1b5664ae20724e683c930643fc4 create mode 100644 test/core/security/corpus/alts_credentials_corpus/55cc52f25865baee3e6e52c3110a9723caa2b3cb create mode 100644 test/core/security/corpus/alts_credentials_corpus/56c22410e3295ad03aa31552ab888f581756cc17 create mode 100644 test/core/security/corpus/alts_credentials_corpus/5724a705b62a7548ba2df1abe4ef0c970c4e1bd2 create mode 100644 test/core/security/corpus/alts_credentials_corpus/576a148c107d56861d1611641a6f7c7921061c5c create mode 100644 test/core/security/corpus/alts_credentials_corpus/5a6b8263e8939f851cf5b1e347a33d97253b7b3d create mode 100644 test/core/security/corpus/alts_credentials_corpus/5ba93c9db0cff93f52b521d7420e43f6eda2784f create mode 100644 test/core/security/corpus/alts_credentials_corpus/5bd02a339fd7705449388580c75bfcc597aba954 create mode 100644 test/core/security/corpus/alts_credentials_corpus/5bd6fb6fc4163bf3a9db6ddaf509dce8df8a5000 create mode 100644 test/core/security/corpus/alts_credentials_corpus/5d06fc38005503af3d084721c60e574fb9d2f370 create mode 100644 test/core/security/corpus/alts_credentials_corpus/5ddc10489ff3269bdaa3051b70fb7af455ee1104 create mode 100644 test/core/security/corpus/alts_credentials_corpus/5ea9d515f0d10b04f1356b9463139bfe121a6e4a create mode 100644 test/core/security/corpus/alts_credentials_corpus/61c449793347cf2e1ed0c38d54d23c63dfaabeb8 create mode 100644 test/core/security/corpus/alts_credentials_corpus/6287389c373e9788dcc04f9747b4be1fd1ef3028 create mode 100644 test/core/security/corpus/alts_credentials_corpus/64d4de4d5aafab7ec388a7fe83066c1a4d1d9d68 create mode 100644 test/core/security/corpus/alts_credentials_corpus/651c37806d2ac579dcfc97643c3c1ea74dbb8774 create mode 100644 test/core/security/corpus/alts_credentials_corpus/6551d02d20573cfa2944ec1f12b0c01f264a1326 create mode 100644 test/core/security/corpus/alts_credentials_corpus/65f029414ee10e45ff4b9f305f7b472364cea538 create mode 100644 test/core/security/corpus/alts_credentials_corpus/68b75a17fe2db060df3e61a597650ba99079abbf create mode 100644 test/core/security/corpus/alts_credentials_corpus/69e80594dbc5c4c648e39883a650b1760f20ab63 create mode 100644 test/core/security/corpus/alts_credentials_corpus/6cb47d0e640b4c41e32f13c0d64ee46eae1b80b5 create mode 100644 test/core/security/corpus/alts_credentials_corpus/6da5fe063432cb9094c7c083efdbbe5ba4246d18 create mode 100644 test/core/security/corpus/alts_credentials_corpus/6dd140da774d85f272fb587dc1b2a85d881a7c21 create mode 100644 test/core/security/corpus/alts_credentials_corpus/6ddab273597d73be49e2307d68e00fa18bba4765 create mode 100644 test/core/security/corpus/alts_credentials_corpus/6eaf85d84fbf47ea0619d0dba8d366f4e3ff0be6 create mode 100644 test/core/security/corpus/alts_credentials_corpus/6f751cc09af8113f6ecd491b1830bd8454c4738d create mode 100644 test/core/security/corpus/alts_credentials_corpus/70d9eb29a70d483d07e2faca6b00098af78d1fff create mode 100644 test/core/security/corpus/alts_credentials_corpus/7192effa1058382b379fb7b87f1acad5ac554d05 create mode 100644 test/core/security/corpus/alts_credentials_corpus/730e85d6a62e70cb6721009b903782ade4ff73a2 create mode 100644 test/core/security/corpus/alts_credentials_corpus/74002471a854059cb29de7cad8f9fb7adc3c5ec2 create mode 100644 test/core/security/corpus/alts_credentials_corpus/747f2330cd1fc4a06d54b376a9a6528d0364f0ac create mode 100644 test/core/security/corpus/alts_credentials_corpus/749d5d7a9e0b1545b297117e834462af32b3e230 create mode 100644 test/core/security/corpus/alts_credentials_corpus/77de0b1de120ac702ca45868b1008a48626daf12 create mode 100644 test/core/security/corpus/alts_credentials_corpus/792c67398bce19a4eeda32653c994436e79456e5 create mode 100644 test/core/security/corpus/alts_credentials_corpus/7a3022b248c8960289e4c80c7cc8df409499e5da create mode 100644 test/core/security/corpus/alts_credentials_corpus/7a9372081294a6fbd3fecdd91b99589c98d4948e create mode 100644 test/core/security/corpus/alts_credentials_corpus/7bbe4ba828947550f4ad089d5989cb695ecbdb1b create mode 100644 test/core/security/corpus/alts_credentials_corpus/7f1ad514a96f0c3d5ca5d6f7880b929a65eeae96 create mode 100644 test/core/security/corpus/alts_credentials_corpus/7f2b075f0b6707c38db851747e2578343eeab286 create mode 100644 test/core/security/corpus/alts_credentials_corpus/81ebc64bfde3fad37af5a58ef7f1c5c3c54c4b5d create mode 100644 test/core/security/corpus/alts_credentials_corpus/82fae081afaea13831404024d39658344d56e1c6 create mode 100644 test/core/security/corpus/alts_credentials_corpus/83ba41cea1adab707f7f213af5e2ed734bdddc25 create mode 100644 test/core/security/corpus/alts_credentials_corpus/841a3f66c94e5acd836a44cd5a8514d4ad45d83e create mode 100644 test/core/security/corpus/alts_credentials_corpus/841ef94ee0f1b0b45983d95b75aba25421d73f2c create mode 100644 test/core/security/corpus/alts_credentials_corpus/843b0aad4a9707c5dcc92d12d876b78675cfcb65 create mode 100644 test/core/security/corpus/alts_credentials_corpus/8483e3d92eda8df504b1d1d0d012f4bcd778cd33 create mode 100644 test/core/security/corpus/alts_credentials_corpus/876830fdff4e59038fa2173b700faef5bffe61de create mode 100644 test/core/security/corpus/alts_credentials_corpus/87ca3342fdce0c1f678a3f1b62428032ef51442d create mode 100644 test/core/security/corpus/alts_credentials_corpus/87d044027cdb7d35fadb56532f497764246946a6 create mode 100644 test/core/security/corpus/alts_credentials_corpus/88ce75ba18bdb7e93a81197d850f4e792f6a8155 create mode 100644 test/core/security/corpus/alts_credentials_corpus/89dc55e8e20e811e78c952c8bd2c16f55fe72f57 create mode 100644 test/core/security/corpus/alts_credentials_corpus/8a215a58908f44bdced595ceb01a81977f1d72f0 create mode 100644 test/core/security/corpus/alts_credentials_corpus/8ac7459e918304ca40b1cf29a3ac0f555eada678 create mode 100644 test/core/security/corpus/alts_credentials_corpus/8b93e50a911f3ea0e0b0377ba4636574f2ee9a5e create mode 100644 test/core/security/corpus/alts_credentials_corpus/8c9ec0ffd803505772693833d56e7a02110645b3 create mode 100644 test/core/security/corpus/alts_credentials_corpus/8e4b361a530dc6825afcfb4106bd482c3fd010fa create mode 100644 test/core/security/corpus/alts_credentials_corpus/8f6690d97bcda890f2a5b2930a2b7a4d7b56c6e7 create mode 100644 test/core/security/corpus/alts_credentials_corpus/917636de2c14dce2580d4308249a94d61d62c305 create mode 100644 test/core/security/corpus/alts_credentials_corpus/91f11008defda918951bda868cc68c6373fb0e6a create mode 100644 test/core/security/corpus/alts_credentials_corpus/92e01a34047b660a798086d55a3d8d7100a01939 create mode 100644 test/core/security/corpus/alts_credentials_corpus/963fafadb4de09dee0e6a852bd61b1740039a465 create mode 100644 test/core/security/corpus/alts_credentials_corpus/97bf33ec97b93fcc2449431915911a55b906e3b6 create mode 100644 test/core/security/corpus/alts_credentials_corpus/99e31e12b02b02479d10b2c08426906bd93a0840 create mode 100644 test/core/security/corpus/alts_credentials_corpus/9a75ce693e7259d4d3bb9203dfc0a65f8bbaa466 create mode 100644 test/core/security/corpus/alts_credentials_corpus/9ac0d956f9743e026baad7319ba2a75d9f1a534f create mode 100644 test/core/security/corpus/alts_credentials_corpus/9ae56d4451dd3e1b66ddc250d84dbf6d8cae0dbd create mode 100644 test/core/security/corpus/alts_credentials_corpus/9b9a3a1e4023c9b172060249752a482a3437ef2a create mode 100644 test/core/security/corpus/alts_credentials_corpus/9c81164e10bf612c352dca3ecabf57743b451d42 create mode 100644 test/core/security/corpus/alts_credentials_corpus/9d8b420b5d32deb0140ab91eeebba58ca6163722 create mode 100644 test/core/security/corpus/alts_credentials_corpus/9de687bf1e2cfac54c3b2e2eb85b53014a460ff7 create mode 100644 test/core/security/corpus/alts_credentials_corpus/9f3cda19a186bd11bfac361b464f92daa129a33b create mode 100644 test/core/security/corpus/alts_credentials_corpus/a14fc6a608121f8abf0fe25cf466720f00f25653 create mode 100644 test/core/security/corpus/alts_credentials_corpus/a39906074669a6b76a35b0adf2bf36ad751f3b35 create mode 100644 test/core/security/corpus/alts_credentials_corpus/a454ca483b4a66b83826d061be2859dd79ff0d6c create mode 100644 test/core/security/corpus/alts_credentials_corpus/a52df5607370ff0f56d821000f3d5e386a01d489 create mode 100644 test/core/security/corpus/alts_credentials_corpus/a56eaf47f7c7263e53efdc55ec39063dbb4ae71c create mode 100644 test/core/security/corpus/alts_credentials_corpus/a79249fb8f7d53f0a280359d2d9df31594adbdfc create mode 100644 test/core/security/corpus/alts_credentials_corpus/aa98a46f25004f7436aadb36ff8b7f07ed7bfce1 create mode 100644 test/core/security/corpus/alts_credentials_corpus/adc83b19e793491b1c6ea0fd8b46cd9f32e592fc create mode 100644 test/core/security/corpus/alts_credentials_corpus/afd8e19f7bfd6c963f1856be59b75627864821dc create mode 100644 test/core/security/corpus/alts_credentials_corpus/b3966239b8568442baecbeb0f8a1aa29dcdfd7ed create mode 100644 test/core/security/corpus/alts_credentials_corpus/b430d41ef65493b3e917182c23ce90df983e01ab create mode 100644 test/core/security/corpus/alts_credentials_corpus/b44e715e0cfe05f0c92a9e000ac3c36aae17df9d create mode 100644 test/core/security/corpus/alts_credentials_corpus/b4cf4ef7b3f64eff76cf99091fddc04411774708 create mode 100644 test/core/security/corpus/alts_credentials_corpus/b53d84468ea93620a9824ca65acf1179f431e763 create mode 100644 test/core/security/corpus/alts_credentials_corpus/b6ac4831cc5baabee9c8ab9af9ca3923f91097a0 create mode 100644 test/core/security/corpus/alts_credentials_corpus/b7f4a484866a8050dbc63bc905c9803c6964eda5 create mode 100644 test/core/security/corpus/alts_credentials_corpus/b8f21e59f90431c982d5ec3fb54ae4605f102252 create mode 100644 test/core/security/corpus/alts_credentials_corpus/bad10b6581cdead8e7cb96e4f544dcf0ea650fbc create mode 100644 test/core/security/corpus/alts_credentials_corpus/bb01bed86b43257be9f527388e1183f52438c473 create mode 100644 test/core/security/corpus/alts_credentials_corpus/bb7497b00f0d999ef39dbf81c6bd0441e32723b6 create mode 100644 test/core/security/corpus/alts_credentials_corpus/bf01b72e635deda1b4a8468f1cc36f01a54e1338 create mode 100644 test/core/security/corpus/alts_credentials_corpus/bf8b4530d8d246dd74ac53a13471bba17941dff7 create mode 100644 test/core/security/corpus/alts_credentials_corpus/c08bc84ab6a512b901bb730beb05c8394e4f1c5d create mode 100644 test/core/security/corpus/alts_credentials_corpus/c244b635d94e6f5d6b344887434be3e001a04b41 create mode 100644 test/core/security/corpus/alts_credentials_corpus/c281efe9620da999a637ff6e9b3279ec613fb992 create mode 100644 test/core/security/corpus/alts_credentials_corpus/c30a212824ee71e215f475f453de17c65a200101 create mode 100644 test/core/security/corpus/alts_credentials_corpus/c449427f35b7ecdf5641073629f7723df52c4cb0 create mode 100644 test/core/security/corpus/alts_credentials_corpus/c60240cd3b02eb71e2bf5ebd59afa3a5dc9b5e4d create mode 100644 test/core/security/corpus/alts_credentials_corpus/c60cdf9c3fb9060838f445b3bc3852b6f81e1e4c create mode 100644 test/core/security/corpus/alts_credentials_corpus/c72d0501bacadb45242c553ba292591302f12a6a create mode 100644 test/core/security/corpus/alts_credentials_corpus/c739e7b5ad999edbdeffdab672dbc30deb3959a0 create mode 100644 test/core/security/corpus/alts_credentials_corpus/c7d73b12a7108d82f8dac6d8a6a34f838601aca6 create mode 100644 test/core/security/corpus/alts_credentials_corpus/ca781e1add632433293e847ae9e71649c217ee5f create mode 100644 test/core/security/corpus/alts_credentials_corpus/cc48e916f40e8d69c2d07cfda42c7d3b7fe3447a create mode 100644 test/core/security/corpus/alts_credentials_corpus/cca1aff4c08ee4ccbcb6f80e1cd1480a0a093cfd create mode 100644 test/core/security/corpus/alts_credentials_corpus/cf6ae8bf1d08d25e235b7bee0839984bbc04edf6 create mode 100644 test/core/security/corpus/alts_credentials_corpus/cfc52fa086292c699efd7bf41d2fae3deb449536 create mode 100644 test/core/security/corpus/alts_credentials_corpus/cfe13ef3c6c713a059f231f0001ecec97e2a932d create mode 100644 test/core/security/corpus/alts_credentials_corpus/d14026ac6421bca7161024f4e735cb80a1068d01 create mode 100644 test/core/security/corpus/alts_credentials_corpus/d2fb6e8f7867fc1e2ebe723da2b5246dc9cc6b14 create mode 100644 test/core/security/corpus/alts_credentials_corpus/d4db7d51bdaa4781cf12c3b59914bad414d2a41e create mode 100644 test/core/security/corpus/alts_credentials_corpus/d533da0e7f8c1e39bb025b4d7a89613142a6f54e create mode 100644 test/core/security/corpus/alts_credentials_corpus/d5cf489d01a1b847a7aac5dddabff23fdc218e1e create mode 100644 test/core/security/corpus/alts_credentials_corpus/d686f8561a249c7c15c78f76a5fceb884286e070 create mode 100644 test/core/security/corpus/alts_credentials_corpus/d92424daad9d96a40e5ab177e3824c36ef51dc0f create mode 100644 test/core/security/corpus/alts_credentials_corpus/db242a11ed88b2b26af46770dd1927d9f35301fb create mode 100644 test/core/security/corpus/alts_credentials_corpus/db32eb04db13d58f65f46d262608bd088987c063 create mode 100644 test/core/security/corpus/alts_credentials_corpus/db39a953317951759e40734de6607a0b4457728e create mode 100644 test/core/security/corpus/alts_credentials_corpus/dc5e8f3102456bed90d17303bc4cff1a7e076d5d create mode 100644 test/core/security/corpus/alts_credentials_corpus/dd9542bbed8e5dc58da2789edbfb9c38d578d3b4 create mode 100644 test/core/security/corpus/alts_credentials_corpus/de2ebb1ed324385de500a1a3308846239857c3c7 create mode 100644 test/core/security/corpus/alts_credentials_corpus/de8ba9158254c1cd84b53df1e4cdf1757b1392f1 create mode 100644 test/core/security/corpus/alts_credentials_corpus/e1dd260746f50024822a8b729b89545d26decfb8 create mode 100644 test/core/security/corpus/alts_credentials_corpus/e29add81b20dc570fdc885782689f6dccb1c5fad create mode 100644 test/core/security/corpus/alts_credentials_corpus/e2e99af62843cd3b29d50daeb118e58830784da9 create mode 100644 test/core/security/corpus/alts_credentials_corpus/e46611c5daf99662e1576147c1623409752a1f39 create mode 100644 test/core/security/corpus/alts_credentials_corpus/e5a1ba11af830e9d2db201c5164f75747a85fe9b create mode 100644 test/core/security/corpus/alts_credentials_corpus/e6026ee0badf216b326443a5f708446b2f2e579f create mode 100644 test/core/security/corpus/alts_credentials_corpus/e6c7d2c0038fa1f03fc6590a726abc98f4c641f3 create mode 100644 test/core/security/corpus/alts_credentials_corpus/eafdef6a630bed71bd0e4f3d4a16b5fa0c920651 create mode 100644 test/core/security/corpus/alts_credentials_corpus/ece985b9b82e27281514d460709d7edf8203ded7 create mode 100644 test/core/security/corpus/alts_credentials_corpus/edb8f4259f756c2c4bc731f05beaa36f992cf079 create mode 100644 test/core/security/corpus/alts_credentials_corpus/edce7778c2e1adb81dda3d057a6536759a7cb293 create mode 100644 test/core/security/corpus/alts_credentials_corpus/ee4040c0dd406dd616c49ed2c37b40478dabfe0f create mode 100644 test/core/security/corpus/alts_credentials_corpus/ee69f2b380663d051a70f30fcfce9f79f5341e5a create mode 100644 test/core/security/corpus/alts_credentials_corpus/efc6743e47274058771bb6eda1fefa017bde4a95 create mode 100644 test/core/security/corpus/alts_credentials_corpus/f0038e54162000694d882b1acb80930c807b41d2 create mode 100644 test/core/security/corpus/alts_credentials_corpus/f1deb9e388c877337dabe92f31b01e2a019a10f4 create mode 100644 test/core/security/corpus/alts_credentials_corpus/f3a09373e4d3c7310d372089e6deb15d6b22c198 create mode 100644 test/core/security/corpus/alts_credentials_corpus/f3db7ef6495fa1ac5bb4db293fb38dd59122bb7c create mode 100644 test/core/security/corpus/alts_credentials_corpus/f434bb4ceecc573e085d4c3ef453ef01e93d9c89 create mode 100644 test/core/security/corpus/alts_credentials_corpus/f55bceaad42ddf9d2b37fdfca68255d29a696109 create mode 100644 test/core/security/corpus/alts_credentials_corpus/f62ca5321428a5d23f3c804fb51eb4e65bc58716 create mode 100644 test/core/security/corpus/alts_credentials_corpus/f7c6a558b8d0af64db2b139371a7af7068b01b92 create mode 100644 test/core/security/corpus/alts_credentials_corpus/faa1781e1444bba5b8c677bc5e2a38d023a1ec65 create mode 100644 test/core/security/corpus/alts_credentials_corpus/fceba33ada1dda05fccedfefd331c9a201f1a2e5 create mode 100644 test/core/security/corpus/alts_credentials_corpus/fd668bef6fdaf7f3ffd58d8c60ce550476652e60 create mode 100644 test/core/security/corpus/alts_credentials_corpus/fdf06b928e37e7c4ae59a568b5723ad98bbed6e5 create mode 100644 test/core/security/corpus/alts_credentials_corpus/fe2fc5d499aeb2762387ef2e3ce939280813dec0 create mode 100644 test/core/security/corpus/alts_credentials_corpus/ff548d368b090409a138e5cc4afc7f43b4a3fbbd create mode 100644 test/core/security/corpus/ssl_server_corpus/05cda1e986096f42698ee2d86ab0a4a3f6a6690b create mode 100644 test/core/security/corpus/ssl_server_corpus/0f65ef472e8308561c77ada56afd4de5932d950a create mode 100644 test/core/security/corpus/ssl_server_corpus/128915cb83e66a736f8a1833c8901eccb81e0656 create mode 100644 test/core/security/corpus/ssl_server_corpus/134d3a5e7a1609a583f6282c48ef9b871e0fdc15 create mode 100644 test/core/security/corpus/ssl_server_corpus/13fccd43a6b52c62851ea24e8be4f8cfe6c0103d create mode 100644 test/core/security/corpus/ssl_server_corpus/171bc6b14b94c72435d2da2e31e9682f12a3f13c create mode 100644 test/core/security/corpus/ssl_server_corpus/17dea38d21e9282ecd062466cf287ecf5b30c1cf create mode 100644 test/core/security/corpus/ssl_server_corpus/1961eb9d4dd4bf21cbcd9c45a17b1d025eb0d200 create mode 100644 test/core/security/corpus/ssl_server_corpus/226ebb5cc16ac42fae3be273de533ac79759ae01 create mode 100644 test/core/security/corpus/ssl_server_corpus/2333cf428cb1e2976679ac84e64873bf76c6595e create mode 100644 test/core/security/corpus/ssl_server_corpus/2885553a9e6829265d5f44ea4e24fcf7d6513436 create mode 100644 test/core/security/corpus/ssl_server_corpus/28bce9a7cb21f3232239b9b71ef568137bf801f4 create mode 100644 test/core/security/corpus/ssl_server_corpus/2a0286615be426d1e7fd5894aadf1a503df05a0a create mode 100644 test/core/security/corpus/ssl_server_corpus/2b4a1f3ebe223d91c042a5e86aff31e460f6cc3f create mode 100644 test/core/security/corpus/ssl_server_corpus/2cfbe809bcf53160ecc0109b2df01a8696a226fd create mode 100644 test/core/security/corpus/ssl_server_corpus/2f770de96db36ef9a71f7eb09b2e8695ac1f0655 create mode 100644 test/core/security/corpus/ssl_server_corpus/30ba8ad171657470b5312232387b7da70c387219 create mode 100644 test/core/security/corpus/ssl_server_corpus/36548a97a8b847e17a77d1e646c6eb5ec001d84a create mode 100644 test/core/security/corpus/ssl_server_corpus/3c442804f73cfe826a609d97c12ef87852742883 create mode 100644 test/core/security/corpus/ssl_server_corpus/3dad758011b16a3771376f9af91242953be3e47b create mode 100644 test/core/security/corpus/ssl_server_corpus/43b56a1adffaf2c3c994679bf2b6fe6414e13df4 create mode 100644 test/core/security/corpus/ssl_server_corpus/4446c60ab89c34e5ccc26bec18d7e7d21fe5aec1 create mode 100644 test/core/security/corpus/ssl_server_corpus/44924b3866956d0668ec65750c3663279ac84a36 create mode 100644 test/core/security/corpus/ssl_server_corpus/44e4370a4eafde61f8e7dc7e4542e0ad5ecf5253 create mode 100644 test/core/security/corpus/ssl_server_corpus/44fb8c02117ebd75c97e517624c0abc9f9a76aa7 create mode 100644 test/core/security/corpus/ssl_server_corpus/45d76dd1f0a29fce3f8d289b5177263871eb3f83 create mode 100644 test/core/security/corpus/ssl_server_corpus/4fcbf18c4135352539eaf445c26f2f8a5da9b68e create mode 100644 test/core/security/corpus/ssl_server_corpus/508ca86c6f4e6ecc30c252ccf74e78256a893b17 create mode 100644 test/core/security/corpus/ssl_server_corpus/515d240b860fcd1e77d4a5af291aa4a667d9b609 create mode 100644 test/core/security/corpus/ssl_server_corpus/528e9738d5016f01cf59d74f20a8aa3f341ad89e create mode 100644 test/core/security/corpus/ssl_server_corpus/54b636a2bb66ccf8247b53ff76a6400e9f1355d0 create mode 100644 test/core/security/corpus/ssl_server_corpus/5cc337c4b33cd703cd354804530f5b72684260d0 create mode 100644 test/core/security/corpus/ssl_server_corpus/5ce3ec59111bf328044e41fcf26b3bc542df527e create mode 100644 test/core/security/corpus/ssl_server_corpus/5eaac270339f19cfce4eafa2e69d62adf100ad1c create mode 100644 test/core/security/corpus/ssl_server_corpus/6129382083353687a5c3acb3d4274b811227bf3d create mode 100644 test/core/security/corpus/ssl_server_corpus/616a25f7c4557ef9eb33d4367c6884abc336802d create mode 100644 test/core/security/corpus/ssl_server_corpus/6214e558afbfdb8451e49b62619896492f1a8972 create mode 100644 test/core/security/corpus/ssl_server_corpus/6c6a6b2ce74acf8a8b90fc0b268ecc7dc992cd60 create mode 100644 test/core/security/corpus/ssl_server_corpus/6f72309e1b23b824e9bbb9abf74a014b78be038e create mode 100644 test/core/security/corpus/ssl_server_corpus/7137ffad853e4dd76c6d6490f37b36e20de7ede0 create mode 100644 test/core/security/corpus/ssl_server_corpus/71c9356b6b6c5a3a07033d0fa4ed417fa74a77e5 create mode 100644 test/core/security/corpus/ssl_server_corpus/7414938799ed61282f41d5fb1474751ca52b2682 create mode 100644 test/core/security/corpus/ssl_server_corpus/75e853eb2ff7e78efb327e114b39baff5a1dd5bb create mode 100644 test/core/security/corpus/ssl_server_corpus/7607c92952b4429e350260d8074c3c460468fd49 create mode 100644 test/core/security/corpus/ssl_server_corpus/7677373c082fee56d8cdde009d9db5b117a4c8de create mode 100644 test/core/security/corpus/ssl_server_corpus/76abde5c970743f9fb8bc781e46c431dee2aa104 create mode 100644 test/core/security/corpus/ssl_server_corpus/77e0b4e2066853df9d32d475b8788e3d7d19329b create mode 100644 test/core/security/corpus/ssl_server_corpus/78e66840048ddc3c75e0e4abffbb3109af0d750e create mode 100644 test/core/security/corpus/ssl_server_corpus/7dc620eb45764390c7b106362fc4922227415407 create mode 100644 test/core/security/corpus/ssl_server_corpus/82ca7a52d589e9dbae37ebf1c59fac7ad876eb7c create mode 100644 test/core/security/corpus/ssl_server_corpus/8997d472f73eec84fea712638abd762818ec92ec create mode 100644 test/core/security/corpus/ssl_server_corpus/933bc3fdc56718d7ac0486c26eecddb6db1c5ba2 create mode 100644 test/core/security/corpus/ssl_server_corpus/94431bda60ddc175cf86273ddc07cb41ecf45fa1 create mode 100644 test/core/security/corpus/ssl_server_corpus/94c4272b2bb4fa9178eb4ae7dcf4b796fdcb22ac create mode 100644 test/core/security/corpus/ssl_server_corpus/9551c32a794250fb425005d8faf4bd24475acd41 create mode 100644 test/core/security/corpus/ssl_server_corpus/9677da7c82f18cec3e0ed2e78aadd6e590271a52 create mode 100644 test/core/security/corpus/ssl_server_corpus/9c2e6291aff608f3f5307a7c80db6b17107f0575 create mode 100644 test/core/security/corpus/ssl_server_corpus/9c39dc04c7414ca0bb64fb942422bebe83ed8e8f create mode 100644 test/core/security/corpus/ssl_server_corpus/9cc8547d183a4f2ab7022b36376ca4a6230726c6 create mode 100644 test/core/security/corpus/ssl_server_corpus/9e19e5e77789c34f99bbe1e6de198610d6765806 create mode 100644 test/core/security/corpus/ssl_server_corpus/9f0853ccf6912df9fba2d5fc3a1ddece41c377ac create mode 100644 test/core/security/corpus/ssl_server_corpus/a6d521e501322f052df5a81ee622e0e4942ddcda create mode 100644 test/core/security/corpus/ssl_server_corpus/a9dc20f09890403be510357a7665a8f0db2468a4 create mode 100644 test/core/security/corpus/ssl_server_corpus/ac1c60970910880558ae7a2ca2e155cfd7772e05 create mode 100644 test/core/security/corpus/ssl_server_corpus/afe36d0187a155fc6e4e5c055c0ed0f3802cf696 create mode 100644 test/core/security/corpus/ssl_server_corpus/b12b5fc39edc5407b4a525c414ff6b5e116eee05 create mode 100644 test/core/security/corpus/ssl_server_corpus/b5b088c6e3a96f88119a940874ab04cb954797ae create mode 100644 test/core/security/corpus/ssl_server_corpus/b65ad77a43ede3394ba714238829860c4ef4bc9f create mode 100644 test/core/security/corpus/ssl_server_corpus/b6f265cad9d47e2ccd17a73a6d309d8898dc5428 create mode 100644 test/core/security/corpus/ssl_server_corpus/b7ca5868bca7ae7d1952f44ca966218b26fb7207 create mode 100644 test/core/security/corpus/ssl_server_corpus/bd20809eacabadb9bcc77d31e42d3359117b03f2 create mode 100644 test/core/security/corpus/ssl_server_corpus/c328623c4ce12505a54cf1a7a1606e1db36e870d create mode 100644 test/core/security/corpus/ssl_server_corpus/c823e8bd5526d9fe7d51319737f51bd18bdd75e8 create mode 100644 test/core/security/corpus/ssl_server_corpus/c9394095d86ff36b69d90f7122592bf51cafe7dd create mode 100644 test/core/security/corpus/ssl_server_corpus/cdbf0d2ae953bec07a67b7152785b548e55f85a4 create mode 100644 test/core/security/corpus/ssl_server_corpus/cef06f9c35ee338998703555847d70c26bfc9474 create mode 100644 test/core/security/corpus/ssl_server_corpus/cfb40ab8eb7031e978bed2418cdc2f0b8a8d8ec7 create mode 100644 test/core/security/corpus/ssl_server_corpus/d30840c3f48f11179ef976ada30477045c6d1e98 create mode 100644 test/core/security/corpus/ssl_server_corpus/d5afef69141edc7f4911243cf2deb19c912999cf create mode 100644 test/core/security/corpus/ssl_server_corpus/d5cf71396e1a04da1a7ec266957ffd2de29d6a57 create mode 100644 test/core/security/corpus/ssl_server_corpus/d6dd8a2b085db5d33ef24b23502293ce1ce906a3 create mode 100644 test/core/security/corpus/ssl_server_corpus/d7676dcd39b7c7cfaac513a98b56fe4ac8ea27d8 create mode 100644 test/core/security/corpus/ssl_server_corpus/d8c9e9ef14abc23b36cb493283ba3e2812d9e537 create mode 100644 test/core/security/corpus/ssl_server_corpus/d9edb0aa5d2fe4af26ac861770c1530a4075f919 create mode 100644 test/core/security/corpus/ssl_server_corpus/da1b52041957334b9ea1371bd2993013118bc82d create mode 100644 test/core/security/corpus/ssl_server_corpus/dca7861424c8f92d3720de5c4488454cde1c39df create mode 100644 test/core/security/corpus/ssl_server_corpus/df3755e257d024ef8ab08f6d5cefcf28148ea4b1 create mode 100644 test/core/security/corpus/ssl_server_corpus/e360a49faefb87d671edb99e777f528f52cac9ae create mode 100644 test/core/security/corpus/ssl_server_corpus/e5e789605744d47e5a5d433bb04db1b413bc91a8 create mode 100644 test/core/security/corpus/ssl_server_corpus/e6e44a6aa0ece409450c85e43d02c57e338ce1da create mode 100644 test/core/security/corpus/ssl_server_corpus/e8ebd49ee98cf57ca7eb35b6e96ef8866270aac6 create mode 100644 test/core/security/corpus/ssl_server_corpus/ea0645f46ccd233337a8389b6118db5b0289f040 create mode 100644 test/core/security/corpus/ssl_server_corpus/f6f7687df6b7056d3c819c03c9268e22a956b6b5 create mode 100644 test/core/security/corpus/ssl_server_corpus/f725caa73aa9467c5e934c49780fc409b36b251c create mode 100644 test/core/security/corpus/ssl_server_corpus/f8d3326a860091edd4d60725f96f429d13f3abe6 create mode 100644 test/core/security/corpus/ssl_server_corpus/f9261344b4049e90e88b5af784dd29b938c5c838 create mode 100644 test/core/security/corpus/ssl_server_corpus/f95b97ece3b46815204a8e6d6e94f92ec40a9672 create mode 100644 test/core/security/corpus/ssl_server_corpus/f97db29497e4e3225016a6ced837e20a13622f16 create mode 100644 test/core/security/corpus/ssl_server_corpus/ff1a900b12f19772f9a86bd5f560a754cdb18d1a create mode 100644 test/core/security/create_jwt.cc create mode 100644 test/core/security/credentials_test.cc create mode 100644 test/core/security/etc/BUILD create mode 100644 test/core/security/etc/README create mode 100644 test/core/security/etc/bundle.pem create mode 100644 test/core/security/etc/test_roots/cert1.pem create mode 100644 test/core/security/etc/test_roots/cert2.pem create mode 100644 test/core/security/etc/test_roots/cert3.pem create mode 100644 test/core/security/fetch_oauth2.cc create mode 100644 test/core/security/grpc_alts_credentials_options_test.cc create mode 100644 test/core/security/grpc_tls_credentials_options_test.cc create mode 100644 test/core/security/json_token_test.cc create mode 100644 test/core/security/jwt_verifier_test.cc create mode 100644 test/core/security/linux_system_roots_test.cc create mode 100644 test/core/security/oauth2_utils.cc create mode 100644 test/core/security/oauth2_utils.h create mode 100644 test/core/security/print_google_default_creds_token.cc create mode 100644 test/core/security/secure_endpoint_test.cc create mode 100644 test/core/security/security_connector_test.cc create mode 100644 test/core/security/ssl_credentials_test.cc create mode 100644 test/core/security/ssl_server_fuzzer.cc create mode 100644 test/core/security/tls_security_connector_test.cc create mode 100644 test/core/security/verify_jwt.cc create mode 100644 test/core/slice/BUILD create mode 100644 test/core/slice/b64_decode_corpus/testcase-5759629707444224 create mode 100644 test/core/slice/b64_decode_fuzzer.cc create mode 100644 test/core/slice/b64_encode_corpus/testcase-5686577615339520 create mode 100644 test/core/slice/b64_encode_fuzzer.cc create mode 100644 test/core/slice/b64_test.cc create mode 100644 test/core/slice/percent_decode_corpus/04cb8ccc553f9b2f5e52c421aff6d1c954d3dae6 create mode 100644 test/core/slice/percent_decode_corpus/0dd8f3a63745b3a2d39791559b5c1b311447b537 create mode 100644 test/core/slice/percent_decode_corpus/17eeaca784409adbe43365c32ac87915d736bba3 create mode 100644 test/core/slice/percent_decode_corpus/2040c1ff65f52a7ae668c2c8f324de5dacc9d695 create mode 100644 test/core/slice/percent_decode_corpus/26b0d1da23027ae54db96e125e4a9e98842d77fb create mode 100644 test/core/slice/percent_decode_corpus/2a089c0db45acdb4c6ed8e7ff81ca7235792c0b9 create mode 100644 test/core/slice/percent_decode_corpus/35b7b3bc3a740d5c3abca0d75b53f0e1e1ee998a create mode 100644 test/core/slice/percent_decode_corpus/36367ba1adba47a1cbc3a88707fde8cc7abdc248 create mode 100644 test/core/slice/percent_decode_corpus/39c2ba51548a0beaf0d6d1164531f1447dc311b5 create mode 100644 test/core/slice/percent_decode_corpus/56d08fea787c041395c6697ce26cfbc0decbe688 create mode 100644 test/core/slice/percent_decode_corpus/678d981fdabb9f0d6640235cf1719dd1e1e66ae9 create mode 100644 test/core/slice/percent_decode_corpus/68751961609ec010565de0aa87521dcbf0722c5d create mode 100644 test/core/slice/percent_decode_corpus/7875c06c6f03c9aa2f8e9c59f8d8957c8a32e759 create mode 100644 test/core/slice/percent_decode_corpus/7b302090e090a5829b6d1dd7be30bd4e36a7e60f create mode 100644 test/core/slice/percent_decode_corpus/875e1022169c9e4c541a9ad894e69e989df22ba1 create mode 100644 test/core/slice/percent_decode_corpus/8c1051ce066f5a26de9a9d133180621d0da957b4 create mode 100644 test/core/slice/percent_decode_corpus/8e084e628ab83a18ac7ca7cb3506525263655c63 create mode 100644 test/core/slice/percent_decode_corpus/9d316c4675f40ddccaf8f1cc7aea94170b1e4223 create mode 100644 test/core/slice/percent_decode_corpus/ad1c7c11d18a7d116e2c2ef4d4c5afb1270836ae create mode 100644 test/core/slice/percent_decode_corpus/b471f94aa4facf502e622e4a248f1ba4063ae681 create mode 100644 test/core/slice/percent_decode_corpus/bf52ece030f16136d46e0dc97f58d60a0d8a1f0b create mode 100644 test/core/slice/percent_decode_corpus/clusterfuzz-testcase-minimized-grpc_percent_decode_fuzzer-5652313562808320 create mode 100644 test/core/slice/percent_decode_corpus/d5b2a7177339ba2b7ce2f60e5f4459bef1e72758 create mode 100644 test/core/slice/percent_decode_corpus/de867b64c54a7ed773dc611fc5cd2f17c5433113 create mode 100644 test/core/slice/percent_decode_corpus/e3948dbe004950591630dd5c52f4e0fcbd5e388a create mode 100644 test/core/slice/percent_decode_corpus/e7064f0b80f61dbc65915311032d27baa569ae2a create mode 100644 test/core/slice/percent_decode_corpus/xyz create mode 100644 test/core/slice/percent_decode_fuzzer.cc create mode 100644 test/core/slice/percent_encode_corpus/0d3ee7fa54e6c66103965fd4409b044ba7db6c3f create mode 100644 test/core/slice/percent_encode_corpus/2e7ccf75e27b9501e3b28cf1c50ed0c45ab7c226 create mode 100644 test/core/slice/percent_encode_corpus/55bb859f3942c462b03b7cbcf22ab4a0ac9705cf create mode 100644 test/core/slice/percent_encode_corpus/56070cecd54c845b6d4334953b17b712eb000d93 create mode 100644 test/core/slice/percent_encode_corpus/61f50e891bf7ff5eb7a7af206f1e25d77f8756e7 create mode 100644 test/core/slice/percent_encode_corpus/6e0c60cefc704c7940e475a87dd9ae423061cb5a create mode 100644 test/core/slice/percent_encode_corpus/7271ebcc6d22a0f186f7bc3c1973a7ed1bec8d8e create mode 100644 test/core/slice/percent_encode_corpus/74c83ece3e2920a67593a9be9c82468f16cbb969 create mode 100644 test/core/slice/percent_encode_corpus/98e004fd2a9f141a7a019720820080e12d637c06 create mode 100644 test/core/slice/percent_encode_corpus/ba2c1e98227aa21ea3bb2ca4d0e504119717da8b create mode 100644 test/core/slice/percent_encode_corpus/c16b9fd45370d4afb5d3ebd307a6e263c25ffd45 create mode 100644 test/core/slice/percent_encode_corpus/d58c3cd4eab9b6d2343abfa1c25c90a383fe0ec3 create mode 100644 test/core/slice/percent_encode_corpus/e2619218ede30d2b7b8ecd601a9f0ae754b728b4 create mode 100644 test/core/slice/percent_encode_corpus/f93b3653e453f0e3eea3198001be6ce46e64bd21 create mode 100644 test/core/slice/percent_encode_corpus/fd41d029c7682ad3d1c40a9fd017a4c85b673a54 create mode 100644 test/core/slice/percent_encode_corpus/xyz create mode 100644 test/core/slice/percent_encode_fuzzer.cc create mode 100644 test/core/slice/percent_encoding_test.cc create mode 100644 test/core/slice/slice_buffer_test.cc create mode 100644 test/core/slice/slice_hash_table_test.cc create mode 100644 test/core/slice/slice_string_helpers_test.cc create mode 100644 test/core/slice/slice_test.cc create mode 100644 test/core/slice/slice_weak_hash_table_test.cc create mode 100644 test/core/surface/BUILD create mode 100644 test/core/surface/byte_buffer_reader_test.cc create mode 100644 test/core/surface/channel_create_test.cc create mode 100644 test/core/surface/completion_queue_test.cc create mode 100644 test/core/surface/completion_queue_threading_test.cc create mode 100644 test/core/surface/concurrent_connectivity_test.cc create mode 100644 test/core/surface/init_test.cc create mode 100644 test/core/surface/lame_client_test.cc create mode 100644 test/core/surface/num_external_connectivity_watchers_test.cc create mode 100644 test/core/surface/public_headers_must_be_c89.c create mode 100644 test/core/surface/secure_channel_create_test.cc create mode 100644 test/core/surface/sequential_connectivity_test.cc create mode 100644 test/core/surface/server_chttp2_test.cc create mode 100644 test/core/surface/server_test.cc create mode 100644 test/core/transport/BUILD create mode 100644 test/core/transport/bdp_estimator_test.cc create mode 100644 test/core/transport/byte_stream_test.cc create mode 100644 test/core/transport/chttp2/BUILD create mode 100644 test/core/transport/chttp2/alpn_test.cc create mode 100644 test/core/transport/chttp2/bin_decoder_test.cc create mode 100644 test/core/transport/chttp2/bin_encoder_test.cc create mode 100644 test/core/transport/chttp2/context_list_test.cc create mode 100644 test/core/transport/chttp2/hpack_encoder_test.cc create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/0141fcddc9807ee093313b2256f1306fbbdc6cda create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/0255050a9ccb25f46d6c1bf6a5a8a4c0c7635599 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/0320a995a8c76c64c8a0e0297f632b76d9bc92d6 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/042091aeac4cc255506b96fa11c7354e699fde76 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/051268ade45dbed0aab896d7d9f4d10ba89d3b09 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/0696e7bf7837d98de01c915d3c9d80e5d21b30d2 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/06995c2f3f01c7ec50547415dc324c64030b7a3e create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/06f7ce769fe07804fc842462d4be8c1aa2ba82c2 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/0781b055c85ab8fbd0a3d0080a32e394af8761c4 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/080e1f19e6061c5bcac31add2095f87f6ce46129 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/0828169ba82152a8907f1001e3d98804397d4610 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/08ffc4a4160e9fe6f322c28870a89a41fd9c37d7 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/090a7a758898a6e7c9108b7e8a1cb9cda383e707 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/0940663729501b750a18542e1041cc26385c6148 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/0a10bd140c6c5fb109a0816ca061739688a6db9a create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/0a4d3fda02cdcb7adad1daa80d65780c9c8d1464 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/0ad812832efa33e086874fbf3496664d3f1b4dbe create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/0c9996d4fef87bacd7a001e99a515b3ba3d5788f create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/0d6210208831fe55951af56cdeee3d54a91a5361 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/0d784965b2262df7ed7a1eb57b92a718cc76bde8 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/0dc9e41eedf35ccedf4e2b0d230ead7c4d72fdb2 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/0dd470c8939ed535de6b36f7b7bfb68aeace493e create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/0e61e471fa6d3405daef4276ee00cf5fc189f378 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/0e9196f951874edbb5ed098739ea5c8b6c0751c2 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/11442d93a554b9e7f9ab02782bbf9443bf6e1ddc create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/11833b795d04eda5a3af56ef7b3c3a26a8ee3444 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/141272316382b0f3e9ec841c735b84e7aa517c3e create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/15ae43369798e48c396dfe7d53a21878b96e66c8 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/166bf1843c229d34a2880d234dd166c27bdc11fd create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/179e8ac763b4051a953a38b6b3b1f1e1f6cc6c9e create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/17faf0ba8a491a835d35977a9007b90ab7d30d2a create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/188f6cf2470e95b228341de305ef839b27f01a5c create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/1ab3e52adace335d02e2b5130eb4f7c918add7fd create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/1b5150514364e2c17f5a4edac1b7af99b936f55a create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/1e8befb98cbaba059d6771abd1680e19484e7723 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/1e9b962969c359bc2ff766704c8ca8e25f5eccfc create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/1f80af104acf41b912bf4a48fb938267e3718719 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/1fcc4afd6f48e83d61ea74970df3ca9dcd8ec291 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/213a734ccdb813b18ad9f2dd99b7f9967ee1460b create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/2151945f43991c27e123c45dc72b93752a47e65f create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/21545d998c27a5a1572a89a552937752432b1c14 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/23c7443fa1ab713e7c34ec50222b1b8cceaedc65 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/2445bb2c6779712dc9e14c01fecb7103f8732858 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/244b0a20500e31d3c538418800db816b07f4d210 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/2461b9fa6b5bc4b6424dec5b9a18d4ec7c309112 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/24ec2f3e17d3850564788f3fed17a5c586c44658 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/2537b8d6b902b8dfc6e17f194cf7d05ddecf74cf create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/253ad01acea4b7038edc3f2a8c4a0c0f5c4dcd05 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/256d0bbdbed22f5867a6f503bf082011e61ee12b create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/26f0e88adbd8f8cdf778131a35b33ecf8711fa49 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/2e5dd8fb9d2a31fad9d681eda697d085b647b57c create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/2fdfd2abf30c636ec8c841f1ac26594e25664f0f create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/311dac5092e36134d3490f98aa4207425e0ee941 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/320fe6224a5b691c0425e34b6b14e8c6fe9f9620 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/3255f1c7441a7150dc3c33022bfbe8c956c7b7b1 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/33bc9db104eb72891fb096f34cbac191b3f9918d create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/342ff1db70a7616b4ef76c03a42802c6702c18cb create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/344c011df992ccfc0ec682c14a1cb2d7959998c7 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/35775efb9d0d68fa07987b9a84934389b528e436 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/3650168db6fe115fb1e73eed4b76cd224d977d01 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/38228bf98cdb50fd3fa830ba5a9d4c7399063dff create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/38717bee901151b22a10beb12c6623ccc844d3c2 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/3a4bb427a85bdc5bf66ac71db073c99e0dc9f881 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/3ab48621d9b8f075369099a8ec7517bd23fd6e70 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/3aec8d9311130dfbb6584fe6e619579c21992b5f create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/3b14837f22905dcb04f93aed2aa69bf95924fb9d create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/3be63c163805927e04fd7f84d96122c48240e601 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/3bf2e349747c0f539181e0d4084a5fe506811a9e create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/3c5af4d73e94d0e8ad5666b6acb340f929031e95 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/3d2b25346a9671d83bd082d170a45eed739bae6b create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/3de7b860c3fba2bc55707fd6875dce276f2f249b create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/3e2004ff9f40e398e0f41138a25a8b66e3d843d9 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/3f8983e457033cc85997c356935ba9c21460e86b create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/4105669086d83a20f8d991088553ba08202478cd create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/4180619316eef7912d1cf52ffe85897242e1ae88 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/420291d7139d9246de747739fd98102434a742dd create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/4256437fc5897c0cd5d755816e4e68c7be326849 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/42b25a5413c536478a3e63da5adef4250babf2f4 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/42bef44ae751a45c671d9da5b1231d2ac747a48d create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/438c3c9045c3cf7910aceec34f77b47a70ca4abd create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/43af96b4f65ed0ace7236427f2f8833c4835989e create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/44c6119bb91a452d6128ce0ea0d62938800779ea create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/46d595331689ae01d77aff387747a98ff3480096 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/471a307b81dc37459087d41532741c5c9d7ba836 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/48900b4a5557530922ce45c15ad0d3b0a337520d create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/48bcce2c6487b18706ef0c609ca39c456215bac8 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/49027bbd3f3f3cafa315843c8fe8280f86985273 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/499376c5e291da2f9c25999abf4960fab5a92ec8 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/4a3b7ce0cdf217963a0b692769e5d6f4befe73b8 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/4a3fdb96bc8c80f1992f0f72f963f84856cbade8 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/4aae80e05793d7adb42a7e6e8a5283b677318777 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/4c7a034d3a3b4f29d99caf021a0e9bbb89706c2e create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/4ce8a43fb17a075627160812ad26c25210d8a82d create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/5032a75a98cd14d4dab75c1c5e2cd981abb19dcf create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/50b3f4b6aed97f442496d27f3b4315a18ba76d5f create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/51064b88a98658d48a0da7f1545c2d1293ad9538 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/51752f12d59fadaaa0dc72e6370612b84ee1555b create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/51eff6fcbfe1a51ceb3f5f2140c01eea89b4313d create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/51f65f681cf3a1218d83ad58642c06deaea86210 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/521809903d36db80b1ccd707f354361f2bf05075 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/5278e3581c069624157fd9176eddf52c0e58df67 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/52fe8f0e1fa270ea16f66c93f2ffab265ce059e8 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/53de87ae94acdc8e58a369459c12a3240f1294fe create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/54a2b3993c3483745f6314c870a038a8e58f97a7 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/55d60c2e5040a38be8ca41de63e137e3fef892a4 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/5653c44a5b520bdf2bdc599b7966f1d7c44950b3 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/5838b5a683229ebb6e6277e2810863e642b8afc2 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/588d225784891ac88e30ac6eb5651d63fac34083 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/58d51c21a20b6549567a0ab8fee29d162dd3fc5a create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/58f1036d8ff855841ec25b3c33e85a8fec0d94b7 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/5a99df42fb7bbafa2d55714ee235b1c46776b2ad create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/5b42793550699b2c015bed677cfcddc052f73513 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/5b8ca72ba00231c38b19f582127e6a146eba4282 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/5baa13dc95da05e7ba02bbe9583ea24517a29a1a create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/5bab61eb53176449e25c2c82f172b82cb13ffb9d create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/5c6f6b6f7f3e7b435f060abb73c20d2b773a7f56 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/5c9fd9cc7100feaeead1e0e45201945a6e76fd85 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/5ff49c9edc7361797a951585f3e180222c8dd95d create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/6129954942e26c2a9ec071b6659675745613cf3c create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/61fa69b6b51b0ed91914fe48779173f8d26a1d54 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/6362ac61cfb6e964aff78f3cd648475dfd5fd4e9 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/644deba51c79b6ebd470bd4367452941045d112a create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/64beae98e2276749b133e6368c9e0f19a79eba96 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/64d7add9192301fd878854dc96f9fa9053f03992 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/65566df65e8f55428b6672cc351df414fa8f936c create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/65bb703af35d5afb824cd68c41d7a1aeb3848d35 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/66c537bf59cb3667c037b3517be3d31245c9da8a create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/66f576baeb0c9435a56eb7375dadc5b5d630ed87 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/67b4cec5183659aeae0f5bc71b3adf0542a11828 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/68c94721eda2f62481bff9f1d183df70498d0c5b create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/68ee8169a65d58edb9fc1c752ea81dfec383203c create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/6b203d49bbba6ee74def0d35c2266e06ad3c45d9 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/6d580f28d785c0bf87ac351a31a89289449feadb create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/6f231dec759eb2105e09263d53e171de19a92c74 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/70ff6621a09e4f641538cb1b27e8b382b2f56a94 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/71981b55f27a1eb6274eda247048fa2c597f5004 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/71c2b0bebf7f0e916e4ab7eb36d47ccca2b9101c create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/74610e278a5b90aa12ce1beaf222c4306b02ed43 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/748ee9817eba56ec9938601a0e380c74bad4563f create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/7727e3eeb2a48c46bf5a678c300ff8a38b8ffe3a create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/78176d80c1d74c4b1b820d386ae483ac4d1d92b7 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/789abb571563a6795220046f76b7cf0ade90743c create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/78f5ff40e5554aa9c31b45f79a7ae9699f93e7fd create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/7a28fc2e9c72d51d29e87eed63ed405c9779b5e1 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/7a42083be21dce7f96edef1f3b3b2fea0bcaeb3f create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/7a51275b11ecb1efec9251390531681c8d6f2481 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/7b9682cd7a3984698f6eac034c59c0f91b4fb83d create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/7ba7239a29d6183960e3986abc8f19cfb548b905 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/7d3b3d5f23d0ede9f7e5dbd1115db58c8a54a213 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/7ff3b6239b04479a9caf67f45b2d0c619f712815 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/8035c81c95dedfc27c3649064f98f49e3e72c21f create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/804e1052842ce4d44b9c775ade2b18fcb8ce7bcf create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/80514b85933ea9bdd3462595f949c5af24409b87 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/8057c32b8bd28a5ec2105d62f2abe8cf69c9f5fc create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/806a3bd4e078d91adeacedfd3e47ef8ae229244a create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/8090444f98218e65ff9594789ff22bbea3c0497c create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/80e516692955d5f224706f268e247858858e16d8 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/810a1372fa97380265f5529c5043ae96f007f5bb create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/8127597d3c146b2a89579e44daef9d03a0f941ec create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/82ed571f8922caa572d13b4cc9b5c5fabafaade9 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/8328e86178800f87a3bf6f80749984f45b0cd0e8 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/84441efd7d8bdb0ce2fac28f218d3d5d4d77f1d4 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/84cbf70f45a64d5a01d1c96367b6d6160134f1ad create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/85eb0f4502a51e646dab4ae08eabd90613cdf8e1 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/86080f33e4eae21b37863c253ce61eaa13021a97 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/862e3ccf601ee0f7fbd8b23e6811fd50485a118f create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/86bae059b18af8ae263e5ae0022b67da0cfc0fbe create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/870f9cc4bd89c6c04c6a51ceae1efa8634627cd6 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/8762a523cdb78d2344d553fa52a229bd63c44e51 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/894211571f9153c3c2ea4102541dac69be8aaa9c create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/894e9b7832c52acb04bfa994ef53c7105d8db206 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/8b0e12978b8e2eecf62346e438e47d0993845693 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/8b3fa0bd4f289eff6a04a5205e04baaeafbdf637 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/8d1deedd1e463f8c95129a6f839c380a7c83ab04 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/8d1e029bd72381e382c87e61b4c5a9741d80d644 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/8dd1983889b6632228d4897c365a1e6124d101e1 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/8dfc2183691385432f92957cff0b2538e5a0ebfa create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/8eb9b86b4f0aa79b8ef84b44e1fb03094e7bb426 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/8ec540c36da3814e93da765bf2ff0825b59c1bd0 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/8f1bec32f4b8e64062f5405a096543e61d771076 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/8f3e48c49d0794909f6e8e61e5a4312edf484c33 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/8fbbf3c0eaa25b64d0a97a8ee08006539e649199 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/907d0021d42d0fdc867fd02d3609cdce13c8a055 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/919511c217a3427c22cad4a71aae31a6cd47b193 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/9267c81c3283da8193c198de05e05fa30631a453 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/92e80997a4237d76f10b70dae2870b7255c97435 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/935322db76f5d4c74c2dc68fc4631915b8e24323 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/939f2627ef6263d0176566de267ff3eb910e6a60 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/94adea6a0d9a44bee6f5e88adcee57be9e9e3597 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/94dcbe0d3352bd9b230096b8dce9c6d8d63f9d51 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/95dad738f60e3e5eb0f1cdafd91ad461f4418e8f create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/960c0a21c9e5c1a61b93b34da3189b0de1c264df create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/96903512b1f1dec08206123f024b62d0e31cd4dc create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/96a89c005e8d9992e34cc149b0be096ad0051446 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/97db8a66dd513eea47a5a25115508f4e59984854 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/98f2cb84ad89550cf56ee54e11f1448ae7287247 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/993497422a59b7f9f0f6db8c867339b5c9e4c978 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/999821e3750a7f2c9db663d2d100b4404c225040 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/99b2ed83be40cab431d1940e8de2dc3ebfe9352f create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/99e888b7372b29256dbefd476855ff73584cc00f create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/9b18087deb3cfafa1b964aa65d8ee980bc61404e create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/9b3c745ea3e313909a228a07b49aae110b02ae4a create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/9be1ce0ba77758928ff5e9c45139b1624cbe9c2d create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/9c703141efd69eb8f32a58133c8035fb585e0f4c create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/9c7f77981677499f0426a0ffb5cb79d5fe55dcb2 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/9ca59e6cadaa5be9af30dfe5620d1bcd70f442e5 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/9d139835d91474e8d8361d65698a31b8b38c4f7b create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/9e2179564a99e96e179c96f28802a0a2759b581c create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/9e56bb3b68d2e2617cb2d2f0f3941f7fc832e462 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/9f318b2c2ff9cf4615bd06ba13bdd086b4ad08c6 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/9f8d90b1480989fc46ea2f1c66cf687638994587 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/a09db5715f0bc3879a0e18e4db5a6b5640b254a3 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/a0c59a090818bca29d76ccf9843f7e2faf330ddf create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/a1cf10478e5e01a0d951c743a3dd45aa5fc409f2 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/a22c0f03f8c005a4612a9dcbcd6a643334c35d2f create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/a3154b8ed26b3461f2b091c732da00b63ce8bed3 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/a84a1ed1a24e753a27adfd3ba806f06fc44f899f create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/a871e7ce66afd4f57702cd1299de06cd08995561 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/a8dc736ea964586b7dcbf2bc065ec4675d1daba3 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/a91a835836c72217824f0b63491d9b623130502a create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/ab97c1f6033dc7d96f69b9e1461fd594c16f4ebf create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/ac8a8c23acd8c290a11dc7828f7f397957fa6400 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/ac94b2788f5252f9e2e8502c7c75e04bef4c0b76 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/ad03b4f58470c43db6593a35be48989486d754f9 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/af417c83e831a96fda1bdde99a1af6509ef2df3d create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/affd292cd2ce3306b4651cc7ec0ec0524cbbae3d create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/b0587e6e319f4b56d877e7ed46bc7da9b1e7249c create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/b166aa66b5b3ad178bc38aee5768226c8adc082f create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/b1ade0571262c6e5f1d72f6d25ebb513d2055bc9 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/b244c690157ff21d073940ef8c77d1898f37cf8e create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/b523091ee4f17d20f51f9b5cf82293465cf61780 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/b7d4d49ac2c530eb8444a449feb689ee50fd210d create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/b855c161121bfa29c6fb22d3c0236fae4af6984e create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/bc4263a92952d56168b354f723eaa43a33cd0b35 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/bcaa71abf23b2e5130e0cc464755fe769bf4aaa7 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/bcf4684ce097faa7e9d99b6e93cc2de24f57aee3 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/bdca6504d2ee7925f62e176355bb481344772075 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/beb208fd8675ba7de2ecb12998d2d628d579ca7c create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/bf0c98689ab81fc32787023300caf9a4175583dc create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/bf479e97b39b697e715663de6a1e78dd58d64122 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/bf826c96be94d1b42eea0666f7239cc5f699a375 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/c17650d19ae4a48abb36739c83d8979453f5705f create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/c1e5307d88feda2c3b15fc221cba92bcf41622bf create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/c249f408c552a0408eab3fe1d1cbeca95cd537c1 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/c26b460aebc9082c519539069f7e060042989696 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/c2eae71daad0d3561ab4d09b8b85372b8d790bc1 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/c37fda8d02e99132a1de99f959596c784ab8a53c create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/c4836760377a7091fb20f4afa9c712875792b9a7 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/c48caad597176404f776d532d4baf9faf7655ee2 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/c4eff0f59986fc5ab09d5bd95f394292f2882659 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/c5fc2086d167c8c3a7d9ec778db69c5fa14a59fe create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/c600877ce547166eb1b9d83afbe128d98767f8a3 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/c6a98fdaf6de78e59e1a149a43f3e42222d650b7 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/c8d22f7fb4f37f2d8cc7953fa2d599d38d899aec create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/c90951c19b24bac84296e3ec32cdeafe99e99cfb create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/c95ff2a172626efb50e94aa6781feba609820076 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/ca6c557afb9c571de62e9b65ca6469a6133760da create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/cb2d0fb23f66c968af2e80d59f71d4c1aed96fbd create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/cc60a642cc2037ad3c459a57381b8f65d8d7aa35 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/ccd3b8aa26c52f6d9c607c26ebdf621142aff745 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/ccdfd1354997eb117bd76b75440a7e4ff20bf564 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/cd7a7b8f08c189e95ae3e2ea44b9015000e823f3 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/ce05678d812a5f8ae8e115938410116ce9169456 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/ce6b642b81373f05baa2a6fe6e9d5d1387046285 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/cf84d06e4dddb997a79a41f9b6122bf620bbdb4b create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/cfbcc3e8cd65aa8b654688145ade34b8789468a6 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/clusterfuzz-testcase-5298216461402112 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/clusterfuzz-testcase-minimized-4857057310146560 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/crash-5ac3e1ea7764cfb6383629574262f82dc7b3cada create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/d000502f32ca5620d7745f39ff6be3b547e26a6d create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/d131f83ee73450ff45565d0c638be7d8beeb30d9 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/d1c7ae01a81a122c2fd7c5d8debcae7566e9ee2f create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/d2817b89d7aaa7fa880c077b1a67168ec2f4f0f7 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/d3ccd7039dd34baef465c4b78baa7a30312a8f07 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/d4cfaf3b59b22b654d7af80ee6715ce5015bfdc0 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/d5670827c8e8d4c95ac0f738c0790c19916c0336 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/d59d7e94863f1ed89cacfbaabf7bc59946036c8f create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/d6d8b478e6d13945f7a6f7d27f424ff57ca12f7f create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/d76d0c7f24ae3cc3f530d5306b8dcc15290c7ff2 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/d8b15e9e555ad9900ba4be8cc9f87bef75725b24 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/d9748abd540810c2449c3dd39a0ebb62754e520f create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/da9fc821f0c1e00728b139b36269bc3d21c0a8cc create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/dcd1bd94ad97b4e67fd7e12ff1bf7c039eb17f66 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/dd3ba9b139e13324fc76cd62af84b00ca8b87205 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/de0a9dce0ea4e4bfdcb13f788ae728bf979fed25 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/deb6f9a930d9b31586ede19fd8fd3caae0e5b1f2 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/dee95e0280b70681eddfb68e3b418126c5661e18 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/df01203edfa2dfe9e108ddde786ae48235624fef create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/df0adbe2523508e9afb42a58d98c2657710d6033 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/e05fcba1b22f658c8bd6f3c330b2b3c9faebf977 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/e145caa75d73e3d819a9cb4b6217f1f53112f3f8 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/e1d86c0094657386197d191855b5645ac1dd5936 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/e25adf8de44f5978d00b7e8c52aee89c5cd1fe93 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/e29f05162e3d96d5549f96aa4a54c868535b2847 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/e3a970ac8636d29da3ded328b876ed3550cb3209 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/e3cfdc862187b4ec28bd4fb2ced5094bb5b09909 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/e4ce52007d001806fc9368b62c124dfc56e8471c create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/e52173f0bc3325629046e85e2dc41acc6ba7d1c3 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/e6589006e3bda4c57247ad66fcd73ac00ee2cbe2 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/e67c79d0ed89ab2d5e8d81127df22876e636ac44 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/e6fab7572fb2a1c6e107b6f83cffd103a233d021 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/e790f5d312957dbfd20abdefe4b1735779ff9689 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/e8809017a4cf6c1e80a93f661166ead961f26bb4 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/e9733e973c33b38c2087b7f1deb36688b3b14259 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/ea8134769855d574f6673bf0301eb2e24632c6eb create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/eb489536e4e5589a93a17cd36669475b8f2a5e1b create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/eb48ebd4d01e5623dd16ae61938b3333fab3ce78 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/eb6ca7624384239c7f7e0d83edb7cc334b7926d7 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/ec9457ad41ed745ea9377ffdb16ad09f981daa7f create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/edff5256a2d60d0e51caef25dc1d6f1643dad6d5 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/ee4d9c5d22512da42726f47213ff56404d1d81d1 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/eef2f30b5e2ecd98ebefb12d57aba8b4ad52d904 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/ef23911de1a27d03d2d4983ca1527e17d6a7092b create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/ef5b7fc62a2daecf1e8f928b1fa3ebd028413a41 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/ef718258ca1870198e91a2fbc1eaa90b620673fb create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/efb46deb37a78f41dd760f6b7203b20956eb114e create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/efdd6824bd2456e3e408e0e84369c4fa3aa14f41 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/efec040a5de1969df5e37e4bc50a0a8f0de341d8 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/f1e30464c24dc1d7cec7ec1dd2adec8512232b43 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/f27a617b936814476770a3b31a5afb80d0f3b423 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/f3f0d99ac2962f8fddb25c65fb4c8c6eb63518a9 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/f4628084cf46f139babb886a782b4ab5977d5d2e create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/f4753e8881e4b3c71f2728149be7d04cc648f6a6 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/f4b48c4f3f310ed767755267210f212dd62bd715 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/f4d6ff635ae4fda497221da4bfa3e593df59a44e create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/f52f4d51aaaed0f9c3a20936cf5efd25d0692f67 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/f7cf30724ab740918eee6e4a6b6658ae3d7706e8 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/f823828ffd2a60efee36f1de52cb0f024ac5b4bb create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/f8760761bd5ab7b47376bfbc5a44e16b2d5ca800 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/fb15042c268625089ef6c8aa3d8a6f12d1d02c74 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/fc3dd4292d6884a770199596f5e9cbc1e869e5fb create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/fcc06696e641a7743bfd2f3b7ecd88e7b727e00a create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/fd34ec90fe8f9218fd25c3eac151aec998cff6d8 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/fdf548cde981fab4fb17bd63a124b75eddc5c836 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/fe47fb18b064e26479c3c3140082bd01065e897a create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/ff2097734bd7bb8451aece13c9336c4624735170 create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/ff2c949863eb4e14d9e835c51591304403d91b6c create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/ff7d6ff060e63355701b2e655c802902338497de create mode 100644 test/core/transport/chttp2/hpack_parser_fuzzer_test.cc create mode 100644 test/core/transport/chttp2/hpack_parser_test.cc create mode 100644 test/core/transport/chttp2/hpack_table_test.cc create mode 100644 test/core/transport/chttp2/settings_timeout_test.cc create mode 100644 test/core/transport/chttp2/stream_map_test.cc create mode 100644 test/core/transport/chttp2/varint_test.cc create mode 100644 test/core/transport/connectivity_state_test.cc create mode 100644 test/core/transport/metadata_test.cc create mode 100644 test/core/transport/pid_controller_test.cc create mode 100644 test/core/transport/static_metadata_test.cc create mode 100644 test/core/transport/status_conversion_test.cc create mode 100644 test/core/transport/status_metadata_test.cc create mode 100644 test/core/transport/stream_owned_slice_test.cc create mode 100644 test/core/transport/timeout_encoding_test.cc create mode 100644 test/core/tsi/BUILD create mode 100644 test/core/tsi/alts/crypt/BUILD create mode 100644 test/core/tsi/alts/crypt/aes_gcm_test.cc create mode 100644 test/core/tsi/alts/crypt/gsec_test_util.cc create mode 100644 test/core/tsi/alts/crypt/gsec_test_util.h create mode 100644 test/core/tsi/alts/fake_handshaker/BUILD create mode 100644 test/core/tsi/alts/fake_handshaker/fake_handshaker_server.cc create mode 100644 test/core/tsi/alts/fake_handshaker/fake_handshaker_server.h create mode 100644 test/core/tsi/alts/fake_handshaker/fake_handshaker_server_main.cc create mode 100644 test/core/tsi/alts/fake_handshaker/handshaker.proto create mode 100644 test/core/tsi/alts/fake_handshaker/transport_security_common.proto create mode 100644 test/core/tsi/alts/frame_protector/BUILD create mode 100644 test/core/tsi/alts/frame_protector/alts_counter_test.cc create mode 100644 test/core/tsi/alts/frame_protector/alts_crypter_test.cc create mode 100644 test/core/tsi/alts/frame_protector/alts_frame_protector_test.cc create mode 100644 test/core/tsi/alts/frame_protector/frame_handler_test.cc create mode 100644 test/core/tsi/alts/handshaker/BUILD create mode 100644 test/core/tsi/alts/handshaker/alts_concurrent_connectivity_test.cc create mode 100644 test/core/tsi/alts/handshaker/alts_handshaker_client_test.cc create mode 100644 test/core/tsi/alts/handshaker/alts_handshaker_service_api_test_lib.cc create mode 100644 test/core/tsi/alts/handshaker/alts_handshaker_service_api_test_lib.h create mode 100644 test/core/tsi/alts/handshaker/alts_tsi_handshaker_test.cc create mode 100644 test/core/tsi/alts/handshaker/alts_tsi_utils_test.cc create mode 100644 test/core/tsi/alts/handshaker/transport_security_common_api_test.cc create mode 100644 test/core/tsi/alts/zero_copy_frame_protector/BUILD create mode 100644 test/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_test.cc create mode 100644 test/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol_test.cc create mode 100644 test/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector_test.cc create mode 100644 test/core/tsi/fake_transport_security_test.cc create mode 100644 test/core/tsi/ssl_session_cache_test.cc create mode 100644 test/core/tsi/ssl_transport_security_test.cc create mode 100644 test/core/tsi/transport_security_test.cc create mode 100644 test/core/tsi/transport_security_test_lib.cc create mode 100644 test/core/tsi/transport_security_test_lib.h create mode 100644 test/core/util/BUILD create mode 100644 test/core/util/cmdline.cc create mode 100644 test/core/util/cmdline.h create mode 100644 test/core/util/cmdline_test.cc create mode 100644 test/core/util/debugger_macros.cc create mode 100644 test/core/util/debugger_macros.h create mode 100644 test/core/util/fuzzer_corpus_test.cc create mode 100755 test/core/util/fuzzer_one_entry_runner.sh create mode 100644 test/core/util/fuzzer_util.cc create mode 100644 test/core/util/fuzzer_util.h create mode 100644 test/core/util/grpc_fuzzer.bzl create mode 100644 test/core/util/grpc_profiler.cc create mode 100644 test/core/util/grpc_profiler.h create mode 100644 test/core/util/histogram.cc create mode 100644 test/core/util/histogram.h create mode 100644 test/core/util/histogram_test.cc create mode 100644 test/core/util/lsan_suppressions.txt create mode 100644 test/core/util/memory_counters.cc create mode 100644 test/core/util/memory_counters.h create mode 100644 test/core/util/mock_endpoint.cc create mode 100644 test/core/util/mock_endpoint.h create mode 100644 test/core/util/one_corpus_entry_fuzzer.cc create mode 100644 test/core/util/parse_hexstring.cc create mode 100644 test/core/util/parse_hexstring.h create mode 100644 test/core/util/passthru_endpoint.cc create mode 100644 test/core/util/passthru_endpoint.h create mode 100644 test/core/util/port.cc create mode 100644 test/core/util/port.h create mode 100644 test/core/util/port_isolated_runtime_environment.cc create mode 100644 test/core/util/port_server_client.cc create mode 100644 test/core/util/port_server_client.h create mode 100644 test/core/util/reconnect_server.cc create mode 100644 test/core/util/reconnect_server.h create mode 100755 test/core/util/run_with_poller.sh create mode 100644 test/core/util/slice_splitter.cc create mode 100644 test/core/util/slice_splitter.h create mode 100644 test/core/util/subprocess.h create mode 100644 test/core/util/subprocess_posix.cc create mode 100644 test/core/util/subprocess_windows.cc create mode 100644 test/core/util/test_config.cc create mode 100644 test/core/util/test_config.h create mode 100644 test/core/util/test_lb_policies.cc create mode 100644 test/core/util/test_lb_policies.h create mode 100644 test/core/util/test_tcp_server.cc create mode 100644 test/core/util/test_tcp_server.h create mode 100644 test/core/util/tracer_util.cc create mode 100644 test/core/util/tracer_util.h create mode 100644 test/core/util/trickle_endpoint.cc create mode 100644 test/core/util/trickle_endpoint.h create mode 100644 test/core/util/tsan_suppressions.txt create mode 100644 test/core/util/ubsan_suppressions.txt create mode 100644 test/cpp/README-iOS.md create mode 100644 test/cpp/client/BUILD create mode 100644 test/cpp/client/client_channel_stress_test.cc create mode 100644 test/cpp/client/credentials_test.cc create mode 100644 test/cpp/client/destroy_grpclb_channel_with_active_connect_stress_test.cc create mode 100644 test/cpp/cocoapods/GRPCCppTests.xcodeproj/project.pbxproj create mode 100644 test/cpp/cocoapods/Podfile create mode 100644 test/cpp/cocoapods/generic/Info.plist create mode 100644 test/cpp/cocoapods/generic/generic.mm create mode 100644 test/cpp/cocoapods/test/Info.plist create mode 100644 test/cpp/cocoapods/test/server_context_test_spouse_test.mm create mode 100644 test/cpp/codegen/BUILD create mode 100644 test/cpp/codegen/codegen_test_full.cc create mode 100644 test/cpp/codegen/codegen_test_minimal.cc create mode 100644 test/cpp/codegen/compiler_test_golden create mode 100644 test/cpp/codegen/compiler_test_mock_golden create mode 100644 test/cpp/codegen/golden_file_test.cc create mode 100644 test/cpp/codegen/proto_utils_test.cc create mode 100755 test/cpp/codegen/run_golden_file_test.sh create mode 100644 test/cpp/common/BUILD create mode 100644 test/cpp/common/alarm_test.cc create mode 100644 test/cpp/common/alts_util_test.cc create mode 100644 test/cpp/common/auth_property_iterator_test.cc create mode 100644 test/cpp/common/channel_arguments_test.cc create mode 100644 test/cpp/common/channel_filter_test.cc create mode 100644 test/cpp/common/secure_auth_context_test.cc create mode 100644 test/cpp/common/time_jump_test.cc create mode 100644 test/cpp/common/timer_test.cc create mode 100644 test/cpp/end2end/BUILD create mode 100644 test/cpp/end2end/async_end2end_test.cc create mode 100644 test/cpp/end2end/cfstream_test.cc create mode 100644 test/cpp/end2end/channelz_service_test.cc create mode 100644 test/cpp/end2end/client_callback_end2end_test.cc create mode 100644 test/cpp/end2end/client_crash_test.cc create mode 100644 test/cpp/end2end/client_crash_test_server.cc create mode 100644 test/cpp/end2end/client_interceptors_end2end_test.cc create mode 100644 test/cpp/end2end/client_lb_end2end_test.cc create mode 100644 test/cpp/end2end/delegating_channel_test.cc create mode 100644 test/cpp/end2end/end2end_test.cc create mode 100644 test/cpp/end2end/exception_test.cc create mode 100644 test/cpp/end2end/filter_end2end_test.cc create mode 100644 test/cpp/end2end/flaky_network_test.cc create mode 100644 test/cpp/end2end/generic_end2end_test.cc create mode 100644 test/cpp/end2end/grpclb_end2end_test.cc create mode 100644 test/cpp/end2end/health_service_end2end_test.cc create mode 100644 test/cpp/end2end/hybrid_end2end_test.cc create mode 100644 test/cpp/end2end/interceptors_util.cc create mode 100644 test/cpp/end2end/interceptors_util.h create mode 100644 test/cpp/end2end/message_allocator_end2end_test.cc create mode 100644 test/cpp/end2end/mock_test.cc create mode 100644 test/cpp/end2end/nonblocking_test.cc create mode 100644 test/cpp/end2end/port_sharing_end2end_test.cc create mode 100644 test/cpp/end2end/proto_server_reflection_test.cc create mode 100644 test/cpp/end2end/raw_end2end_test.cc create mode 100644 test/cpp/end2end/server_builder_plugin_test.cc create mode 100644 test/cpp/end2end/server_crash_test.cc create mode 100644 test/cpp/end2end/server_crash_test_client.cc create mode 100644 test/cpp/end2end/server_early_return_test.cc create mode 100644 test/cpp/end2end/server_interceptors_end2end_test.cc create mode 100644 test/cpp/end2end/server_load_reporting_end2end_test.cc create mode 100644 test/cpp/end2end/service_config_end2end_test.cc create mode 100644 test/cpp/end2end/shutdown_test.cc create mode 100644 test/cpp/end2end/streaming_throughput_test.cc create mode 100644 test/cpp/end2end/test_health_check_service_impl.cc create mode 100644 test/cpp/end2end/test_health_check_service_impl.h create mode 100644 test/cpp/end2end/test_service_impl.cc create mode 100644 test/cpp/end2end/test_service_impl.h create mode 100644 test/cpp/end2end/thread_stress_test.cc create mode 100644 test/cpp/end2end/time_change_test.cc create mode 100644 test/cpp/end2end/xds_end2end_test.cc create mode 100644 test/cpp/ext/filters/census/BUILD create mode 100644 test/cpp/ext/filters/census/stats_plugin_end2end_test.cc create mode 100644 test/cpp/grpclb/BUILD create mode 100644 test/cpp/grpclb/grpclb_api_test.cc create mode 100644 test/cpp/interop/BUILD create mode 100644 test/cpp/interop/client.cc create mode 100644 test/cpp/interop/client_helper.cc create mode 100644 test/cpp/interop/client_helper.h create mode 100644 test/cpp/interop/grpclb_fallback_test.cc create mode 100644 test/cpp/interop/http2_client.cc create mode 100644 test/cpp/interop/http2_client.h create mode 100644 test/cpp/interop/interop_client.cc create mode 100644 test/cpp/interop/interop_client.h create mode 100644 test/cpp/interop/interop_server.cc create mode 100644 test/cpp/interop/interop_server_bootstrap.cc create mode 100644 test/cpp/interop/interop_test.cc create mode 100644 test/cpp/interop/metrics_client.cc create mode 100644 test/cpp/interop/reconnect_interop_client.cc create mode 100644 test/cpp/interop/reconnect_interop_server.cc create mode 100644 test/cpp/interop/server_helper.cc create mode 100644 test/cpp/interop/server_helper.h create mode 100644 test/cpp/interop/stress_interop_client.cc create mode 100644 test/cpp/interop/stress_interop_client.h create mode 100644 test/cpp/interop/stress_test.cc create mode 100644 test/cpp/interop/xds_interop_client.cc create mode 100644 test/cpp/interop/xds_interop_server.cc create mode 100644 test/cpp/ios/CronetTests/CppCronetEnd2EndTests.mm create mode 100644 test/cpp/ios/CronetTests/TestHelper.h create mode 100644 test/cpp/ios/CronetTests/TestHelper.mm create mode 100644 test/cpp/ios/Info.plist create mode 100644 test/cpp/ios/Podfile create mode 100644 test/cpp/ios/RemoteTestClientCpp/RemoteTestCpp.podspec create mode 100644 test/cpp/ios/Tests.xcodeproj/project.pbxproj create mode 100644 test/cpp/ios/Tests.xcodeproj/xcshareddata/xcschemes/CronetTests.xcscheme create mode 100755 test/cpp/ios/build_and_run_tests.sh create mode 100755 test/cpp/ios/build_tests.sh create mode 100755 test/cpp/ios/verbose_time.sh create mode 100644 test/cpp/microbenchmarks/BUILD create mode 100644 test/cpp/microbenchmarks/bm_alarm.cc create mode 100644 test/cpp/microbenchmarks/bm_arena.cc create mode 100644 test/cpp/microbenchmarks/bm_byte_buffer.cc create mode 100644 test/cpp/microbenchmarks/bm_call_create.cc create mode 100644 test/cpp/microbenchmarks/bm_callback_streaming_ping_pong.cc create mode 100644 test/cpp/microbenchmarks/bm_callback_unary_ping_pong.cc create mode 100644 test/cpp/microbenchmarks/bm_channel.cc create mode 100644 test/cpp/microbenchmarks/bm_chttp2_hpack.cc create mode 100644 test/cpp/microbenchmarks/bm_chttp2_transport.cc create mode 100644 test/cpp/microbenchmarks/bm_closure.cc create mode 100644 test/cpp/microbenchmarks/bm_cq.cc create mode 100644 test/cpp/microbenchmarks/bm_cq_multiple_threads.cc create mode 100644 test/cpp/microbenchmarks/bm_error.cc create mode 100644 test/cpp/microbenchmarks/bm_fullstack_streaming_ping_pong.cc create mode 100644 test/cpp/microbenchmarks/bm_fullstack_streaming_pump.cc create mode 100644 test/cpp/microbenchmarks/bm_fullstack_trickle.cc create mode 100644 test/cpp/microbenchmarks/bm_fullstack_unary_ping_pong.cc create mode 100644 test/cpp/microbenchmarks/bm_metadata.cc create mode 100644 test/cpp/microbenchmarks/bm_opencensus_plugin.cc create mode 100644 test/cpp/microbenchmarks/bm_pollset.cc create mode 100644 test/cpp/microbenchmarks/bm_threadpool.cc create mode 100644 test/cpp/microbenchmarks/bm_timer.cc create mode 100644 test/cpp/microbenchmarks/callback_streaming_ping_pong.h create mode 100644 test/cpp/microbenchmarks/callback_test_service.cc create mode 100644 test/cpp/microbenchmarks/callback_test_service.h create mode 100644 test/cpp/microbenchmarks/callback_unary_ping_pong.h create mode 100644 test/cpp/microbenchmarks/fullstack_context_mutators.h create mode 100644 test/cpp/microbenchmarks/fullstack_fixtures.h create mode 100644 test/cpp/microbenchmarks/fullstack_streaming_ping_pong.h create mode 100644 test/cpp/microbenchmarks/fullstack_streaming_pump.h create mode 100644 test/cpp/microbenchmarks/fullstack_unary_ping_pong.h create mode 100644 test/cpp/microbenchmarks/helpers.cc create mode 100644 test/cpp/microbenchmarks/helpers.h create mode 100644 test/cpp/microbenchmarks/noop-benchmark.cc create mode 100644 test/cpp/microbenchmarks/representative_server_initial_metadata.headers create mode 100644 test/cpp/microbenchmarks/representative_server_trailing_metadata.headers create mode 100644 test/cpp/naming/BUILD create mode 100644 test/cpp/naming/address_sorting_test.cc create mode 100644 test/cpp/naming/cancel_ares_query_test.cc create mode 100644 test/cpp/naming/dns_test_util.cc create mode 100644 test/cpp/naming/dns_test_util.h create mode 100755 test/cpp/naming/gen_build_yaml.py create mode 100755 test/cpp/naming/generate_resolver_component_tests.bzl create mode 100644 test/cpp/naming/manual_run_resolver_component_test.py create mode 100644 test/cpp/naming/resolver_component_test.cc create mode 100755 test/cpp/naming/resolver_component_tests_runner.py create mode 100644 test/cpp/naming/resolver_component_tests_runner_invoker.cc create mode 100644 test/cpp/naming/resolver_test_record_groups.yaml create mode 100644 test/cpp/naming/utils/BUILD create mode 100755 test/cpp/naming/utils/dns_resolver.py create mode 100755 test/cpp/naming/utils/dns_server.py create mode 100755 test/cpp/naming/utils/run_dns_server_for_lb_interop_tests.py create mode 100755 test/cpp/naming/utils/tcp_connect.py create mode 100644 test/cpp/performance/BUILD create mode 100644 test/cpp/performance/writes_per_rpc_test.cc create mode 100644 test/cpp/qps/BUILD create mode 100644 test/cpp/qps/benchmark_config.cc create mode 100644 test/cpp/qps/benchmark_config.h create mode 100644 test/cpp/qps/client.h create mode 100644 test/cpp/qps/client_async.cc create mode 100644 test/cpp/qps/client_callback.cc create mode 100644 test/cpp/qps/client_sync.cc create mode 100644 test/cpp/qps/driver.cc create mode 100644 test/cpp/qps/driver.h create mode 100755 test/cpp/qps/gen_build_yaml.py create mode 100644 test/cpp/qps/histogram.h create mode 100644 test/cpp/qps/inproc_sync_unary_ping_pong_test.cc create mode 100644 test/cpp/qps/interarrival.h create mode 100644 test/cpp/qps/json_run_localhost.cc create mode 100755 test/cpp/qps/json_run_localhost_scenario_gen.py create mode 100644 test/cpp/qps/json_run_localhost_scenarios.bzl create mode 100644 test/cpp/qps/parse_json.cc create mode 100644 test/cpp/qps/parse_json.h create mode 100644 test/cpp/qps/qps_benchmark_script.bzl create mode 100644 test/cpp/qps/qps_interarrival_test.cc create mode 100644 test/cpp/qps/qps_json_driver.cc create mode 100755 test/cpp/qps/qps_json_driver_scenario_gen.py create mode 100644 test/cpp/qps/qps_json_driver_scenarios.bzl create mode 100644 test/cpp/qps/qps_openloop_test.cc create mode 100644 test/cpp/qps/qps_server_builder.cc create mode 100644 test/cpp/qps/qps_server_builder.h create mode 100644 test/cpp/qps/qps_worker.cc create mode 100644 test/cpp/qps/qps_worker.h create mode 100644 test/cpp/qps/report.cc create mode 100644 test/cpp/qps/report.h create mode 100644 test/cpp/qps/secure_sync_unary_ping_pong_test.cc create mode 100644 test/cpp/qps/server.h create mode 100644 test/cpp/qps/server_async.cc create mode 100644 test/cpp/qps/server_callback.cc create mode 100644 test/cpp/qps/server_sync.cc create mode 100644 test/cpp/qps/stats.h create mode 100644 test/cpp/qps/usage_timer.cc create mode 100644 test/cpp/qps/usage_timer.h create mode 100644 test/cpp/qps/worker.cc create mode 100644 test/cpp/server/BUILD create mode 100644 test/cpp/server/load_reporter/BUILD create mode 100644 test/cpp/server/load_reporter/get_cpu_stats_test.cc create mode 100644 test/cpp/server/load_reporter/load_data_store_test.cc create mode 100644 test/cpp/server/load_reporter/load_reporter_test.cc create mode 100644 test/cpp/server/server_builder_test.cc create mode 100644 test/cpp/server/server_builder_with_socket_mutator_test.cc create mode 100644 test/cpp/server/server_request_call_test.cc create mode 100644 test/cpp/test/BUILD create mode 100644 test/cpp/test/server_context_test_spouse_test.cc create mode 100644 test/cpp/thread_manager/BUILD create mode 100644 test/cpp/thread_manager/thread_manager_test.cc create mode 100644 test/cpp/util/BUILD create mode 100644 test/cpp/util/byte_buffer_proto_helper.cc create mode 100644 test/cpp/util/byte_buffer_proto_helper.h create mode 100644 test/cpp/util/byte_buffer_test.cc create mode 100644 test/cpp/util/channel_trace_proto_helper.cc create mode 100644 test/cpp/util/channel_trace_proto_helper.h create mode 100644 test/cpp/util/cli_call.cc create mode 100644 test/cpp/util/cli_call.h create mode 100644 test/cpp/util/cli_call_test.cc create mode 100644 test/cpp/util/cli_credentials.cc create mode 100644 test/cpp/util/cli_credentials.h create mode 100644 test/cpp/util/config_grpc_cli.h create mode 100644 test/cpp/util/create_test_channel.cc create mode 100644 test/cpp/util/create_test_channel.h create mode 100644 test/cpp/util/error_details_test.cc create mode 100644 test/cpp/util/grpc_cli.cc create mode 100644 test/cpp/util/grpc_tool.cc create mode 100644 test/cpp/util/grpc_tool.h create mode 100644 test/cpp/util/grpc_tool_test.cc create mode 100644 test/cpp/util/metrics_server.cc create mode 100644 test/cpp/util/metrics_server.h create mode 100644 test/cpp/util/proto_file_parser.cc create mode 100644 test/cpp/util/proto_file_parser.h create mode 100644 test/cpp/util/proto_reflection_descriptor_database.cc create mode 100644 test/cpp/util/proto_reflection_descriptor_database.h create mode 100644 test/cpp/util/service_describer.cc create mode 100644 test/cpp/util/service_describer.h create mode 100644 test/cpp/util/slice_test.cc create mode 100644 test/cpp/util/string_ref_helper.cc create mode 100644 test/cpp/util/string_ref_helper.h create mode 100644 test/cpp/util/string_ref_test.cc create mode 100644 test/cpp/util/subprocess.cc create mode 100644 test/cpp/util/subprocess.h create mode 100644 test/cpp/util/test_config.h create mode 100644 test/cpp/util/test_config_cc.cc create mode 100644 test/cpp/util/test_credentials_provider.cc create mode 100644 test/cpp/util/test_credentials_provider.h create mode 100644 test/cpp/util/time_test.cc create mode 100644 test/distrib/cpp/run_distrib_test_cmake.bat create mode 100755 test/distrib/cpp/run_distrib_test_cmake.sh create mode 100644 test/distrib/cpp/run_distrib_test_cmake_as_externalproject.bat create mode 100755 test/distrib/cpp/run_distrib_test_cmake_as_externalproject.sh create mode 100755 test/distrib/cpp/run_distrib_test_cmake_as_submodule.sh create mode 100755 test/distrib/cpp/run_distrib_test_cmake_fetchcontent.sh create mode 100755 test/distrib/cpp/run_distrib_test_cmake_module_install.sh create mode 100755 test/distrib/cpp/run_distrib_test_cmake_module_install_pkgconfig.sh create mode 100755 test/distrib/cpp/run_distrib_test_cmake_pkgconfig.sh create mode 100755 test/distrib/cpp/run_distrib_test_raspberry_pi.sh create mode 100755 test/distrib/cpp/run_distrib_test_routeguide.sh create mode 100644 test/distrib/csharp/.gitignore create mode 100644 test/distrib/csharp/DistribTest.sln create mode 100644 test/distrib/csharp/DistribTest/.gitignore create mode 100644 test/distrib/csharp/DistribTest/DistribTest.csproj create mode 100644 test/distrib/csharp/DistribTest/DistribTestDotNet.csproj create mode 100644 test/distrib/csharp/DistribTest/Program.cs create mode 100644 test/distrib/csharp/DistribTest/Properties/AssemblyInfo.cs create mode 100644 test/distrib/csharp/DistribTest/packages.config create mode 100644 test/distrib/csharp/DistribTest/testcodegen.proto create mode 100644 test/distrib/csharp/NuGet.Config create mode 100644 test/distrib/csharp/build_vs2015.bat create mode 100644 test/distrib/csharp/run_distrib_test.bat create mode 100755 test/distrib/csharp/run_distrib_test.sh create mode 100755 test/distrib/csharp/run_distrib_test_dotnetcli.sh create mode 100755 test/distrib/csharp/update_version.sh create mode 100644 test/distrib/php/distribtest.php create mode 100755 test/distrib/php/run_distrib_test.sh create mode 100755 test/distrib/php/run_distrib_test_macos.sh create mode 100644 test/distrib/python/distribtest.py create mode 100755 test/distrib/python/run_binary_distrib_test.sh create mode 100755 test/distrib/python/run_source_distrib_test.sh create mode 100755 test/distrib/python/test_packages.sh create mode 100644 test/distrib/ruby/Gemfile create mode 100644 test/distrib/ruby/distribtest.gemspec create mode 100755 test/distrib/ruby/distribtest.rb create mode 100755 test/distrib/ruby/run_distrib_test.sh create mode 100644 test/http2_test/http2_base_server.py create mode 100644 test/http2_test/http2_server_health_check.py create mode 100644 test/http2_test/http2_test_server.py create mode 100644 test/http2_test/messages_pb2.py create mode 100644 test/http2_test/test_data_frame_padding.py create mode 100644 test/http2_test/test_goaway.py create mode 100644 test/http2_test/test_max_streams.py create mode 100644 test/http2_test/test_ping.py create mode 100644 test/http2_test/test_rst_after_data.py create mode 100644 test/http2_test/test_rst_after_header.py create mode 100644 test/http2_test/test_rst_during_data.py create mode 100644 third_party/BUILD create mode 100644 third_party/README.md create mode 100644 third_party/address_sorting/BUILD create mode 100644 third_party/address_sorting/LICENSE create mode 100644 third_party/address_sorting/address_sorting.bzl create mode 100644 third_party/address_sorting/address_sorting.c create mode 100644 third_party/address_sorting/address_sorting_internal.h create mode 100644 third_party/address_sorting/address_sorting_posix.c create mode 100644 third_party/address_sorting/address_sorting_windows.c create mode 100644 third_party/address_sorting/include/address_sorting/address_sorting.h create mode 100644 third_party/cares/BUILD create mode 100644 third_party/cares/ares_build.h create mode 100644 third_party/cares/cares.BUILD create mode 100644 third_party/cares/config_android/ares_config.h create mode 100644 third_party/cares/config_darwin/ares_config.h create mode 100644 third_party/cares/config_freebsd/ares_config.h create mode 100644 third_party/cares/config_linux/ares_config.h create mode 100644 third_party/cares/config_openbsd/ares_config.h create mode 100644 third_party/cares/config_windows/ares_config.h create mode 100644 third_party/constantly.BUILD create mode 100644 third_party/cython.BUILD create mode 100644 third_party/enum34.BUILD create mode 100644 third_party/futures.BUILD create mode 100644 third_party/incremental.BUILD create mode 100644 third_party/libuv.BUILD create mode 100644 third_party/objective_c/Cronet/BUILD create mode 100644 third_party/objective_c/Cronet/bidirectional_stream_c.h create mode 100644 third_party/objective_c/google_toolbox_for_mac/BUILD create mode 100644 third_party/objective_c/google_toolbox_for_mac/UnitTesting/GTMGoogleTestRunner.mm create mode 100644 third_party/py/BUILD create mode 100644 third_party/py/BUILD.tpl create mode 100644 third_party/py/python_configure.bzl create mode 100644 third_party/py/variety.tpl create mode 100644 third_party/six.BUILD create mode 100644 third_party/toolchains/BUILD create mode 100644 third_party/toolchains/README.md create mode 100644 third_party/toolchains/bazel_0.26.0_rbe_windows/BUILD create mode 100644 third_party/toolchains/bazel_0.26.0_rbe_windows/cc_toolchain_config.bzl create mode 100644 third_party/toolchains/rbe_win2019/Dockerfile create mode 100644 third_party/twisted.BUILD create mode 100644 third_party/upb/.bazelci/presubmit.yml create mode 100644 third_party/upb/.gitignore create mode 100644 third_party/upb/.gitmodules create mode 100644 third_party/upb/CMakeLists.txt create mode 100644 third_party/upb/CONTRIBUTING.md create mode 100644 third_party/upb/DESIGN.md create mode 100644 third_party/upb/LICENSE create mode 100644 third_party/upb/README.md create mode 100644 third_party/upb/WORKSPACE create mode 100644 third_party/upb/bazel/BUILD create mode 100644 third_party/upb/bazel/build_defs.bzl create mode 100644 third_party/upb/bazel/lua.BUILD create mode 100644 third_party/upb/bazel/ragel.BUILD create mode 100644 third_party/upb/bazel/repository_defs.bzl create mode 100644 third_party/upb/bazel/upb_proto_library.bzl create mode 100644 third_party/upb/bazel/workspace_deps.bzl create mode 100644 third_party/upb/examples/bazel/BUILD create mode 100644 third_party/upb/examples/bazel/WORKSPACE create mode 100644 third_party/upb/examples/bazel/foo.proto create mode 100644 third_party/upb/examples/bazel/test_binary.c create mode 100644 third_party/upb/generated_for_cmake/google/protobuf/descriptor.upb.c create mode 100644 third_party/upb/generated_for_cmake/google/protobuf/descriptor.upb.h create mode 100644 third_party/upb/generated_for_cmake/upb/json/parser.c create mode 100644 third_party/upb/kokoro/ubuntu/build.sh create mode 100644 third_party/upb/kokoro/ubuntu/continuous.cfg create mode 100644 third_party/upb/kokoro/ubuntu/presubmit.cfg create mode 100644 third_party/upb/tests/benchmark.cc create mode 100644 third_party/upb/tests/bindings/googlepb/test_vs_proto2.cc create mode 100644 third_party/upb/tests/bindings/lua/test_upb.lua create mode 100644 third_party/upb/tests/bindings/lua/test_upb.pb.lua create mode 100644 third_party/upb/tests/bindings/ruby/upb.rb create mode 100644 third_party/upb/tests/conformance_upb.c create mode 100644 third_party/upb/tests/conformance_upb_failures.txt create mode 100644 third_party/upb/tests/corpus/README create mode 100644 third_party/upb/tests/corpus/temp.cc create mode 100644 third_party/upb/tests/file_descriptor_parsenew_fuzzer.cc create mode 100644 third_party/upb/tests/google_message1.dat create mode 100644 third_party/upb/tests/google_message2.dat create mode 100644 third_party/upb/tests/google_messages.proto create mode 100644 third_party/upb/tests/json/enum_from_separate_file.proto create mode 100644 third_party/upb/tests/json/test.proto create mode 100644 third_party/upb/tests/json/test.proto.pb create mode 100644 third_party/upb/tests/json/test_json.cc create mode 100644 third_party/upb/tests/pb/test_decoder.cc create mode 100644 third_party/upb/tests/pb/test_decoder.proto create mode 100644 third_party/upb/tests/pb/test_encoder.cc create mode 100644 third_party/upb/tests/pb/test_varint.c create mode 100644 third_party/upb/tests/test.proto create mode 100644 third_party/upb/tests/test.proto.pb create mode 100644 third_party/upb/tests/test_cpp.cc create mode 100644 third_party/upb/tests/test_cpp.proto create mode 100644 third_party/upb/tests/test_table.cc create mode 100644 third_party/upb/tests/test_util.h create mode 100644 third_party/upb/tests/testmain.cc create mode 100644 third_party/upb/tests/upb_test.h create mode 100644 third_party/upb/third_party/lunit/LICENSE create mode 100644 third_party/upb/third_party/lunit/README.google create mode 100644 third_party/upb/third_party/lunit/console.lua create mode 100644 third_party/upb/third_party/lunit/lunit.lua create mode 100755 third_party/upb/tools/amalgamate.py create mode 100755 third_party/upb/tools/make_cmakelists.py create mode 100644 third_party/upb/tools/staleness_test.py create mode 100644 third_party/upb/tools/staleness_test_lib.py create mode 100644 third_party/upb/upb/bindings/README create mode 100644 third_party/upb/upb/bindings/lua/def.c create mode 100644 third_party/upb/upb/bindings/lua/msg.c create mode 100644 third_party/upb/upb/bindings/lua/upb.c create mode 100644 third_party/upb/upb/bindings/lua/upb.h create mode 100644 third_party/upb/upb/bindings/lua/upb.lua create mode 100644 third_party/upb/upb/bindings/lua/upb/pb.c create mode 100644 third_party/upb/upb/bindings/lua/upb/pb.lua create mode 100644 third_party/upb/upb/bindings/stdc++/string.h create mode 100644 third_party/upb/upb/decode.c create mode 100644 third_party/upb/upb/decode.h create mode 100644 third_party/upb/upb/def.c create mode 100644 third_party/upb/upb/def.h create mode 100644 third_party/upb/upb/encode.c create mode 100644 third_party/upb/upb/encode.h create mode 100644 third_party/upb/upb/generated_util.h create mode 100644 third_party/upb/upb/handlers-inl.h create mode 100644 third_party/upb/upb/handlers.c create mode 100644 third_party/upb/upb/handlers.h create mode 100644 third_party/upb/upb/json/parser.h create mode 100644 third_party/upb/upb/json/parser.rl create mode 100644 third_party/upb/upb/json/printer.c create mode 100644 third_party/upb/upb/json/printer.h create mode 100644 third_party/upb/upb/legacy_msg_reflection.c create mode 100644 third_party/upb/upb/legacy_msg_reflection.h create mode 100644 third_party/upb/upb/msg.c create mode 100644 third_party/upb/upb/msg.h create mode 100644 third_party/upb/upb/msgfactory.c create mode 100644 third_party/upb/upb/msgfactory.h create mode 100644 third_party/upb/upb/pb/compile_decoder.c create mode 100644 third_party/upb/upb/pb/decoder.c create mode 100644 third_party/upb/upb/pb/decoder.h create mode 100644 third_party/upb/upb/pb/decoder.int.h create mode 100644 third_party/upb/upb/pb/encoder.c create mode 100644 third_party/upb/upb/pb/encoder.h create mode 100755 third_party/upb/upb/pb/make-gdb-script.rb create mode 100644 third_party/upb/upb/pb/textprinter.c create mode 100644 third_party/upb/upb/pb/textprinter.h create mode 100644 third_party/upb/upb/pb/varint.c create mode 100644 third_party/upb/upb/pb/varint.int.h create mode 100644 third_party/upb/upb/port.c create mode 100644 third_party/upb/upb/port_def.inc create mode 100644 third_party/upb/upb/port_undef.inc create mode 100644 third_party/upb/upb/sink.c create mode 100644 third_party/upb/upb/sink.h create mode 100644 third_party/upb/upb/table.c create mode 100644 third_party/upb/upb/table.int.h create mode 100644 third_party/upb/upb/upb.c create mode 100644 third_party/upb/upb/upb.h create mode 100644 third_party/upb/upbc/generator.cc create mode 100644 third_party/upb/upbc/generator.h create mode 100644 third_party/upb/upbc/main.cc create mode 100644 third_party/upb/upbc/message_layout.cc create mode 100644 third_party/upb/upbc/message_layout.h create mode 100644 third_party/yaml.BUILD create mode 100644 third_party/zlib.BUILD create mode 100644 third_party/zope_interface.BUILD create mode 100644 tools/README.md create mode 100755 tools/api_reference/add_google_analytics.sh create mode 100755 tools/bazel create mode 100644 tools/bazel.rc create mode 100755 tools/buildgen/build_cleaner.py create mode 100755 tools/buildgen/bunch.py create mode 100755 tools/buildgen/extract_metadata_from_bazel_xml.py create mode 100755 tools/buildgen/generate_build_additions.sh create mode 100755 tools/buildgen/generate_projects.py create mode 100755 tools/buildgen/generate_projects.sh create mode 100755 tools/buildgen/mako_renderer.py create mode 100644 tools/buildgen/plugins/check_attrs.py create mode 100755 tools/buildgen/plugins/expand_bin_attrs.py create mode 100755 tools/buildgen/plugins/expand_filegroups.py create mode 100755 tools/buildgen/plugins/expand_version.py create mode 100755 tools/buildgen/plugins/generate_vsprojects.py create mode 100755 tools/buildgen/plugins/list_api.py create mode 100755 tools/buildgen/plugins/list_protos.py create mode 100644 tools/buildgen/plugins/make_fuzzer_tests.py create mode 100644 tools/buildgen/plugins/transitive_dependencies.py create mode 100644 tools/buildgen/plugins/verify_duplicate_sources.py create mode 100755 tools/codegen/core/gen_header_frame.py create mode 100644 tools/codegen/core/gen_hpack_tables.cc create mode 100644 tools/codegen/core/gen_legal_metadata_characters.cc create mode 100644 tools/codegen/core/gen_percent_encoding_tables.cc create mode 100755 tools/codegen/core/gen_server_registered_method_bad_client_test_body.py create mode 100755 tools/codegen/core/gen_settings_ids.py create mode 100755 tools/codegen/core/gen_static_metadata.py create mode 100755 tools/codegen/core/gen_stats_data.py create mode 100755 tools/codegen/core/gen_upb_api.sh create mode 100755 tools/debug/core/chttp2_ref_leak.py create mode 100644 tools/debug/core/error_ref_leak.py create mode 100644 tools/distrib/bazel_style.cfg create mode 100644 tools/distrib/build_ruby_environment_macos.sh create mode 100755 tools/distrib/buildifier_format_code.sh create mode 100755 tools/distrib/buildifier_format_code_strict.sh create mode 100755 tools/distrib/c-ish/check_documentation.py create mode 100755 tools/distrib/check_boringssl_prefix_symbol.sh create mode 100755 tools/distrib/check_copyright.py create mode 100755 tools/distrib/check_include_guards.py create mode 100755 tools/distrib/check_protobuf_pod_version.sh create mode 100755 tools/distrib/check_pytype.sh create mode 100755 tools/distrib/check_trailing_newlines.sh create mode 100755 tools/distrib/check_upb_output.sh create mode 100755 tools/distrib/check_windows_dlls.sh create mode 100755 tools/distrib/clang_format_code.sh create mode 100755 tools/distrib/clang_tidy_code.sh create mode 100755 tools/distrib/format_bazel.sh create mode 100755 tools/distrib/generate_boringssl_prefix_header.sh create mode 100755 tools/distrib/guard_headers.sh create mode 100755 tools/distrib/pull_requests_interval.sh create mode 100755 tools/distrib/pylint_code.sh create mode 100644 tools/distrib/python/.gitignore create mode 100755 tools/distrib/python/bazel_deps.sh create mode 100755 tools/distrib/python/check_grpcio_tools.py create mode 100755 tools/distrib/python/docgen.py create mode 100644 tools/distrib/python/grpc_prefixed/.gitignore create mode 100644 tools/distrib/python/grpc_prefixed/generate.py create mode 100644 tools/distrib/python/grpc_prefixed/templates/MANIFEST.in.template create mode 100644 tools/distrib/python/grpc_prefixed/templates/README.rst.template create mode 100644 tools/distrib/python/grpc_prefixed/templates/setup.py.template create mode 100644 tools/distrib/python/grpcio_tools/.gitignore create mode 100644 tools/distrib/python/grpcio_tools/MANIFEST.in create mode 100644 tools/distrib/python/grpcio_tools/README.rst create mode 100644 tools/distrib/python/grpcio_tools/_parallel_compile_patch.py create mode 100644 tools/distrib/python/grpcio_tools/grpc_tools/__init__.py create mode 100644 tools/distrib/python/grpcio_tools/grpc_tools/_protoc_compiler.pyx create mode 100644 tools/distrib/python/grpcio_tools/grpc_tools/command.py create mode 100644 tools/distrib/python/grpcio_tools/grpc_tools/main.cc create mode 100644 tools/distrib/python/grpcio_tools/grpc_tools/main.h create mode 100644 tools/distrib/python/grpcio_tools/grpc_tools/protoc.py create mode 100644 tools/distrib/python/grpcio_tools/grpc_version.py create mode 100644 tools/distrib/python/grpcio_tools/protoc_lib_deps.py create mode 100644 tools/distrib/python/grpcio_tools/setup.py create mode 100755 tools/distrib/python/make_grpcio_tools.py create mode 100755 tools/distrib/python/submit.py create mode 100755 tools/distrib/python_wrapper.sh create mode 100755 tools/distrib/run_clang_tidy.py create mode 100755 tools/distrib/sanitize.sh create mode 100755 tools/distrib/yapf_code.sh create mode 100644 tools/dockerfile/OWNERS create mode 100644 tools/dockerfile/distribtest/cpp_jessie_x64/Dockerfile create mode 100644 tools/dockerfile/distribtest/cpp_stretch_x64/Dockerfile create mode 100644 tools/dockerfile/distribtest/csharp_alpine_x64/Dockerfile create mode 100644 tools/dockerfile/distribtest/csharp_centos7_x64/Dockerfile create mode 100644 tools/dockerfile/distribtest/csharp_jessie_x64/Dockerfile create mode 100644 tools/dockerfile/distribtest/csharp_jessie_x86/Dockerfile create mode 100644 tools/dockerfile/distribtest/csharp_stretch_x64/Dockerfile create mode 100644 tools/dockerfile/distribtest/csharp_ubuntu1604_x64/Dockerfile create mode 100644 tools/dockerfile/distribtest/node_centos7_x64/Dockerfile create mode 100644 tools/dockerfile/distribtest/node_jessie_x64/Dockerfile create mode 100644 tools/dockerfile/distribtest/node_jessie_x86/Dockerfile create mode 100644 tools/dockerfile/distribtest/node_ubuntu1404_x64/Dockerfile create mode 100644 tools/dockerfile/distribtest/node_ubuntu1604_x64/Dockerfile create mode 100644 tools/dockerfile/distribtest/php_jessie_x64/Dockerfile create mode 100644 tools/dockerfile/distribtest/python_arch_x64/Dockerfile create mode 100644 tools/dockerfile/distribtest/python_centos6_x64/Dockerfile create mode 100644 tools/dockerfile/distribtest/python_centos7_x64/Dockerfile create mode 100644 tools/dockerfile/distribtest/python_dev_alpine3.7_x64/Dockerfile create mode 100644 tools/dockerfile/distribtest/python_dev_arch_x64/Dockerfile create mode 100644 tools/dockerfile/distribtest/python_dev_centos7_x64/Dockerfile create mode 100644 tools/dockerfile/distribtest/python_dev_fedora23_x64/Dockerfile create mode 100644 tools/dockerfile/distribtest/python_dev_jessie_x64/Dockerfile create mode 100644 tools/dockerfile/distribtest/python_dev_jessie_x86/Dockerfile create mode 100644 tools/dockerfile/distribtest/python_dev_ubuntu1404_x64/Dockerfile create mode 100644 tools/dockerfile/distribtest/python_dev_ubuntu1604_x64/Dockerfile create mode 100644 tools/dockerfile/distribtest/python_fedora23_x64/Dockerfile create mode 100644 tools/dockerfile/distribtest/python_jessie_x64/Dockerfile create mode 100644 tools/dockerfile/distribtest/python_jessie_x86/Dockerfile create mode 100644 tools/dockerfile/distribtest/python_opensuse_x64/Dockerfile create mode 100644 tools/dockerfile/distribtest/python_ubuntu1404_x64/Dockerfile create mode 100644 tools/dockerfile/distribtest/python_ubuntu1604_x64/Dockerfile create mode 100644 tools/dockerfile/distribtest/ruby_centos6_x64/Dockerfile create mode 100644 tools/dockerfile/distribtest/ruby_centos7_x64/Dockerfile create mode 100644 tools/dockerfile/distribtest/ruby_fedora23_x64/Dockerfile create mode 100644 tools/dockerfile/distribtest/ruby_jessie_x64/Dockerfile create mode 100644 tools/dockerfile/distribtest/ruby_jessie_x64_ruby_2_3/Dockerfile create mode 100644 tools/dockerfile/distribtest/ruby_jessie_x64_ruby_2_4/Dockerfile create mode 100644 tools/dockerfile/distribtest/ruby_jessie_x64_ruby_2_5/Dockerfile create mode 100644 tools/dockerfile/distribtest/ruby_jessie_x64_ruby_2_6/Dockerfile create mode 100644 tools/dockerfile/distribtest/ruby_jessie_x64_ruby_2_7/Dockerfile create mode 100644 tools/dockerfile/distribtest/ruby_jessie_x86/Dockerfile create mode 100644 tools/dockerfile/distribtest/ruby_opensuse_x64/Dockerfile create mode 100644 tools/dockerfile/distribtest/ruby_ubuntu1404_x64/Dockerfile create mode 100644 tools/dockerfile/distribtest/ruby_ubuntu1604_x64/Dockerfile create mode 100644 tools/dockerfile/grpc_artifact_android_ndk/Dockerfile create mode 100644 tools/dockerfile/grpc_artifact_centos6_x64/Dockerfile create mode 100644 tools/dockerfile/grpc_artifact_centos6_x86/Dockerfile create mode 100644 tools/dockerfile/grpc_artifact_linux_armv6/Dockerfile create mode 100644 tools/dockerfile/grpc_artifact_linux_armv7/Dockerfile create mode 100644 tools/dockerfile/grpc_artifact_linux_x64/Dockerfile create mode 100644 tools/dockerfile/grpc_artifact_linux_x86/Dockerfile create mode 100644 tools/dockerfile/grpc_artifact_protoc/Dockerfile create mode 100644 tools/dockerfile/grpc_artifact_python_manylinux2010_x64/Dockerfile create mode 100644 tools/dockerfile/grpc_artifact_python_manylinux2010_x86/Dockerfile create mode 100644 tools/dockerfile/grpc_clang/Dockerfile create mode 100644 tools/dockerfile/grpc_clang_format/Dockerfile create mode 100755 tools/dockerfile/grpc_clang_format/clang_format_all_the_things.sh create mode 100644 tools/dockerfile/grpc_clang_tidy/Dockerfile create mode 100755 tools/dockerfile/grpc_clang_tidy/clang_tidy_all_the_things.sh create mode 100644 tools/dockerfile/grpc_dist_proto/Dockerfile create mode 100644 tools/dockerfile/grpc_dist_proto/version.txt create mode 100644 tools/dockerfile/grpc_scan_build/Dockerfile create mode 100644 tools/dockerfile/interoptest/grpc_interop_aspnetcore/Dockerfile create mode 100644 tools/dockerfile/interoptest/grpc_interop_aspnetcore/build_interop.sh create mode 100644 tools/dockerfile/interoptest/grpc_interop_csharp/Dockerfile create mode 100755 tools/dockerfile/interoptest/grpc_interop_csharp/build_interop.sh create mode 100644 tools/dockerfile/interoptest/grpc_interop_csharpcoreclr/Dockerfile create mode 100644 tools/dockerfile/interoptest/grpc_interop_csharpcoreclr/build_interop.sh create mode 100644 tools/dockerfile/interoptest/grpc_interop_cxx/Dockerfile create mode 100755 tools/dockerfile/interoptest/grpc_interop_cxx/build_interop.sh create mode 100644 tools/dockerfile/interoptest/grpc_interop_dart/Dockerfile create mode 100644 tools/dockerfile/interoptest/grpc_interop_dart/build_interop.sh create mode 100644 tools/dockerfile/interoptest/grpc_interop_go/Dockerfile create mode 100755 tools/dockerfile/interoptest/grpc_interop_go/build_interop.sh create mode 100644 tools/dockerfile/interoptest/grpc_interop_go1.11/Dockerfile create mode 100644 tools/dockerfile/interoptest/grpc_interop_go1.11/build_interop.sh create mode 100644 tools/dockerfile/interoptest/grpc_interop_go1.7/Dockerfile create mode 100644 tools/dockerfile/interoptest/grpc_interop_go1.7/build_interop.sh create mode 100644 tools/dockerfile/interoptest/grpc_interop_go1.8/Dockerfile create mode 100644 tools/dockerfile/interoptest/grpc_interop_go1.8/build_interop.sh create mode 100644 tools/dockerfile/interoptest/grpc_interop_http2/Dockerfile create mode 100755 tools/dockerfile/interoptest/grpc_interop_http2/build_interop.sh create mode 100644 tools/dockerfile/interoptest/grpc_interop_java/Dockerfile create mode 100644 tools/dockerfile/interoptest/grpc_interop_java/build_interop.sh create mode 100644 tools/dockerfile/interoptest/grpc_interop_node/Dockerfile create mode 100755 tools/dockerfile/interoptest/grpc_interop_node/build_interop.sh create mode 100644 tools/dockerfile/interoptest/grpc_interop_nodepurejs/Dockerfile create mode 100755 tools/dockerfile/interoptest/grpc_interop_nodepurejs/build_interop.sh create mode 100644 tools/dockerfile/interoptest/grpc_interop_php/Dockerfile create mode 100755 tools/dockerfile/interoptest/grpc_interop_php/build_interop.sh create mode 100644 tools/dockerfile/interoptest/grpc_interop_php7/Dockerfile create mode 100755 tools/dockerfile/interoptest/grpc_interop_php7/build_interop.sh create mode 100644 tools/dockerfile/interoptest/grpc_interop_python/Dockerfile create mode 100755 tools/dockerfile/interoptest/grpc_interop_python/build_interop.sh create mode 100644 tools/dockerfile/interoptest/grpc_interop_pythonasyncio/Dockerfile create mode 100755 tools/dockerfile/interoptest/grpc_interop_pythonasyncio/build_interop.sh create mode 100644 tools/dockerfile/interoptest/grpc_interop_ruby/Dockerfile create mode 100755 tools/dockerfile/interoptest/grpc_interop_ruby/build_interop.sh create mode 100644 tools/dockerfile/interoptest/lb_interop_fake_servers/Dockerfile create mode 100644 tools/dockerfile/interoptest/lb_interop_fake_servers/build_interop.sh create mode 100755 tools/dockerfile/push_testing_images.sh create mode 100644 tools/dockerfile/test/bazel/Dockerfile create mode 100644 tools/dockerfile/test/csharp_stretch_x64/Dockerfile create mode 100644 tools/dockerfile/test/cxx_alpine_x64/Dockerfile create mode 100644 tools/dockerfile/test/cxx_buster_x64/Dockerfile create mode 100644 tools/dockerfile/test/cxx_jessie_x64/Dockerfile create mode 100644 tools/dockerfile/test/cxx_jessie_x86/Dockerfile create mode 100644 tools/dockerfile/test/cxx_sanitizers_jessie_x64/Dockerfile create mode 100644 tools/dockerfile/test/cxx_ubuntu1404_x64/Dockerfile create mode 100644 tools/dockerfile/test/cxx_ubuntu1604_x64/Dockerfile create mode 100644 tools/dockerfile/test/cxx_ubuntu1804_x64/Dockerfile create mode 100644 tools/dockerfile/test/fuzzer/Dockerfile create mode 100644 tools/dockerfile/test/node_jessie_x64/Dockerfile create mode 100644 tools/dockerfile/test/php73_zts_stretch_x64/Dockerfile create mode 100644 tools/dockerfile/test/php7_jessie_x64/Dockerfile create mode 100644 tools/dockerfile/test/php_jessie_x64/Dockerfile create mode 100644 tools/dockerfile/test/python_alpine_x64/Dockerfile create mode 100644 tools/dockerfile/test/python_stretch_2.7_x64/Dockerfile create mode 100644 tools/dockerfile/test/python_stretch_3.5_x64/Dockerfile create mode 100644 tools/dockerfile/test/python_stretch_3.6_x64/Dockerfile create mode 100644 tools/dockerfile/test/python_stretch_3.7_x64/Dockerfile create mode 100644 tools/dockerfile/test/python_stretch_3.8_x64/Dockerfile create mode 100644 tools/dockerfile/test/python_stretch_default_x64/Dockerfile create mode 100644 tools/dockerfile/test/ruby_jessie_x64/Dockerfile create mode 100644 tools/dockerfile/test/sanity/Dockerfile create mode 100644 tools/doxygen/Doxyfile.c++ create mode 100644 tools/doxygen/Doxyfile.c++.internal create mode 100644 tools/doxygen/Doxyfile.core create mode 100644 tools/doxygen/Doxyfile.core.internal create mode 100644 tools/doxygen/Doxyfile.objc create mode 100644 tools/doxygen/Doxyfile.objc.internal create mode 100755 tools/doxygen/run_doxygen.sh create mode 100644 tools/failures/detect_new_failures.py create mode 100644 tools/failures/sql/new_failures_24h.sql create mode 100755 tools/fuzzer/build_and_run_fuzzer.sh create mode 100644 tools/fuzzer/options/client_fuzzer.options create mode 100644 tools/fuzzer/options/fuzzer.options create mode 100644 tools/fuzzer/options/fuzzer_response.options create mode 100644 tools/fuzzer/options/fuzzer_serverlist.options create mode 100644 tools/fuzzer/options/hpack_parser_fuzzer_test.options create mode 100644 tools/fuzzer/options/percent_decode_fuzzer.options create mode 100644 tools/fuzzer/options/percent_encode_fuzzer.options create mode 100644 tools/fuzzer/options/request_fuzzer.options create mode 100644 tools/fuzzer/options/response_fuzzer.options create mode 100644 tools/fuzzer/options/server_fuzzer.options create mode 100644 tools/fuzzer/options/ssl_server_fuzzer.options create mode 100644 tools/fuzzer/options/uri_fuzzer_test.options create mode 100644 tools/fuzzer/runners/alts_credentials_fuzzer.sh create mode 100644 tools/fuzzer/runners/client_fuzzer.sh create mode 100644 tools/fuzzer/runners/hpack_parser_fuzzer_test.sh create mode 100644 tools/fuzzer/runners/http_request_fuzzer_test.sh create mode 100644 tools/fuzzer/runners/http_response_fuzzer_test.sh create mode 100644 tools/fuzzer/runners/json_fuzzer_test.sh create mode 100644 tools/fuzzer/runners/nanopb_fuzzer_response_test.sh create mode 100644 tools/fuzzer/runners/nanopb_fuzzer_serverlist_test.sh create mode 100644 tools/fuzzer/runners/percent_decode_fuzzer.sh create mode 100644 tools/fuzzer/runners/percent_encode_fuzzer.sh create mode 100644 tools/fuzzer/runners/server_fuzzer.sh create mode 100644 tools/fuzzer/runners/ssl_server_fuzzer.sh create mode 100644 tools/fuzzer/runners/uri_fuzzer_test.sh create mode 100755 tools/gce/create_linux_kokoro_performance_worker.sh create mode 100755 tools/gce/create_linux_kokoro_performance_worker_from_image.sh create mode 100755 tools/gce/create_win2019_container_vm.sh create mode 100755 tools/gce/create_windows_debug_worker.sh create mode 100644 tools/gce/kokoro_performance.pub create mode 100755 tools/gce/linux_kokoro_performance_worker_init.sh create mode 100644 tools/gcp/github_stats_tracking/app.yaml create mode 100644 tools/gcp/github_stats_tracking/appengine_config.py create mode 100644 tools/gcp/github_stats_tracking/cron.yaml create mode 100644 tools/gcp/github_stats_tracking/fetch_data.py create mode 100644 tools/gcp/github_stats_tracking/main.py create mode 100755 tools/gcp/utils/big_query_utils.py create mode 100644 tools/github/pr_latency.py create mode 100644 tools/gource/create_auth_context.h create mode 100755 tools/gource/gen-all-logs.sh create mode 100755 tools/gource/gource.sh create mode 100755 tools/gource/make-video.sh create mode 100644 tools/http2_interop/README.md create mode 100644 tools/http2_interop/doc.go create mode 100644 tools/http2_interop/frame.go create mode 100644 tools/http2_interop/frameheader.go create mode 100644 tools/http2_interop/goaway.go create mode 100644 tools/http2_interop/http1frame.go create mode 100644 tools/http2_interop/http2interop.go create mode 100644 tools/http2_interop/http2interop_test.go create mode 100644 tools/http2_interop/ping.go create mode 100644 tools/http2_interop/s6.5.go create mode 100644 tools/http2_interop/s6.5_test.go create mode 100644 tools/http2_interop/settings.go create mode 100644 tools/http2_interop/testsuite.go create mode 100644 tools/http2_interop/unknownframe.go create mode 100644 tools/internal_ci/README.md create mode 100755 tools/internal_ci/helper_scripts/delete_nonartifacts.sh create mode 100644 tools/internal_ci/helper_scripts/install_python38.ps1 create mode 100644 tools/internal_ci/helper_scripts/prepare_build_grpclb_interop_rc create mode 100644 tools/internal_ci/helper_scripts/prepare_build_interop_rc create mode 100644 tools/internal_ci/helper_scripts/prepare_build_linux_perf_multilang_rc create mode 100644 tools/internal_ci/helper_scripts/prepare_build_linux_perf_rc create mode 100644 tools/internal_ci/helper_scripts/prepare_build_linux_rc create mode 100644 tools/internal_ci/helper_scripts/prepare_build_macos_interop_rc create mode 100644 tools/internal_ci/helper_scripts/prepare_build_macos_rc create mode 100644 tools/internal_ci/helper_scripts/prepare_build_windows.bat create mode 100644 tools/internal_ci/linux/grpc_android.cfg create mode 100755 tools/internal_ci/linux/grpc_android.sh create mode 100755 tools/internal_ci/linux/grpc_asan_on_foundry.sh create mode 100644 tools/internal_ci/linux/grpc_basictests_c_cpp_dbg.cfg create mode 100644 tools/internal_ci/linux/grpc_basictests_c_cpp_opt.cfg create mode 100644 tools/internal_ci/linux/grpc_basictests_csharp.cfg create mode 100644 tools/internal_ci/linux/grpc_basictests_multilang.cfg create mode 100644 tools/internal_ci/linux/grpc_basictests_node.cfg create mode 100644 tools/internal_ci/linux/grpc_basictests_php.cfg create mode 100644 tools/internal_ci/linux/grpc_basictests_python.cfg create mode 100644 tools/internal_ci/linux/grpc_basictests_ruby.cfg create mode 100755 tools/internal_ci/linux/grpc_bazel.sh create mode 100644 tools/internal_ci/linux/grpc_bazel_build.cfg create mode 100755 tools/internal_ci/linux/grpc_bazel_build_in_docker.sh create mode 100755 tools/internal_ci/linux/grpc_bazel_on_foundry_base.sh create mode 100644 tools/internal_ci/linux/grpc_bazel_on_foundry_dbg.sh create mode 100644 tools/internal_ci/linux/grpc_bazel_on_foundry_opt.sh create mode 100755 tools/internal_ci/linux/grpc_bazel_privileged_docker.sh create mode 100644 tools/internal_ci/linux/grpc_bazel_rbe_asan.cfg create mode 100644 tools/internal_ci/linux/grpc_bazel_rbe_dbg.cfg create mode 100644 tools/internal_ci/linux/grpc_bazel_rbe_incompatible_changes.cfg create mode 100644 tools/internal_ci/linux/grpc_bazel_rbe_incompatible_changes.sh create mode 100644 tools/internal_ci/linux/grpc_bazel_rbe_msan.cfg create mode 100644 tools/internal_ci/linux/grpc_bazel_rbe_opt.cfg create mode 100644 tools/internal_ci/linux/grpc_bazel_rbe_tsan.cfg create mode 100644 tools/internal_ci/linux/grpc_bazel_rbe_ubsan.cfg create mode 100644 tools/internal_ci/linux/grpc_bazel_test.cfg create mode 100755 tools/internal_ci/linux/grpc_bazel_test_in_docker.sh create mode 100644 tools/internal_ci/linux/grpc_build_artifacts.cfg create mode 100755 tools/internal_ci/linux/grpc_build_artifacts.sh create mode 100644 tools/internal_ci/linux/grpc_build_artifacts_extra.cfg create mode 100755 tools/internal_ci/linux/grpc_build_artifacts_extra.sh create mode 100644 tools/internal_ci/linux/grpc_build_artifacts_extra_release.cfg create mode 100644 tools/internal_ci/linux/grpc_build_boringssl_at_head.cfg create mode 100644 tools/internal_ci/linux/grpc_build_packages.cfg create mode 100644 tools/internal_ci/linux/grpc_build_packages.sh create mode 100644 tools/internal_ci/linux/grpc_build_protobuf_at_head.cfg create mode 100755 tools/internal_ci/linux/grpc_build_submodule_at_head.sh create mode 100644 tools/internal_ci/linux/grpc_coverage.cfg create mode 100755 tools/internal_ci/linux/grpc_coverage.sh create mode 100644 tools/internal_ci/linux/grpc_distribtests.cfg create mode 100644 tools/internal_ci/linux/grpc_distribtests.sh create mode 100644 tools/internal_ci/linux/grpc_distribtests_standalone.cfg create mode 100755 tools/internal_ci/linux/grpc_distribtests_standalone.sh create mode 100644 tools/internal_ci/linux/grpc_e2e_performance_singlevm.cfg create mode 100755 tools/internal_ci/linux/grpc_e2e_performance_singlevm.sh create mode 100644 tools/internal_ci/linux/grpc_flaky_network.cfg create mode 100755 tools/internal_ci/linux/grpc_flaky_network_in_docker.sh create mode 100644 tools/internal_ci/linux/grpc_full_performance_master.cfg create mode 100755 tools/internal_ci/linux/grpc_full_performance_master.sh create mode 100644 tools/internal_ci/linux/grpc_full_performance_release.cfg create mode 100755 tools/internal_ci/linux/grpc_full_performance_release.sh create mode 100644 tools/internal_ci/linux/grpc_interop_alts.cfg create mode 100644 tools/internal_ci/linux/grpc_interop_matrix.cfg create mode 100755 tools/internal_ci/linux/grpc_interop_matrix.sh create mode 100644 tools/internal_ci/linux/grpc_interop_tocloud.cfg create mode 100644 tools/internal_ci/linux/grpc_interop_toprod.cfg create mode 100644 tools/internal_ci/linux/grpc_line_count.cfg create mode 100755 tools/internal_ci/linux/grpc_line_count.sh create mode 100755 tools/internal_ci/linux/grpc_microbenchmark_diff.sh create mode 100644 tools/internal_ci/linux/grpc_msan_on_foundry.sh create mode 100644 tools/internal_ci/linux/grpc_performance_profile_daily.cfg create mode 100755 tools/internal_ci/linux/grpc_performance_profile_daily.sh create mode 100644 tools/internal_ci/linux/grpc_performance_profile_master.cfg create mode 100755 tools/internal_ci/linux/grpc_performance_profile_master.sh create mode 100644 tools/internal_ci/linux/grpc_portability.cfg create mode 100644 tools/internal_ci/linux/grpc_portability_build_only.cfg create mode 100644 tools/internal_ci/linux/grpc_publish_packages.cfg create mode 100755 tools/internal_ci/linux/grpc_publish_packages.sh create mode 100644 tools/internal_ci/linux/grpc_pull_request_sanity.cfg create mode 100644 tools/internal_ci/linux/grpc_python_bazel_test.cfg create mode 100755 tools/internal_ci/linux/grpc_python_bazel_test_in_docker.sh create mode 100755 tools/internal_ci/linux/grpc_run_grpclb_interop_tests.sh create mode 100755 tools/internal_ci/linux/grpc_run_interop_tests.sh create mode 100755 tools/internal_ci/linux/grpc_run_tests_matrix.sh create mode 100644 tools/internal_ci/linux/grpc_sanity.cfg create mode 100755 tools/internal_ci/linux/grpc_trickle_diff.sh create mode 100644 tools/internal_ci/linux/grpc_tsan_on_foundry.sh create mode 100644 tools/internal_ci/linux/grpc_ubsan_on_foundry.sh create mode 100644 tools/internal_ci/linux/grpc_xds.cfg create mode 100755 tools/internal_ci/linux/grpc_xds.sh create mode 100755 tools/internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh create mode 100755 tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh create mode 100644 tools/internal_ci/linux/grpc_xds_csharp.cfg create mode 100755 tools/internal_ci/linux/grpc_xds_csharp.sh create mode 100755 tools/internal_ci/linux/grpc_xds_csharp_test_in_docker.sh create mode 100644 tools/internal_ci/linux/grpc_xds_php.cfg create mode 100755 tools/internal_ci/linux/grpc_xds_php.sh create mode 100755 tools/internal_ci/linux/grpc_xds_php_test_in_docker.sh create mode 100644 tools/internal_ci/linux/grpc_xds_python.cfg create mode 100644 tools/internal_ci/linux/grpc_xds_ruby.cfg create mode 100644 tools/internal_ci/linux/grpc_xds_ruby.sh create mode 100644 tools/internal_ci/linux/grpc_xds_ruby_test_in_docker.sh create mode 100644 tools/internal_ci/linux/grpclb_in_dns_interop.cfg create mode 100644 tools/internal_ci/linux/pull_request/grpc_asan_on_foundry.sh create mode 100644 tools/internal_ci/linux/pull_request/grpc_basictests_c_cpp_build_only.cfg create mode 100644 tools/internal_ci/linux/pull_request/grpc_basictests_c_dbg.cfg create mode 100644 tools/internal_ci/linux/pull_request/grpc_basictests_c_opt.cfg create mode 100644 tools/internal_ci/linux/pull_request/grpc_basictests_cpp_dbg.cfg create mode 100644 tools/internal_ci/linux/pull_request/grpc_basictests_cpp_opt.cfg create mode 100644 tools/internal_ci/linux/pull_request/grpc_basictests_csharp.cfg create mode 100644 tools/internal_ci/linux/pull_request/grpc_basictests_multilang.cfg create mode 100644 tools/internal_ci/linux/pull_request/grpc_basictests_node.cfg create mode 100644 tools/internal_ci/linux/pull_request/grpc_basictests_php.cfg create mode 100644 tools/internal_ci/linux/pull_request/grpc_basictests_python.cfg create mode 100644 tools/internal_ci/linux/pull_request/grpc_basictests_ruby.cfg create mode 100644 tools/internal_ci/linux/pull_request/grpc_bazel_on_foundry_dbg.sh create mode 100644 tools/internal_ci/linux/pull_request/grpc_bazel_on_foundry_opt.sh create mode 100644 tools/internal_ci/linux/pull_request/grpc_bazel_rbe_asan.cfg create mode 100644 tools/internal_ci/linux/pull_request/grpc_bazel_rbe_dbg.cfg create mode 100644 tools/internal_ci/linux/pull_request/grpc_bazel_rbe_msan.cfg create mode 100644 tools/internal_ci/linux/pull_request/grpc_bazel_rbe_opt.cfg create mode 100644 tools/internal_ci/linux/pull_request/grpc_bazel_rbe_tsan.cfg create mode 100644 tools/internal_ci/linux/pull_request/grpc_bazel_rbe_ubsan.cfg create mode 100644 tools/internal_ci/linux/pull_request/grpc_interop_alts.cfg create mode 100644 tools/internal_ci/linux/pull_request/grpc_interop_matrix_adhoc.cfg create mode 100644 tools/internal_ci/linux/pull_request/grpc_interop_tocloud.cfg create mode 100644 tools/internal_ci/linux/pull_request/grpc_interop_toprod.cfg create mode 100644 tools/internal_ci/linux/pull_request/grpc_microbenchmark_diff.cfg create mode 100644 tools/internal_ci/linux/pull_request/grpc_msan_on_foundry.sh create mode 100644 tools/internal_ci/linux/pull_request/grpc_sanity.cfg create mode 100644 tools/internal_ci/linux/pull_request/grpc_trickle_diff.cfg create mode 100644 tools/internal_ci/linux/pull_request/grpc_tsan_on_foundry.sh create mode 100644 tools/internal_ci/linux/pull_request/grpc_ubsan_on_foundry.sh create mode 100755 tools/internal_ci/linux/run_if_c_cpp_modified.sh create mode 100755 tools/internal_ci/linux/run_performance_profile_daily.sh create mode 100755 tools/internal_ci/linux/run_performance_profile_hourly.sh create mode 100644 tools/internal_ci/linux/sanitizer/grpc_c_asan.cfg create mode 100644 tools/internal_ci/linux/sanitizer/grpc_c_msan.cfg create mode 100644 tools/internal_ci/linux/sanitizer/grpc_c_tsan.cfg create mode 100644 tools/internal_ci/linux/sanitizer/grpc_c_ubsan.cfg create mode 100644 tools/internal_ci/linux/sanitizer/grpc_cpp_asan.cfg create mode 100644 tools/internal_ci/linux/sanitizer/grpc_cpp_tsan.cfg create mode 100644 tools/internal_ci/linux/sanitizer/pull_request/grpc_c_asan.cfg create mode 100644 tools/internal_ci/linux/sanitizer/pull_request/grpc_c_msan.cfg create mode 100644 tools/internal_ci/linux/sanitizer/pull_request/grpc_c_tsan.cfg create mode 100644 tools/internal_ci/linux/sanitizer/pull_request/grpc_c_ubsan.cfg create mode 100644 tools/internal_ci/linux/sanitizer/pull_request/grpc_cpp_asan.cfg create mode 100644 tools/internal_ci/linux/sanitizer/pull_request/grpc_cpp_tsan.cfg create mode 100644 tools/internal_ci/macos/grpc_basictests_c_cpp.cfg create mode 100644 tools/internal_ci/macos/grpc_basictests_cpp_ios.cfg create mode 100644 tools/internal_ci/macos/grpc_basictests_csharp.cfg create mode 100755 tools/internal_ci/macos/grpc_basictests_csharp.sh create mode 100644 tools/internal_ci/macos/grpc_basictests_node.cfg create mode 100644 tools/internal_ci/macos/grpc_basictests_objc_examples.cfg create mode 100644 tools/internal_ci/macos/grpc_basictests_objc_ios.cfg create mode 100644 tools/internal_ci/macos/grpc_basictests_objc_mac.cfg create mode 100644 tools/internal_ci/macos/grpc_basictests_objc_tvos.cfg create mode 100644 tools/internal_ci/macos/grpc_basictests_php.cfg create mode 100644 tools/internal_ci/macos/grpc_basictests_python.cfg create mode 100755 tools/internal_ci/macos/grpc_basictests_python.sh create mode 100644 tools/internal_ci/macos/grpc_basictests_ruby.cfg create mode 100755 tools/internal_ci/macos/grpc_basictests_ruby.sh create mode 100644 tools/internal_ci/macos/grpc_bazel_c_cpp_dbg.cfg create mode 100644 tools/internal_ci/macos/grpc_bazel_c_cpp_opt.cfg create mode 100644 tools/internal_ci/macos/grpc_bazel_cpp_ios_tests.cfg create mode 100644 tools/internal_ci/macos/grpc_build_artifacts.cfg create mode 100755 tools/internal_ci/macos/grpc_build_artifacts.sh create mode 100644 tools/internal_ci/macos/grpc_cfstream.cfg create mode 100644 tools/internal_ci/macos/grpc_cfstream_asan.cfg create mode 100644 tools/internal_ci/macos/grpc_cfstream_tsan.cfg create mode 100644 tools/internal_ci/macos/grpc_distribtests.cfg create mode 100644 tools/internal_ci/macos/grpc_distribtests.sh create mode 100644 tools/internal_ci/macos/grpc_interop_toprod.cfg create mode 100755 tools/internal_ci/macos/grpc_interop_toprod.sh create mode 100755 tools/internal_ci/macos/grpc_ios_binary_size.sh create mode 100644 tools/internal_ci/macos/grpc_run_bazel_c_cpp_tests.sh create mode 100644 tools/internal_ci/macos/grpc_run_bazel_cpp_ios_tests.sh create mode 100644 tools/internal_ci/macos/grpc_run_bazel_isolated_tests.sh create mode 100755 tools/internal_ci/macos/grpc_run_tests_matrix.sh create mode 100755 tools/internal_ci/macos/grpc_run_tests_matrix_objc.sh create mode 100644 tools/internal_ci/macos/pull_request/grpc_basictests_c_cpp.cfg create mode 100644 tools/internal_ci/macos/pull_request/grpc_basictests_cpp_ios.cfg create mode 100644 tools/internal_ci/macos/pull_request/grpc_basictests_csharp.cfg create mode 100644 tools/internal_ci/macos/pull_request/grpc_basictests_dbg.cfg create mode 100644 tools/internal_ci/macos/pull_request/grpc_basictests_node.cfg create mode 100644 tools/internal_ci/macos/pull_request/grpc_basictests_objc_examples.cfg create mode 100644 tools/internal_ci/macos/pull_request/grpc_basictests_objc_ios.cfg create mode 100644 tools/internal_ci/macos/pull_request/grpc_basictests_objc_mac.cfg create mode 100644 tools/internal_ci/macos/pull_request/grpc_basictests_objc_tvos.cfg create mode 100644 tools/internal_ci/macos/pull_request/grpc_basictests_opt.cfg create mode 100644 tools/internal_ci/macos/pull_request/grpc_basictests_php.cfg create mode 100644 tools/internal_ci/macos/pull_request/grpc_basictests_python.cfg create mode 100644 tools/internal_ci/macos/pull_request/grpc_basictests_ruby.cfg create mode 100644 tools/internal_ci/macos/pull_request/grpc_bazel_c_cpp_dbg.cfg create mode 100644 tools/internal_ci/macos/pull_request/grpc_bazel_c_cpp_opt.cfg create mode 100644 tools/internal_ci/macos/pull_request/grpc_interop.cfg create mode 100644 tools/internal_ci/macos/pull_request/grpc_ios_binary_size.cfg create mode 100644 tools/internal_ci/windows/bazel_rbe.bat create mode 100644 tools/internal_ci/windows/grpc_basictests.cfg create mode 100644 tools/internal_ci/windows/grpc_basictests_c.cfg create mode 100644 tools/internal_ci/windows/grpc_basictests_csharp.cfg create mode 100644 tools/internal_ci/windows/grpc_basictests_dbg.cfg create mode 100644 tools/internal_ci/windows/grpc_basictests_opt.cfg create mode 100644 tools/internal_ci/windows/grpc_basictests_python.cfg create mode 100644 tools/internal_ci/windows/grpc_bazel_rbe_dbg.cfg create mode 100644 tools/internal_ci/windows/grpc_bazel_rbe_opt.cfg create mode 100644 tools/internal_ci/windows/grpc_build_artifacts.bat create mode 100644 tools/internal_ci/windows/grpc_build_artifacts.cfg create mode 100644 tools/internal_ci/windows/grpc_build_packages.bat create mode 100644 tools/internal_ci/windows/grpc_build_packages.cfg create mode 100644 tools/internal_ci/windows/grpc_distribtests.bat create mode 100644 tools/internal_ci/windows/grpc_distribtests.cfg create mode 100644 tools/internal_ci/windows/grpc_distribtests_standalone.bat create mode 100644 tools/internal_ci/windows/grpc_distribtests_standalone.cfg create mode 100644 tools/internal_ci/windows/grpc_portability.cfg create mode 100644 tools/internal_ci/windows/grpc_portability_build_only.cfg create mode 100644 tools/internal_ci/windows/grpc_run_tests_matrix.bat create mode 100644 tools/internal_ci/windows/pull_request/grpc_basictests.cfg create mode 100644 tools/internal_ci/windows/pull_request/grpc_basictests_c.cfg create mode 100644 tools/internal_ci/windows/pull_request/grpc_basictests_csharp.cfg create mode 100644 tools/internal_ci/windows/pull_request/grpc_basictests_dbg.cfg create mode 100644 tools/internal_ci/windows/pull_request/grpc_basictests_opt.cfg create mode 100644 tools/internal_ci/windows/pull_request/grpc_basictests_python.cfg create mode 100644 tools/internal_ci/windows/pull_request/grpc_bazel_rbe_dbg.cfg create mode 100644 tools/internal_ci/windows/pull_request/grpc_bazel_rbe_opt.cfg create mode 100644 tools/internal_ci/windows/pull_request/grpc_portability.cfg create mode 100644 tools/interop_matrix/README.md create mode 100644 tools/interop_matrix/client_matrix.py create mode 100755 tools/interop_matrix/create_matrix_images.py create mode 100755 tools/interop_matrix/create_testcases.sh create mode 100644 tools/interop_matrix/patches/README.md create mode 100644 tools/interop_matrix/patches/csharp_v1.0.1/git_repo.patch create mode 100644 tools/interop_matrix/patches/ruby_v1.0.1/git_repo.patch create mode 100644 tools/interop_matrix/patches/ruby_v1.18.0/git_repo.patch create mode 100755 tools/interop_matrix/run_interop_matrix_tests.py create mode 100755 tools/interop_matrix/testcases/csharp__master create mode 100644 tools/interop_matrix/testcases/csharp__v1.1.4 create mode 100644 tools/interop_matrix/testcases/csharp__v1.18.0 create mode 100644 tools/interop_matrix/testcases/csharp__v1.3.9 create mode 100755 tools/interop_matrix/testcases/csharpcoreclr__master create mode 100644 tools/interop_matrix/testcases/csharpcoreclr__v1.1.4 create mode 100755 tools/interop_matrix/testcases/csharpcoreclr__v1.18.0 create mode 100644 tools/interop_matrix/testcases/csharpcoreclr__v1.3.9 create mode 100755 tools/interop_matrix/testcases/cxx__master create mode 100755 tools/interop_matrix/testcases/cxx__v1.0.1 create mode 100755 tools/interop_matrix/testcases/go__master create mode 100755 tools/interop_matrix/testcases/go__v1.0.5 create mode 100755 tools/interop_matrix/testcases/java__master create mode 100755 tools/interop_matrix/testcases/java__v1.0.3 create mode 100755 tools/interop_matrix/testcases/node__master create mode 100644 tools/interop_matrix/testcases/node__v1.0.1 create mode 100644 tools/interop_matrix/testcases/node__v1.1.4 create mode 100755 tools/interop_matrix/testcases/php__master create mode 100755 tools/interop_matrix/testcases/php__v1.0.1 create mode 100755 tools/interop_matrix/testcases/python__master create mode 100755 tools/interop_matrix/testcases/python__v1.0.x create mode 100755 tools/interop_matrix/testcases/python__v1.11.1 create mode 100755 tools/interop_matrix/testcases/ruby__master create mode 100755 tools/interop_matrix/testcases/ruby__v1.0.1 create mode 100755 tools/interop_matrix/testcases/ruby__v1.1.4 create mode 100755 tools/line_count/collect-history.py create mode 100755 tools/line_count/collect-now.sh create mode 100755 tools/line_count/summarize-history.py create mode 100755 tools/line_count/yaml2csv.py create mode 100755 tools/mkowners/mkowners.py create mode 100644 tools/package_hosting/404.html create mode 100644 tools/package_hosting/build-201807.xsl create mode 100644 tools/package_hosting/dirindex.css create mode 100644 tools/package_hosting/home.xsl create mode 100644 tools/package_hosting/style.css create mode 100755 tools/package_hosting/upload_web_assets.sh create mode 100755 tools/profiling/bloat/bloat_diff.py create mode 100755 tools/profiling/ios_bin/binary_size.py create mode 100755 tools/profiling/ios_bin/parse_link_map.py create mode 100755 tools/profiling/latency_profile/profile_analyzer.py create mode 100644 tools/profiling/microbenchmarks/README.md create mode 100755 tools/profiling/microbenchmarks/bm2bq.py create mode 100644 tools/profiling/microbenchmarks/bm_diff/README.md create mode 100755 tools/profiling/microbenchmarks/bm_diff/bm_build.py create mode 100644 tools/profiling/microbenchmarks/bm_diff/bm_constants.py create mode 100755 tools/profiling/microbenchmarks/bm_diff/bm_diff.py create mode 100755 tools/profiling/microbenchmarks/bm_diff/bm_main.py create mode 100755 tools/profiling/microbenchmarks/bm_diff/bm_run.py create mode 100755 tools/profiling/microbenchmarks/bm_diff/bm_speedup.py create mode 100644 tools/profiling/microbenchmarks/bm_json.py create mode 100755 tools/profiling/perf/run_perf_unconstrained.sh create mode 100755 tools/profiling/qps/qps_diff.py create mode 100644 tools/profiling/qps/qps_scenarios.py create mode 100644 tools/release/release_notes.py create mode 100644 tools/release/verify_python_release.py create mode 100644 tools/remote_build/README.md create mode 100644 tools/remote_build/kokoro.bazelrc create mode 100644 tools/remote_build/mac.bazelrc create mode 100644 tools/remote_build/manual.bazelrc create mode 100644 tools/remote_build/rbe_common.bazelrc create mode 100644 tools/remote_build/windows.bazelrc create mode 100644 tools/remote_build/workspace_status_kokoro.bat create mode 100755 tools/remote_build/workspace_status_kokoro.sh create mode 100644 tools/run_tests/README.md create mode 100644 tools/run_tests/artifacts/__init__.py create mode 100644 tools/run_tests/artifacts/artifact_targets.py create mode 100644 tools/run_tests/artifacts/build_artifact_csharp.bat create mode 100755 tools/run_tests/artifacts/build_artifact_csharp.sh create mode 100755 tools/run_tests/artifacts/build_artifact_csharp_android.sh create mode 100755 tools/run_tests/artifacts/build_artifact_csharp_ios.sh create mode 100755 tools/run_tests/artifacts/build_artifact_php.sh create mode 100644 tools/run_tests/artifacts/build_artifact_protoc.bat create mode 100755 tools/run_tests/artifacts/build_artifact_protoc.sh create mode 100644 tools/run_tests/artifacts/build_artifact_python.bat create mode 100755 tools/run_tests/artifacts/build_artifact_python.sh create mode 100755 tools/run_tests/artifacts/build_artifact_ruby.sh create mode 100755 tools/run_tests/artifacts/build_package_php.sh create mode 100755 tools/run_tests/artifacts/build_package_python.sh create mode 100755 tools/run_tests/artifacts/build_package_ruby.sh create mode 100644 tools/run_tests/artifacts/distribtest_targets.py create mode 100644 tools/run_tests/artifacts/package_targets.py create mode 100755 tools/run_tests/artifacts/run_in_workspace.sh create mode 100644 tools/run_tests/build_stats/build_stats_schema.json create mode 100644 tools/run_tests/build_stats/build_stats_schema_no_matrix.json create mode 100755 tools/run_tests/dockerize/build_and_run_docker.sh create mode 100755 tools/run_tests/dockerize/build_docker_and_run_tests.sh create mode 100755 tools/run_tests/dockerize/build_interop_image.sh create mode 100755 tools/run_tests/dockerize/docker_run.sh create mode 100755 tools/run_tests/dockerize/docker_run_tests.sh create mode 100644 tools/run_tests/generated/configs.json create mode 100644 tools/run_tests/generated/lb_interop_test_scenarios.json create mode 100644 tools/run_tests/generated/tests.json create mode 100644 tools/run_tests/helper_scripts/build_csharp.bat create mode 100755 tools/run_tests/helper_scripts/build_csharp.sh create mode 100755 tools/run_tests/helper_scripts/build_php.sh create mode 100755 tools/run_tests/helper_scripts/build_python.sh create mode 100644 tools/run_tests/helper_scripts/build_python_msys2.sh create mode 100755 tools/run_tests/helper_scripts/build_ruby.sh create mode 100755 tools/run_tests/helper_scripts/bundle_install_wrapper.sh create mode 100755 tools/run_tests/helper_scripts/post_tests_c.sh create mode 100644 tools/run_tests/helper_scripts/post_tests_csharp.bat create mode 100755 tools/run_tests/helper_scripts/post_tests_csharp.sh create mode 100755 tools/run_tests/helper_scripts/post_tests_php.sh create mode 100755 tools/run_tests/helper_scripts/post_tests_python.sh create mode 100755 tools/run_tests/helper_scripts/post_tests_ruby.sh create mode 100644 tools/run_tests/helper_scripts/pre_build_cmake.bat create mode 100755 tools/run_tests/helper_scripts/pre_build_cmake.sh create mode 100644 tools/run_tests/helper_scripts/pre_build_csharp.bat create mode 100755 tools/run_tests/helper_scripts/pre_build_csharp.sh create mode 100755 tools/run_tests/helper_scripts/pre_build_ruby.sh create mode 100755 tools/run_tests/helper_scripts/prep_xds.sh create mode 100755 tools/run_tests/helper_scripts/run_grpc-node.sh create mode 100755 tools/run_tests/helper_scripts/run_python.sh create mode 100755 tools/run_tests/helper_scripts/run_ruby.sh create mode 100755 tools/run_tests/helper_scripts/run_ruby_end2end_tests.sh create mode 100755 tools/run_tests/helper_scripts/run_tests_in_workspace.sh create mode 100644 tools/run_tests/interop/interop_html_report.template create mode 100755 tools/run_tests/interop/with_nvm.sh create mode 100755 tools/run_tests/interop/with_rvm.sh create mode 100755 tools/run_tests/lb_interop_tests/gen_build_yaml.py create mode 100644 tools/run_tests/performance/README.md create mode 100644 tools/run_tests/performance/__init__.py create mode 100755 tools/run_tests/performance/bq_upload_result.py create mode 100755 tools/run_tests/performance/build_performance.sh create mode 100755 tools/run_tests/performance/build_performance_go.sh create mode 100755 tools/run_tests/performance/build_performance_node.sh create mode 100755 tools/run_tests/performance/build_performance_php7.sh create mode 100755 tools/run_tests/performance/kill_workers.sh create mode 100644 tools/run_tests/performance/massage_qps_stats.py create mode 100644 tools/run_tests/performance/massage_qps_stats_helpers.py create mode 100755 tools/run_tests/performance/patch_scenario_results_schema.py create mode 100755 tools/run_tests/performance/process_local_perf_flamegraphs.sh create mode 100755 tools/run_tests/performance/process_remote_perf_flamegraphs.sh create mode 100755 tools/run_tests/performance/remote_host_build.sh create mode 100755 tools/run_tests/performance/remote_host_prepare.sh create mode 100755 tools/run_tests/performance/run_netperf.sh create mode 100755 tools/run_tests/performance/run_qps_driver.sh create mode 100755 tools/run_tests/performance/run_worker_csharp.sh create mode 100755 tools/run_tests/performance/run_worker_go.sh create mode 100755 tools/run_tests/performance/run_worker_java.sh create mode 100755 tools/run_tests/performance/run_worker_node.sh create mode 100755 tools/run_tests/performance/run_worker_php.sh create mode 100755 tools/run_tests/performance/run_worker_python.sh create mode 100755 tools/run_tests/performance/run_worker_python_asyncio.sh create mode 100755 tools/run_tests/performance/run_worker_ruby.sh create mode 100644 tools/run_tests/performance/scenario_config.py create mode 100644 tools/run_tests/performance/scenario_result_schema.json create mode 100644 tools/run_tests/python_utils/__init__.py create mode 100755 tools/run_tests/python_utils/antagonist.py create mode 100644 tools/run_tests/python_utils/check_on_pr.py create mode 100755 tools/run_tests/python_utils/dockerjob.py create mode 100644 tools/run_tests/python_utils/filter_pull_request_tests.py create mode 100755 tools/run_tests/python_utils/jobset.py create mode 100755 tools/run_tests/python_utils/port_server.py create mode 100644 tools/run_tests/python_utils/report_utils.py create mode 100644 tools/run_tests/python_utils/start_port_server.py create mode 100755 tools/run_tests/python_utils/upload_rbe_results.py create mode 100644 tools/run_tests/python_utils/upload_test_results.py create mode 100755 tools/run_tests/python_utils/watch_dirs.py create mode 100755 tools/run_tests/run_grpclb_interop_tests.py create mode 100755 tools/run_tests/run_interop_tests.py create mode 100755 tools/run_tests/run_microbenchmark.py create mode 100755 tools/run_tests/run_performance_tests.py create mode 100755 tools/run_tests/run_tests.py create mode 100755 tools/run_tests/run_tests_matrix.py create mode 100755 tools/run_tests/run_xds_tests.py create mode 100755 tools/run_tests/sanity/check_bad_dependencies.sh create mode 100755 tools/run_tests/sanity/check_bazel_workspace.py create mode 100755 tools/run_tests/sanity/check_buildifier.sh create mode 100755 tools/run_tests/sanity/check_cache_mk.sh create mode 100755 tools/run_tests/sanity/check_deprecated_grpc++.py create mode 100755 tools/run_tests/sanity/check_owners.sh create mode 100755 tools/run_tests/sanity/check_port_platform.py create mode 100755 tools/run_tests/sanity/check_qps_scenario_changes.py create mode 100755 tools/run_tests/sanity/check_shellcheck.sh create mode 100755 tools/run_tests/sanity/check_submodules.sh create mode 100755 tools/run_tests/sanity/check_test_filtering.py create mode 100755 tools/run_tests/sanity/check_tracer_sanity.py create mode 100755 tools/run_tests/sanity/check_version.py create mode 100755 tools/run_tests/sanity/core_banned_functions.py create mode 100755 tools/run_tests/sanity/core_untyped_structs.sh create mode 100755 tools/run_tests/sanity/cpp_banned_constructs.sh create mode 100644 tools/run_tests/sanity/sanity_tests.yaml create mode 100755 tools/run_tests/start_port_server.py create mode 100755 tools/run_tests/task_runner.py diff --git a/.bazelci/presubmit.yml b/.bazelci/presubmit.yml new file mode 100644 index 00000000..ab0bfd3a --- /dev/null +++ b/.bazelci/presubmit.yml @@ -0,0 +1,23 @@ +# Configuration file for Bazel CI [1]. +# +# Also testing on Bazel CI in addition of our normal CI workflow +# ensures that gRPC is tested against Bazel@HEAD and stays compatible +# with the latest release. +# +# See [2,3] in case you have questions. +# +# [1] https://github.com/bazelbuild/continuous-integration +# [2] https://github.com/grpc/grpc/issues/19171 +# [3] https://github.com/grpc/grpc/pull/20784 +--- +# TODO(yannic): Ideally, we should also enable buildifier and all platforms should test `//...`. +platforms: + ubuntu1604: + build_targets: + - //:all + - //src/proto/... + - //src/python/... + test_targets: + - //:all + - //src/proto/... + - //src/python/... diff --git a/.bazelrc b/.bazelrc new file mode 100644 index 00000000..bc31c54e --- /dev/null +++ b/.bazelrc @@ -0,0 +1,3 @@ +# load bazelrc from the legacy location +# as recommended in https://github.com/bazelbuild/bazel/issues/6319 +import %workspace%/tools/bazel.rc diff --git a/.clang-format b/.clang-format new file mode 100644 index 00000000..b641a647 --- /dev/null +++ b/.clang-format @@ -0,0 +1,11 @@ +--- +Language: Cpp +BasedOnStyle: Google +DerivePointerAlignment: false +PointerAlignment: Left +--- +Language: ObjC +BasedOnStyle: Google +ColumnLimit: 100 +ObjCBlockIndentWidth: 2 +... diff --git a/.clang-tidy b/.clang-tidy new file mode 100644 index 00000000..d2174417 --- /dev/null +++ b/.clang-tidy @@ -0,0 +1,6 @@ +--- +Checks: 'modernize-use-nullptr,google-build-namespaces,google-build-explicit-make-pair,readability-function-size,performance-*,bugprone-*' +WarningsAsErrors: 'modernize-use-nullptr,google-build-namespaces,google-build-explicit-make-pair,readability-function-size,performance-*,bugprone-*' +CheckOptions: + - key: readability-function-size.StatementThreshold + value: '450' diff --git a/.clang_complete b/.clang_complete new file mode 100644 index 00000000..4da3376a --- /dev/null +++ b/.clang_complete @@ -0,0 +1,19 @@ +-Wall +-Wc++-compat +-I. +-Igens +-Iinclude +-Isrc/core/ext/upb-generated +-Ithird_party/abseil-cpp +-Ithird_party/address_sorting/include +-Ithird_party/benchmark/include +-Ithird_party/boringssl-with-bazel/src/include +-Ithird_party/cares +-Ithird_party/cares/cares +-Ithird_party/googletest +-Ithird_party/googletest/googlemock/include +-Ithird_party/googletest/googletest/include +-Ithird_party/googletest/include +-Ithird_party/protobuf/src +-Ithird_party/upb +-Ithird_party/zlib diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..f7445169 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,7 @@ +root = true +[**] +end_of_line = LF +indent_style = space +indent_size = 2 +insert_final_newline = true +tab_width = 8 diff --git a/.gitallowed b/.gitallowed new file mode 100644 index 00000000..24862452 --- /dev/null +++ b/.gitallowed @@ -0,0 +1,2 @@ +# Security tests will contain fake secrets +test/core/security/** diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 00000000..0b3a8c7c --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,8 @@ +# Auto-generated by the tools/mkowners/mkowners.py tool +# Uses OWNERS files in different modules throughout the +# repository as the source of truth for module ownership. +/**/OWNERS @markdroth @nicolasnoble @a11r +/bazel/** @nicolasnoble @jtattermusch @veblush @gnossen +/cmake/** @jtattermusch @nicolasnoble @apolcyn +/src/core/ext/filters/client_channel/** @markdroth +/tools/dockerfile/** @jtattermusch @apolcyn @nicolasnoble diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..dbec90ae --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,41 @@ +--- +name: Report a bug +about: Create a report to help us improve +labels: kind/bug, priority/P2 +assignees: veblush + +--- + + + +### What version of gRPC and what language are you using? + + +### What operating system (Linux, Windows,...) and version? + + +### What runtime / compiler are you using (e.g. python version or version of gcc) + + +### What did you do? +Please provide either 1) A unit test for reproducing the bug or 2) Specific steps for us to follow to reproduce the bug. If there’s not enough information to debug the problem, gRPC team may close the issue at their discretion. You’re welcome to re-open the issue once you have a reproduction. + +### What did you expect to see? + + +### What did you see instead? + +Make sure you include information that can help us debug (full error message, exception listing, stack trace, logs). + +See [TROUBLESHOOTING.md](https://github.com/grpc/grpc/blob/master/TROUBLESHOOTING.md) for how to diagnose problems better. + +### Anything else we should know about your project / environment? diff --git a/.github/ISSUE_TEMPLATE/cleanup_request.md b/.github/ISSUE_TEMPLATE/cleanup_request.md new file mode 100644 index 00000000..d821fef2 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/cleanup_request.md @@ -0,0 +1,19 @@ +--- +name: Request a cleanup +about: Suggest a cleanup in our repository +labels: kind/internal cleanup, priority/P2 +assignees: veblush + +--- + + + diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000..5a2f61d1 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,30 @@ +--- +name: Request a feature +about: Suggest an idea for this project +labels: kind/enhancement, priority/P2 +assignees: veblush + +--- + + + +### Is your feature request related to a problem? Please describe. +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +### Describe the solution you'd like +A clear and concise description of what you want to happen. + +### Describe alternatives you've considered +A clear and concise description of any alternative solutions or features you've considered. + +### Additional context +Add any other context about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md new file mode 100644 index 00000000..68f5dfb2 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/question.md @@ -0,0 +1,17 @@ +--- +name: Ask a question +about: Ask a question +labels: kind/question, priority/P3 +assignees: veblush + +--- + +PLEASE DO NOT POST A QUESTION HERE. +This form is for bug reports and feature requests ONLY! + +For general questions and troubleshooting, please ask/look for answers at StackOverflow, with "grpc" tag: https://stackoverflow.com/questions/tagged/grpc + +For questions that specifically need to be answered by gRPC team members, please ask/look for answers at grpc.io mailing list: https://groups.google.com/forum/#!forum/grpc-io + +This issue will be closed down once seen by the repo managers. + diff --git a/.github/lock.yml b/.github/lock.yml new file mode 100644 index 00000000..119e4840 --- /dev/null +++ b/.github/lock.yml @@ -0,0 +1,2 @@ +daysUntilLock: 90 +lockComment: false diff --git a/.github/mergeable.yml b/.github/mergeable.yml new file mode 100644 index 00000000..e82ad328 --- /dev/null +++ b/.github/mergeable.yml @@ -0,0 +1,18 @@ +mergeable: + pull_requests: + label: + and: + - must_exclude: + regex: '^disposition/DO NOT MERGE' + message: 'Pull request marked not mergeable' + - or: + - and: + - must_include: + regex: '^release notes: yes' + message: 'Please add the label (release notes: yes)' + - must_include: + regex: '^lang\/' + message: 'Please add a language label (lang/...)' + - must_include: + regex: '^release notes: no' + message: 'Please add the label (release notes: no)' diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 00000000..366b6860 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,11 @@ + + + + + +@veblush diff --git a/.github/stale.yml b/.github/stale.yml new file mode 100644 index 00000000..081cb6d7 --- /dev/null +++ b/.github/stale.yml @@ -0,0 +1,60 @@ +# Configuration for probot-stale - https://github.com/probot/stale + +# Number of days of inactivity before an Issue or Pull Request becomes stale +daysUntilStale: 90 + +# Number of days of inactivity before an Issue or Pull Request with the stale label is closed. +# Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale. +daysUntilClose: 7 + +# Only issues or pull requests with all of these labels are check if stale. Defaults to `[]` (disabled) +onlyLabels: [] + +# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable +exemptLabels: + - "disposition/never stale" + - "kind/bug" + +# Set to true to ignore issues in a project (defaults to false) +exemptProjects: false + +# Set to true to ignore issues in a milestone (defaults to false) +exemptMilestones: false + +# Set to true to ignore issues with an assignee (defaults to false) +exemptAssignees: false + +# Label to use when marking as stale +staleLabel: "disposition/stale" + +# Comment to post when marking as stale. Set to `false` to disable +markComment: > + This issue/PR has been automatically marked as stale because it has not had any update (including + commits, comments, labels, milestones, etc) for 30 days. It will be closed automatically if no + further update occurs in 7 day. Thank you for your contributions! + +# Comment to post when removing the stale label. +# unmarkComment: > +# Your comment here. + +# Comment to post when closing a stale Issue or Pull Request. +# closeComment: > +# Your comment here. + +# Limit the number of actions per hour, from 1-30. Default is 30 +limitPerRun: 30 + +# Limit to only `issues` or `pulls` +# only: issues + +# Optionally, specify configuration settings that are specific to just 'issues' or 'pulls': +# pulls: +# daysUntilStale: 30 +# markComment: > +# This pull request has been automatically marked as stale because it has not had +# recent activity. It will be closed if no further activity occurs. Thank you +# for your contributions. + +# issues: +# exemptLabels: +# - confirmed diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..c0ec8813 --- /dev/null +++ b/.gitignore @@ -0,0 +1,153 @@ +# C/C++ build outputs +.build/ +bins +gens +libs +objs + +# Python items +cython_debug/ +python_build/ +yapf_virtual_environment/ +python_pylint_venv/ +.coverage* +.eggs +htmlcov/ +dist/ +*.egg +py27_gevent/ +py27_native/ +py3[0-9]_gevent/ +py3[0-9]_native/ +a.out +src/python/grpcio_*/LICENSE +src/python/grpcio_status/grpc_status/google/rpc/status.proto +.pytype +*.egg-info + +# Node installation output +node_modules +src/node/extension_binary/ + +# gcov coverage data +reports +coverage +*.gcno + +# profiler output +*.prof + +# python compiled objects +*.pyc + +# eclipse project files +.cproject +.project +.settings + +# cache for run_tests.py +.run_tests_cache +.preprocessed_build + +# emacs temp files +*~ + +# vim temp files +.*.swp + +# Makefile's cache +cache.mk + +# Ruby's local gem information +Gemfile.lock + +# Temporary test reports +report.xml +*/sponge_log.xml +latency_trace.txt +latency_trace.*.txt + +# port server log +portlog.txt + +# gyp generated make files +*-gyp.mk +out + +# YCM config files +.ycm_extra_conf.py + +# XCode +^build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +*.xccheckout +*.moved-aside +DerivedData +*.hmap +*.ipa +*.xcuserstate +*.DS_Store + +# Objective-C generated files +*.pbobjc.* +*.pbrpc.* +src/objective-c/**/Build + +# Cocoapods artifacts +Pods/ +Podfile.lock +*.xcworkspace + +# Artifacts directory +/artifacts/ + +# Git generated files for conflicting +*.orig + +# IDE specific folder for JetBrains IDEs +.idea/ + +# Bazel files +bazel-* +bazel_format_virtual_environment/ +tools/bazel-* + +# Debug output +gdb.txt + +# ctags file +tags + +# perf data +memory_usage.csv +perf.data +perf.data.old + +# bm_diff +bm_diff_new/ +bm_diff_old/ +bm_*.json + +# cmake build files +**/cmake/build/ + +# Visual Studio Code artifacts +.vscode/* +.history/ + +# Clion artifacts +cmake-build-debug/ + +# Benchmark outputs +BenchmarkDotNet.Artifacts/ + +# pyenv config +.python-version diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..aefc8f94 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,48 @@ +[submodule "third_party/zlib"] + path = third_party/zlib + url = https://github.com/madler/zlib + # When using CMake to build, the zlib submodule ends up with a + # generated file that makes Git consider the submodule dirty. This + # state can be ignored for day-to-day development on gRPC. + ignore = dirty +[submodule "third_party/protobuf"] + path = third_party/protobuf + url = https://github.com/google/protobuf.git +[submodule "third_party/gflags"] + path = third_party/gflags + url = https://github.com/gflags/gflags.git +[submodule "third_party/googletest"] + path = third_party/googletest + url = https://github.com/google/googletest.git +[submodule "third_party/benchmark"] + path = third_party/benchmark + url = https://github.com/google/benchmark +[submodule "third_party/boringssl-with-bazel"] + path = third_party/boringssl-with-bazel + url = https://github.com/google/boringssl.git +[submodule "third_party/cares/cares"] + path = third_party/cares/cares + url = https://github.com/c-ares/c-ares.git + branch = cares-1_12_0 +[submodule "third_party/bloaty"] + path = third_party/bloaty + url = https://github.com/google/bloaty.git +[submodule "third_party/abseil-cpp"] + path = third_party/abseil-cpp + url = https://github.com/abseil/abseil-cpp.git + branch = lts_2020_02_25 +[submodule "third_party/envoy-api"] + path = third_party/envoy-api + url = https://github.com/envoyproxy/data-plane-api.git +[submodule "third_party/googleapis"] + path = third_party/googleapis + url = https://github.com/googleapis/googleapis.git +[submodule "third_party/protoc-gen-validate"] + path = third_party/protoc-gen-validate + url = https://github.com/envoyproxy/protoc-gen-validate.git +[submodule "third_party/udpa"] + path = third_party/udpa + url = https://github.com/cncf/udpa.git +[submodule "third_party/libuv"] + path = third_party/libuv + url = https://github.com/libuv/libuv.git diff --git a/.istanbul.yml b/.istanbul.yml new file mode 100644 index 00000000..9ff1379f --- /dev/null +++ b/.istanbul.yml @@ -0,0 +1,6 @@ +reporting: + watermarks: + statements: [80, 95] + lines: [80, 95] + functions: [80, 95] + branches: [80, 95] diff --git a/.pylintrc b/.pylintrc new file mode 100644 index 00000000..be8be6b6 --- /dev/null +++ b/.pylintrc @@ -0,0 +1,97 @@ +[MASTER] +ignore= + src/python/grpcio/grpc/beta, + src/python/grpcio/grpc/framework, + src/python/grpcio/grpc/framework/common, + src/python/grpcio/grpc/framework/foundation, + src/python/grpcio/grpc/framework/interfaces, + +extension-pkg-whitelist=grpc._cython.cygrpc + +[VARIABLES] + +# TODO(https://github.com/PyCQA/pylint/issues/1345): How does the inspection +# not include "unused_" and "ignored_" by default? +dummy-variables-rgx=^ignored_|^unused_|_ + +[DESIGN] + +# NOTE(nathaniel): Not particularly attached to this value; it just seems to +# be what works for us at the moment (excepting the dead-code-walking Beta +# API). +max-args=14 +max-parents=8 + +[MISCELLANEOUS] + +# NOTE(nathaniel): We are big fans of "TODO(): " and +# "NOTE(): ". We do not allow "TODO:", +# "TODO():", "FIXME:", or anything else. +notes=FIXME,XXX + +[MESSAGES CONTROL] + +disable= + # TODO(https://github.com/PyCQA/pylint/issues/59#issuecomment-283774279): + # Enable cyclic-import after a 1.7-or-later pylint release that + # recognizes our disable=cyclic-import suppressions. + cyclic-import, + # TODO(https://github.com/grpc/grpc/issues/8622): Enable this after the + # Beta API is removed. + duplicate-code, + # TODO(https://github.com/grpc/grpc/issues/261): Doesn't seem to + # understand enum and concurrent.futures; look into this later with the + # latest pylint version. + import-error, + # TODO(https://github.com/grpc/grpc/issues/261): Enable this one. + # Should take a little configuration but not much. + invalid-name, + # TODO(https://github.com/grpc/grpc/issues/261): This doesn't seem to + # work for now? Try with a later pylint? + locally-disabled, + # NOTE(nathaniel): What even is this? *Enabling* an inspection results + # in a warning? How does that encourage more analysis and coverage? + locally-enabled, + # NOTE(nathaniel): We don't write doc strings for most private code + # elements. + missing-docstring, + # NOTE(nathaniel): In numeric comparisons it is better to have the + # lesser (or lesser-or-equal-to) quantity on the left when the + # expression is true than it is to worry about which is an identifier + # and which a literal value. + misplaced-comparison-constant, + # NOTE(nathaniel): Our completely abstract interface classes don't have + # constructors. + no-init, + # TODO(https://github.com/grpc/grpc/issues/261): Doesn't yet play + # nicely with some of our code being implemented in Cython. Maybe in a + # later version? + no-name-in-module, + # TODO(https://github.com/grpc/grpc/issues/261): Suppress these where + # the odd shape of the authentication portion of the API forces them on + # us and enable everywhere else. + protected-access, + # NOTE(nathaniel): Pylint and I will probably never agree on this. + too-few-public-methods, + # NOTE(nathaniel): Pylint and I wil probably never agree on this for + # private classes. For public classes maybe? + too-many-instance-attributes, + # NOTE(nathaniel): Some of our modules have a lot of lines... of + # specification and documentation. Maybe if this were + # lines-of-code-based we would use it. + too-many-lines, + # TODO(https://github.com/grpc/grpc/issues/261): Maybe we could have + # this one if we extracted just a few more helper functions... + too-many-nested-blocks, + # TODO(https://github.com/grpc/grpc/issues/261): Disable unnecessary + # super-init requirement for abstract class implementations for now. + super-init-not-called, + # NOTE(nathaniel): A single statement that always returns program + # control is better than two statements the first of which sometimes + # returns program control and the second of which always returns + # program control. Probably generally, but definitely in the cases of + # if:/else: and for:/else:. + useless-else-on-loop, + no-else-return, + # NOTE(lidiz): Python 3 make object inheritance default, but not PY2 + useless-object-inheritance, diff --git a/.pylintrc-examples b/.pylintrc-examples new file mode 100644 index 00000000..9480d6ea --- /dev/null +++ b/.pylintrc-examples @@ -0,0 +1,100 @@ +[MASTER] +ignore= + src/python/grpcio/grpc/beta, + src/python/grpcio/grpc/framework, + src/python/grpcio/grpc/framework/common, + src/python/grpcio/grpc/framework/foundation, + src/python/grpcio/grpc/framework/interfaces, + +[VARIABLES] + +# TODO(https://github.com/PyCQA/pylint/issues/1345): How does the inspection +# not include "unused_" and "ignored_" by default? +dummy-variables-rgx=^ignored_|^unused_ + +[DESIGN] + +# NOTE(nathaniel): Not particularly attached to this value; it just seems to +# be what works for us at the moment (excepting the dead-code-walking Beta +# API). +max-args=6 + +[MISCELLANEOUS] + +# NOTE(nathaniel): We are big fans of "TODO(): " and +# "NOTE(): ". We do not allow "TODO:", +# "TODO():", "FIXME:", or anything else. +notes=FIXME,XXX + +[MESSAGES CONTROL] + +disable= + # -- START OF EXAMPLE-SPECIFIC SUPPRESSIONS -- + no-self-use, + unused-argument, + unused-variable, + # -- END OF EXAMPLE-SPECIFIC SUPPRESSIONS -- + + # TODO(https://github.com/PyCQA/pylint/issues/59#issuecomment-283774279): + # Enable cyclic-import after a 1.7-or-later pylint release that + # recognizes our disable=cyclic-import suppressions. + cyclic-import, + # TODO(https://github.com/grpc/grpc/issues/8622): Enable this after the + # Beta API is removed. + duplicate-code, + # TODO(https://github.com/grpc/grpc/issues/261): Doesn't seem to + # understand enum and concurrent.futures; look into this later with the + # latest pylint version. + import-error, + # TODO(https://github.com/grpc/grpc/issues/261): Enable this one. + # Should take a little configuration but not much. + invalid-name, + # TODO(https://github.com/grpc/grpc/issues/261): This doesn't seem to + # work for now? Try with a later pylint? + locally-disabled, + # NOTE(nathaniel): What even is this? *Enabling* an inspection results + # in a warning? How does that encourage more analysis and coverage? + locally-enabled, + # NOTE(nathaniel): We don't write doc strings for most private code + # elements. + missing-docstring, + # NOTE(nathaniel): In numeric comparisons it is better to have the + # lesser (or lesser-or-equal-to) quantity on the left when the + # expression is true than it is to worry about which is an identifier + # and which a literal value. + misplaced-comparison-constant, + # NOTE(nathaniel): Our completely abstract interface classes don't have + # constructors. + no-init, + # TODO(https://github.com/grpc/grpc/issues/261): Doesn't yet play + # nicely with some of our code being implemented in Cython. Maybe in a + # later version? + no-name-in-module, + # TODO(https://github.com/grpc/grpc/issues/261): Suppress these where + # the odd shape of the authentication portion of the API forces them on + # us and enable everywhere else. + protected-access, + # NOTE(nathaniel): Pylint and I will probably never agree on this. + too-few-public-methods, + # NOTE(nathaniel): Pylint and I wil probably never agree on this for + # private classes. For public classes maybe? + too-many-instance-attributes, + # NOTE(nathaniel): Some of our modules have a lot of lines... of + # specification and documentation. Maybe if this were + # lines-of-code-based we would use it. + too-many-lines, + # TODO(https://github.com/grpc/grpc/issues/261): Maybe we could have + # this one if we extracted just a few more helper functions... + too-many-nested-blocks, + # TODO(https://github.com/grpc/grpc/issues/261): Disable unnecessary + # super-init requirement for abstract class implementations for now. + super-init-not-called, + # NOTE(nathaniel): A single statement that always returns program + # control is better than two statements the first of which sometimes + # returns program control and the second of which always returns + # program control. Probably generally, but definitely in the cases of + # if:/else: and for:/else:. + useless-else-on-loop, + no-else-return, + # NOTE(lidiz): Python 3 make object inheritance default, but not PY2 + useless-object-inheritance, diff --git a/.pylintrc-tests b/.pylintrc-tests new file mode 100644 index 00000000..d9cc4d10 --- /dev/null +++ b/.pylintrc-tests @@ -0,0 +1,126 @@ +[MASTER] +ignore= + src/python/grpcio_tests/tests/unit/beta, + src/python/grpcio_tests/tests/unit/framework, + src/python/grpcio_tests/tests/unit/framework/common, + src/python/grpcio_tests/tests/unit/framework/foundation, + +[VARIABLES] + +# TODO(https://github.com/PyCQA/pylint/issues/1345): How does the inspection +# not include "unused_" and "ignored_" by default? +dummy-variables-rgx=^ignored_|^unused_ + +[DESIGN] + +# NOTE(nathaniel): Not particularly attached to this value; it just seems to +# be what works for us at the moment (excepting the dead-code-walking Beta +# API). +max-args=6 + +[MISCELLANEOUS] + +# NOTE(nathaniel): We are big fans of "TODO(): " and +# "NOTE(): ". We do not allow "TODO:", +# "TODO():", "FIXME:", or anything else. +notes=FIXME,XXX + +[MESSAGES CONTROL] + +extension-pkg-whitelist=grpc._cython.cygrpc + +disable= + # These suppressions are specific to tests: + # + # TODO(https://github.com/grpc/grpc/issues/261): investigate + # each of the following one by one and consider eliminating + # the suppression category. + # Eventually, the hope is to eliminate the .pylintrc-tests + # altogether and rely on .pylintrc for everything. + pointless-statement, + no-member, + no-self-use, + attribute-defined-outside-init, + unused-argument, + unused-variable, + unused-import, + redefined-builtin, + too-many-public-methods, + too-many-locals, + redefined-variable-type, + redefined-outer-name, + ungrouped-imports, + too-many-branches, + too-many-arguments, + too-many-format-args, + too-many-return-statements, + too-many-statements, + line-too-long, + wrong-import-position, + wrong-import-order, + # -- END OF TEST-SPECIFIC SUPPRESSIONS -- + + + # TODO(https://github.com/PyCQA/pylint/issues/59#issuecomment-283774279): + # Enable cyclic-import after a 1.7-or-later pylint release that + # recognizes our disable=cyclic-import suppressions. + cyclic-import, + # TODO(https://github.com/grpc/grpc/issues/8622): Enable this after the + # Beta API is removed. + duplicate-code, + # TODO(https://github.com/grpc/grpc/issues/261): Doesn't seem to + # understand enum and concurrent.futures; look into this later with the + # latest pylint version. + import-error, + # TODO(https://github.com/grpc/grpc/issues/261): Enable this one. + # Should take a little configuration but not much. + invalid-name, + # TODO(https://github.com/grpc/grpc/issues/261): This doesn't seem to + # work for now? Try with a later pylint? + locally-disabled, + # NOTE(nathaniel): What even is this? *Enabling* an inspection results + # in a warning? How does that encourage more analysis and coverage? + locally-enabled, + # NOTE(nathaniel): We don't write doc strings for most private code + # elements. + missing-docstring, + # NOTE(nathaniel): In numeric comparisons it is better to have the + # lesser (or lesser-or-equal-to) quantity on the left when the + # expression is true than it is to worry about which is an identifier + # and which a literal value. + misplaced-comparison-constant, + # NOTE(nathaniel): Our completely abstract interface classes don't have + # constructors. + no-init, + # TODO(https://github.com/grpc/grpc/issues/261): Doesn't yet play + # nicely with some of our code being implemented in Cython. Maybe in a + # later version? + no-name-in-module, + # TODO(https://github.com/grpc/grpc/issues/261): Suppress these where + # the odd shape of the authentication portion of the API forces them on + # us and enable everywhere else. + protected-access, + # NOTE(nathaniel): Pylint and I will probably never agree on this. + too-few-public-methods, + # NOTE(nathaniel): Pylint and I wil probably never agree on this for + # private classes. For public classes maybe? + too-many-instance-attributes, + # NOTE(nathaniel): Some of our modules have a lot of lines... of + # specification and documentation. Maybe if this were + # lines-of-code-based we would use it. + too-many-lines, + # TODO(https://github.com/grpc/grpc/issues/261): Maybe we could have + # this one if we extracted just a few more helper functions... + too-many-nested-blocks, + # TODO(https://github.com/grpc/grpc/issues/261): Disable unnecessary + # super-init requirement for abstract class implementations for now. + super-init-not-called, + # NOTE(nathaniel): A single statement that always returns program + # control is better than two statements the first of which sometimes + # returns program control and the second of which always returns + # program control. Probably generally, but definitely in the cases of + # if:/else: and for:/else:. + useless-else-on-loop, + no-else-return, + # NOTE(lidiz): Python 3 make object inheritance default, but not PY2 + useless-object-inheritance, diff --git a/.rspec b/.rspec new file mode 100755 index 00000000..b94d663c --- /dev/null +++ b/.rspec @@ -0,0 +1,6 @@ +-Isrc/ruby +-Isrc/ruby/pb +--backtrace +--require spec/spec_helper +--format documentation +--color diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..94bf382b --- /dev/null +++ b/.travis.yml @@ -0,0 +1,70 @@ +git: + depth: 1 +language: objective-c +osx_image: xcode7.3 +env: + global: + - CONFIG=opt + - TEST=objc + - JOBS=1 + matrix: + - SCHEME="RxLibraryUnitTests" + WORKSPACE="Tests.xcworkspace" TEST_PATH="src/objective-c/tests" BUILD_ONLY="false" + INTEROP_SERVER="false" + - SCHEME="InteropTestsLocalSSL" + WORKSPACE="Tests.xcworkspace" TEST_PATH="src/objective-c/tests" BUILD_ONLY="false" + INTEROP_SERVER="true" + - SCHEME="InteropTestsLocalCleartext" + WORKSPACE="Tests.xcworkspace" TEST_PATH="src/objective-c/tests" BUILD_ONLY="false" + INTEROP_SERVER="true" + # TODO(jcanizales): Make tests an app project (instead of library), so the following will work. + # - SCHEME="InteropTestsRemote" + # WORKSPACE="Tests.xcworkspace" TEST_PATH="src/objective-c/tests" BUILD_ONLY="false" + # INTEROP_SERVER="true" + - SCHEME="HelloWorld" + WORKSPACE="HelloWorld.xcworkspace" TEST_PATH="examples/objective-c/helloworld" + BUILD_ONLY="true" INTEROP_SERVER="false" + - SCHEME="RouteGuideClient" + WORKSPACE="RouteGuideClient.xcworkspace" TEST_PATH="examples/objective-c/route_guide" + BUILD_ONLY="true" INTEROP_SERVER="false" + - SCHEME="AuthSample" + WORKSPACE="AuthSample.xcworkspace" TEST_PATH="examples/objective-c/auth_sample" + BUILD_ONLY="true" INTEROP_SERVER="false" + - SCHEME="Sample" + WORKSPACE="Sample.xcworkspace" TEST_PATH="src/objective-c/examples/Sample" BUILD_ONLY="true" + INTEROP_SERVER="false" + - SCHEME="Sample" + WORKSPACE="Sample.xcworkspace" TEST_PATH="src/objective-c/examples/Sample" BUILD_ONLY="true" + INTEROP_SERVER="false" FRAMEWORKS="YES" + - SCHEME="SwiftSample" + WORKSPACE="SwiftSample.xcworkspace" TEST_PATH="src/objective-c/examples/SwiftSample" + BUILD_ONLY="true" INTEROP_SERVER="false" +before_install: + # Until Travis upgrades from Cocoapods 0.39, we need to do it here. + - pod --version + - gem uninstall cocoapods -a + - gem install cocoapods -v '1.0.1' + - pod --version + # Recent pods aren't found if we don't explicitly update Cocoapods' repo. + - pod repo update + - brew install gflags +install: + - pushd $TEST_PATH + - pod install + - popd +before_script: + - if [ "${INTEROP_SERVER}" = "true" ]; then + make interop_server; + (bins/$CONFIG/interop_server --port=5050 &); + (bins/$CONFIG/interop_server --port=5051 --use_tls &); + fi +script: + - if [ "${BUILD_ONLY}" = "true" ]; then + xctool -workspace "$TEST_PATH/$WORKSPACE" -scheme "$SCHEME" + -sdk iphonesimulator9.3 build; + else + xctool -workspace "$TEST_PATH/$WORKSPACE" -scheme "$SCHEME" + -sdk iphonesimulator9.3 test; + fi +notifications: + email: false diff --git a/.yapfignore b/.yapfignore new file mode 100644 index 00000000..8601c86d --- /dev/null +++ b/.yapfignore @@ -0,0 +1,35 @@ +# this file is auto-generated +*protoc_lib_deps.py + +# no need to format protoc generated files +*_pb2*.py + +# no need to format build-yaml generated files +*.gen.py + +# generated files from a template +*test/cpp/naming/resolver_component_tests_runner.py + +# No BUILD, .bzl files +*BUILD +*.bzl +*.bazelrc + +# No other languages +*.bat +*.c +*.c++ +*.cc +*.css +*.go +*.h +*.html +*.json +*.md +*.objc +*.php +*.proto +*.rb +*.sh +*.xml +*.yaml diff --git a/.yardopts b/.yardopts new file mode 100644 index 00000000..3bc779d4 --- /dev/null +++ b/.yardopts @@ -0,0 +1 @@ +src/ruby/**/*.rb \ No newline at end of file diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 00000000..0c5fee8c --- /dev/null +++ b/AUTHORS @@ -0,0 +1,4 @@ +Dropbox, Inc. +Google Inc. +Skyscanner Ltd. +WeWork Companies Inc. diff --git a/BUILD b/BUILD new file mode 100644 index 00000000..4345ff28 --- /dev/null +++ b/BUILD @@ -0,0 +1,2853 @@ +# gRPC Bazel BUILD file. +# +# Copyright 2016 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +licenses(["notice"]) + +exports_files([ + "LICENSE", + "etc/roots.pem", +]) + +package( + default_visibility = ["//visibility:public"], + features = [ + "-layering_check", + "-parse_headers", + ], +) + +load( + "//bazel:grpc_build_system.bzl", + "grpc_cc_library", + "grpc_generate_one_off_targets", + "grpc_upb_proto_library", + "python_config_settings", +) + +config_setting( + name = "grpc_no_ares", + values = {"define": "grpc_no_ares=true"}, +) + +config_setting( + name = "grpc_allow_exceptions", + values = {"define": "GRPC_ALLOW_EXCEPTIONS=1"}, +) + +config_setting( + name = "grpc_disallow_exceptions", + values = {"define": "GRPC_ALLOW_EXCEPTIONS=0"}, +) + +config_setting( + name = "remote_execution", + values = {"define": "GRPC_PORT_ISOLATED_RUNTIME=1"}, +) + +config_setting( + name = "windows", + values = {"cpu": "x64_windows"}, +) + +config_setting( + name = "windows_msvc", + values = {"cpu": "x64_windows_msvc"}, +) + +config_setting( + name = "mac_x86_64", + values = {"cpu": "darwin"}, +) + +python_config_settings() + +# This should be updated along with build.yaml +g_stands_for = "gradius" + +core_version = "10.0.0" + +version = "1.30.2" + +GPR_PUBLIC_HDRS = [ + "include/grpc/support/alloc.h", + "include/grpc/support/atm.h", + "include/grpc/support/atm_gcc_atomic.h", + "include/grpc/support/atm_gcc_sync.h", + "include/grpc/support/atm_windows.h", + "include/grpc/support/cpu.h", + "include/grpc/support/log.h", + "include/grpc/support/log_windows.h", + "include/grpc/support/port_platform.h", + "include/grpc/support/string_util.h", + "include/grpc/support/sync.h", + "include/grpc/support/sync_abseil.h", + "include/grpc/support/sync_custom.h", + "include/grpc/support/sync_generic.h", + "include/grpc/support/sync_posix.h", + "include/grpc/support/sync_windows.h", + "include/grpc/support/thd_id.h", + "include/grpc/support/time.h", +] + +GRPC_PUBLIC_HDRS = [ + "include/grpc/byte_buffer.h", + "include/grpc/byte_buffer_reader.h", + "include/grpc/compression.h", + "include/grpc/fork.h", + "include/grpc/grpc.h", + "include/grpc/grpc_posix.h", + "include/grpc/grpc_security_constants.h", + "include/grpc/slice.h", + "include/grpc/slice_buffer.h", + "include/grpc/status.h", + "include/grpc/load_reporting.h", + "include/grpc/support/workaround_list.h", +] + +GRPC_SECURE_PUBLIC_HDRS = [ + "include/grpc/grpc_security.h", +] + +# TODO(ctiller): layer grpc atop grpc_unsecure, layer grpc++ atop grpc++_unsecure +GRPCXX_SRCS = [ + "src/cpp/client/channel_cc.cc", + "src/cpp/client/client_context.cc", + "src/cpp/client/client_interceptor.cc", + "src/cpp/client/create_channel.cc", + "src/cpp/client/create_channel_internal.cc", + "src/cpp/client/create_channel_posix.cc", + "src/cpp/client/credentials_cc.cc", + "src/cpp/common/alarm.cc", + "src/cpp/common/channel_arguments.cc", + "src/cpp/common/channel_filter.cc", + "src/cpp/common/completion_queue_cc.cc", + "src/cpp/common/core_codegen.cc", + "src/cpp/common/resource_quota_cc.cc", + "src/cpp/common/rpc_method.cc", + "src/cpp/common/version_cc.cc", + "src/cpp/common/validate_service_config.cc", + "src/cpp/server/async_generic_service.cc", + "src/cpp/server/channel_argument_option.cc", + "src/cpp/server/create_default_thread_pool.cc", + "src/cpp/server/dynamic_thread_pool.cc", + "src/cpp/server/external_connection_acceptor_impl.cc", + "src/cpp/server/health/default_health_check_service.cc", + "src/cpp/server/health/health_check_service.cc", + "src/cpp/server/health/health_check_service_server_builder_option.cc", + "src/cpp/server/server_builder.cc", + "src/cpp/server/server_callback.cc", + "src/cpp/server/server_cc.cc", + "src/cpp/server/server_context.cc", + "src/cpp/server/server_credentials.cc", + "src/cpp/server/server_posix.cc", + "src/cpp/thread_manager/thread_manager.cc", + "src/cpp/util/byte_buffer_cc.cc", + "src/cpp/util/status.cc", + "src/cpp/util/string_ref.cc", + "src/cpp/util/time_cc.cc", +] + +GRPCXX_HDRS = [ + "src/cpp/client/create_channel_internal.h", + "src/cpp/common/channel_filter.h", + "src/cpp/server/dynamic_thread_pool.h", + "src/cpp/server/external_connection_acceptor_impl.h", + "src/cpp/server/health/default_health_check_service.h", + "src/cpp/server/thread_pool_interface.h", + "src/cpp/thread_manager/thread_manager.h", +] + +GRPCXX_PUBLIC_HDRS = [ + "include/grpc++/alarm.h", + "include/grpc++/channel.h", + "include/grpc++/client_context.h", + "include/grpc++/completion_queue.h", + "include/grpc++/create_channel.h", + "include/grpc++/create_channel_posix.h", + "include/grpc++/ext/health_check_service_server_builder_option.h", + "include/grpc++/generic/async_generic_service.h", + "include/grpc++/generic/generic_stub.h", + "include/grpc++/grpc++.h", + "include/grpc++/health_check_service_interface.h", + "include/grpc++/impl/call.h", + "include/grpc++/impl/channel_argument_option.h", + "include/grpc++/impl/client_unary_call.h", + "include/grpc++/impl/codegen/core_codegen.h", + "include/grpc++/impl/grpc_library.h", + "include/grpc++/impl/method_handler_impl.h", + "include/grpc++/impl/rpc_method.h", + "include/grpc++/impl/rpc_service_method.h", + "include/grpc++/impl/serialization_traits.h", + "include/grpc++/impl/server_builder_option.h", + "include/grpc++/impl/server_builder_plugin.h", + "include/grpc++/impl/server_initializer.h", + "include/grpc++/impl/service_type.h", + "include/grpc++/security/auth_context.h", + "include/grpc++/resource_quota.h", + "include/grpc++/security/auth_metadata_processor.h", + "include/grpc++/security/credentials.h", + "include/grpc++/security/server_credentials.h", + "include/grpc++/server.h", + "include/grpc++/server_builder.h", + "include/grpc++/server_context.h", + "include/grpc++/server_posix.h", + "include/grpc++/support/async_stream.h", + "include/grpc++/support/async_unary_call.h", + "include/grpc++/support/byte_buffer.h", + "include/grpc++/support/channel_arguments.h", + "include/grpc++/support/config.h", + "include/grpc++/support/slice.h", + "include/grpc++/support/status.h", + "include/grpc++/support/status_code_enum.h", + "include/grpc++/support/string_ref.h", + "include/grpc++/support/stub_options.h", + "include/grpc++/support/sync_stream.h", + "include/grpc++/support/time.h", + "include/grpcpp/alarm.h", + "include/grpcpp/alarm_impl.h", + "include/grpcpp/channel.h", + "include/grpcpp/channel_impl.h", + "include/grpcpp/client_context.h", + "include/grpcpp/completion_queue.h", + "include/grpcpp/completion_queue_impl.h", + "include/grpcpp/create_channel.h", + "include/grpcpp/create_channel_impl.h", + "include/grpcpp/create_channel_posix.h", + "include/grpcpp/create_channel_posix_impl.h", + "include/grpcpp/ext/health_check_service_server_builder_option.h", + "include/grpcpp/generic/async_generic_service.h", + "include/grpcpp/generic/generic_stub.h", + "include/grpcpp/generic/generic_stub_impl.h", + "include/grpcpp/grpcpp.h", + "include/grpcpp/health_check_service_interface.h", + "include/grpcpp/health_check_service_interface_impl.h", + "include/grpcpp/impl/call.h", + "include/grpcpp/impl/channel_argument_option.h", + "include/grpcpp/impl/client_unary_call.h", + "include/grpcpp/impl/codegen/core_codegen.h", + "include/grpcpp/impl/grpc_library.h", + "include/grpcpp/impl/method_handler_impl.h", + "include/grpcpp/impl/rpc_method.h", + "include/grpcpp/impl/rpc_service_method.h", + "include/grpcpp/impl/serialization_traits.h", + "include/grpcpp/impl/server_builder_option.h", + "include/grpcpp/impl/server_builder_option_impl.h", + "include/grpcpp/impl/server_builder_plugin.h", + "include/grpcpp/impl/server_initializer.h", + "include/grpcpp/impl/server_initializer_impl.h", + "include/grpcpp/impl/service_type.h", + "include/grpcpp/resource_quota.h", + "include/grpcpp/resource_quota_impl.h", + "include/grpcpp/security/auth_context.h", + "include/grpcpp/security/auth_metadata_processor.h", + "include/grpcpp/security/auth_metadata_processor_impl.h", + "include/grpcpp/security/credentials.h", + "include/grpcpp/security/credentials_impl.h", + "include/grpcpp/security/server_credentials.h", + "include/grpcpp/security/server_credentials_impl.h", + "include/grpcpp/security/tls_credentials_options.h", + "include/grpcpp/server.h", + "include/grpcpp/server_impl.h", + "include/grpcpp/server_builder.h", + "include/grpcpp/server_builder_impl.h", + "include/grpcpp/server_context.h", + "include/grpcpp/server_posix.h", + "include/grpcpp/server_posix_impl.h", + "include/grpcpp/support/async_stream.h", + "include/grpcpp/support/async_stream_impl.h", + "include/grpcpp/support/async_unary_call.h", + "include/grpcpp/support/async_unary_call_impl.h", + "include/grpcpp/support/byte_buffer.h", + "include/grpcpp/support/channel_arguments.h", + "include/grpcpp/support/channel_arguments_impl.h", + "include/grpcpp/support/client_callback.h", + "include/grpcpp/support/client_callback_impl.h", + "include/grpcpp/support/client_interceptor.h", + "include/grpcpp/support/config.h", + "include/grpcpp/support/interceptor.h", + "include/grpcpp/support/message_allocator.h", + "include/grpcpp/support/method_handler.h", + "include/grpcpp/support/proto_buffer_reader.h", + "include/grpcpp/support/proto_buffer_writer.h", + "include/grpcpp/support/server_callback.h", + "include/grpcpp/support/server_callback_impl.h", + "include/grpcpp/support/server_interceptor.h", + "include/grpcpp/support/slice.h", + "include/grpcpp/support/status.h", + "include/grpcpp/support/status_code_enum.h", + "include/grpcpp/support/string_ref.h", + "include/grpcpp/support/stub_options.h", + "include/grpcpp/support/sync_stream.h", + "include/grpcpp/support/sync_stream_impl.h", + "include/grpcpp/support/time.h", + "include/grpcpp/support/validate_service_config.h", +] + +grpc_cc_library( + name = "gpr", + language = "c++", + public_hdrs = GPR_PUBLIC_HDRS, + standalone = True, + deps = [ + "gpr_base", + ], +) + +grpc_cc_library( + name = "grpc_unsecure", + srcs = [ + "src/core/lib/surface/init.cc", + "src/core/lib/surface/init_unsecure.cc", + "src/core/plugin_registry/grpc_unsecure_plugin_registry.cc", + ], + language = "c++", + public_hdrs = GRPC_PUBLIC_HDRS, + standalone = True, + deps = [ + "grpc_common", + "grpc_lb_policy_cds", + "grpc_lb_policy_eds", + "grpc_lb_policy_grpclb", + "grpc_lb_policy_lrs", + "grpc_lb_policy_xds_routing", + "grpc_resolver_xds", + ], +) + +grpc_cc_library( + name = "grpc", + srcs = [ + "src/core/lib/surface/init.cc", + "src/core/plugin_registry/grpc_plugin_registry.cc", + ], + language = "c++", + public_hdrs = GRPC_PUBLIC_HDRS + GRPC_SECURE_PUBLIC_HDRS, + standalone = True, + deps = [ + "grpc_common", + "grpc_lb_policy_cds_secure", + "grpc_lb_policy_eds_secure", + "grpc_lb_policy_grpclb_secure", + "grpc_lb_policy_lrs_secure", + "grpc_lb_policy_xds_routing", + "grpc_resolver_xds_secure", + "grpc_secure", + "grpc_transport_chttp2_client_secure", + "grpc_transport_chttp2_server_secure", + ], +) + +grpc_cc_library( + name = "grpc++_public_hdrs", + hdrs = GRPCXX_PUBLIC_HDRS, +) + +grpc_cc_library( + name = "grpc++", + srcs = [ + "src/cpp/client/insecure_credentials.cc", + "src/cpp/client/secure_credentials.cc", + "src/cpp/common/auth_property_iterator.cc", + "src/cpp/common/secure_auth_context.cc", + "src/cpp/common/secure_channel_arguments.cc", + "src/cpp/common/secure_create_auth_context.cc", + "src/cpp/common/tls_credentials_options.cc", + "src/cpp/common/tls_credentials_options_util.cc", + "src/cpp/server/insecure_server_credentials.cc", + "src/cpp/server/secure_server_credentials.cc", + ], + hdrs = [ + "src/cpp/client/secure_credentials.h", + "src/cpp/common/secure_auth_context.h", + "src/cpp/common/tls_credentials_options_util.h", + "src/cpp/server/secure_server_credentials.h", + ], + language = "c++", + public_hdrs = GRPCXX_PUBLIC_HDRS, + standalone = True, + deps = [ + "gpr", + "grpc", + "grpc++_base", + "grpc++_codegen_base", + "grpc++_codegen_base_src", + "grpc++_codegen_proto", + "grpc_secure", + ], +) + +grpc_cc_library( + name = "grpc++_unsecure", + srcs = [ + "src/cpp/client/insecure_credentials.cc", + "src/cpp/common/insecure_create_auth_context.cc", + "src/cpp/server/insecure_server_credentials.cc", + ], + language = "c++", + standalone = True, + deps = [ + "gpr", + "grpc++_base_unsecure", + "grpc++_codegen_base", + "grpc++_codegen_base_src", + "grpc++_codegen_proto", + "grpc_unsecure", + ], +) + +grpc_cc_library( + name = "grpc++_error_details", + srcs = [ + "src/cpp/util/error_details.cc", + ], + hdrs = [ + "include/grpc++/support/error_details.h", + "include/grpcpp/support/error_details.h", + "include/grpcpp/support/error_details_impl.h", + ], + language = "c++", + standalone = True, + deps = [ + "grpc++", + "//src/proto/grpc/status:status_proto", + ], +) + +grpc_cc_library( + name = "grpc++_alts", + srcs = [ + "src/cpp/common/alts_context.cc", + "src/cpp/common/alts_util.cc", + ], + hdrs = [ + "include/grpcpp/security/alts_context.h", + "include/grpcpp/security/alts_util.h", + ], + language = "c++", + standalone = True, + deps = [ + "alts_upb", + "alts_util", + "grpc++", + ], +) + +grpc_cc_library( + name = "grpc_csharp_ext", + srcs = [ + "src/csharp/ext/grpc_csharp_ext.c", + ], + language = "csharp", + deps = [ + "gpr", + "grpc", + ], +) + +grpc_cc_library( + name = "census", + srcs = [ + "src/core/ext/filters/census/grpc_context.cc", + ], + language = "c++", + public_hdrs = [ + "include/grpc/census.h", + ], + deps = [ + "grpc_base", + ], +) + +grpc_cc_library( + name = "grpc++_internal_hdrs_only", + hdrs = [ + "include/grpcpp/impl/codegen/sync.h", + ], + language = "c++", + deps = [ + "gpr_codegen", + ], +) + +grpc_cc_library( + name = "gpr_base", + srcs = [ + "src/core/lib/gpr/alloc.cc", + "src/core/lib/gpr/atm.cc", + "src/core/lib/gpr/cpu_iphone.cc", + "src/core/lib/gpr/cpu_linux.cc", + "src/core/lib/gpr/cpu_posix.cc", + "src/core/lib/gpr/cpu_windows.cc", + "src/core/lib/gpr/env_linux.cc", + "src/core/lib/gpr/env_posix.cc", + "src/core/lib/gpr/env_windows.cc", + "src/core/lib/gpr/log.cc", + "src/core/lib/gpr/log_android.cc", + "src/core/lib/gpr/log_linux.cc", + "src/core/lib/gpr/log_posix.cc", + "src/core/lib/gpr/log_windows.cc", + "src/core/lib/gpr/murmur_hash.cc", + "src/core/lib/gpr/string.cc", + "src/core/lib/gpr/string_posix.cc", + "src/core/lib/gpr/string_util_windows.cc", + "src/core/lib/gpr/string_windows.cc", + "src/core/lib/gpr/sync.cc", + "src/core/lib/gpr/sync_abseil.cc", + "src/core/lib/gpr/sync_posix.cc", + "src/core/lib/gpr/sync_windows.cc", + "src/core/lib/gpr/time.cc", + "src/core/lib/gpr/time_posix.cc", + "src/core/lib/gpr/time_precise.cc", + "src/core/lib/gpr/time_windows.cc", + "src/core/lib/gpr/tls_pthread.cc", + "src/core/lib/gpr/tmpfile_msys.cc", + "src/core/lib/gpr/tmpfile_posix.cc", + "src/core/lib/gpr/tmpfile_windows.cc", + "src/core/lib/gpr/wrap_memcpy.cc", + "src/core/lib/gprpp/arena.cc", + "src/core/lib/gprpp/fork.cc", + "src/core/lib/gprpp/global_config_env.cc", + "src/core/lib/gprpp/host_port.cc", + "src/core/lib/gprpp/mpscq.cc", + "src/core/lib/gprpp/thd_posix.cc", + "src/core/lib/gprpp/thd_windows.cc", + "src/core/lib/profiling/basic_timers.cc", + "src/core/lib/profiling/stap_timers.cc", + ], + hdrs = [ + "src/core/lib/gpr/alloc.h", + "src/core/lib/gpr/arena.h", + "src/core/lib/gpr/env.h", + "src/core/lib/gpr/murmur_hash.h", + "src/core/lib/gpr/spinlock.h", + "src/core/lib/gpr/string.h", + "src/core/lib/gpr/string_windows.h", + "src/core/lib/gpr/time_precise.h", + "src/core/lib/gpr/tls.h", + "src/core/lib/gpr/tls_gcc.h", + "src/core/lib/gpr/tls_msvc.h", + "src/core/lib/gpr/tls_pthread.h", + "src/core/lib/gpr/tmpfile.h", + "src/core/lib/gpr/useful.h", + "src/core/lib/gprpp/arena.h", + "src/core/lib/gprpp/atomic.h", + "src/core/lib/gprpp/fork.h", + "src/core/lib/gprpp/global_config.h", + "src/core/lib/gprpp/global_config_custom.h", + "src/core/lib/gprpp/global_config_env.h", + "src/core/lib/gprpp/global_config_generic.h", + "src/core/lib/gprpp/host_port.h", + "src/core/lib/gprpp/manual_constructor.h", + "src/core/lib/gprpp/map.h", + "src/core/lib/gprpp/memory.h", + "src/core/lib/gprpp/mpscq.h", + "src/core/lib/gprpp/sync.h", + "src/core/lib/gprpp/thd.h", + "src/core/lib/profiling/timers.h", + ], + external_deps = [ + "absl/memory", + "absl/strings", + "absl/strings:str_format", + "absl/time:time", + ], + language = "c++", + public_hdrs = GPR_PUBLIC_HDRS, + deps = [ + "gpr_codegen", + "grpc_codegen", + ], +) + +grpc_cc_library( + name = "gpr_codegen", + language = "c++", + public_hdrs = [ + "include/grpc/impl/codegen/atm.h", + "include/grpc/impl/codegen/atm_gcc_atomic.h", + "include/grpc/impl/codegen/atm_gcc_sync.h", + "include/grpc/impl/codegen/atm_windows.h", + "include/grpc/impl/codegen/fork.h", + "include/grpc/impl/codegen/gpr_slice.h", + "include/grpc/impl/codegen/gpr_types.h", + "include/grpc/impl/codegen/log.h", + "include/grpc/impl/codegen/port_platform.h", + "include/grpc/impl/codegen/sync.h", + "include/grpc/impl/codegen/sync_abseil.h", + "include/grpc/impl/codegen/sync_custom.h", + "include/grpc/impl/codegen/sync_generic.h", + "include/grpc/impl/codegen/sync_posix.h", + "include/grpc/impl/codegen/sync_windows.h", + ], +) + +grpc_cc_library( + name = "grpc_trace", + srcs = ["src/core/lib/debug/trace.cc"], + hdrs = ["src/core/lib/debug/trace.h"], + language = "c++", + public_hdrs = GRPC_PUBLIC_HDRS, + deps = [ + "grpc_codegen", + ":gpr", + ], +) + +grpc_cc_library( + name = "atomic", + language = "c++", + public_hdrs = [ + "src/core/lib/gprpp/atomic.h", + ], + deps = [ + "gpr", + ], +) + +grpc_cc_library( + name = "debug_location", + language = "c++", + public_hdrs = ["src/core/lib/gprpp/debug_location.h"], +) + +grpc_cc_library( + name = "orphanable", + language = "c++", + public_hdrs = ["src/core/lib/gprpp/orphanable.h"], + deps = [ + "debug_location", + "gpr_base", + "grpc_trace", + "ref_counted", + "ref_counted_ptr", + ], +) + +grpc_cc_library( + name = "ref_counted", + language = "c++", + public_hdrs = ["src/core/lib/gprpp/ref_counted.h"], + deps = [ + "atomic", + "debug_location", + "gpr_base", + "grpc_trace", + "ref_counted_ptr", + ], +) + +grpc_cc_library( + name = "ref_counted_ptr", + language = "c++", + public_hdrs = ["src/core/lib/gprpp/ref_counted_ptr.h"], + deps = [ + "gpr_base", + ], +) + +grpc_cc_library( + name = "grpc_base_c", + srcs = [ + "src/core/lib/avl/avl.cc", + "src/core/lib/backoff/backoff.cc", + "src/core/lib/channel/channel_args.cc", + "src/core/lib/channel/channel_stack.cc", + "src/core/lib/channel/channel_stack_builder.cc", + "src/core/lib/channel/channel_trace.cc", + "src/core/lib/channel/channelz.cc", + "src/core/lib/channel/channelz_registry.cc", + "src/core/lib/channel/connected_channel.cc", + "src/core/lib/channel/handshaker.cc", + "src/core/lib/channel/handshaker_registry.cc", + "src/core/lib/channel/status_util.cc", + "src/core/lib/compression/compression.cc", + "src/core/lib/compression/compression_args.cc", + "src/core/lib/compression/compression_internal.cc", + "src/core/lib/compression/message_compress.cc", + "src/core/lib/compression/stream_compression.cc", + "src/core/lib/compression/stream_compression_gzip.cc", + "src/core/lib/compression/stream_compression_identity.cc", + "src/core/lib/debug/stats.cc", + "src/core/lib/debug/stats_data.cc", + "src/core/lib/http/format_request.cc", + "src/core/lib/http/httpcli.cc", + "src/core/lib/http/parser.cc", + "src/core/lib/iomgr/buffer_list.cc", + "src/core/lib/iomgr/call_combiner.cc", + "src/core/lib/iomgr/cfstream_handle.cc", + "src/core/lib/iomgr/combiner.cc", + "src/core/lib/iomgr/dualstack_socket_posix.cc", + "src/core/lib/iomgr/endpoint.cc", + "src/core/lib/iomgr/endpoint_cfstream.cc", + "src/core/lib/iomgr/endpoint_pair_posix.cc", + "src/core/lib/iomgr/endpoint_pair_uv.cc", + "src/core/lib/iomgr/endpoint_pair_windows.cc", + "src/core/lib/iomgr/error.cc", + "src/core/lib/iomgr/error_cfstream.cc", + "src/core/lib/iomgr/ev_apple.cc", + "src/core/lib/iomgr/ev_epoll1_linux.cc", + "src/core/lib/iomgr/ev_epollex_linux.cc", + "src/core/lib/iomgr/ev_poll_posix.cc", + "src/core/lib/iomgr/ev_posix.cc", + "src/core/lib/iomgr/ev_windows.cc", + "src/core/lib/iomgr/exec_ctx.cc", + "src/core/lib/iomgr/executor.cc", + "src/core/lib/iomgr/executor/mpmcqueue.cc", + "src/core/lib/iomgr/executor/threadpool.cc", + "src/core/lib/iomgr/fork_posix.cc", + "src/core/lib/iomgr/fork_windows.cc", + "src/core/lib/iomgr/gethostname_fallback.cc", + "src/core/lib/iomgr/gethostname_host_name_max.cc", + "src/core/lib/iomgr/gethostname_sysconf.cc", + "src/core/lib/iomgr/grpc_if_nametoindex_posix.cc", + "src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc", + "src/core/lib/iomgr/internal_errqueue.cc", + "src/core/lib/iomgr/iocp_windows.cc", + "src/core/lib/iomgr/iomgr.cc", + "src/core/lib/iomgr/iomgr_custom.cc", + "src/core/lib/iomgr/iomgr_internal.cc", + "src/core/lib/iomgr/iomgr_posix.cc", + "src/core/lib/iomgr/iomgr_posix_cfstream.cc", + "src/core/lib/iomgr/iomgr_uv.cc", + "src/core/lib/iomgr/iomgr_windows.cc", + "src/core/lib/iomgr/is_epollexclusive_available.cc", + "src/core/lib/iomgr/load_file.cc", + "src/core/lib/iomgr/lockfree_event.cc", + "src/core/lib/iomgr/polling_entity.cc", + "src/core/lib/iomgr/pollset.cc", + "src/core/lib/iomgr/pollset_custom.cc", + "src/core/lib/iomgr/pollset_set.cc", + "src/core/lib/iomgr/pollset_set_custom.cc", + "src/core/lib/iomgr/pollset_set_windows.cc", + "src/core/lib/iomgr/pollset_uv.cc", + "src/core/lib/iomgr/pollset_windows.cc", + "src/core/lib/iomgr/resolve_address.cc", + "src/core/lib/iomgr/resolve_address_custom.cc", + "src/core/lib/iomgr/resolve_address_posix.cc", + "src/core/lib/iomgr/resolve_address_windows.cc", + "src/core/lib/iomgr/resource_quota.cc", + "src/core/lib/iomgr/sockaddr_utils.cc", + "src/core/lib/iomgr/socket_factory_posix.cc", + "src/core/lib/iomgr/socket_mutator.cc", + "src/core/lib/iomgr/socket_utils_common_posix.cc", + "src/core/lib/iomgr/socket_utils_linux.cc", + "src/core/lib/iomgr/socket_utils_posix.cc", + "src/core/lib/iomgr/socket_utils_uv.cc", + "src/core/lib/iomgr/socket_utils_windows.cc", + "src/core/lib/iomgr/socket_windows.cc", + "src/core/lib/iomgr/tcp_client.cc", + "src/core/lib/iomgr/tcp_client_cfstream.cc", + "src/core/lib/iomgr/tcp_client_custom.cc", + "src/core/lib/iomgr/tcp_client_posix.cc", + "src/core/lib/iomgr/tcp_client_windows.cc", + "src/core/lib/iomgr/tcp_custom.cc", + "src/core/lib/iomgr/tcp_posix.cc", + "src/core/lib/iomgr/tcp_server.cc", + "src/core/lib/iomgr/tcp_server_custom.cc", + "src/core/lib/iomgr/tcp_server_posix.cc", + "src/core/lib/iomgr/tcp_server_utils_posix_common.cc", + "src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc", + "src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc", + "src/core/lib/iomgr/tcp_server_windows.cc", + "src/core/lib/iomgr/tcp_uv.cc", + "src/core/lib/iomgr/tcp_windows.cc", + "src/core/lib/iomgr/time_averaged_stats.cc", + "src/core/lib/iomgr/timer.cc", + "src/core/lib/iomgr/timer_custom.cc", + "src/core/lib/iomgr/timer_generic.cc", + "src/core/lib/iomgr/timer_heap.cc", + "src/core/lib/iomgr/timer_manager.cc", + "src/core/lib/iomgr/timer_uv.cc", + "src/core/lib/iomgr/udp_server.cc", + "src/core/lib/iomgr/unix_sockets_posix.cc", + "src/core/lib/iomgr/unix_sockets_posix_noop.cc", + "src/core/lib/iomgr/wakeup_fd_eventfd.cc", + "src/core/lib/iomgr/wakeup_fd_nospecial.cc", + "src/core/lib/iomgr/wakeup_fd_pipe.cc", + "src/core/lib/iomgr/wakeup_fd_posix.cc", + "src/core/lib/iomgr/work_serializer.cc", + "src/core/lib/json/json_reader.cc", + "src/core/lib/json/json_writer.cc", + "src/core/lib/slice/b64.cc", + "src/core/lib/slice/percent_encoding.cc", + "src/core/lib/slice/slice.cc", + "src/core/lib/slice/slice_buffer.cc", + "src/core/lib/slice/slice_intern.cc", + "src/core/lib/slice/slice_string_helpers.cc", + "src/core/lib/surface/api_trace.cc", + "src/core/lib/surface/byte_buffer.cc", + "src/core/lib/surface/byte_buffer_reader.cc", + "src/core/lib/surface/call.cc", + "src/core/lib/surface/call_details.cc", + "src/core/lib/surface/call_log_batch.cc", + "src/core/lib/surface/channel.cc", + "src/core/lib/surface/channel_init.cc", + "src/core/lib/surface/channel_ping.cc", + "src/core/lib/surface/channel_stack_type.cc", + "src/core/lib/surface/completion_queue.cc", + "src/core/lib/surface/completion_queue_factory.cc", + "src/core/lib/surface/event_string.cc", + "src/core/lib/surface/metadata_array.cc", + "src/core/lib/surface/server.cc", + "src/core/lib/surface/validate_metadata.cc", + "src/core/lib/surface/version.cc", + "src/core/lib/transport/bdp_estimator.cc", + "src/core/lib/transport/byte_stream.cc", + "src/core/lib/transport/connectivity_state.cc", + "src/core/lib/transport/error_utils.cc", + "src/core/lib/transport/metadata.cc", + "src/core/lib/transport/metadata_batch.cc", + "src/core/lib/transport/pid_controller.cc", + "src/core/lib/transport/static_metadata.cc", + "src/core/lib/transport/status_conversion.cc", + "src/core/lib/transport/status_metadata.cc", + "src/core/lib/transport/timeout_encoding.cc", + "src/core/lib/transport/transport.cc", + "src/core/lib/transport/transport_op_string.cc", + "src/core/lib/uri/uri_parser.cc", + ], + hdrs = [ + "src/core/lib/avl/avl.h", + "src/core/lib/backoff/backoff.h", + "src/core/lib/channel/channel_args.h", + "src/core/lib/channel/channel_stack.h", + "src/core/lib/channel/channel_stack_builder.h", + "src/core/lib/channel/channel_trace.h", + "src/core/lib/channel/channelz.h", + "src/core/lib/channel/channelz_registry.h", + "src/core/lib/channel/connected_channel.h", + "src/core/lib/channel/context.h", + "src/core/lib/channel/handshaker.h", + "src/core/lib/channel/handshaker_factory.h", + "src/core/lib/channel/handshaker_registry.h", + "src/core/lib/channel/status_util.h", + "src/core/lib/compression/algorithm_metadata.h", + "src/core/lib/compression/compression_args.h", + "src/core/lib/compression/compression_internal.h", + "src/core/lib/compression/message_compress.h", + "src/core/lib/compression/stream_compression.h", + "src/core/lib/compression/stream_compression_gzip.h", + "src/core/lib/compression/stream_compression_identity.h", + "src/core/lib/debug/stats.h", + "src/core/lib/debug/stats_data.h", + "src/core/lib/http/format_request.h", + "src/core/lib/http/httpcli.h", + "src/core/lib/http/parser.h", + "src/core/lib/iomgr/block_annotate.h", + "src/core/lib/iomgr/buffer_list.h", + "src/core/lib/iomgr/call_combiner.h", + "src/core/lib/iomgr/cfstream_handle.h", + "src/core/lib/iomgr/closure.h", + "src/core/lib/iomgr/combiner.h", + "src/core/lib/iomgr/dynamic_annotations.h", + "src/core/lib/iomgr/endpoint.h", + "src/core/lib/iomgr/endpoint_cfstream.h", + "src/core/lib/iomgr/endpoint_pair.h", + "src/core/lib/iomgr/error.h", + "src/core/lib/iomgr/error_cfstream.h", + "src/core/lib/iomgr/error_internal.h", + "src/core/lib/iomgr/ev_apple.h", + "src/core/lib/iomgr/ev_epoll1_linux.h", + "src/core/lib/iomgr/ev_epollex_linux.h", + "src/core/lib/iomgr/ev_poll_posix.h", + "src/core/lib/iomgr/ev_posix.h", + "src/core/lib/iomgr/exec_ctx.h", + "src/core/lib/iomgr/executor.h", + "src/core/lib/iomgr/executor/mpmcqueue.h", + "src/core/lib/iomgr/executor/threadpool.h", + "src/core/lib/iomgr/gethostname.h", + "src/core/lib/iomgr/grpc_if_nametoindex.h", + "src/core/lib/iomgr/internal_errqueue.h", + "src/core/lib/iomgr/iocp_windows.h", + "src/core/lib/iomgr/iomgr.h", + "src/core/lib/iomgr/iomgr_custom.h", + "src/core/lib/iomgr/iomgr_internal.h", + "src/core/lib/iomgr/iomgr_posix.h", + "src/core/lib/iomgr/is_epollexclusive_available.h", + "src/core/lib/iomgr/load_file.h", + "src/core/lib/iomgr/lockfree_event.h", + "src/core/lib/iomgr/nameser.h", + "src/core/lib/iomgr/polling_entity.h", + "src/core/lib/iomgr/pollset.h", + "src/core/lib/iomgr/pollset_custom.h", + "src/core/lib/iomgr/pollset_set.h", + "src/core/lib/iomgr/pollset_set_custom.h", + "src/core/lib/iomgr/pollset_set_windows.h", + "src/core/lib/iomgr/pollset_uv.h", + "src/core/lib/iomgr/pollset_windows.h", + "src/core/lib/iomgr/port.h", + "src/core/lib/iomgr/python_util.h", + "src/core/lib/iomgr/resolve_address.h", + "src/core/lib/iomgr/resolve_address_custom.h", + "src/core/lib/iomgr/resource_quota.h", + "src/core/lib/iomgr/sockaddr.h", + "src/core/lib/iomgr/sockaddr_custom.h", + "src/core/lib/iomgr/sockaddr_posix.h", + "src/core/lib/iomgr/sockaddr_utils.h", + "src/core/lib/iomgr/sockaddr_windows.h", + "src/core/lib/iomgr/socket_factory_posix.h", + "src/core/lib/iomgr/socket_mutator.h", + "src/core/lib/iomgr/socket_utils.h", + "src/core/lib/iomgr/socket_utils_posix.h", + "src/core/lib/iomgr/socket_windows.h", + "src/core/lib/iomgr/sys_epoll_wrapper.h", + "src/core/lib/iomgr/tcp_client.h", + "src/core/lib/iomgr/tcp_client_posix.h", + "src/core/lib/iomgr/tcp_custom.h", + "src/core/lib/iomgr/tcp_posix.h", + "src/core/lib/iomgr/tcp_server.h", + "src/core/lib/iomgr/tcp_server_utils_posix.h", + "src/core/lib/iomgr/tcp_windows.h", + "src/core/lib/iomgr/time_averaged_stats.h", + "src/core/lib/iomgr/timer.h", + "src/core/lib/iomgr/timer_custom.h", + "src/core/lib/iomgr/timer_generic.h", + "src/core/lib/iomgr/timer_heap.h", + "src/core/lib/iomgr/timer_manager.h", + "src/core/lib/iomgr/udp_server.h", + "src/core/lib/iomgr/unix_sockets_posix.h", + "src/core/lib/iomgr/wakeup_fd_pipe.h", + "src/core/lib/iomgr/wakeup_fd_posix.h", + "src/core/lib/iomgr/work_serializer.h", + "src/core/lib/json/json.h", + "src/core/lib/slice/b64.h", + "src/core/lib/slice/percent_encoding.h", + "src/core/lib/slice/slice_hash_table.h", + "src/core/lib/slice/slice_internal.h", + "src/core/lib/slice/slice_string_helpers.h", + "src/core/lib/slice/slice_utils.h", + "src/core/lib/slice/slice_weak_hash_table.h", + "src/core/lib/surface/api_trace.h", + "src/core/lib/surface/call.h", + "src/core/lib/surface/call_test_only.h", + "src/core/lib/surface/channel.h", + "src/core/lib/surface/channel_init.h", + "src/core/lib/surface/channel_stack_type.h", + "src/core/lib/surface/completion_queue.h", + "src/core/lib/surface/completion_queue_factory.h", + "src/core/lib/surface/event_string.h", + "src/core/lib/surface/init.h", + "src/core/lib/surface/lame_client.h", + "src/core/lib/surface/server.h", + "src/core/lib/surface/validate_metadata.h", + "src/core/lib/transport/bdp_estimator.h", + "src/core/lib/transport/byte_stream.h", + "src/core/lib/transport/connectivity_state.h", + "src/core/lib/transport/error_utils.h", + "src/core/lib/transport/http2_errors.h", + "src/core/lib/transport/metadata.h", + "src/core/lib/transport/metadata_batch.h", + "src/core/lib/transport/pid_controller.h", + "src/core/lib/transport/static_metadata.h", + "src/core/lib/transport/status_conversion.h", + "src/core/lib/transport/status_metadata.h", + "src/core/lib/transport/timeout_encoding.h", + "src/core/lib/transport/transport.h", + "src/core/lib/transport/transport_impl.h", + "src/core/lib/uri/uri_parser.h", + ], + external_deps = [ + "madler_zlib", + "absl/container:inlined_vector", + "absl/types:optional", + ], + language = "c++", + public_hdrs = GRPC_PUBLIC_HDRS, + deps = [ + "eventmanager_libuv", + "gpr_base", + "grpc_codegen", + "grpc_trace", + "orphanable", + "ref_counted", + "ref_counted_ptr", + ], +) + +grpc_cc_library( + name = "grpc_base", + srcs = [ + "src/core/lib/surface/lame_client.cc", + ], + language = "c++", + deps = [ + "atomic", + "grpc_base_c", + ], +) + +grpc_cc_library( + name = "grpc_common", + language = "c++", + deps = [ + "grpc_base", + # standard plugins + "census", + "grpc_deadline_filter", + "grpc_client_authority_filter", + "grpc_lb_policy_pick_first", + "grpc_lb_policy_priority", + "grpc_lb_policy_round_robin", + "grpc_lb_policy_weighted_target", + "grpc_client_idle_filter", + "grpc_max_age_filter", + "grpc_message_size_filter", + "grpc_resolver_dns_ares", + "grpc_resolver_fake", + "grpc_resolver_dns_native", + "grpc_resolver_sockaddr", + "grpc_transport_chttp2_client_insecure", + "grpc_transport_chttp2_server_insecure", + "grpc_transport_inproc", + "grpc_workaround_cronet_compression_filter", + "grpc_server_backward_compatibility", + ], +) + +grpc_cc_library( + name = "grpc_client_channel", + srcs = [ + "src/core/ext/filters/client_channel/backend_metric.cc", + "src/core/ext/filters/client_channel/backup_poller.cc", + "src/core/ext/filters/client_channel/channel_connectivity.cc", + "src/core/ext/filters/client_channel/client_channel.cc", + "src/core/ext/filters/client_channel/client_channel_channelz.cc", + "src/core/ext/filters/client_channel/client_channel_factory.cc", + "src/core/ext/filters/client_channel/client_channel_plugin.cc", + "src/core/ext/filters/client_channel/global_subchannel_pool.cc", + "src/core/ext/filters/client_channel/health/health_check_client.cc", + "src/core/ext/filters/client_channel/http_connect_handshaker.cc", + "src/core/ext/filters/client_channel/http_proxy.cc", + "src/core/ext/filters/client_channel/lb_policy.cc", + "src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc", + "src/core/ext/filters/client_channel/lb_policy_registry.cc", + "src/core/ext/filters/client_channel/local_subchannel_pool.cc", + "src/core/ext/filters/client_channel/parse_address.cc", + "src/core/ext/filters/client_channel/proxy_mapper_registry.cc", + "src/core/ext/filters/client_channel/resolver.cc", + "src/core/ext/filters/client_channel/resolver_registry.cc", + "src/core/ext/filters/client_channel/resolver_result_parsing.cc", + "src/core/ext/filters/client_channel/resolving_lb_policy.cc", + "src/core/ext/filters/client_channel/retry_throttle.cc", + "src/core/ext/filters/client_channel/server_address.cc", + "src/core/ext/filters/client_channel/service_config.cc", + "src/core/ext/filters/client_channel/service_config_parser.cc", + "src/core/ext/filters/client_channel/subchannel.cc", + "src/core/ext/filters/client_channel/subchannel_pool_interface.cc", + ], + hdrs = [ + "src/core/ext/filters/client_channel/backend_metric.h", + "src/core/ext/filters/client_channel/backup_poller.h", + "src/core/ext/filters/client_channel/client_channel.h", + "src/core/ext/filters/client_channel/client_channel_channelz.h", + "src/core/ext/filters/client_channel/client_channel_factory.h", + "src/core/ext/filters/client_channel/connector.h", + "src/core/ext/filters/client_channel/global_subchannel_pool.h", + "src/core/ext/filters/client_channel/health/health_check_client.h", + "src/core/ext/filters/client_channel/http_connect_handshaker.h", + "src/core/ext/filters/client_channel/http_proxy.h", + "src/core/ext/filters/client_channel/lb_policy.h", + "src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h", + "src/core/ext/filters/client_channel/lb_policy_factory.h", + "src/core/ext/filters/client_channel/lb_policy_registry.h", + "src/core/ext/filters/client_channel/local_subchannel_pool.h", + "src/core/ext/filters/client_channel/parse_address.h", + "src/core/ext/filters/client_channel/proxy_mapper.h", + "src/core/ext/filters/client_channel/proxy_mapper_registry.h", + "src/core/ext/filters/client_channel/resolver.h", + "src/core/ext/filters/client_channel/resolver_factory.h", + "src/core/ext/filters/client_channel/resolver_registry.h", + "src/core/ext/filters/client_channel/resolver_result_parsing.h", + "src/core/ext/filters/client_channel/resolving_lb_policy.h", + "src/core/ext/filters/client_channel/retry_throttle.h", + "src/core/ext/filters/client_channel/server_address.h", + "src/core/ext/filters/client_channel/service_config.h", + "src/core/ext/filters/client_channel/service_config_call_data.h", + "src/core/ext/filters/client_channel/service_config_parser.h", + "src/core/ext/filters/client_channel/subchannel.h", + "src/core/ext/filters/client_channel/subchannel_interface.h", + "src/core/ext/filters/client_channel/subchannel_pool_interface.h", + ], + external_deps = [ + "absl/container:inlined_vector", + ], + language = "c++", + deps = [ + "gpr_base", + "grpc_base", + "grpc_client_authority_filter", + "grpc_deadline_filter", + "grpc_health_upb", + "orphanable", + "ref_counted", + "ref_counted_ptr", + "udpa_orca_upb", + ], +) + +grpc_cc_library( + name = "grpc_client_idle_filter", + srcs = [ + "src/core/ext/filters/client_idle/client_idle_filter.cc", + ], + language = "c++", + deps = [ + "grpc_base", + ], +) + +grpc_cc_library( + name = "grpc_max_age_filter", + srcs = [ + "src/core/ext/filters/max_age/max_age_filter.cc", + ], + hdrs = [ + "src/core/ext/filters/max_age/max_age_filter.h", + ], + language = "c++", + deps = [ + "grpc_base", + ], +) + +grpc_cc_library( + name = "grpc_deadline_filter", + srcs = [ + "src/core/ext/filters/deadline/deadline_filter.cc", + ], + hdrs = [ + "src/core/ext/filters/deadline/deadline_filter.h", + ], + language = "c++", + deps = [ + "grpc_base", + ], +) + +grpc_cc_library( + name = "grpc_client_authority_filter", + srcs = [ + "src/core/ext/filters/http/client_authority_filter.cc", + ], + hdrs = [ + "src/core/ext/filters/http/client_authority_filter.h", + ], + language = "c++", + deps = [ + "grpc_base", + ], +) + +grpc_cc_library( + name = "grpc_message_size_filter", + srcs = [ + "src/core/ext/filters/message_size/message_size_filter.cc", + ], + hdrs = [ + "src/core/ext/filters/message_size/message_size_filter.h", + ], + language = "c++", + deps = [ + "grpc_base", + "grpc_client_channel", + ], +) + +grpc_cc_library( + name = "grpc_http_filters", + srcs = [ + "src/core/ext/filters/http/client/http_client_filter.cc", + "src/core/ext/filters/http/http_filters_plugin.cc", + "src/core/ext/filters/http/message_compress/message_compress_filter.cc", + "src/core/ext/filters/http/message_compress/message_decompress_filter.cc", + "src/core/ext/filters/http/server/http_server_filter.cc", + ], + hdrs = [ + "src/core/ext/filters/http/client/http_client_filter.h", + "src/core/ext/filters/http/message_compress/message_compress_filter.h", + "src/core/ext/filters/http/message_compress/message_decompress_filter.h", + "src/core/ext/filters/http/server/http_server_filter.h", + ], + language = "c++", + deps = [ + "grpc_base", + ], +) + +grpc_cc_library( + name = "grpc_workaround_cronet_compression_filter", + srcs = [ + "src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc", + ], + hdrs = [ + "src/core/ext/filters/workarounds/workaround_cronet_compression_filter.h", + ], + language = "c++", + deps = [ + "grpc_base", + "grpc_server_backward_compatibility", + ], +) + +grpc_cc_library( + name = "grpc_codegen", + language = "c++", + public_hdrs = [ + "include/grpc/impl/codegen/byte_buffer.h", + "include/grpc/impl/codegen/byte_buffer_reader.h", + "include/grpc/impl/codegen/compression_types.h", + "include/grpc/impl/codegen/connectivity_state.h", + "include/grpc/impl/codegen/grpc_types.h", + "include/grpc/impl/codegen/propagation_bits.h", + "include/grpc/impl/codegen/status.h", + "include/grpc/impl/codegen/slice.h", + ], + deps = [ + "gpr_codegen", + ], +) + +grpc_cc_library( + name = "grpc_grpclb_balancer_addresses", + srcs = [ + "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc", + ], + hdrs = [ + "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h", + ], + language = "c++", + deps = [ + "grpc_base", + "grpc_client_channel", + ], +) + +grpc_cc_library( + name = "grpc_lb_policy_grpclb", + srcs = [ + "src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc", + "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc", + "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.cc", + "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc", + "src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc", + ], + hdrs = [ + "src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h", + "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h", + "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h", + "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h", + "src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h", + ], + language = "c++", + deps = [ + "grpc_base", + "grpc_client_channel", + "grpc_grpclb_balancer_addresses", + "grpc_lb_upb", + "grpc_resolver_fake", + "grpc_transport_chttp2_client_insecure", + ], +) + +grpc_cc_library( + name = "grpc_lb_policy_grpclb_secure", + srcs = [ + "src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc", + "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc", + "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc", + "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc", + "src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc", + ], + hdrs = [ + "src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h", + "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h", + "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h", + "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h", + "src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h", + ], + language = "c++", + deps = [ + "grpc_base", + "grpc_client_channel", + "grpc_grpclb_balancer_addresses", + "grpc_lb_upb", + "grpc_resolver_fake", + "grpc_secure", + "grpc_transport_chttp2_client_secure", + ], +) + +grpc_cc_library( + name = "grpc_xds_client", + srcs = [ + "src/core/ext/filters/client_channel/xds/xds_api.cc", + "src/core/ext/filters/client_channel/xds/xds_bootstrap.cc", + "src/core/ext/filters/client_channel/xds/xds_channel.cc", + "src/core/ext/filters/client_channel/xds/xds_client.cc", + "src/core/ext/filters/client_channel/xds/xds_client_stats.cc", + ], + hdrs = [ + "src/core/ext/filters/client_channel/xds/xds_api.h", + "src/core/ext/filters/client_channel/xds/xds_bootstrap.h", + "src/core/ext/filters/client_channel/xds/xds_channel.h", + "src/core/ext/filters/client_channel/xds/xds_channel_args.h", + "src/core/ext/filters/client_channel/xds/xds_client.h", + "src/core/ext/filters/client_channel/xds/xds_client_stats.h", + ], + language = "c++", + deps = [ + "envoy_ads_upb", + "grpc_base", + "grpc_client_channel", + ], +) + +grpc_cc_library( + name = "grpc_xds_client_secure", + srcs = [ + "src/core/ext/filters/client_channel/xds/xds_api.cc", + "src/core/ext/filters/client_channel/xds/xds_bootstrap.cc", + "src/core/ext/filters/client_channel/xds/xds_channel_secure.cc", + "src/core/ext/filters/client_channel/xds/xds_client.cc", + "src/core/ext/filters/client_channel/xds/xds_client_stats.cc", + ], + hdrs = [ + "src/core/ext/filters/client_channel/xds/xds_api.h", + "src/core/ext/filters/client_channel/xds/xds_bootstrap.h", + "src/core/ext/filters/client_channel/xds/xds_channel.h", + "src/core/ext/filters/client_channel/xds/xds_channel_args.h", + "src/core/ext/filters/client_channel/xds/xds_client.h", + "src/core/ext/filters/client_channel/xds/xds_client_stats.h", + ], + language = "c++", + deps = [ + "envoy_ads_upb", + "grpc_base", + "grpc_client_channel", + "grpc_secure", + ], +) + +grpc_cc_library( + name = "grpc_lb_policy_cds", + srcs = [ + "src/core/ext/filters/client_channel/lb_policy/xds/cds.cc", + ], + language = "c++", + deps = [ + "grpc_base", + "grpc_client_channel", + "grpc_xds_client", + ], +) + +grpc_cc_library( + name = "grpc_lb_policy_cds_secure", + srcs = [ + "src/core/ext/filters/client_channel/lb_policy/xds/cds.cc", + ], + language = "c++", + deps = [ + "grpc_base", + "grpc_client_channel", + "grpc_xds_client_secure", + ], +) + +grpc_cc_library( + name = "grpc_lb_policy_eds", + srcs = [ + "src/core/ext/filters/client_channel/lb_policy/xds/eds.cc", + ], + hdrs = [ + "src/core/ext/filters/client_channel/lb_policy/xds/xds.h", + ], + external_deps = [ + "absl/strings", + ], + language = "c++", + deps = [ + "grpc_base", + "grpc_client_channel", + "grpc_lb_address_filtering", + "grpc_xds_client", + ], +) + +grpc_cc_library( + name = "grpc_lb_policy_eds_secure", + srcs = [ + "src/core/ext/filters/client_channel/lb_policy/xds/eds.cc", + ], + hdrs = [ + "src/core/ext/filters/client_channel/lb_policy/xds/xds.h", + ], + external_deps = [ + "absl/strings", + ], + language = "c++", + deps = [ + "grpc_base", + "grpc_client_channel", + "grpc_lb_address_filtering", + "grpc_xds_client_secure", + ], +) + +grpc_cc_library( + name = "grpc_lb_policy_lrs", + srcs = [ + "src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc", + ], + language = "c++", + deps = [ + "grpc_base", + "grpc_client_channel", + "grpc_xds_client", + ], +) + +grpc_cc_library( + name = "grpc_lb_policy_lrs_secure", + srcs = [ + "src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc", + ], + language = "c++", + deps = [ + "grpc_base", + "grpc_client_channel", + "grpc_xds_client_secure", + ], +) + +grpc_cc_library( + name = "grpc_lb_policy_xds_routing", + srcs = [ + "src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc", + ], + language = "c++", + deps = [ + "grpc_base", + "grpc_client_channel", + ], +) + +grpc_cc_library( + name = "grpc_lb_address_filtering", + srcs = [ + "src/core/ext/filters/client_channel/lb_policy/address_filtering.cc", + ], + hdrs = [ + "src/core/ext/filters/client_channel/lb_policy/address_filtering.h", + ], + external_deps = [ + "absl/strings", + ], + language = "c++", + deps = [ + "grpc_base", + "grpc_client_channel", + ], +) + +grpc_cc_library( + name = "grpc_lb_subchannel_list", + hdrs = [ + "src/core/ext/filters/client_channel/lb_policy/subchannel_list.h", + ], + language = "c++", + deps = [ + "grpc_base", + "grpc_client_channel", + ], +) + +grpc_cc_library( + name = "grpc_lb_policy_pick_first", + srcs = [ + "src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc", + ], + language = "c++", + deps = [ + "grpc_base", + "grpc_client_channel", + "grpc_lb_subchannel_list", + ], +) + +grpc_cc_library( + name = "grpc_lb_policy_round_robin", + srcs = [ + "src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc", + ], + language = "c++", + deps = [ + "grpc_base", + "grpc_client_channel", + "grpc_lb_subchannel_list", + ], +) + +grpc_cc_library( + name = "grpc_lb_policy_priority", + srcs = [ + "src/core/ext/filters/client_channel/lb_policy/priority/priority.cc", + ], + external_deps = [ + "absl/strings", + ], + language = "c++", + deps = [ + "grpc_base", + "grpc_client_channel", + "grpc_lb_address_filtering", + ], +) + +grpc_cc_library( + name = "grpc_lb_policy_weighted_target", + srcs = [ + "src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc", + ], + language = "c++", + deps = [ + "grpc_base", + "grpc_client_channel", + "grpc_lb_address_filtering", + ], +) + +grpc_cc_library( + name = "lb_server_load_reporting_filter", + srcs = [ + "src/core/ext/filters/load_reporting/server_load_reporting_filter.cc", + ], + hdrs = [ + "src/core/ext/filters/load_reporting/registered_opencensus_objects.h", + "src/core/ext/filters/load_reporting/server_load_reporting_filter.h", + "src/cpp/server/load_reporter/constants.h", + ], + external_deps = [ + "opencensus-stats", + ], + language = "c++", + deps = [ + "grpc++_base", + "grpc_secure", + ], + alwayslink = 1, +) + +grpc_cc_library( + name = "lb_load_data_store", + srcs = [ + "src/cpp/server/load_reporter/load_data_store.cc", + ], + hdrs = [ + "src/cpp/server/load_reporter/constants.h", + "src/cpp/server/load_reporter/load_data_store.h", + ], + language = "c++", + deps = [ + "grpc++", + ], +) + +grpc_cc_library( + name = "lb_server_load_reporting_service_server_builder_plugin", + srcs = [ + "src/cpp/server/load_reporter/load_reporting_service_server_builder_plugin.cc", + ], + hdrs = [ + "src/cpp/server/load_reporter/load_reporting_service_server_builder_plugin.h", + ], + language = "c++", + deps = [ + "lb_load_reporter_service", + ], +) + +grpc_cc_library( + name = "grpcpp_server_load_reporting", + srcs = [ + "src/cpp/server/load_reporter/load_reporting_service_server_builder_option.cc", + "src/cpp/server/load_reporter/util.cc", + ], + language = "c++", + public_hdrs = [ + "include/grpcpp/ext/server_load_reporting.h", + "include/grpcpp/ext/server_load_reporting_impl.h", + ], + deps = [ + "lb_server_load_reporting_filter", + "lb_server_load_reporting_service_server_builder_plugin", + ], +) + +grpc_cc_library( + name = "lb_load_reporter_service", + srcs = [ + "src/cpp/server/load_reporter/load_reporter_async_service_impl.cc", + ], + hdrs = [ + "src/cpp/server/load_reporter/load_reporter_async_service_impl.h", + ], + language = "c++", + deps = [ + "lb_load_reporter", + ], +) + +grpc_cc_library( + name = "lb_get_cpu_stats", + srcs = [ + "src/cpp/server/load_reporter/get_cpu_stats_linux.cc", + "src/cpp/server/load_reporter/get_cpu_stats_macos.cc", + "src/cpp/server/load_reporter/get_cpu_stats_unsupported.cc", + "src/cpp/server/load_reporter/get_cpu_stats_windows.cc", + ], + hdrs = [ + "src/cpp/server/load_reporter/get_cpu_stats.h", + ], + language = "c++", + deps = [ + "grpc++", + ], +) + +grpc_cc_library( + name = "lb_load_reporter", + srcs = [ + "src/cpp/server/load_reporter/load_reporter.cc", + ], + hdrs = [ + "src/cpp/server/load_reporter/constants.h", + "src/cpp/server/load_reporter/load_reporter.h", + ], + external_deps = [ + "opencensus-stats", + ], + language = "c++", + deps = [ + "lb_get_cpu_stats", + "lb_load_data_store", + "//src/proto/grpc/lb/v1:load_reporter_proto", + ], +) + +grpc_cc_library( + name = "grpc_resolver_dns_selection", + srcs = [ + "src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc", + ], + hdrs = [ + "src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h", + ], + language = "c++", + deps = [ + "grpc_base", + ], +) + +grpc_cc_library( + name = "grpc_resolver_dns_native", + srcs = [ + "src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc", + ], + language = "c++", + deps = [ + "grpc_base", + "grpc_client_channel", + "grpc_resolver_dns_selection", + ], +) + +grpc_cc_library( + name = "grpc_resolver_dns_ares", + srcs = [ + "src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc", + "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc", + "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc", + "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc", + "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc", + "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc", + "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc", + "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc", + "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc", + "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc", + ], + hdrs = [ + "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h", + "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h", + ], + external_deps = [ + "cares", + "address_sorting", + ], + language = "c++", + deps = [ + "grpc_base", + "grpc_client_channel", + "grpc_grpclb_balancer_addresses", + "grpc_resolver_dns_selection", + ], +) + +grpc_cc_library( + name = "grpc_resolver_sockaddr", + srcs = [ + "src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc", + ], + language = "c++", + deps = [ + "grpc_base", + "grpc_client_channel", + ], +) + +grpc_cc_library( + name = "grpc_resolver_fake", + srcs = ["src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc"], + hdrs = ["src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h"], + language = "c++", + visibility = ["//test:__subpackages__"], + deps = [ + "grpc_base", + "grpc_client_channel", + ], +) + +grpc_cc_library( + name = "grpc_resolver_xds", + srcs = [ + "src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc", + ], + language = "c++", + deps = [ + "grpc_base", + "grpc_client_channel", + "grpc_xds_client", + ], +) + +grpc_cc_library( + name = "grpc_resolver_xds_secure", + srcs = [ + "src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc", + ], + language = "c++", + deps = [ + "grpc_base", + "grpc_client_channel", + "grpc_xds_client_secure", + ], +) + +grpc_cc_library( + name = "grpc_secure", + srcs = [ + "src/core/lib/http/httpcli_security_connector.cc", + "src/core/lib/security/context/security_context.cc", + "src/core/lib/security/credentials/alts/alts_credentials.cc", + "src/core/lib/security/credentials/composite/composite_credentials.cc", + "src/core/lib/security/credentials/credentials.cc", + "src/core/lib/security/credentials/credentials_metadata.cc", + "src/core/lib/security/credentials/fake/fake_credentials.cc", + "src/core/lib/security/credentials/google_default/credentials_generic.cc", + "src/core/lib/security/credentials/google_default/google_default_credentials.cc", + "src/core/lib/security/credentials/iam/iam_credentials.cc", + "src/core/lib/security/credentials/jwt/json_token.cc", + "src/core/lib/security/credentials/jwt/jwt_credentials.cc", + "src/core/lib/security/credentials/jwt/jwt_verifier.cc", + "src/core/lib/security/credentials/local/local_credentials.cc", + "src/core/lib/security/credentials/oauth2/oauth2_credentials.cc", + "src/core/lib/security/credentials/plugin/plugin_credentials.cc", + "src/core/lib/security/credentials/ssl/ssl_credentials.cc", + "src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc", + "src/core/lib/security/credentials/tls/tls_credentials.cc", + "src/core/lib/security/security_connector/alts/alts_security_connector.cc", + "src/core/lib/security/security_connector/fake/fake_security_connector.cc", + "src/core/lib/security/security_connector/load_system_roots_fallback.cc", + "src/core/lib/security/security_connector/load_system_roots_linux.cc", + "src/core/lib/security/security_connector/local/local_security_connector.cc", + "src/core/lib/security/security_connector/security_connector.cc", + "src/core/lib/security/security_connector/ssl/ssl_security_connector.cc", + "src/core/lib/security/security_connector/ssl_utils.cc", + "src/core/lib/security/security_connector/ssl_utils_config.cc", + "src/core/lib/security/security_connector/tls/tls_security_connector.cc", + "src/core/lib/security/transport/client_auth_filter.cc", + "src/core/lib/security/transport/secure_endpoint.cc", + "src/core/lib/security/transport/security_handshaker.cc", + "src/core/lib/security/transport/server_auth_filter.cc", + "src/core/lib/security/transport/target_authority_table.cc", + "src/core/lib/security/transport/tsi_error.cc", + "src/core/lib/security/util/json_util.cc", + "src/core/lib/surface/init_secure.cc", + ], + hdrs = [ + "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h", + "src/core/ext/filters/client_channel/xds/xds_channel_args.h", + "src/core/lib/security/context/security_context.h", + "src/core/lib/security/credentials/alts/alts_credentials.h", + "src/core/lib/security/credentials/composite/composite_credentials.h", + "src/core/lib/security/credentials/credentials.h", + "src/core/lib/security/credentials/fake/fake_credentials.h", + "src/core/lib/security/credentials/google_default/google_default_credentials.h", + "src/core/lib/security/credentials/iam/iam_credentials.h", + "src/core/lib/security/credentials/jwt/json_token.h", + "src/core/lib/security/credentials/jwt/jwt_credentials.h", + "src/core/lib/security/credentials/jwt/jwt_verifier.h", + "src/core/lib/security/credentials/local/local_credentials.h", + "src/core/lib/security/credentials/oauth2/oauth2_credentials.h", + "src/core/lib/security/credentials/plugin/plugin_credentials.h", + "src/core/lib/security/credentials/ssl/ssl_credentials.h", + "src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h", + "src/core/lib/security/credentials/tls/tls_credentials.h", + "src/core/lib/security/security_connector/alts/alts_security_connector.h", + "src/core/lib/security/security_connector/fake/fake_security_connector.h", + "src/core/lib/security/security_connector/load_system_roots.h", + "src/core/lib/security/security_connector/load_system_roots_linux.h", + "src/core/lib/security/security_connector/local/local_security_connector.h", + "src/core/lib/security/security_connector/security_connector.h", + "src/core/lib/security/security_connector/ssl/ssl_security_connector.h", + "src/core/lib/security/security_connector/ssl_utils.h", + "src/core/lib/security/security_connector/ssl_utils_config.h", + "src/core/lib/security/security_connector/tls/tls_security_connector.h", + "src/core/lib/security/transport/auth_filters.h", + "src/core/lib/security/transport/secure_endpoint.h", + "src/core/lib/security/transport/security_handshaker.h", + "src/core/lib/security/transport/target_authority_table.h", + "src/core/lib/security/transport/tsi_error.h", + "src/core/lib/security/util/json_util.h", + ], + language = "c++", + public_hdrs = GRPC_SECURE_PUBLIC_HDRS, + deps = [ + "alts_util", + "grpc_base", + "grpc_transport_chttp2_alpn", + "tsi", + ], +) + +grpc_cc_library( + name = "grpc_transport_chttp2", + srcs = [ + "src/core/ext/transport/chttp2/transport/bin_decoder.cc", + "src/core/ext/transport/chttp2/transport/bin_encoder.cc", + "src/core/ext/transport/chttp2/transport/chttp2_plugin.cc", + "src/core/ext/transport/chttp2/transport/chttp2_transport.cc", + "src/core/ext/transport/chttp2/transport/context_list.cc", + "src/core/ext/transport/chttp2/transport/flow_control.cc", + "src/core/ext/transport/chttp2/transport/frame_data.cc", + "src/core/ext/transport/chttp2/transport/frame_goaway.cc", + "src/core/ext/transport/chttp2/transport/frame_ping.cc", + "src/core/ext/transport/chttp2/transport/frame_rst_stream.cc", + "src/core/ext/transport/chttp2/transport/frame_settings.cc", + "src/core/ext/transport/chttp2/transport/frame_window_update.cc", + "src/core/ext/transport/chttp2/transport/hpack_encoder.cc", + "src/core/ext/transport/chttp2/transport/hpack_parser.cc", + "src/core/ext/transport/chttp2/transport/hpack_table.cc", + "src/core/ext/transport/chttp2/transport/http2_settings.cc", + "src/core/ext/transport/chttp2/transport/huffsyms.cc", + "src/core/ext/transport/chttp2/transport/incoming_metadata.cc", + "src/core/ext/transport/chttp2/transport/parsing.cc", + "src/core/ext/transport/chttp2/transport/stream_lists.cc", + "src/core/ext/transport/chttp2/transport/stream_map.cc", + "src/core/ext/transport/chttp2/transport/varint.cc", + "src/core/ext/transport/chttp2/transport/writing.cc", + ], + hdrs = [ + "src/core/ext/transport/chttp2/transport/bin_decoder.h", + "src/core/ext/transport/chttp2/transport/bin_encoder.h", + "src/core/ext/transport/chttp2/transport/chttp2_transport.h", + "src/core/ext/transport/chttp2/transport/context_list.h", + "src/core/ext/transport/chttp2/transport/flow_control.h", + "src/core/ext/transport/chttp2/transport/frame.h", + "src/core/ext/transport/chttp2/transport/frame_data.h", + "src/core/ext/transport/chttp2/transport/frame_goaway.h", + "src/core/ext/transport/chttp2/transport/frame_ping.h", + "src/core/ext/transport/chttp2/transport/frame_rst_stream.h", + "src/core/ext/transport/chttp2/transport/frame_settings.h", + "src/core/ext/transport/chttp2/transport/frame_window_update.h", + "src/core/ext/transport/chttp2/transport/hpack_encoder.h", + "src/core/ext/transport/chttp2/transport/hpack_parser.h", + "src/core/ext/transport/chttp2/transport/hpack_table.h", + "src/core/ext/transport/chttp2/transport/http2_settings.h", + "src/core/ext/transport/chttp2/transport/huffsyms.h", + "src/core/ext/transport/chttp2/transport/incoming_metadata.h", + "src/core/ext/transport/chttp2/transport/internal.h", + "src/core/ext/transport/chttp2/transport/stream_map.h", + "src/core/ext/transport/chttp2/transport/varint.h", + ], + language = "c++", + deps = [ + "gpr_base", + "grpc_base", + "grpc_http_filters", + "grpc_transport_chttp2_alpn", + ], +) + +grpc_cc_library( + name = "grpc_transport_chttp2_alpn", + srcs = [ + "src/core/ext/transport/chttp2/alpn/alpn.cc", + ], + hdrs = [ + "src/core/ext/transport/chttp2/alpn/alpn.h", + ], + language = "c++", + deps = [ + "gpr", + ], +) + +grpc_cc_library( + name = "grpc_transport_chttp2_client_connector", + srcs = [ + "src/core/ext/transport/chttp2/client/authority.cc", + "src/core/ext/transport/chttp2/client/chttp2_connector.cc", + ], + hdrs = [ + "src/core/ext/transport/chttp2/client/authority.h", + "src/core/ext/transport/chttp2/client/chttp2_connector.h", + ], + language = "c++", + deps = [ + "grpc_base", + "grpc_client_channel", + "grpc_transport_chttp2", + ], +) + +grpc_cc_library( + name = "grpc_transport_chttp2_client_insecure", + srcs = [ + "src/core/ext/transport/chttp2/client/insecure/channel_create.cc", + "src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc", + ], + language = "c++", + deps = [ + "grpc_base", + "grpc_client_channel", + "grpc_transport_chttp2", + "grpc_transport_chttp2_client_connector", + ], +) + +grpc_cc_library( + name = "grpc_transport_chttp2_client_secure", + srcs = [ + "src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc", + ], + language = "c++", + deps = [ + "grpc_base", + "grpc_client_channel", + "grpc_secure", + "grpc_transport_chttp2", + "grpc_transport_chttp2_client_connector", + ], +) + +grpc_cc_library( + name = "grpc_transport_chttp2_server", + srcs = [ + "src/core/ext/transport/chttp2/server/chttp2_server.cc", + ], + hdrs = [ + "src/core/ext/transport/chttp2/server/chttp2_server.h", + ], + language = "c++", + deps = [ + "grpc_base", + "grpc_transport_chttp2", + ], +) + +grpc_cc_library( + name = "grpc_transport_chttp2_server_insecure", + srcs = [ + "src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc", + "src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc", + ], + language = "c++", + deps = [ + "grpc_base", + "grpc_transport_chttp2", + "grpc_transport_chttp2_server", + ], +) + +grpc_cc_library( + name = "grpc_transport_chttp2_server_secure", + srcs = [ + "src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc", + ], + language = "c++", + deps = [ + "grpc_base", + "grpc_secure", + "grpc_transport_chttp2", + "grpc_transport_chttp2_server", + ], +) + +grpc_cc_library( + name = "grpc_transport_inproc", + srcs = [ + "src/core/ext/transport/inproc/inproc_plugin.cc", + "src/core/ext/transport/inproc/inproc_transport.cc", + ], + hdrs = [ + "src/core/ext/transport/inproc/inproc_transport.h", + ], + language = "c++", + deps = [ + "grpc_base", + ], +) + +grpc_cc_library( + name = "tsi_interface", + srcs = [ + "src/core/tsi/transport_security.cc", + ], + hdrs = [ + "src/core/tsi/transport_security.h", + "src/core/tsi/transport_security_interface.h", + ], + language = "c++", + deps = [ + "gpr", + "grpc_trace", + ], +) + +grpc_cc_library( + name = "alts_frame_protector", + srcs = [ + "src/core/tsi/alts/crypt/aes_gcm.cc", + "src/core/tsi/alts/crypt/gsec.cc", + "src/core/tsi/alts/frame_protector/alts_counter.cc", + "src/core/tsi/alts/frame_protector/alts_crypter.cc", + "src/core/tsi/alts/frame_protector/alts_frame_protector.cc", + "src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.cc", + "src/core/tsi/alts/frame_protector/alts_seal_privacy_integrity_crypter.cc", + "src/core/tsi/alts/frame_protector/alts_unseal_privacy_integrity_crypter.cc", + "src/core/tsi/alts/frame_protector/frame_handler.cc", + "src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc", + "src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc", + "src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc", + "src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc", + "src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc", + ], + hdrs = [ + "src/core/tsi/alts/crypt/gsec.h", + "src/core/tsi/alts/frame_protector/alts_counter.h", + "src/core/tsi/alts/frame_protector/alts_crypter.h", + "src/core/tsi/alts/frame_protector/alts_frame_protector.h", + "src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.h", + "src/core/tsi/alts/frame_protector/frame_handler.h", + "src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.h", + "src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.h", + "src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol.h", + "src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h", + "src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.h", + "src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h", + "src/core/tsi/transport_security_grpc.h", + ], + external_deps = [ + "libssl", + ], + language = "c++", + deps = [ + "gpr", + "grpc_base", + "tsi_interface", + ], +) + +grpc_cc_library( + name = "alts_util", + srcs = [ + "src/core/lib/security/credentials/alts/check_gcp_environment.cc", + "src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc", + "src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc", + "src/core/lib/security/credentials/alts/check_gcp_environment_windows.cc", + "src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc", + "src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc", + "src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc", + "src/core/tsi/alts/handshaker/transport_security_common_api.cc", + ], + hdrs = [ + "src/core/lib/security/credentials/alts/check_gcp_environment.h", + "src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h", + "src/core/tsi/alts/handshaker/transport_security_common_api.h", + ], + language = "c++", + public_hdrs = GRPC_SECURE_PUBLIC_HDRS, + deps = [ + "alts_upb", + "gpr", + "grpc_base", + ], +) + +grpc_cc_library( + name = "tsi", + srcs = [ + "src/core/tsi/alts/handshaker/alts_handshaker_client.cc", + "src/core/tsi/alts/handshaker/alts_shared_resource.cc", + "src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc", + "src/core/tsi/alts/handshaker/alts_tsi_utils.cc", + "src/core/tsi/fake_transport_security.cc", + "src/core/tsi/local_transport_security.cc", + "src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc", + "src/core/tsi/ssl/session_cache/ssl_session_cache.cc", + "src/core/tsi/ssl/session_cache/ssl_session_openssl.cc", + "src/core/tsi/ssl_transport_security.cc", + "src/core/tsi/transport_security_grpc.cc", + ], + hdrs = [ + "src/core/tsi/alts/handshaker/alts_handshaker_client.h", + "src/core/tsi/alts/handshaker/alts_shared_resource.h", + "src/core/tsi/alts/handshaker/alts_tsi_handshaker.h", + "src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h", + "src/core/tsi/alts/handshaker/alts_tsi_utils.h", + "src/core/tsi/fake_transport_security.h", + "src/core/tsi/local_transport_security.h", + "src/core/tsi/ssl/session_cache/ssl_session.h", + "src/core/tsi/ssl/session_cache/ssl_session_cache.h", + "src/core/tsi/ssl_transport_security.h", + "src/core/tsi/ssl_types.h", + "src/core/tsi/transport_security_grpc.h", + ], + external_deps = [ + "libssl", + ], + language = "c++", + deps = [ + "alts_frame_protector", + "alts_util", + "gpr", + "grpc_base", + "grpc_transport_chttp2_client_insecure", + "tsi_interface", + ], +) + +grpc_cc_library( + name = "grpc++_base", + srcs = GRPCXX_SRCS, + hdrs = GRPCXX_HDRS, + language = "c++", + public_hdrs = GRPCXX_PUBLIC_HDRS, + deps = [ + "grpc", + "grpc++_codegen_base", + "grpc++_codegen_base_src", + "grpc_health_upb", + ], +) + +grpc_cc_library( + name = "grpc++_base_unsecure", + srcs = GRPCXX_SRCS, + hdrs = GRPCXX_HDRS, + language = "c++", + public_hdrs = GRPCXX_PUBLIC_HDRS, + deps = [ + "grpc++_codegen_base", + "grpc++_codegen_base_src", + "grpc_health_upb", + "grpc_unsecure", + ], +) + +grpc_cc_library( + name = "grpc++_codegen_base", + language = "c++", + public_hdrs = [ + "include/grpc++/impl/codegen/async_stream.h", + "include/grpc++/impl/codegen/async_unary_call.h", + "include/grpc++/impl/codegen/byte_buffer.h", + "include/grpc++/impl/codegen/call.h", + "include/grpc++/impl/codegen/call_hook.h", + "include/grpc++/impl/codegen/channel_interface.h", + "include/grpc++/impl/codegen/client_context.h", + "include/grpc++/impl/codegen/client_unary_call.h", + "include/grpc++/impl/codegen/completion_queue.h", + "include/grpc++/impl/codegen/completion_queue_tag.h", + "include/grpc++/impl/codegen/config.h", + "include/grpc++/impl/codegen/core_codegen_interface.h", + "include/grpc++/impl/codegen/create_auth_context.h", + "include/grpc++/impl/codegen/grpc_library.h", + "include/grpc++/impl/codegen/metadata_map.h", + "include/grpc++/impl/codegen/method_handler_impl.h", + "include/grpc++/impl/codegen/rpc_method.h", + "include/grpc++/impl/codegen/rpc_service_method.h", + "include/grpc++/impl/codegen/security/auth_context.h", + "include/grpc++/impl/codegen/serialization_traits.h", + "include/grpc++/impl/codegen/server_context.h", + "include/grpc++/impl/codegen/server_interface.h", + "include/grpc++/impl/codegen/service_type.h", + "include/grpc++/impl/codegen/slice.h", + "include/grpc++/impl/codegen/status.h", + "include/grpc++/impl/codegen/status_code_enum.h", + "include/grpc++/impl/codegen/string_ref.h", + "include/grpc++/impl/codegen/stub_options.h", + "include/grpc++/impl/codegen/sync_stream.h", + "include/grpc++/impl/codegen/time.h", + "include/grpcpp/impl/codegen/async_generic_service.h", + "include/grpcpp/impl/codegen/async_stream.h", + "include/grpcpp/impl/codegen/async_stream_impl.h", + "include/grpcpp/impl/codegen/async_unary_call.h", + "include/grpcpp/impl/codegen/async_unary_call_impl.h", + "include/grpcpp/impl/codegen/byte_buffer.h", + "include/grpcpp/impl/codegen/call.h", + "include/grpcpp/impl/codegen/call_hook.h", + "include/grpcpp/impl/codegen/call_op_set.h", + "include/grpcpp/impl/codegen/call_op_set_interface.h", + "include/grpcpp/impl/codegen/callback_common.h", + "include/grpcpp/impl/codegen/channel_interface.h", + "include/grpcpp/impl/codegen/client_callback.h", + "include/grpcpp/impl/codegen/client_callback_impl.h", + "include/grpcpp/impl/codegen/client_context.h", + "include/grpcpp/impl/codegen/client_context_impl.h", + "include/grpcpp/impl/codegen/client_interceptor.h", + "include/grpcpp/impl/codegen/client_unary_call.h", + "include/grpcpp/impl/codegen/completion_queue.h", + "include/grpcpp/impl/codegen/completion_queue_impl.h", + "include/grpcpp/impl/codegen/completion_queue_tag.h", + "include/grpcpp/impl/codegen/config.h", + "include/grpcpp/impl/codegen/core_codegen_interface.h", + "include/grpcpp/impl/codegen/create_auth_context.h", + "include/grpcpp/impl/codegen/delegating_channel.h", + "include/grpcpp/impl/codegen/grpc_library.h", + "include/grpcpp/impl/codegen/intercepted_channel.h", + "include/grpcpp/impl/codegen/interceptor.h", + "include/grpcpp/impl/codegen/interceptor_common.h", + "include/grpcpp/impl/codegen/message_allocator.h", + "include/grpcpp/impl/codegen/metadata_map.h", + "include/grpcpp/impl/codegen/method_handler.h", + "include/grpcpp/impl/codegen/method_handler_impl.h", + "include/grpcpp/impl/codegen/rpc_method.h", + "include/grpcpp/impl/codegen/rpc_service_method.h", + "include/grpcpp/impl/codegen/security/auth_context.h", + "include/grpcpp/impl/codegen/serialization_traits.h", + "include/grpcpp/impl/codegen/server_callback.h", + "include/grpcpp/impl/codegen/server_callback_handlers.h", + "include/grpcpp/impl/codegen/server_callback_impl.h", + "include/grpcpp/impl/codegen/server_context.h", + "include/grpcpp/impl/codegen/server_context_impl.h", + "include/grpcpp/impl/codegen/server_interceptor.h", + "include/grpcpp/impl/codegen/server_interface.h", + "include/grpcpp/impl/codegen/service_type.h", + "include/grpcpp/impl/codegen/slice.h", + "include/grpcpp/impl/codegen/status.h", + "include/grpcpp/impl/codegen/status_code_enum.h", + "include/grpcpp/impl/codegen/string_ref.h", + "include/grpcpp/impl/codegen/stub_options.h", + "include/grpcpp/impl/codegen/sync_stream.h", + "include/grpcpp/impl/codegen/sync_stream_impl.h", + "include/grpcpp/impl/codegen/time.h", + ], + deps = [ + "grpc++_internal_hdrs_only", + "grpc_codegen", + ], +) + +grpc_cc_library( + name = "grpc++_codegen_base_src", + srcs = [ + "src/cpp/codegen/codegen_init.cc", + ], + language = "c++", + deps = [ + "grpc++_codegen_base", + ], +) + +grpc_cc_library( + name = "grpc++_codegen_proto", + language = "c++", + public_hdrs = [ + "include/grpc++/impl/codegen/proto_utils.h", + "include/grpcpp/impl/codegen/proto_buffer_reader.h", + "include/grpcpp/impl/codegen/proto_buffer_writer.h", + "include/grpcpp/impl/codegen/proto_utils.h", + ], + deps = [ + "grpc++_codegen_base", + "grpc++_config_proto", + ], +) + +grpc_cc_library( + name = "grpc++_config_proto", + external_deps = [ + "protobuf_headers", + ], + language = "c++", + public_hdrs = [ + "include/grpc++/impl/codegen/config_protobuf.h", + "include/grpcpp/impl/codegen/config_protobuf.h", + ], +) + +grpc_cc_library( + name = "grpc++_reflection", + srcs = [ + "src/cpp/ext/proto_server_reflection.cc", + "src/cpp/ext/proto_server_reflection_plugin.cc", + ], + hdrs = [ + "src/cpp/ext/proto_server_reflection.h", + ], + language = "c++", + public_hdrs = [ + "include/grpc++/ext/proto_server_reflection_plugin.h", + "include/grpcpp/ext/proto_server_reflection_plugin.h", + "include/grpcpp/ext/proto_server_reflection_plugin_impl.h", + ], + deps = [ + ":grpc++", + "//src/proto/grpc/reflection/v1alpha:reflection_proto", + ], + alwayslink = 1, +) + +grpc_cc_library( + name = "grpcpp_channelz", + srcs = [ + "src/cpp/server/channelz/channelz_service.cc", + "src/cpp/server/channelz/channelz_service_plugin.cc", + ], + hdrs = [ + "src/cpp/server/channelz/channelz_service.h", + ], + language = "c++", + public_hdrs = [ + "include/grpcpp/ext/channelz_service_plugin.h", + "include/grpcpp/ext/channelz_service_plugin_impl.h", + ], + deps = [ + ":grpc++", + "//src/proto/grpc/channelz:channelz_proto", + ], + alwayslink = 1, +) + +grpc_cc_library( + name = "grpc++_test", + srcs = [ + "src/cpp/client/channel_test_peer.cc", + ], + public_hdrs = [ + "include/grpc++/test/mock_stream.h", + "include/grpc++/test/server_context_test_spouse.h", + "include/grpcpp/test/channel_test_peer.h", + "include/grpcpp/test/default_reactor_test_peer.h", + "include/grpcpp/test/mock_stream.h", + "include/grpcpp/test/server_context_test_spouse.h", + ], + deps = [ + ":grpc++", + ], +) + +grpc_cc_library( + name = "grpc_server_backward_compatibility", + srcs = [ + "src/core/ext/filters/workarounds/workaround_utils.cc", + ], + hdrs = [ + "src/core/ext/filters/workarounds/workaround_utils.h", + ], + language = "c++", + deps = [ + "grpc_base", + ], +) + +grpc_cc_library( + name = "grpc++_core_stats", + srcs = [ + "src/cpp/util/core_stats.cc", + ], + hdrs = [ + "src/cpp/util/core_stats.h", + ], + language = "c++", + deps = [ + ":grpc++", + "//src/proto/grpc/core:stats_proto", + ], +) + +grpc_cc_library( + name = "grpc_opencensus_plugin", + srcs = [ + "src/cpp/ext/filters/census/channel_filter.cc", + "src/cpp/ext/filters/census/client_filter.cc", + "src/cpp/ext/filters/census/context.cc", + "src/cpp/ext/filters/census/grpc_plugin.cc", + "src/cpp/ext/filters/census/measures.cc", + "src/cpp/ext/filters/census/rpc_encoding.cc", + "src/cpp/ext/filters/census/server_filter.cc", + "src/cpp/ext/filters/census/views.cc", + ], + hdrs = [ + "include/grpcpp/opencensus.h", + "src/cpp/ext/filters/census/channel_filter.h", + "src/cpp/ext/filters/census/client_filter.h", + "src/cpp/ext/filters/census/context.h", + "src/cpp/ext/filters/census/grpc_plugin.h", + "src/cpp/ext/filters/census/measures.h", + "src/cpp/ext/filters/census/rpc_encoding.h", + "src/cpp/ext/filters/census/server_filter.h", + ], + external_deps = [ + "absl-base", + "absl-time", + "opencensus-trace", + "opencensus-trace-context_util", + "opencensus-stats", + "opencensus-context", + ], + language = "c++", + deps = [ + ":census", + ":grpc++", + ], +) + +# Once upb code-gen issue is resolved, use the targets commented below to replace the ones using +# upb-generated files. + +# grpc_upb_proto_library( +# name = "upb_load_report", +# deps = ["@envoy_api//envoy/api/v2/endpoint:load_report_export"], +# ) +# +# grpc_upb_proto_library( +# name = "upb_lrs", +# deps = ["@envoy_api//envoy/service/load_stats/v2:lrs_export"], +# ) +# +# grpc_upb_proto_library( +# name = "upb_cds", +# deps = ["@envoy_api//envoy/api/v2:cds_export"], +# ) + +# grpc_cc_library( +# name = "envoy_lrs_upb", +# external_deps = [ +# "upb_lib", +# ], +# language = "c++", +# tags = ["no_windows"], +# deps = [ +# ":upb_load_report", +# ":upb_lrs", +# ], +# ) + +# grpc_cc_library( +# name = "envoy_ads_upb", +# external_deps = [ +# "upb_lib", +# ], +# language = "c++", +# tags = ["no_windows"], +# deps = [ +# ":upb_cds", +# ], +# ) + +grpc_cc_library( + name = "envoy_ads_upb", + srcs = [ + "src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/cds.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/eds.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/lds.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/listener.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/rds.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/route.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/srds.upb.c", + "src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c", + "src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c", + "src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c", + "src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c", + "src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c", + "src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c", + ], + hdrs = [ + "src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/cds.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/eds.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/lds.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/listener.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/rds.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/route.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/route/route.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/srds.upb.h", + "src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h", + "src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h", + "src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h", + "src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h", + "src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h", + "src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h", + ], + external_deps = [ + "upb_lib", + ], + language = "c++", + deps = [ + ":envoy_annotations_upb", + ":envoy_core_upb", + ":envoy_type_upb", + ":google_api_upb", + ":proto_gen_validate_upb", + ":udpa_annotations_upb", + ], +) + +grpc_cc_library( + name = "envoy_annotations_upb", + srcs = [ + "src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c", + "src/core/ext/upb-generated/envoy/annotations/resource.upb.c", + ], + hdrs = [ + "src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h", + "src/core/ext/upb-generated/envoy/annotations/resource.upb.h", + ], + external_deps = [ + "upb_lib", + ], + language = "c++", + deps = [ + ":google_api_upb", + ], +) + +grpc_cc_library( + name = "envoy_core_upb", + srcs = [ + "src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c", + ], + hdrs = [ + "src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h", + ], + external_deps = [ + "upb_lib", + ], + language = "c++", + deps = [ + ":envoy_annotations_upb", + ":envoy_type_upb", + ":google_api_upb", + ":proto_gen_validate_upb", + ":udpa_annotations_upb", + ], +) + +grpc_cc_library( + name = "envoy_type_upb", + srcs = [ + "src/core/ext/upb-generated/envoy/type/http.upb.c", + "src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c", + "src/core/ext/upb-generated/envoy/type/matcher/string.upb.c", + "src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c", + "src/core/ext/upb-generated/envoy/type/percent.upb.c", + "src/core/ext/upb-generated/envoy/type/range.upb.c", + "src/core/ext/upb-generated/envoy/type/semantic_version.upb.c", + "src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c", + ], + hdrs = [ + "src/core/ext/upb-generated/envoy/type/http.upb.h", + "src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h", + "src/core/ext/upb-generated/envoy/type/matcher/string.upb.h", + "src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.h", + "src/core/ext/upb-generated/envoy/type/percent.upb.h", + "src/core/ext/upb-generated/envoy/type/range.upb.h", + "src/core/ext/upb-generated/envoy/type/semantic_version.upb.h", + "src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.h", + ], + external_deps = [ + "upb_lib", + ], + language = "c++", + deps = [ + ":envoy_annotations_upb", + ":google_api_upb", + ":proto_gen_validate_upb", + ":udpa_annotations_upb", + ], +) + +grpc_cc_library( + name = "proto_gen_validate_upb", + srcs = [ + "src/core/ext/upb-generated/gogoproto/gogo.upb.c", + "src/core/ext/upb-generated/validate/validate.upb.c", + ], + hdrs = [ + "src/core/ext/upb-generated/gogoproto/gogo.upb.h", + "src/core/ext/upb-generated/validate/validate.upb.h", + ], + external_deps = [ + "upb_lib", + ], + language = "c++", + deps = [ + ":google_api_upb", + ], +) + +# Once upb code-gen issue is resolved, replace udpa_orca_upb with this. +# grpc_upb_proto_library( +# name = "udpa_orca_upb", +# deps = ["@envoy_api//udpa/data/orca/v1:orca_load_report"] +# ) + +grpc_cc_library( + name = "udpa_orca_upb", + srcs = [ + "src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c", + ], + hdrs = [ + "src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h", + ], + external_deps = [ + "upb_lib", + ], + language = "c++", + deps = [ + ":proto_gen_validate_upb", + ], +) + +grpc_cc_library( + name = "udpa_annotations_upb", + srcs = [ + "src/core/ext/upb-generated/udpa/annotations/migrate.upb.c", + "src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c", + "src/core/ext/upb-generated/udpa/annotations/status.upb.c", + ], + hdrs = [ + "src/core/ext/upb-generated/udpa/annotations/migrate.upb.h", + "src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h", + "src/core/ext/upb-generated/udpa/annotations/status.upb.h", + ], + external_deps = [ + "upb_lib", + ], + language = "c++", + deps = [ + ":google_api_upb", + ], +) + +# Once upb code-gen issue is resolved, replace grpc_health_upb with this. +# grpc_upb_proto_library( +# name = "grpc_health_upb", +# deps = ["//src/proto/grpc/health/v1:health_proto_descriptor"], +# ) + +grpc_cc_library( + name = "grpc_health_upb", + srcs = [ + "src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c", + ], + hdrs = [ + "src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h", + ], + external_deps = [ + "upb_lib", + ], + language = "c++", +) + +# Once upb code-gen issue is resolved, remove this. +grpc_cc_library( + name = "google_api_upb", + srcs = [ + "src/core/ext/upb-generated/google/api/annotations.upb.c", + "src/core/ext/upb-generated/google/api/http.upb.c", + "src/core/ext/upb-generated/google/protobuf/any.upb.c", + "src/core/ext/upb-generated/google/protobuf/descriptor.upb.c", + "src/core/ext/upb-generated/google/protobuf/duration.upb.c", + "src/core/ext/upb-generated/google/protobuf/empty.upb.c", + "src/core/ext/upb-generated/google/protobuf/struct.upb.c", + "src/core/ext/upb-generated/google/protobuf/timestamp.upb.c", + "src/core/ext/upb-generated/google/protobuf/wrappers.upb.c", + "src/core/ext/upb-generated/google/rpc/status.upb.c", + ], + hdrs = [ + "src/core/ext/upb-generated/google/api/annotations.upb.h", + "src/core/ext/upb-generated/google/api/http.upb.h", + "src/core/ext/upb-generated/google/protobuf/any.upb.h", + "src/core/ext/upb-generated/google/protobuf/descriptor.upb.h", + "src/core/ext/upb-generated/google/protobuf/duration.upb.h", + "src/core/ext/upb-generated/google/protobuf/empty.upb.h", + "src/core/ext/upb-generated/google/protobuf/struct.upb.h", + "src/core/ext/upb-generated/google/protobuf/timestamp.upb.h", + "src/core/ext/upb-generated/google/protobuf/wrappers.upb.h", + "src/core/ext/upb-generated/google/rpc/status.upb.h", + ], + external_deps = [ + "upb_lib", + ], + language = "c++", +) + +# Once upb code-gen issue is resolved, replace grpc_lb_upb with this. +# grpc_upb_proto_library( +# name = "grpc_lb_upb", +# deps = ["//src/proto/grpc/lb/v1:load_balancer_proto_descriptor"], +# ) + +grpc_cc_library( + name = "grpc_lb_upb", + srcs = [ + "src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c", + ], + hdrs = [ + "src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h", + ], + external_deps = [ + "upb_lib", + ], + language = "c++", + deps = [ + "google_api_upb", + ], +) + +# Once upb code-gen issue is resolved, replace alts_upb with this. +# grpc_upb_proto_library( +# name = "alts_upb", +# deps = ["//src/proto/grpc/gcp:alts_handshaker_proto"], +# ) + +grpc_cc_library( + name = "alts_upb", + srcs = [ + "src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c", + "src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c", + "src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c", + ], + hdrs = [ + "src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h", + "src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h", + "src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h", + ], + external_deps = [ + "upb_lib", + ], + language = "c++", +) + +grpc_generate_one_off_targets() + +filegroup( + name = "root_certificates", + srcs = [ + "etc/roots.pem", + ], + visibility = ["//visibility:public"], +) + +# Base classes of EventManagerInterface +grpc_cc_library( + name = "eventmanager_interface", + hdrs = [ + "src/core/lib/iomgr/poller/eventmanager_interface.h", + ], +) + +# Libuv-based EventManager implementation +grpc_cc_library( + name = "eventmanager_libuv", + srcs = [ + "src/core/lib/iomgr/poller/eventmanager_libuv.cc", + ], + hdrs = [ + "src/core/lib/iomgr/poller/eventmanager_libuv.h", + ], + deps = [ + "gpr_base", + ], +) diff --git a/BUILD.gn b/BUILD.gn new file mode 100644 index 00000000..a16d298f --- /dev/null +++ b/BUILD.gn @@ -0,0 +1,1357 @@ +# GRPC Fuchsia GN build file + +# This file has been automatically generated from a template file. +# Please look at the templates directory instead. +# This file can be regenerated from the template by running +# tools/buildgen/generate_projects.sh + +# Copyright 2019 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +config("grpc_config") { + include_dirs = [ + ".", + "include/", + ] + defines = [ + "GRPC_USE_PROTO_LITE", + "GPR_SUPPORT_CHANNELS_FROM_FD", + "PB_FIELD_16BIT", + ] +} + + + + source_set("address_sorting") { + sources = [ + "third_party/address_sorting/address_sorting.c", + "third_party/address_sorting/address_sorting_internal.h", + "third_party/address_sorting/address_sorting_posix.c", + "third_party/address_sorting/address_sorting_windows.c", + "third_party/address_sorting/include/address_sorting/address_sorting.h", + ] + deps = [ + ] + + public_configs = [ + ":grpc_config", + ] + include_dirs = [ + "third_party/address_sorting/include", + ] + } + + + + source_set("gpr") { + sources = [ + "include/grpc/impl/codegen/atm.h", + "include/grpc/impl/codegen/atm_gcc_atomic.h", + "include/grpc/impl/codegen/atm_gcc_sync.h", + "include/grpc/impl/codegen/atm_windows.h", + "include/grpc/impl/codegen/byte_buffer.h", + "include/grpc/impl/codegen/byte_buffer_reader.h", + "include/grpc/impl/codegen/compression_types.h", + "include/grpc/impl/codegen/connectivity_state.h", + "include/grpc/impl/codegen/fork.h", + "include/grpc/impl/codegen/gpr_slice.h", + "include/grpc/impl/codegen/gpr_types.h", + "include/grpc/impl/codegen/grpc_types.h", + "include/grpc/impl/codegen/log.h", + "include/grpc/impl/codegen/port_platform.h", + "include/grpc/impl/codegen/propagation_bits.h", + "include/grpc/impl/codegen/slice.h", + "include/grpc/impl/codegen/status.h", + "include/grpc/impl/codegen/sync.h", + "include/grpc/impl/codegen/sync_abseil.h", + "include/grpc/impl/codegen/sync_custom.h", + "include/grpc/impl/codegen/sync_generic.h", + "include/grpc/impl/codegen/sync_posix.h", + "include/grpc/impl/codegen/sync_windows.h", + "include/grpc/support/alloc.h", + "include/grpc/support/atm.h", + "include/grpc/support/atm_gcc_atomic.h", + "include/grpc/support/atm_gcc_sync.h", + "include/grpc/support/atm_windows.h", + "include/grpc/support/cpu.h", + "include/grpc/support/log.h", + "include/grpc/support/log_windows.h", + "include/grpc/support/port_platform.h", + "include/grpc/support/string_util.h", + "include/grpc/support/sync.h", + "include/grpc/support/sync_abseil.h", + "include/grpc/support/sync_custom.h", + "include/grpc/support/sync_generic.h", + "include/grpc/support/sync_posix.h", + "include/grpc/support/sync_windows.h", + "include/grpc/support/thd_id.h", + "include/grpc/support/time.h", + "src/core/lib/gpr/alloc.cc", + "src/core/lib/gpr/alloc.h", + "src/core/lib/gpr/arena.h", + "src/core/lib/gpr/atm.cc", + "src/core/lib/gpr/cpu_iphone.cc", + "src/core/lib/gpr/cpu_linux.cc", + "src/core/lib/gpr/cpu_posix.cc", + "src/core/lib/gpr/cpu_windows.cc", + "src/core/lib/gpr/env.h", + "src/core/lib/gpr/env_linux.cc", + "src/core/lib/gpr/env_posix.cc", + "src/core/lib/gpr/env_windows.cc", + "src/core/lib/gpr/log.cc", + "src/core/lib/gpr/log_android.cc", + "src/core/lib/gpr/log_linux.cc", + "src/core/lib/gpr/log_posix.cc", + "src/core/lib/gpr/log_windows.cc", + "src/core/lib/gpr/murmur_hash.cc", + "src/core/lib/gpr/murmur_hash.h", + "src/core/lib/gpr/spinlock.h", + "src/core/lib/gpr/string.cc", + "src/core/lib/gpr/string.h", + "src/core/lib/gpr/string_posix.cc", + "src/core/lib/gpr/string_util_windows.cc", + "src/core/lib/gpr/string_windows.cc", + "src/core/lib/gpr/string_windows.h", + "src/core/lib/gpr/sync.cc", + "src/core/lib/gpr/sync_abseil.cc", + "src/core/lib/gpr/sync_posix.cc", + "src/core/lib/gpr/sync_windows.cc", + "src/core/lib/gpr/time.cc", + "src/core/lib/gpr/time_posix.cc", + "src/core/lib/gpr/time_precise.cc", + "src/core/lib/gpr/time_precise.h", + "src/core/lib/gpr/time_windows.cc", + "src/core/lib/gpr/tls.h", + "src/core/lib/gpr/tls_gcc.h", + "src/core/lib/gpr/tls_msvc.h", + "src/core/lib/gpr/tls_pthread.cc", + "src/core/lib/gpr/tls_pthread.h", + "src/core/lib/gpr/tmpfile.h", + "src/core/lib/gpr/tmpfile_msys.cc", + "src/core/lib/gpr/tmpfile_posix.cc", + "src/core/lib/gpr/tmpfile_windows.cc", + "src/core/lib/gpr/useful.h", + "src/core/lib/gpr/wrap_memcpy.cc", + "src/core/lib/gprpp/arena.cc", + "src/core/lib/gprpp/arena.h", + "src/core/lib/gprpp/atomic.h", + "src/core/lib/gprpp/fork.cc", + "src/core/lib/gprpp/fork.h", + "src/core/lib/gprpp/global_config.h", + "src/core/lib/gprpp/global_config_custom.h", + "src/core/lib/gprpp/global_config_env.cc", + "src/core/lib/gprpp/global_config_env.h", + "src/core/lib/gprpp/global_config_generic.h", + "src/core/lib/gprpp/host_port.cc", + "src/core/lib/gprpp/host_port.h", + "src/core/lib/gprpp/manual_constructor.h", + "src/core/lib/gprpp/map.h", + "src/core/lib/gprpp/memory.h", + "src/core/lib/gprpp/mpscq.cc", + "src/core/lib/gprpp/mpscq.h", + "src/core/lib/gprpp/sync.h", + "src/core/lib/gprpp/thd.h", + "src/core/lib/gprpp/thd_posix.cc", + "src/core/lib/gprpp/thd_windows.cc", + "src/core/lib/profiling/basic_timers.cc", + "src/core/lib/profiling/stap_timers.cc", + "src/core/lib/profiling/timers.h", + ] + deps = [ + ":absl/time:time", + ":absl/strings:strings", + ":absl/strings:str_format", + ":absl/memory:memory", + ] + + public_configs = [ + ":grpc_config", + ] + } + + + + source_set("grpc") { + sources = [ + "include/grpc/byte_buffer.h", + "include/grpc/byte_buffer_reader.h", + "include/grpc/census.h", + "include/grpc/compression.h", + "include/grpc/fork.h", + "include/grpc/grpc.h", + "include/grpc/grpc_posix.h", + "include/grpc/grpc_security.h", + "include/grpc/grpc_security_constants.h", + "include/grpc/load_reporting.h", + "include/grpc/slice.h", + "include/grpc/slice_buffer.h", + "include/grpc/status.h", + "include/grpc/support/workaround_list.h", + "src/core/ext/filters/census/grpc_context.cc", + "src/core/ext/filters/client_channel/backend_metric.cc", + "src/core/ext/filters/client_channel/backend_metric.h", + "src/core/ext/filters/client_channel/backup_poller.cc", + "src/core/ext/filters/client_channel/backup_poller.h", + "src/core/ext/filters/client_channel/channel_connectivity.cc", + "src/core/ext/filters/client_channel/client_channel.cc", + "src/core/ext/filters/client_channel/client_channel.h", + "src/core/ext/filters/client_channel/client_channel_channelz.cc", + "src/core/ext/filters/client_channel/client_channel_channelz.h", + "src/core/ext/filters/client_channel/client_channel_factory.cc", + "src/core/ext/filters/client_channel/client_channel_factory.h", + "src/core/ext/filters/client_channel/client_channel_plugin.cc", + "src/core/ext/filters/client_channel/connector.h", + "src/core/ext/filters/client_channel/global_subchannel_pool.cc", + "src/core/ext/filters/client_channel/global_subchannel_pool.h", + "src/core/ext/filters/client_channel/health/health_check_client.cc", + "src/core/ext/filters/client_channel/health/health_check_client.h", + "src/core/ext/filters/client_channel/http_connect_handshaker.cc", + "src/core/ext/filters/client_channel/http_connect_handshaker.h", + "src/core/ext/filters/client_channel/http_proxy.cc", + "src/core/ext/filters/client_channel/http_proxy.h", + "src/core/ext/filters/client_channel/lb_policy.cc", + "src/core/ext/filters/client_channel/lb_policy.h", + "src/core/ext/filters/client_channel/lb_policy/address_filtering.cc", + "src/core/ext/filters/client_channel/lb_policy/address_filtering.h", + "src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc", + "src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h", + "src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc", + "src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h", + "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc", + "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h", + "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc", + "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h", + "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h", + "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc", + "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc", + "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h", + "src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc", + "src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h", + "src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc", + "src/core/ext/filters/client_channel/lb_policy/priority/priority.cc", + "src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc", + "src/core/ext/filters/client_channel/lb_policy/subchannel_list.h", + "src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc", + "src/core/ext/filters/client_channel/lb_policy/xds/cds.cc", + "src/core/ext/filters/client_channel/lb_policy/xds/eds.cc", + "src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc", + "src/core/ext/filters/client_channel/lb_policy/xds/xds.h", + "src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc", + "src/core/ext/filters/client_channel/lb_policy_factory.h", + "src/core/ext/filters/client_channel/lb_policy_registry.cc", + "src/core/ext/filters/client_channel/lb_policy_registry.h", + "src/core/ext/filters/client_channel/local_subchannel_pool.cc", + "src/core/ext/filters/client_channel/local_subchannel_pool.h", + "src/core/ext/filters/client_channel/parse_address.cc", + "src/core/ext/filters/client_channel/parse_address.h", + "src/core/ext/filters/client_channel/proxy_mapper.h", + "src/core/ext/filters/client_channel/proxy_mapper_registry.cc", + "src/core/ext/filters/client_channel/proxy_mapper_registry.h", + "src/core/ext/filters/client_channel/resolver.cc", + "src/core/ext/filters/client_channel/resolver.h", + "src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc", + "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc", + "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h", + "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc", + "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc", + "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc", + "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc", + "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h", + "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc", + "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc", + "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc", + "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc", + "src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc", + "src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h", + "src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc", + "src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc", + "src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h", + "src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc", + "src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc", + "src/core/ext/filters/client_channel/resolver_factory.h", + "src/core/ext/filters/client_channel/resolver_registry.cc", + "src/core/ext/filters/client_channel/resolver_registry.h", + "src/core/ext/filters/client_channel/resolver_result_parsing.cc", + "src/core/ext/filters/client_channel/resolver_result_parsing.h", + "src/core/ext/filters/client_channel/resolving_lb_policy.cc", + "src/core/ext/filters/client_channel/resolving_lb_policy.h", + "src/core/ext/filters/client_channel/retry_throttle.cc", + "src/core/ext/filters/client_channel/retry_throttle.h", + "src/core/ext/filters/client_channel/server_address.cc", + "src/core/ext/filters/client_channel/server_address.h", + "src/core/ext/filters/client_channel/service_config.cc", + "src/core/ext/filters/client_channel/service_config.h", + "src/core/ext/filters/client_channel/service_config_call_data.h", + "src/core/ext/filters/client_channel/service_config_parser.cc", + "src/core/ext/filters/client_channel/service_config_parser.h", + "src/core/ext/filters/client_channel/subchannel.cc", + "src/core/ext/filters/client_channel/subchannel.h", + "src/core/ext/filters/client_channel/subchannel_interface.h", + "src/core/ext/filters/client_channel/subchannel_pool_interface.cc", + "src/core/ext/filters/client_channel/subchannel_pool_interface.h", + "src/core/ext/filters/client_channel/xds/xds_api.cc", + "src/core/ext/filters/client_channel/xds/xds_api.h", + "src/core/ext/filters/client_channel/xds/xds_bootstrap.cc", + "src/core/ext/filters/client_channel/xds/xds_bootstrap.h", + "src/core/ext/filters/client_channel/xds/xds_channel.h", + "src/core/ext/filters/client_channel/xds/xds_channel_args.h", + "src/core/ext/filters/client_channel/xds/xds_channel_secure.cc", + "src/core/ext/filters/client_channel/xds/xds_client.cc", + "src/core/ext/filters/client_channel/xds/xds_client.h", + "src/core/ext/filters/client_channel/xds/xds_client_stats.cc", + "src/core/ext/filters/client_channel/xds/xds_client_stats.h", + "src/core/ext/filters/client_idle/client_idle_filter.cc", + "src/core/ext/filters/deadline/deadline_filter.cc", + "src/core/ext/filters/deadline/deadline_filter.h", + "src/core/ext/filters/http/client/http_client_filter.cc", + "src/core/ext/filters/http/client/http_client_filter.h", + "src/core/ext/filters/http/client_authority_filter.cc", + "src/core/ext/filters/http/client_authority_filter.h", + "src/core/ext/filters/http/http_filters_plugin.cc", + "src/core/ext/filters/http/message_compress/message_compress_filter.cc", + "src/core/ext/filters/http/message_compress/message_compress_filter.h", + "src/core/ext/filters/http/message_compress/message_decompress_filter.cc", + "src/core/ext/filters/http/message_compress/message_decompress_filter.h", + "src/core/ext/filters/http/server/http_server_filter.cc", + "src/core/ext/filters/http/server/http_server_filter.h", + "src/core/ext/filters/max_age/max_age_filter.cc", + "src/core/ext/filters/max_age/max_age_filter.h", + "src/core/ext/filters/message_size/message_size_filter.cc", + "src/core/ext/filters/message_size/message_size_filter.h", + "src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc", + "src/core/ext/filters/workarounds/workaround_cronet_compression_filter.h", + "src/core/ext/filters/workarounds/workaround_utils.cc", + "src/core/ext/filters/workarounds/workaround_utils.h", + "src/core/ext/transport/chttp2/alpn/alpn.cc", + "src/core/ext/transport/chttp2/alpn/alpn.h", + "src/core/ext/transport/chttp2/client/authority.cc", + "src/core/ext/transport/chttp2/client/authority.h", + "src/core/ext/transport/chttp2/client/chttp2_connector.cc", + "src/core/ext/transport/chttp2/client/chttp2_connector.h", + "src/core/ext/transport/chttp2/client/insecure/channel_create.cc", + "src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc", + "src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc", + "src/core/ext/transport/chttp2/server/chttp2_server.cc", + "src/core/ext/transport/chttp2/server/chttp2_server.h", + "src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc", + "src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc", + "src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc", + "src/core/ext/transport/chttp2/transport/bin_decoder.cc", + "src/core/ext/transport/chttp2/transport/bin_decoder.h", + "src/core/ext/transport/chttp2/transport/bin_encoder.cc", + "src/core/ext/transport/chttp2/transport/bin_encoder.h", + "src/core/ext/transport/chttp2/transport/chttp2_plugin.cc", + "src/core/ext/transport/chttp2/transport/chttp2_transport.cc", + "src/core/ext/transport/chttp2/transport/chttp2_transport.h", + "src/core/ext/transport/chttp2/transport/context_list.cc", + "src/core/ext/transport/chttp2/transport/context_list.h", + "src/core/ext/transport/chttp2/transport/flow_control.cc", + "src/core/ext/transport/chttp2/transport/flow_control.h", + "src/core/ext/transport/chttp2/transport/frame.h", + "src/core/ext/transport/chttp2/transport/frame_data.cc", + "src/core/ext/transport/chttp2/transport/frame_data.h", + "src/core/ext/transport/chttp2/transport/frame_goaway.cc", + "src/core/ext/transport/chttp2/transport/frame_goaway.h", + "src/core/ext/transport/chttp2/transport/frame_ping.cc", + "src/core/ext/transport/chttp2/transport/frame_ping.h", + "src/core/ext/transport/chttp2/transport/frame_rst_stream.cc", + "src/core/ext/transport/chttp2/transport/frame_rst_stream.h", + "src/core/ext/transport/chttp2/transport/frame_settings.cc", + "src/core/ext/transport/chttp2/transport/frame_settings.h", + "src/core/ext/transport/chttp2/transport/frame_window_update.cc", + "src/core/ext/transport/chttp2/transport/frame_window_update.h", + "src/core/ext/transport/chttp2/transport/hpack_encoder.cc", + "src/core/ext/transport/chttp2/transport/hpack_encoder.h", + "src/core/ext/transport/chttp2/transport/hpack_parser.cc", + "src/core/ext/transport/chttp2/transport/hpack_parser.h", + "src/core/ext/transport/chttp2/transport/hpack_table.cc", + "src/core/ext/transport/chttp2/transport/hpack_table.h", + "src/core/ext/transport/chttp2/transport/http2_settings.cc", + "src/core/ext/transport/chttp2/transport/http2_settings.h", + "src/core/ext/transport/chttp2/transport/huffsyms.cc", + "src/core/ext/transport/chttp2/transport/huffsyms.h", + "src/core/ext/transport/chttp2/transport/incoming_metadata.cc", + "src/core/ext/transport/chttp2/transport/incoming_metadata.h", + "src/core/ext/transport/chttp2/transport/internal.h", + "src/core/ext/transport/chttp2/transport/parsing.cc", + "src/core/ext/transport/chttp2/transport/stream_lists.cc", + "src/core/ext/transport/chttp2/transport/stream_map.cc", + "src/core/ext/transport/chttp2/transport/stream_map.h", + "src/core/ext/transport/chttp2/transport/varint.cc", + "src/core/ext/transport/chttp2/transport/varint.h", + "src/core/ext/transport/chttp2/transport/writing.cc", + "src/core/ext/transport/inproc/inproc_plugin.cc", + "src/core/ext/transport/inproc/inproc_transport.cc", + "src/core/ext/transport/inproc/inproc_transport.h", + "src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c", + "src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h", + "src/core/ext/upb-generated/envoy/annotations/resource.upb.c", + "src/core/ext/upb-generated/envoy/annotations/resource.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/cds.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/cds.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/eds.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/eds.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/lds.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/lds.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/listener.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/listener.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/rds.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/rds.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/route.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/route.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/route/route.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/srds.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/srds.upb.h", + "src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c", + "src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h", + "src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c", + "src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h", + "src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c", + "src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h", + "src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c", + "src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h", + "src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c", + "src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h", + "src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c", + "src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h", + "src/core/ext/upb-generated/envoy/type/http.upb.c", + "src/core/ext/upb-generated/envoy/type/http.upb.h", + "src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c", + "src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h", + "src/core/ext/upb-generated/envoy/type/matcher/string.upb.c", + "src/core/ext/upb-generated/envoy/type/matcher/string.upb.h", + "src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c", + "src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.h", + "src/core/ext/upb-generated/envoy/type/percent.upb.c", + "src/core/ext/upb-generated/envoy/type/percent.upb.h", + "src/core/ext/upb-generated/envoy/type/range.upb.c", + "src/core/ext/upb-generated/envoy/type/range.upb.h", + "src/core/ext/upb-generated/envoy/type/semantic_version.upb.c", + "src/core/ext/upb-generated/envoy/type/semantic_version.upb.h", + "src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c", + "src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.h", + "src/core/ext/upb-generated/gogoproto/gogo.upb.c", + "src/core/ext/upb-generated/gogoproto/gogo.upb.h", + "src/core/ext/upb-generated/google/api/annotations.upb.c", + "src/core/ext/upb-generated/google/api/annotations.upb.h", + "src/core/ext/upb-generated/google/api/http.upb.c", + "src/core/ext/upb-generated/google/api/http.upb.h", + "src/core/ext/upb-generated/google/protobuf/any.upb.c", + "src/core/ext/upb-generated/google/protobuf/any.upb.h", + "src/core/ext/upb-generated/google/protobuf/descriptor.upb.c", + "src/core/ext/upb-generated/google/protobuf/descriptor.upb.h", + "src/core/ext/upb-generated/google/protobuf/duration.upb.c", + "src/core/ext/upb-generated/google/protobuf/duration.upb.h", + "src/core/ext/upb-generated/google/protobuf/empty.upb.c", + "src/core/ext/upb-generated/google/protobuf/empty.upb.h", + "src/core/ext/upb-generated/google/protobuf/struct.upb.c", + "src/core/ext/upb-generated/google/protobuf/struct.upb.h", + "src/core/ext/upb-generated/google/protobuf/timestamp.upb.c", + "src/core/ext/upb-generated/google/protobuf/timestamp.upb.h", + "src/core/ext/upb-generated/google/protobuf/wrappers.upb.c", + "src/core/ext/upb-generated/google/protobuf/wrappers.upb.h", + "src/core/ext/upb-generated/google/rpc/status.upb.c", + "src/core/ext/upb-generated/google/rpc/status.upb.h", + "src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c", + "src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h", + "src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c", + "src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h", + "src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c", + "src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h", + "src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c", + "src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h", + "src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c", + "src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h", + "src/core/ext/upb-generated/udpa/annotations/migrate.upb.c", + "src/core/ext/upb-generated/udpa/annotations/migrate.upb.h", + "src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c", + "src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h", + "src/core/ext/upb-generated/udpa/annotations/status.upb.c", + "src/core/ext/upb-generated/udpa/annotations/status.upb.h", + "src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c", + "src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h", + "src/core/ext/upb-generated/validate/validate.upb.c", + "src/core/ext/upb-generated/validate/validate.upb.h", + "src/core/lib/avl/avl.cc", + "src/core/lib/avl/avl.h", + "src/core/lib/backoff/backoff.cc", + "src/core/lib/backoff/backoff.h", + "src/core/lib/channel/channel_args.cc", + "src/core/lib/channel/channel_args.h", + "src/core/lib/channel/channel_stack.cc", + "src/core/lib/channel/channel_stack.h", + "src/core/lib/channel/channel_stack_builder.cc", + "src/core/lib/channel/channel_stack_builder.h", + "src/core/lib/channel/channel_trace.cc", + "src/core/lib/channel/channel_trace.h", + "src/core/lib/channel/channelz.cc", + "src/core/lib/channel/channelz.h", + "src/core/lib/channel/channelz_registry.cc", + "src/core/lib/channel/channelz_registry.h", + "src/core/lib/channel/connected_channel.cc", + "src/core/lib/channel/connected_channel.h", + "src/core/lib/channel/context.h", + "src/core/lib/channel/handshaker.cc", + "src/core/lib/channel/handshaker.h", + "src/core/lib/channel/handshaker_factory.h", + "src/core/lib/channel/handshaker_registry.cc", + "src/core/lib/channel/handshaker_registry.h", + "src/core/lib/channel/status_util.cc", + "src/core/lib/channel/status_util.h", + "src/core/lib/compression/algorithm_metadata.h", + "src/core/lib/compression/compression.cc", + "src/core/lib/compression/compression_args.cc", + "src/core/lib/compression/compression_args.h", + "src/core/lib/compression/compression_internal.cc", + "src/core/lib/compression/compression_internal.h", + "src/core/lib/compression/message_compress.cc", + "src/core/lib/compression/message_compress.h", + "src/core/lib/compression/stream_compression.cc", + "src/core/lib/compression/stream_compression.h", + "src/core/lib/compression/stream_compression_gzip.cc", + "src/core/lib/compression/stream_compression_gzip.h", + "src/core/lib/compression/stream_compression_identity.cc", + "src/core/lib/compression/stream_compression_identity.h", + "src/core/lib/debug/stats.cc", + "src/core/lib/debug/stats.h", + "src/core/lib/debug/stats_data.cc", + "src/core/lib/debug/stats_data.h", + "src/core/lib/debug/trace.cc", + "src/core/lib/debug/trace.h", + "src/core/lib/gprpp/atomic.h", + "src/core/lib/gprpp/debug_location.h", + "src/core/lib/gprpp/orphanable.h", + "src/core/lib/gprpp/ref_counted.h", + "src/core/lib/gprpp/ref_counted_ptr.h", + "src/core/lib/http/format_request.cc", + "src/core/lib/http/format_request.h", + "src/core/lib/http/httpcli.cc", + "src/core/lib/http/httpcli.h", + "src/core/lib/http/httpcli_security_connector.cc", + "src/core/lib/http/parser.cc", + "src/core/lib/http/parser.h", + "src/core/lib/iomgr/block_annotate.h", + "src/core/lib/iomgr/buffer_list.cc", + "src/core/lib/iomgr/buffer_list.h", + "src/core/lib/iomgr/call_combiner.cc", + "src/core/lib/iomgr/call_combiner.h", + "src/core/lib/iomgr/cfstream_handle.cc", + "src/core/lib/iomgr/cfstream_handle.h", + "src/core/lib/iomgr/closure.h", + "src/core/lib/iomgr/combiner.cc", + "src/core/lib/iomgr/combiner.h", + "src/core/lib/iomgr/dualstack_socket_posix.cc", + "src/core/lib/iomgr/dynamic_annotations.h", + "src/core/lib/iomgr/endpoint.cc", + "src/core/lib/iomgr/endpoint.h", + "src/core/lib/iomgr/endpoint_cfstream.cc", + "src/core/lib/iomgr/endpoint_cfstream.h", + "src/core/lib/iomgr/endpoint_pair.h", + "src/core/lib/iomgr/endpoint_pair_posix.cc", + "src/core/lib/iomgr/endpoint_pair_uv.cc", + "src/core/lib/iomgr/endpoint_pair_windows.cc", + "src/core/lib/iomgr/error.cc", + "src/core/lib/iomgr/error.h", + "src/core/lib/iomgr/error_cfstream.cc", + "src/core/lib/iomgr/error_cfstream.h", + "src/core/lib/iomgr/error_internal.h", + "src/core/lib/iomgr/ev_apple.cc", + "src/core/lib/iomgr/ev_apple.h", + "src/core/lib/iomgr/ev_epoll1_linux.cc", + "src/core/lib/iomgr/ev_epoll1_linux.h", + "src/core/lib/iomgr/ev_epollex_linux.cc", + "src/core/lib/iomgr/ev_epollex_linux.h", + "src/core/lib/iomgr/ev_poll_posix.cc", + "src/core/lib/iomgr/ev_poll_posix.h", + "src/core/lib/iomgr/ev_posix.cc", + "src/core/lib/iomgr/ev_posix.h", + "src/core/lib/iomgr/ev_windows.cc", + "src/core/lib/iomgr/exec_ctx.cc", + "src/core/lib/iomgr/exec_ctx.h", + "src/core/lib/iomgr/executor.cc", + "src/core/lib/iomgr/executor.h", + "src/core/lib/iomgr/executor/mpmcqueue.cc", + "src/core/lib/iomgr/executor/mpmcqueue.h", + "src/core/lib/iomgr/executor/threadpool.cc", + "src/core/lib/iomgr/executor/threadpool.h", + "src/core/lib/iomgr/fork_posix.cc", + "src/core/lib/iomgr/fork_windows.cc", + "src/core/lib/iomgr/gethostname.h", + "src/core/lib/iomgr/gethostname_fallback.cc", + "src/core/lib/iomgr/gethostname_host_name_max.cc", + "src/core/lib/iomgr/gethostname_sysconf.cc", + "src/core/lib/iomgr/grpc_if_nametoindex.h", + "src/core/lib/iomgr/grpc_if_nametoindex_posix.cc", + "src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc", + "src/core/lib/iomgr/internal_errqueue.cc", + "src/core/lib/iomgr/internal_errqueue.h", + "src/core/lib/iomgr/iocp_windows.cc", + "src/core/lib/iomgr/iocp_windows.h", + "src/core/lib/iomgr/iomgr.cc", + "src/core/lib/iomgr/iomgr.h", + "src/core/lib/iomgr/iomgr_custom.cc", + "src/core/lib/iomgr/iomgr_custom.h", + "src/core/lib/iomgr/iomgr_internal.cc", + "src/core/lib/iomgr/iomgr_internal.h", + "src/core/lib/iomgr/iomgr_posix.cc", + "src/core/lib/iomgr/iomgr_posix.h", + "src/core/lib/iomgr/iomgr_posix_cfstream.cc", + "src/core/lib/iomgr/iomgr_uv.cc", + "src/core/lib/iomgr/iomgr_windows.cc", + "src/core/lib/iomgr/is_epollexclusive_available.cc", + "src/core/lib/iomgr/is_epollexclusive_available.h", + "src/core/lib/iomgr/load_file.cc", + "src/core/lib/iomgr/load_file.h", + "src/core/lib/iomgr/lockfree_event.cc", + "src/core/lib/iomgr/lockfree_event.h", + "src/core/lib/iomgr/nameser.h", + "src/core/lib/iomgr/poller/eventmanager_libuv.cc", + "src/core/lib/iomgr/poller/eventmanager_libuv.h", + "src/core/lib/iomgr/polling_entity.cc", + "src/core/lib/iomgr/polling_entity.h", + "src/core/lib/iomgr/pollset.cc", + "src/core/lib/iomgr/pollset.h", + "src/core/lib/iomgr/pollset_custom.cc", + "src/core/lib/iomgr/pollset_custom.h", + "src/core/lib/iomgr/pollset_set.cc", + "src/core/lib/iomgr/pollset_set.h", + "src/core/lib/iomgr/pollset_set_custom.cc", + "src/core/lib/iomgr/pollset_set_custom.h", + "src/core/lib/iomgr/pollset_set_windows.cc", + "src/core/lib/iomgr/pollset_set_windows.h", + "src/core/lib/iomgr/pollset_uv.cc", + "src/core/lib/iomgr/pollset_uv.h", + "src/core/lib/iomgr/pollset_windows.cc", + "src/core/lib/iomgr/pollset_windows.h", + "src/core/lib/iomgr/port.h", + "src/core/lib/iomgr/python_util.h", + "src/core/lib/iomgr/resolve_address.cc", + "src/core/lib/iomgr/resolve_address.h", + "src/core/lib/iomgr/resolve_address_custom.cc", + "src/core/lib/iomgr/resolve_address_custom.h", + "src/core/lib/iomgr/resolve_address_posix.cc", + "src/core/lib/iomgr/resolve_address_windows.cc", + "src/core/lib/iomgr/resource_quota.cc", + "src/core/lib/iomgr/resource_quota.h", + "src/core/lib/iomgr/sockaddr.h", + "src/core/lib/iomgr/sockaddr_custom.h", + "src/core/lib/iomgr/sockaddr_posix.h", + "src/core/lib/iomgr/sockaddr_utils.cc", + "src/core/lib/iomgr/sockaddr_utils.h", + "src/core/lib/iomgr/sockaddr_windows.h", + "src/core/lib/iomgr/socket_factory_posix.cc", + "src/core/lib/iomgr/socket_factory_posix.h", + "src/core/lib/iomgr/socket_mutator.cc", + "src/core/lib/iomgr/socket_mutator.h", + "src/core/lib/iomgr/socket_utils.h", + "src/core/lib/iomgr/socket_utils_common_posix.cc", + "src/core/lib/iomgr/socket_utils_linux.cc", + "src/core/lib/iomgr/socket_utils_posix.cc", + "src/core/lib/iomgr/socket_utils_posix.h", + "src/core/lib/iomgr/socket_utils_uv.cc", + "src/core/lib/iomgr/socket_utils_windows.cc", + "src/core/lib/iomgr/socket_windows.cc", + "src/core/lib/iomgr/socket_windows.h", + "src/core/lib/iomgr/sys_epoll_wrapper.h", + "src/core/lib/iomgr/tcp_client.cc", + "src/core/lib/iomgr/tcp_client.h", + "src/core/lib/iomgr/tcp_client_cfstream.cc", + "src/core/lib/iomgr/tcp_client_custom.cc", + "src/core/lib/iomgr/tcp_client_posix.cc", + "src/core/lib/iomgr/tcp_client_posix.h", + "src/core/lib/iomgr/tcp_client_windows.cc", + "src/core/lib/iomgr/tcp_custom.cc", + "src/core/lib/iomgr/tcp_custom.h", + "src/core/lib/iomgr/tcp_posix.cc", + "src/core/lib/iomgr/tcp_posix.h", + "src/core/lib/iomgr/tcp_server.cc", + "src/core/lib/iomgr/tcp_server.h", + "src/core/lib/iomgr/tcp_server_custom.cc", + "src/core/lib/iomgr/tcp_server_posix.cc", + "src/core/lib/iomgr/tcp_server_utils_posix.h", + "src/core/lib/iomgr/tcp_server_utils_posix_common.cc", + "src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc", + "src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc", + "src/core/lib/iomgr/tcp_server_windows.cc", + "src/core/lib/iomgr/tcp_uv.cc", + "src/core/lib/iomgr/tcp_windows.cc", + "src/core/lib/iomgr/tcp_windows.h", + "src/core/lib/iomgr/time_averaged_stats.cc", + "src/core/lib/iomgr/time_averaged_stats.h", + "src/core/lib/iomgr/timer.cc", + "src/core/lib/iomgr/timer.h", + "src/core/lib/iomgr/timer_custom.cc", + "src/core/lib/iomgr/timer_custom.h", + "src/core/lib/iomgr/timer_generic.cc", + "src/core/lib/iomgr/timer_generic.h", + "src/core/lib/iomgr/timer_heap.cc", + "src/core/lib/iomgr/timer_heap.h", + "src/core/lib/iomgr/timer_manager.cc", + "src/core/lib/iomgr/timer_manager.h", + "src/core/lib/iomgr/timer_uv.cc", + "src/core/lib/iomgr/udp_server.cc", + "src/core/lib/iomgr/udp_server.h", + "src/core/lib/iomgr/unix_sockets_posix.cc", + "src/core/lib/iomgr/unix_sockets_posix.h", + "src/core/lib/iomgr/unix_sockets_posix_noop.cc", + "src/core/lib/iomgr/wakeup_fd_eventfd.cc", + "src/core/lib/iomgr/wakeup_fd_nospecial.cc", + "src/core/lib/iomgr/wakeup_fd_pipe.cc", + "src/core/lib/iomgr/wakeup_fd_pipe.h", + "src/core/lib/iomgr/wakeup_fd_posix.cc", + "src/core/lib/iomgr/wakeup_fd_posix.h", + "src/core/lib/iomgr/work_serializer.cc", + "src/core/lib/iomgr/work_serializer.h", + "src/core/lib/json/json.h", + "src/core/lib/json/json_reader.cc", + "src/core/lib/json/json_writer.cc", + "src/core/lib/security/context/security_context.cc", + "src/core/lib/security/context/security_context.h", + "src/core/lib/security/credentials/alts/alts_credentials.cc", + "src/core/lib/security/credentials/alts/alts_credentials.h", + "src/core/lib/security/credentials/alts/check_gcp_environment.cc", + "src/core/lib/security/credentials/alts/check_gcp_environment.h", + "src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc", + "src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc", + "src/core/lib/security/credentials/alts/check_gcp_environment_windows.cc", + "src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc", + "src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc", + "src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h", + "src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc", + "src/core/lib/security/credentials/composite/composite_credentials.cc", + "src/core/lib/security/credentials/composite/composite_credentials.h", + "src/core/lib/security/credentials/credentials.cc", + "src/core/lib/security/credentials/credentials.h", + "src/core/lib/security/credentials/credentials_metadata.cc", + "src/core/lib/security/credentials/fake/fake_credentials.cc", + "src/core/lib/security/credentials/fake/fake_credentials.h", + "src/core/lib/security/credentials/google_default/credentials_generic.cc", + "src/core/lib/security/credentials/google_default/google_default_credentials.cc", + "src/core/lib/security/credentials/google_default/google_default_credentials.h", + "src/core/lib/security/credentials/iam/iam_credentials.cc", + "src/core/lib/security/credentials/iam/iam_credentials.h", + "src/core/lib/security/credentials/jwt/json_token.cc", + "src/core/lib/security/credentials/jwt/json_token.h", + "src/core/lib/security/credentials/jwt/jwt_credentials.cc", + "src/core/lib/security/credentials/jwt/jwt_credentials.h", + "src/core/lib/security/credentials/jwt/jwt_verifier.cc", + "src/core/lib/security/credentials/jwt/jwt_verifier.h", + "src/core/lib/security/credentials/local/local_credentials.cc", + "src/core/lib/security/credentials/local/local_credentials.h", + "src/core/lib/security/credentials/oauth2/oauth2_credentials.cc", + "src/core/lib/security/credentials/oauth2/oauth2_credentials.h", + "src/core/lib/security/credentials/plugin/plugin_credentials.cc", + "src/core/lib/security/credentials/plugin/plugin_credentials.h", + "src/core/lib/security/credentials/ssl/ssl_credentials.cc", + "src/core/lib/security/credentials/ssl/ssl_credentials.h", + "src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc", + "src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h", + "src/core/lib/security/credentials/tls/tls_credentials.cc", + "src/core/lib/security/credentials/tls/tls_credentials.h", + "src/core/lib/security/security_connector/alts/alts_security_connector.cc", + "src/core/lib/security/security_connector/alts/alts_security_connector.h", + "src/core/lib/security/security_connector/fake/fake_security_connector.cc", + "src/core/lib/security/security_connector/fake/fake_security_connector.h", + "src/core/lib/security/security_connector/load_system_roots.h", + "src/core/lib/security/security_connector/load_system_roots_fallback.cc", + "src/core/lib/security/security_connector/load_system_roots_linux.cc", + "src/core/lib/security/security_connector/load_system_roots_linux.h", + "src/core/lib/security/security_connector/local/local_security_connector.cc", + "src/core/lib/security/security_connector/local/local_security_connector.h", + "src/core/lib/security/security_connector/security_connector.cc", + "src/core/lib/security/security_connector/security_connector.h", + "src/core/lib/security/security_connector/ssl/ssl_security_connector.cc", + "src/core/lib/security/security_connector/ssl/ssl_security_connector.h", + "src/core/lib/security/security_connector/ssl_utils.cc", + "src/core/lib/security/security_connector/ssl_utils.h", + "src/core/lib/security/security_connector/ssl_utils_config.cc", + "src/core/lib/security/security_connector/ssl_utils_config.h", + "src/core/lib/security/security_connector/tls/tls_security_connector.cc", + "src/core/lib/security/security_connector/tls/tls_security_connector.h", + "src/core/lib/security/transport/auth_filters.h", + "src/core/lib/security/transport/client_auth_filter.cc", + "src/core/lib/security/transport/secure_endpoint.cc", + "src/core/lib/security/transport/secure_endpoint.h", + "src/core/lib/security/transport/security_handshaker.cc", + "src/core/lib/security/transport/security_handshaker.h", + "src/core/lib/security/transport/server_auth_filter.cc", + "src/core/lib/security/transport/target_authority_table.cc", + "src/core/lib/security/transport/target_authority_table.h", + "src/core/lib/security/transport/tsi_error.cc", + "src/core/lib/security/transport/tsi_error.h", + "src/core/lib/security/util/json_util.cc", + "src/core/lib/security/util/json_util.h", + "src/core/lib/slice/b64.cc", + "src/core/lib/slice/b64.h", + "src/core/lib/slice/percent_encoding.cc", + "src/core/lib/slice/percent_encoding.h", + "src/core/lib/slice/slice.cc", + "src/core/lib/slice/slice_buffer.cc", + "src/core/lib/slice/slice_hash_table.h", + "src/core/lib/slice/slice_intern.cc", + "src/core/lib/slice/slice_internal.h", + "src/core/lib/slice/slice_string_helpers.cc", + "src/core/lib/slice/slice_string_helpers.h", + "src/core/lib/slice/slice_utils.h", + "src/core/lib/slice/slice_weak_hash_table.h", + "src/core/lib/surface/api_trace.cc", + "src/core/lib/surface/api_trace.h", + "src/core/lib/surface/byte_buffer.cc", + "src/core/lib/surface/byte_buffer_reader.cc", + "src/core/lib/surface/call.cc", + "src/core/lib/surface/call.h", + "src/core/lib/surface/call_details.cc", + "src/core/lib/surface/call_log_batch.cc", + "src/core/lib/surface/call_test_only.h", + "src/core/lib/surface/channel.cc", + "src/core/lib/surface/channel.h", + "src/core/lib/surface/channel_init.cc", + "src/core/lib/surface/channel_init.h", + "src/core/lib/surface/channel_ping.cc", + "src/core/lib/surface/channel_stack_type.cc", + "src/core/lib/surface/channel_stack_type.h", + "src/core/lib/surface/completion_queue.cc", + "src/core/lib/surface/completion_queue.h", + "src/core/lib/surface/completion_queue_factory.cc", + "src/core/lib/surface/completion_queue_factory.h", + "src/core/lib/surface/event_string.cc", + "src/core/lib/surface/event_string.h", + "src/core/lib/surface/init.cc", + "src/core/lib/surface/init.h", + "src/core/lib/surface/init_secure.cc", + "src/core/lib/surface/lame_client.cc", + "src/core/lib/surface/lame_client.h", + "src/core/lib/surface/metadata_array.cc", + "src/core/lib/surface/server.cc", + "src/core/lib/surface/server.h", + "src/core/lib/surface/validate_metadata.cc", + "src/core/lib/surface/validate_metadata.h", + "src/core/lib/surface/version.cc", + "src/core/lib/transport/bdp_estimator.cc", + "src/core/lib/transport/bdp_estimator.h", + "src/core/lib/transport/byte_stream.cc", + "src/core/lib/transport/byte_stream.h", + "src/core/lib/transport/connectivity_state.cc", + "src/core/lib/transport/connectivity_state.h", + "src/core/lib/transport/error_utils.cc", + "src/core/lib/transport/error_utils.h", + "src/core/lib/transport/http2_errors.h", + "src/core/lib/transport/metadata.cc", + "src/core/lib/transport/metadata.h", + "src/core/lib/transport/metadata_batch.cc", + "src/core/lib/transport/metadata_batch.h", + "src/core/lib/transport/pid_controller.cc", + "src/core/lib/transport/pid_controller.h", + "src/core/lib/transport/static_metadata.cc", + "src/core/lib/transport/static_metadata.h", + "src/core/lib/transport/status_conversion.cc", + "src/core/lib/transport/status_conversion.h", + "src/core/lib/transport/status_metadata.cc", + "src/core/lib/transport/status_metadata.h", + "src/core/lib/transport/timeout_encoding.cc", + "src/core/lib/transport/timeout_encoding.h", + "src/core/lib/transport/transport.cc", + "src/core/lib/transport/transport.h", + "src/core/lib/transport/transport_impl.h", + "src/core/lib/transport/transport_op_string.cc", + "src/core/lib/uri/uri_parser.cc", + "src/core/lib/uri/uri_parser.h", + "src/core/plugin_registry/grpc_plugin_registry.cc", + "src/core/tsi/alts/crypt/aes_gcm.cc", + "src/core/tsi/alts/crypt/gsec.cc", + "src/core/tsi/alts/crypt/gsec.h", + "src/core/tsi/alts/frame_protector/alts_counter.cc", + "src/core/tsi/alts/frame_protector/alts_counter.h", + "src/core/tsi/alts/frame_protector/alts_crypter.cc", + "src/core/tsi/alts/frame_protector/alts_crypter.h", + "src/core/tsi/alts/frame_protector/alts_frame_protector.cc", + "src/core/tsi/alts/frame_protector/alts_frame_protector.h", + "src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.cc", + "src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.h", + "src/core/tsi/alts/frame_protector/alts_seal_privacy_integrity_crypter.cc", + "src/core/tsi/alts/frame_protector/alts_unseal_privacy_integrity_crypter.cc", + "src/core/tsi/alts/frame_protector/frame_handler.cc", + "src/core/tsi/alts/frame_protector/frame_handler.h", + "src/core/tsi/alts/handshaker/alts_handshaker_client.cc", + "src/core/tsi/alts/handshaker/alts_handshaker_client.h", + "src/core/tsi/alts/handshaker/alts_shared_resource.cc", + "src/core/tsi/alts/handshaker/alts_shared_resource.h", + "src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc", + "src/core/tsi/alts/handshaker/alts_tsi_handshaker.h", + "src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h", + "src/core/tsi/alts/handshaker/alts_tsi_utils.cc", + "src/core/tsi/alts/handshaker/alts_tsi_utils.h", + "src/core/tsi/alts/handshaker/transport_security_common_api.cc", + "src/core/tsi/alts/handshaker/transport_security_common_api.h", + "src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc", + "src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.h", + "src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc", + "src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.h", + "src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol.h", + "src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc", + "src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h", + "src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc", + "src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.h", + "src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc", + "src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h", + "src/core/tsi/fake_transport_security.cc", + "src/core/tsi/fake_transport_security.h", + "src/core/tsi/local_transport_security.cc", + "src/core/tsi/local_transport_security.h", + "src/core/tsi/ssl/session_cache/ssl_session.h", + "src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc", + "src/core/tsi/ssl/session_cache/ssl_session_cache.cc", + "src/core/tsi/ssl/session_cache/ssl_session_cache.h", + "src/core/tsi/ssl/session_cache/ssl_session_openssl.cc", + "src/core/tsi/ssl_transport_security.cc", + "src/core/tsi/ssl_transport_security.h", + "src/core/tsi/ssl_types.h", + "src/core/tsi/transport_security.cc", + "src/core/tsi/transport_security.h", + "src/core/tsi/transport_security_grpc.cc", + "src/core/tsi/transport_security_grpc.h", + "src/core/tsi/transport_security_interface.h", + ] + deps = [ + "//third_party/boringssl", + "//third_party/zlib", + ":gpr", + ":address_sorting", + ":upb", + ":absl/types:optional", + ":absl/strings:strings", + ":absl/container:inlined_vector", + "//third_party/cares", + ":address_sorting", + ] + + public_configs = [ + ":grpc_config", + ] + include_dirs = [ + "third_party/cares", + "third_party/address_sorting/include", + ] + } + + + + source_set("grpc++") { + sources = [ + "include/grpc++/alarm.h", + "include/grpc++/channel.h", + "include/grpc++/client_context.h", + "include/grpc++/completion_queue.h", + "include/grpc++/create_channel.h", + "include/grpc++/create_channel_posix.h", + "include/grpc++/ext/health_check_service_server_builder_option.h", + "include/grpc++/generic/async_generic_service.h", + "include/grpc++/generic/generic_stub.h", + "include/grpc++/grpc++.h", + "include/grpc++/health_check_service_interface.h", + "include/grpc++/impl/call.h", + "include/grpc++/impl/channel_argument_option.h", + "include/grpc++/impl/client_unary_call.h", + "include/grpc++/impl/codegen/async_stream.h", + "include/grpc++/impl/codegen/async_unary_call.h", + "include/grpc++/impl/codegen/byte_buffer.h", + "include/grpc++/impl/codegen/call.h", + "include/grpc++/impl/codegen/call_hook.h", + "include/grpc++/impl/codegen/channel_interface.h", + "include/grpc++/impl/codegen/client_context.h", + "include/grpc++/impl/codegen/client_unary_call.h", + "include/grpc++/impl/codegen/completion_queue.h", + "include/grpc++/impl/codegen/completion_queue_tag.h", + "include/grpc++/impl/codegen/config.h", + "include/grpc++/impl/codegen/config_protobuf.h", + "include/grpc++/impl/codegen/core_codegen.h", + "include/grpc++/impl/codegen/core_codegen_interface.h", + "include/grpc++/impl/codegen/create_auth_context.h", + "include/grpc++/impl/codegen/grpc_library.h", + "include/grpc++/impl/codegen/metadata_map.h", + "include/grpc++/impl/codegen/method_handler_impl.h", + "include/grpc++/impl/codegen/proto_utils.h", + "include/grpc++/impl/codegen/rpc_method.h", + "include/grpc++/impl/codegen/rpc_service_method.h", + "include/grpc++/impl/codegen/security/auth_context.h", + "include/grpc++/impl/codegen/serialization_traits.h", + "include/grpc++/impl/codegen/server_context.h", + "include/grpc++/impl/codegen/server_interface.h", + "include/grpc++/impl/codegen/service_type.h", + "include/grpc++/impl/codegen/slice.h", + "include/grpc++/impl/codegen/status.h", + "include/grpc++/impl/codegen/status_code_enum.h", + "include/grpc++/impl/codegen/string_ref.h", + "include/grpc++/impl/codegen/stub_options.h", + "include/grpc++/impl/codegen/sync_stream.h", + "include/grpc++/impl/codegen/time.h", + "include/grpc++/impl/grpc_library.h", + "include/grpc++/impl/method_handler_impl.h", + "include/grpc++/impl/rpc_method.h", + "include/grpc++/impl/rpc_service_method.h", + "include/grpc++/impl/serialization_traits.h", + "include/grpc++/impl/server_builder_option.h", + "include/grpc++/impl/server_builder_plugin.h", + "include/grpc++/impl/server_initializer.h", + "include/grpc++/impl/service_type.h", + "include/grpc++/resource_quota.h", + "include/grpc++/security/auth_context.h", + "include/grpc++/security/auth_metadata_processor.h", + "include/grpc++/security/credentials.h", + "include/grpc++/security/server_credentials.h", + "include/grpc++/server.h", + "include/grpc++/server_builder.h", + "include/grpc++/server_context.h", + "include/grpc++/server_posix.h", + "include/grpc++/support/async_stream.h", + "include/grpc++/support/async_unary_call.h", + "include/grpc++/support/byte_buffer.h", + "include/grpc++/support/channel_arguments.h", + "include/grpc++/support/config.h", + "include/grpc++/support/slice.h", + "include/grpc++/support/status.h", + "include/grpc++/support/status_code_enum.h", + "include/grpc++/support/string_ref.h", + "include/grpc++/support/stub_options.h", + "include/grpc++/support/sync_stream.h", + "include/grpc++/support/time.h", + "include/grpcpp/alarm.h", + "include/grpcpp/alarm_impl.h", + "include/grpcpp/channel.h", + "include/grpcpp/channel_impl.h", + "include/grpcpp/client_context.h", + "include/grpcpp/completion_queue.h", + "include/grpcpp/completion_queue_impl.h", + "include/grpcpp/create_channel.h", + "include/grpcpp/create_channel_impl.h", + "include/grpcpp/create_channel_posix.h", + "include/grpcpp/create_channel_posix_impl.h", + "include/grpcpp/ext/health_check_service_server_builder_option.h", + "include/grpcpp/generic/async_generic_service.h", + "include/grpcpp/generic/generic_stub.h", + "include/grpcpp/generic/generic_stub_impl.h", + "include/grpcpp/grpcpp.h", + "include/grpcpp/health_check_service_interface.h", + "include/grpcpp/health_check_service_interface_impl.h", + "include/grpcpp/impl/call.h", + "include/grpcpp/impl/channel_argument_option.h", + "include/grpcpp/impl/client_unary_call.h", + "include/grpcpp/impl/codegen/async_generic_service.h", + "include/grpcpp/impl/codegen/async_stream.h", + "include/grpcpp/impl/codegen/async_stream_impl.h", + "include/grpcpp/impl/codegen/async_unary_call.h", + "include/grpcpp/impl/codegen/async_unary_call_impl.h", + "include/grpcpp/impl/codegen/byte_buffer.h", + "include/grpcpp/impl/codegen/call.h", + "include/grpcpp/impl/codegen/call_hook.h", + "include/grpcpp/impl/codegen/call_op_set.h", + "include/grpcpp/impl/codegen/call_op_set_interface.h", + "include/grpcpp/impl/codegen/callback_common.h", + "include/grpcpp/impl/codegen/channel_interface.h", + "include/grpcpp/impl/codegen/client_callback.h", + "include/grpcpp/impl/codegen/client_callback_impl.h", + "include/grpcpp/impl/codegen/client_context.h", + "include/grpcpp/impl/codegen/client_context_impl.h", + "include/grpcpp/impl/codegen/client_interceptor.h", + "include/grpcpp/impl/codegen/client_unary_call.h", + "include/grpcpp/impl/codegen/completion_queue.h", + "include/grpcpp/impl/codegen/completion_queue_impl.h", + "include/grpcpp/impl/codegen/completion_queue_tag.h", + "include/grpcpp/impl/codegen/config.h", + "include/grpcpp/impl/codegen/config_protobuf.h", + "include/grpcpp/impl/codegen/core_codegen.h", + "include/grpcpp/impl/codegen/core_codegen_interface.h", + "include/grpcpp/impl/codegen/create_auth_context.h", + "include/grpcpp/impl/codegen/delegating_channel.h", + "include/grpcpp/impl/codegen/grpc_library.h", + "include/grpcpp/impl/codegen/intercepted_channel.h", + "include/grpcpp/impl/codegen/interceptor.h", + "include/grpcpp/impl/codegen/interceptor_common.h", + "include/grpcpp/impl/codegen/message_allocator.h", + "include/grpcpp/impl/codegen/metadata_map.h", + "include/grpcpp/impl/codegen/method_handler.h", + "include/grpcpp/impl/codegen/method_handler_impl.h", + "include/grpcpp/impl/codegen/proto_buffer_reader.h", + "include/grpcpp/impl/codegen/proto_buffer_writer.h", + "include/grpcpp/impl/codegen/proto_utils.h", + "include/grpcpp/impl/codegen/rpc_method.h", + "include/grpcpp/impl/codegen/rpc_service_method.h", + "include/grpcpp/impl/codegen/security/auth_context.h", + "include/grpcpp/impl/codegen/serialization_traits.h", + "include/grpcpp/impl/codegen/server_callback.h", + "include/grpcpp/impl/codegen/server_callback_handlers.h", + "include/grpcpp/impl/codegen/server_callback_impl.h", + "include/grpcpp/impl/codegen/server_context.h", + "include/grpcpp/impl/codegen/server_context_impl.h", + "include/grpcpp/impl/codegen/server_interceptor.h", + "include/grpcpp/impl/codegen/server_interface.h", + "include/grpcpp/impl/codegen/service_type.h", + "include/grpcpp/impl/codegen/slice.h", + "include/grpcpp/impl/codegen/status.h", + "include/grpcpp/impl/codegen/status_code_enum.h", + "include/grpcpp/impl/codegen/string_ref.h", + "include/grpcpp/impl/codegen/stub_options.h", + "include/grpcpp/impl/codegen/sync.h", + "include/grpcpp/impl/codegen/sync_stream.h", + "include/grpcpp/impl/codegen/sync_stream_impl.h", + "include/grpcpp/impl/codegen/time.h", + "include/grpcpp/impl/grpc_library.h", + "include/grpcpp/impl/method_handler_impl.h", + "include/grpcpp/impl/rpc_method.h", + "include/grpcpp/impl/rpc_service_method.h", + "include/grpcpp/impl/serialization_traits.h", + "include/grpcpp/impl/server_builder_option.h", + "include/grpcpp/impl/server_builder_option_impl.h", + "include/grpcpp/impl/server_builder_plugin.h", + "include/grpcpp/impl/server_initializer.h", + "include/grpcpp/impl/server_initializer_impl.h", + "include/grpcpp/impl/service_type.h", + "include/grpcpp/resource_quota.h", + "include/grpcpp/resource_quota_impl.h", + "include/grpcpp/security/auth_context.h", + "include/grpcpp/security/auth_metadata_processor.h", + "include/grpcpp/security/auth_metadata_processor_impl.h", + "include/grpcpp/security/credentials.h", + "include/grpcpp/security/credentials_impl.h", + "include/grpcpp/security/server_credentials.h", + "include/grpcpp/security/server_credentials_impl.h", + "include/grpcpp/security/tls_credentials_options.h", + "include/grpcpp/server.h", + "include/grpcpp/server_builder.h", + "include/grpcpp/server_builder_impl.h", + "include/grpcpp/server_context.h", + "include/grpcpp/server_impl.h", + "include/grpcpp/server_posix.h", + "include/grpcpp/server_posix_impl.h", + "include/grpcpp/support/async_stream.h", + "include/grpcpp/support/async_stream_impl.h", + "include/grpcpp/support/async_unary_call.h", + "include/grpcpp/support/async_unary_call_impl.h", + "include/grpcpp/support/byte_buffer.h", + "include/grpcpp/support/channel_arguments.h", + "include/grpcpp/support/channel_arguments_impl.h", + "include/grpcpp/support/client_callback.h", + "include/grpcpp/support/client_callback_impl.h", + "include/grpcpp/support/client_interceptor.h", + "include/grpcpp/support/config.h", + "include/grpcpp/support/interceptor.h", + "include/grpcpp/support/message_allocator.h", + "include/grpcpp/support/method_handler.h", + "include/grpcpp/support/proto_buffer_reader.h", + "include/grpcpp/support/proto_buffer_writer.h", + "include/grpcpp/support/server_callback.h", + "include/grpcpp/support/server_callback_impl.h", + "include/grpcpp/support/server_interceptor.h", + "include/grpcpp/support/slice.h", + "include/grpcpp/support/status.h", + "include/grpcpp/support/status_code_enum.h", + "include/grpcpp/support/string_ref.h", + "include/grpcpp/support/stub_options.h", + "include/grpcpp/support/sync_stream.h", + "include/grpcpp/support/sync_stream_impl.h", + "include/grpcpp/support/time.h", + "include/grpcpp/support/validate_service_config.h", + "src/cpp/client/channel_cc.cc", + "src/cpp/client/client_context.cc", + "src/cpp/client/client_interceptor.cc", + "src/cpp/client/create_channel.cc", + "src/cpp/client/create_channel_internal.cc", + "src/cpp/client/create_channel_internal.h", + "src/cpp/client/create_channel_posix.cc", + "src/cpp/client/credentials_cc.cc", + "src/cpp/client/insecure_credentials.cc", + "src/cpp/client/secure_credentials.cc", + "src/cpp/client/secure_credentials.h", + "src/cpp/codegen/codegen_init.cc", + "src/cpp/common/alarm.cc", + "src/cpp/common/auth_property_iterator.cc", + "src/cpp/common/channel_arguments.cc", + "src/cpp/common/channel_filter.cc", + "src/cpp/common/channel_filter.h", + "src/cpp/common/completion_queue_cc.cc", + "src/cpp/common/core_codegen.cc", + "src/cpp/common/resource_quota_cc.cc", + "src/cpp/common/rpc_method.cc", + "src/cpp/common/secure_auth_context.cc", + "src/cpp/common/secure_auth_context.h", + "src/cpp/common/secure_channel_arguments.cc", + "src/cpp/common/secure_create_auth_context.cc", + "src/cpp/common/tls_credentials_options.cc", + "src/cpp/common/tls_credentials_options_util.cc", + "src/cpp/common/tls_credentials_options_util.h", + "src/cpp/common/validate_service_config.cc", + "src/cpp/common/version_cc.cc", + "src/cpp/server/async_generic_service.cc", + "src/cpp/server/channel_argument_option.cc", + "src/cpp/server/create_default_thread_pool.cc", + "src/cpp/server/dynamic_thread_pool.cc", + "src/cpp/server/dynamic_thread_pool.h", + "src/cpp/server/external_connection_acceptor_impl.cc", + "src/cpp/server/external_connection_acceptor_impl.h", + "src/cpp/server/health/default_health_check_service.cc", + "src/cpp/server/health/default_health_check_service.h", + "src/cpp/server/health/health_check_service.cc", + "src/cpp/server/health/health_check_service_server_builder_option.cc", + "src/cpp/server/insecure_server_credentials.cc", + "src/cpp/server/secure_server_credentials.cc", + "src/cpp/server/secure_server_credentials.h", + "src/cpp/server/server_builder.cc", + "src/cpp/server/server_callback.cc", + "src/cpp/server/server_cc.cc", + "src/cpp/server/server_context.cc", + "src/cpp/server/server_credentials.cc", + "src/cpp/server/server_posix.cc", + "src/cpp/server/thread_pool_interface.h", + "src/cpp/thread_manager/thread_manager.cc", + "src/cpp/thread_manager/thread_manager.h", + "src/cpp/util/byte_buffer_cc.cc", + "src/cpp/util/status.cc", + "src/cpp/util/string_ref.cc", + "src/cpp/util/time_cc.cc", + ] + deps = [ + "//third_party/protobuf:protobuf_lite", + ":grpc", + ":gpr", + ":address_sorting", + ":upb", + ] + + public_configs = [ + ":grpc_config", + ] + } + + # Only compile the plugin for the host architecture. + if (current_toolchain == host_toolchain) { + + + source_set("grpc_plugin_support") { + sources = [ + "include/grpc++/impl/codegen/config_protobuf.h", + "include/grpcpp/impl/codegen/config_protobuf.h", + "src/compiler/config.h", + "src/compiler/config_protobuf.h", + "src/compiler/cpp_generator.cc", + "src/compiler/cpp_generator.h", + "src/compiler/cpp_generator_helpers.h", + "src/compiler/cpp_plugin.h", + "src/compiler/csharp_generator.cc", + "src/compiler/csharp_generator.h", + "src/compiler/csharp_generator_helpers.h", + "src/compiler/generator_helpers.h", + "src/compiler/node_generator.cc", + "src/compiler/node_generator.h", + "src/compiler/node_generator_helpers.h", + "src/compiler/objective_c_generator.cc", + "src/compiler/objective_c_generator.h", + "src/compiler/objective_c_generator_helpers.h", + "src/compiler/php_generator.cc", + "src/compiler/php_generator.h", + "src/compiler/php_generator_helpers.h", + "src/compiler/protobuf_plugin.h", + "src/compiler/python_generator.cc", + "src/compiler/python_generator.h", + "src/compiler/python_generator_helpers.h", + "src/compiler/python_private_generator.h", + "src/compiler/schema_interface.h", + ] + deps = [ + "//third_party/protobuf:protoc_lib", + ] + + public_configs = [ + ":grpc_config", + ] + } + + } + # Only compile the plugin for the host architecture. + if (current_toolchain == host_toolchain) { + + executable("grpc_cpp_plugin") { + sources = [ + "src/compiler/cpp_plugin.cc", + ] + deps = [ + "//third_party/protobuf:protoc_lib", + ":grpc_plugin_support", + ] + + configs += [ + "//third_party/protobuf:protobuf_config", + ] + public_configs = [ ":grpc_config" ] + } + + } + + diff --git a/BUILDING.md b/BUILDING.md new file mode 100644 index 00000000..4a8d1441 --- /dev/null +++ b/BUILDING.md @@ -0,0 +1,270 @@ +gRPC C++ - Building from source +=========================== + +This document has detailed instructions on how to build gRPC C++ from source. Note that it only covers the build of gRPC itself and is mostly meant for gRPC C++ contributors and/or power users. +Other should follow the user instructions. See the [How to use](https://github.com/grpc/grpc/tree/master/src/cpp#to-start-using-grpc-c) instructions for guidance on how to add gRPC as a dependency to a C++ application (there are several ways and system wide installation is often not the best choice). + +# Pre-requisites + +## Linux + +```sh + $ [sudo] apt-get install build-essential autoconf libtool pkg-config +``` + +If you plan to build using CMake +```sh + $ [sudo] apt-get install cmake +``` + +If you are a contributor and plan to build and run tests, install the following as well: +```sh + $ # libgflags-dev is only required if building with make (deprecated) + $ [sudo] apt-get install libgflags-dev + $ # clang and LLVM C++ lib is only required for sanitizer builds + $ [sudo] apt-get install clang-5.0 libc++-dev +``` + +## MacOS + +On a Mac, you will first need to +install Xcode or +[Command Line Tools for Xcode](https://developer.apple.com/download/more/) +and then run the following command from a terminal: + +```sh + $ [sudo] xcode-select --install +``` + +To build gRPC from source, you may need to install the following +packages from [Homebrew](https://brew.sh): + +```sh + $ brew install autoconf automake libtool shtool +``` + +If you plan to build using CMake, follow the instructions from https://cmake.org/download/ + +If you are a contributor and plan to build and run tests, install the following as well: +```sh + $ # gflags is only required if building with make (deprecated) + $ brew install gflags +``` + +*Tip*: when building, +you *may* want to explicitly set the `LIBTOOL` and `LIBTOOLIZE` +environment variables when running `make` to ensure the version +installed by `brew` is being used: + +```sh + $ LIBTOOL=glibtool LIBTOOLIZE=glibtoolize make +``` + +## Windows + +To prepare for cmake + Microsoft Visual C++ compiler build +- Install Visual Studio 2015 or 2017 (Visual C++ compiler will be used). +- Install [Git](https://git-scm.com/). +- Install [CMake](https://cmake.org/download/). +- Install [nasm](https://www.nasm.us/) and add it to `PATH` (`choco install nasm`) - *required by boringssl* +- (Optional) Install [Ninja](https://ninja-build.org/) (`choco install ninja`) + +# Clone the repository (including submodules) + +Before building, you need to clone the gRPC github repository and download submodules containing source code +for gRPC's dependencies (that's done by the `submodule` command or `--recursive` flag). Use following commands +to clone the gRPC repository at the [latest stable release tag](https://github.com/grpc/grpc/releases) + +## Unix + +```sh + $ git clone -b RELEASE_TAG_HERE https://github.com/grpc/grpc + $ cd grpc + $ git submodule update --init + ``` + +## Windows + +``` +> git clone -b RELEASE_TAG_HERE https://github.com/grpc/grpc +> cd grpc +> git submodule update --init +``` + +NOTE: The `bazel` build tool uses a different model for dependencies. You only need to worry about downloading submodules if you're building +with something else than `bazel` (e.g. `cmake`). + +# Build from source + +In the C++ world, there's no "standard" build system that would work for in all supported use cases and on all supported platforms. +Therefore, gRPC supports several major build systems, which should satisfy most users. Depending on your needs +we recommend building using `bazel` or `cmake`. + +## Building with bazel (recommended) + +Bazel is the primary build system for gRPC C++ and if you're comfortable with using bazel, we can certainly recommend it. +Using bazel will give you the best developer experience as well as faster and cleaner builds. + +You'll need `bazel` version `1.0.0` or higher to build gRPC. +See [Installing Bazel](https://docs.bazel.build/versions/master/install.html) for instructions how to install bazel on your system. +We support building with `bazel` on Linux, MacOS and Windows. + +From the grpc repository root +``` +# Build gRPC C++ +$ bazel build :all +``` + +``` +# Run all the C/C++ tests +$ bazel test --config=dbg //test/... +``` + +NOTE: If you are gRPC maintainer and you have access to our test cluster, you should use the our [gRPC's Remote Execution environment](tools/remote_build/README.md) +to get significant improvement to the build and test speed (and a bunch of other very useful features). + +## Building with CMake + +### Linux/Unix, Using Make + +Run from grpc directory after cloning the repo with --recursive or updating submodules. +``` +$ mkdir -p cmake/build +$ cd cmake/build +$ cmake ../.. +$ make +``` + +If you want to build shared libraries (`.so` files), run `cmake` with `-DBUILD_SHARED_LIBS=ON`. + +### Windows, Using Visual Studio 2015 or 2017 + +When using the "Visual Studio" generator, +cmake will generate a solution (`grpc.sln`) that contains a VS project for +every target defined in `CMakeLists.txt` (+ few extra convenience projects +added automatically by cmake). After opening the solution with Visual Studio +you will be able to browse and build the code. +``` +> @rem Run from grpc directory after cloning the repo with --recursive or updating submodules. +> md .build +> cd .build +> cmake .. -G "Visual Studio 14 2015" +> cmake --build . --config Release +``` + +If you want to build DLLs, run `cmake` with `-DBUILD_SHARED_LIBS=ON`. + +### Windows, Using Ninja (faster build). + +Please note that when using Ninja, you will still need Visual C++ (part of Visual Studio) +installed to be able to compile the C/C++ sources. +``` +> @rem Run from grpc directory after cloning the repo with --recursive or updating submodules. +> cd cmake +> md build +> cd build +> call "%VS140COMNTOOLS%..\..\VC\vcvarsall.bat" x64 +> cmake ..\.. -GNinja -DCMAKE_BUILD_TYPE=Release +> cmake --build . +``` + +If you want to build DLLs, run `cmake` with `-DBUILD_SHARED_LIBS=ON`. + +### Dependency management + +gRPC's CMake build system has two options for handling dependencies. +CMake can build the dependencies for you, or it can search for libraries +that are already installed on your system and use them to build gRPC. + +This behavior is controlled by the `gRPC__PROVIDER` CMake variables, +e.g. `gRPC_CARES_PROVIDER`. The options that these variables take are as follows: + +* module - build dependencies alongside gRPC. The source code is obtained from +gRPC's git submodules. +* package - use external copies of dependencies that are already available +on your system. These could come from your system package manager, or perhaps +you pre-installed them using CMake with the `CMAKE_INSTALL_PREFIX` option. + +For example, if you set `gRPC_CARES_PROVIDER=module`, then CMake will build +c-ares before building gRPC. On the other hand, if you set +`gRPC_CARES_PROVIDER=package`, then CMake will search for a copy of c-ares +that's already installed on your system and use it to build gRPC. + +### Install after build + +Perform the following steps to install gRPC using CMake. +* Set `-DgRPC_INSTALL=ON` +* Build the `install` target + +The install destination is controlled by the +[`CMAKE_INSTALL_PREFIX`](https://cmake.org/cmake/help/latest/variable/CMAKE_INSTALL_PREFIX.html) variable. + +If you are running CMake v3.13 or newer you can build gRPC's dependencies +in "module" mode and install them alongside gRPC in a single step. +[Example](test/distrib/cpp/run_distrib_test_cmake_module_install.sh) + +If you are building gRPC < 1.27 or if you are using CMake < 3.13 you will need +to select "package" mode (rather than "module" mode) for the dependencies. +This means you will need to have external copies of these libraries available +on your system. This [example](test/distrib/cpp/run_distrib_test_cmake.sh) shows +how to install dependencies with cmake before proceeding to installing gRPC itself. + +``` +# NOTE: all of gRPC's dependencies need to be already installed +$ cmake ../.. -DgRPC_INSTALL=ON \ + -DCMAKE_BUILD_TYPE=Release \ + -DgRPC_ABSL_PROVIDER=package \ + -DgRPC_CARES_PROVIDER=package \ + -DgRPC_PROTOBUF_PROVIDER=package \ + -DgRPC_SSL_PROVIDER=package \ + -DgRPC_ZLIB_PROVIDER=package +$ make +$ make install +``` + +### Cross-compiling + +You can use CMake to cross-compile gRPC for another architecture. In order to +do so, you will first need to build `protoc` and `grpc_cpp_plugin` +for the host architecture. These tools are used during the build of gRPC, so +we need copies of executables that can be run natively. + +You will likely need to install the toolchain for the platform you are +targeting for your cross-compile. Once you have done so, you can write a +toolchain file to tell CMake where to find the compilers and system tools +that will be used for this build. + +This toolchain file is specified to CMake by setting the `CMAKE_TOOLCHAIN_FILE` +variable. +``` +$ cmake ../.. -DCMAKE_TOOLCHAIN_FILE=path/to/file +$ make +``` + +[Cross-compile example](test/distrib/cpp/run_distrib_test_raspberry_pi.sh) + +## Building with make on UNIX systems (deprecated) + +NOTE: `make` used to be gRPC's default build system, but we're no longer recommending it. You should use `bazel` or `cmake` instead. The `Makefile` is only intended for internal usage and is not meant for public consumption. + +From the grpc repository root +```sh + $ make +``` + +NOTE: if you get an error on linux such as 'aclocal-1.15: command not found', which can happen if you ran 'make' before installing the pre-reqs, try the following: +```sh +$ git clean -f -d -x && git submodule foreach --recursive git clean -f -d -x +$ [sudo] apt-get install build-essential autoconf libtool pkg-config +$ make +``` + +### A note on `protoc` + +By default gRPC uses [protocol buffers](https://github.com/google/protobuf), +you will need the `protoc` compiler to generate stub server and client code. + +If you compile gRPC from source, as described below, the Makefile will +automatically try compiling the `protoc` in third_party if you cloned the +repository recursively and it detects that you do not already have 'protoc' compiler +installed. diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..be695c20 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,15165 @@ +# GRPC global cmake file +# This currently builds C and C++ code. +# This file has been automatically generated from a template file. +# Please look at the templates directory instead. +# This file can be regenerated from the template by running +# tools/buildgen/generate_projects.sh +# +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + + + +cmake_minimum_required(VERSION 3.5.1) + +set(PACKAGE_NAME "grpc") +set(PACKAGE_VERSION "1.30.2") +set(gRPC_CORE_VERSION "10.0.0") +set(gRPC_CORE_SOVERSION "10") +set(gRPC_CPP_VERSION "1.30.2") +set(gRPC_CPP_SOVERSION "1") +set(gRPC_CSHARP_VERSION "2.30.2") +set(gRPC_CSHARP_SOVERSION "2") +set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}") +set(PACKAGE_TARNAME "${PACKAGE_NAME}-${PACKAGE_VERSION}") +set(PACKAGE_BUGREPORT "https://github.com/grpc/grpc/issues/") +project(${PACKAGE_NAME} LANGUAGES C CXX) + +set(gRPC_INSTALL_BINDIR "bin" CACHE STRING "Installation directory for executables") +set(gRPC_INSTALL_LIBDIR "lib" CACHE STRING "Installation directory for libraries") +set(gRPC_INSTALL_INCLUDEDIR "include" CACHE STRING "Installation directory for headers") +set(gRPC_INSTALL_CMAKEDIR "lib/cmake/${PACKAGE_NAME}" CACHE STRING "Installation directory for cmake config files") +set(gRPC_INSTALL_SHAREDIR "share/grpc" CACHE STRING "Installation directory for root certificates") + +# Options +option(gRPC_BUILD_TESTS "Build tests" OFF) +option(gRPC_BUILD_CODEGEN "Build codegen" ON) +option(gRPC_BUILD_CSHARP_EXT "Build C# extensions" ON) +option(gRPC_BACKWARDS_COMPATIBILITY_MODE "Build libraries that are binary compatible across a larger number of OS and libc versions" OFF) + +set(gRPC_INSTALL_default ON) +if(NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) + # Disable gRPC_INSTALL by default if building as a submodule + set(gRPC_INSTALL_default OFF) +endif() +set(gRPC_INSTALL ${gRPC_INSTALL_default} CACHE BOOL + "Generate installation target") + +# We can install dependencies from submodules if we're running +# CMake v3.13 or newer. +if(CMAKE_VERSION VERSION_LESS 3.13) + set(_gRPC_INSTALL_SUPPORTED_FROM_MODULE OFF) +else() + set(_gRPC_INSTALL_SUPPORTED_FROM_MODULE ON) +endif() + +# Providers for third-party dependencies (gRPC_*_PROVIDER properties): +# "module": build the dependency using sources from git submodule (under third_party) +# "package": use cmake's find_package functionality to locate a pre-installed dependency + +set(gRPC_ZLIB_PROVIDER "module" CACHE STRING "Provider of zlib library") +set_property(CACHE gRPC_ZLIB_PROVIDER PROPERTY STRINGS "module" "package") + +set(gRPC_CARES_PROVIDER "module" CACHE STRING "Provider of c-ares library") +set_property(CACHE gRPC_CARES_PROVIDER PROPERTY STRINGS "module" "package") + +set(gRPC_SSL_PROVIDER "module" CACHE STRING "Provider of ssl library") +set_property(CACHE gRPC_SSL_PROVIDER PROPERTY STRINGS "module" "package") + +set(gRPC_PROTOBUF_PROVIDER "module" CACHE STRING "Provider of protobuf library") +set_property(CACHE gRPC_PROTOBUF_PROVIDER PROPERTY STRINGS "module" "package") + +set(gRPC_PROTOBUF_PACKAGE_TYPE "" CACHE STRING "Algorithm for searching protobuf package") +set_property(CACHE gRPC_PROTOBUF_PACKAGE_TYPE PROPERTY STRINGS "CONFIG" "MODULE") + +if(gRPC_BUILD_TESTS) + set(gRPC_GFLAGS_PROVIDER "module" CACHE STRING "Provider of gflags library") + set_property(CACHE gRPC_GFLAGS_PROVIDER PROPERTY STRINGS "module" "package") + + set(gRPC_BENCHMARK_PROVIDER "module" CACHE STRING "Provider of benchmark library") + set_property(CACHE gRPC_BENCHMARK_PROVIDER PROPERTY STRINGS "module" "package") +else() + set(gRPC_GFLAGS_PROVIDER "none") + set(gRPC_BENCHMARK_PROVIDER "none") +endif() + +set(gRPC_ABSL_PROVIDER "module" CACHE STRING "Provider of absl library") +set_property(CACHE gRPC_ABSL_PROVIDER PROPERTY STRINGS "module" "package") + +set(gRPC_ABSL_USED_TARGETS + absl_algorithm + absl_atomic_hook + absl_bad_optional_access + absl_base + absl_base_internal + absl_bits + absl_civil_time + absl_compressed_tuple + absl_config + absl_core_headers + absl_dynamic_annotations + absl_endian + absl_errno_saver + absl_inlined_vector + absl_inlined_vector_internal + absl_int128 + absl_log_severity + absl_memory + absl_optional + absl_raw_logging_internal + absl_span + absl_spinlock_wait + absl_str_format + absl_str_format_internal + absl_strings + absl_strings_internal + absl_throw_delegate + absl_time + absl_time_zone + absl_type_traits + absl_utility + absl_meta +) + +set(gRPC_USE_PROTO_LITE OFF CACHE BOOL "Use the protobuf-lite library") + +if(UNIX) + if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") + set(_gRPC_PLATFORM_LINUX ON) + elseif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + set(_gRPC_PLATFORM_MAC ON) + elseif(${CMAKE_SYSTEM_NAME} MATCHES "iOS") + set(_gRPC_PLATFORM_IOS ON) + elseif(${CMAKE_SYSTEM_NAME} MATCHES "Android") + set(_gRPC_PLATFORM_ANDROID ON) + else() + set(_gRPC_PLATFORM_POSIX ON) + endif() +endif() +if(WIN32) + set(_gRPC_PLATFORM_WINDOWS ON) +endif() + + # Use C99 standard +if (NOT DEFINED CMAKE_C_STANDARD) + set(CMAKE_C_STANDARD 99) +endif() + +# Add c++11 flags +if (NOT DEFINED CMAKE_CXX_STANDARD) + set(CMAKE_CXX_STANDARD 11) +else() + if (CMAKE_CXX_STANDARD LESS 11) + message(FATAL_ERROR "CMAKE_CXX_STANDARD is less than 11, please specify at least SET(CMAKE_CXX_STANDARD 11)") + endif() +endif() +if (NOT DEFINED CMAKE_CXX_STANDARD_REQUIRED) + set(CMAKE_CXX_STANDARD_REQUIRED ON) +endif() +if (NOT DEFINED CMAKE_CXX_EXTENSIONS) + set(CMAKE_CXX_EXTENSIONS OFF) +endif() + +if (NOT DEFINED CMAKE_POSITION_INDEPENDENT_CODE) + set(CMAKE_POSITION_INDEPENDENT_CODE TRUE) +endif() +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules") + +if(MSVC) + include(cmake/msvc_static_runtime.cmake) + add_definitions(-D_WIN32_WINNT=0x600 -D_SCL_SECURE_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS -D_WINSOCK_DEPRECATED_NO_WARNINGS) + # needed to compile protobuf + set(_gRPC_C_CXX_FLAGS "${_gRPC_C_CXX_FLAGS} /wd4065 /wd4506") + # TODO(jtattermusch): revisit warnings that were silenced as part of upgrade to protobuf3.6.0 + set(_gRPC_C_CXX_FLAGS "${_gRPC_C_CXX_FLAGS} /wd4200 /wd4291 /wd4244") + # TODO(jtattermusch): revisit C4267 occurrences throughout the code + set(_gRPC_C_CXX_FLAGS "${_gRPC_C_CXX_FLAGS} /wd4267") + # TODO(jtattermusch): needed to build boringssl with VS2017, revisit later + set(_gRPC_C_CXX_FLAGS "${_gRPC_C_CXX_FLAGS} /wd4987 /wd4774 /wd4819 /wd4996 /wd4619") +endif() +if (MINGW) + add_definitions(-D_WIN32_WINNT=0x600) +endif() +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${_gRPC_C_CXX_FLAGS}") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${_gRPC_C_CXX_FLAGS}") + +if(gRPC_USE_PROTO_LITE) + set(_gRPC_PROTOBUF_LIBRARY_NAME "libprotobuf-lite") + add_definitions("-DGRPC_USE_PROTO_LITE") +else() + set(_gRPC_PROTOBUF_LIBRARY_NAME "libprotobuf") +endif() + +if(gRPC_BACKWARDS_COMPATIBILITY_MODE) + add_definitions(-DGPR_BACKWARDS_COMPATIBILITY_MODE) + if(_gRPC_PLATFORM_MAC) + # some C++11 constructs not supported before OS X 10.9 + set(CMAKE_OSX_DEPLOYMENT_TARGET 10.9) + endif() +endif() + +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_IOS) + set(_gRPC_CORE_NOSTDCXX_FLAGS -fno-exceptions -fno-rtti) +else() + set(_gRPC_CORE_NOSTDCXX_FLAGS "") +endif() + +include(cmake/abseil-cpp.cmake) +include(cmake/address_sorting.cmake) +include(cmake/benchmark.cmake) +include(cmake/cares.cmake) +include(cmake/gflags.cmake) +include(cmake/protobuf.cmake) +include(cmake/ssl.cmake) +include(cmake/upb.cmake) +include(cmake/zlib.cmake) + +if(_gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_IOS) + set(_gRPC_ALLTARGETS_LIBRARIES ${CMAKE_DL_LIBS} m pthread) +elseif(_gRPC_PLATFORM_ANDROID) + set(_gRPC_ALLTARGETS_LIBRARIES ${CMAKE_DL_LIBS} m) +elseif(UNIX) + set(_gRPC_ALLTARGETS_LIBRARIES ${CMAKE_DL_LIBS} rt m pthread) +endif() + +if(WIN32) + set(_gRPC_BASELIB_LIBRARIES wsock32 ws2_32 crypt32) +endif() + +# Create directory for generated .proto files +set(_gRPC_PROTO_GENS_DIR ${CMAKE_BINARY_DIR}/gens) +file(MAKE_DIRECTORY ${_gRPC_PROTO_GENS_DIR}) + +# protobuf_generate_grpc_cpp +# -------------------------- +# +# Add custom commands to process ``.proto`` files to C++ using protoc and +# GRPC plugin:: +# +# protobuf_generate_grpc_cpp [...] +# +# ``ARGN`` +# ``.proto`` files +# +function(protobuf_generate_grpc_cpp) + if(NOT ARGN) + message(SEND_ERROR "Error: PROTOBUF_GENERATE_GRPC_CPP() called without any proto files") + return() + endif() + + set(_protobuf_include_path -I . -I ${_gRPC_PROTOBUF_WELLKNOWN_INCLUDE_DIR}) + foreach(FIL ${ARGN}) + get_filename_component(ABS_FIL ${FIL} ABSOLUTE) + get_filename_component(FIL_WE ${FIL} NAME_WE) + file(RELATIVE_PATH REL_FIL ${CMAKE_CURRENT_SOURCE_DIR} ${ABS_FIL}) + get_filename_component(REL_DIR ${REL_FIL} DIRECTORY) + set(RELFIL_WE "${REL_DIR}/${FIL_WE}") + + #if cross-compiling, find host plugin + if(CMAKE_CROSSCOMPILING) + find_program(_gRPC_CPP_PLUGIN grpc_cpp_plugin) + else() + set(_gRPC_CPP_PLUGIN $) + endif() + + add_custom_command( + OUTPUT "${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.grpc.pb.cc" + "${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.grpc.pb.h" + "${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}_mock.grpc.pb.h" + "${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.cc" + "${_gRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.h" + COMMAND ${_gRPC_PROTOBUF_PROTOC_EXECUTABLE} + ARGS --grpc_out=generate_mock_code=true:${_gRPC_PROTO_GENS_DIR} + --cpp_out=${_gRPC_PROTO_GENS_DIR} + --plugin=protoc-gen-grpc=${_gRPC_CPP_PLUGIN} + ${_protobuf_include_path} + ${REL_FIL} + DEPENDS ${ABS_FIL} ${_gRPC_PROTOBUF_PROTOC} grpc_cpp_plugin + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMENT "Running gRPC C++ protocol buffer compiler on ${FIL}" + VERBATIM) + endforeach() +endfunction() + +# These options allow users to enable or disable the building of the various +# protoc plugins. For example, running CMake with +# -DgRPC_BUILD_GRPC_CSHARP_PLUGIN=OFF will disable building the C# plugin. +set(_gRPC_PLUGIN_LIST) +option(gRPC_BUILD_GRPC_CPP_PLUGIN "Build grpc_cpp_plugin" ON) +if (gRPC_BUILD_GRPC_CPP_PLUGIN) + list(APPEND _gRPC_PLUGIN_LIST grpc_cpp_plugin) +endif () +option(gRPC_BUILD_GRPC_CSHARP_PLUGIN "Build grpc_csharp_plugin" ON) +if (gRPC_BUILD_GRPC_CSHARP_PLUGIN) + list(APPEND _gRPC_PLUGIN_LIST grpc_csharp_plugin) +endif () +option(gRPC_BUILD_GRPC_NODE_PLUGIN "Build grpc_node_plugin" ON) +if (gRPC_BUILD_GRPC_NODE_PLUGIN) + list(APPEND _gRPC_PLUGIN_LIST grpc_node_plugin) +endif () +option(gRPC_BUILD_GRPC_OBJECTIVE_C_PLUGIN "Build grpc_objective_c_plugin" ON) +if (gRPC_BUILD_GRPC_OBJECTIVE_C_PLUGIN) + list(APPEND _gRPC_PLUGIN_LIST grpc_objective_c_plugin) +endif () +option(gRPC_BUILD_GRPC_PHP_PLUGIN "Build grpc_php_plugin" ON) +if (gRPC_BUILD_GRPC_PHP_PLUGIN) + list(APPEND _gRPC_PLUGIN_LIST grpc_php_plugin) +endif () +option(gRPC_BUILD_GRPC_PYTHON_PLUGIN "Build grpc_python_plugin" ON) +if (gRPC_BUILD_GRPC_PYTHON_PLUGIN) + list(APPEND _gRPC_PLUGIN_LIST grpc_python_plugin) +endif () +option(gRPC_BUILD_GRPC_RUBY_PLUGIN "Build grpc_ruby_plugin" ON) +if (gRPC_BUILD_GRPC_RUBY_PLUGIN) + list(APPEND _gRPC_PLUGIN_LIST grpc_ruby_plugin) +endif () + +add_custom_target(plugins + DEPENDS ${_gRPC_PLUGIN_LIST} +) + +add_custom_target(tools_c + DEPENDS + check_epollexclusive +) + +add_custom_target(tools_cxx + DEPENDS + gen_hpack_tables + gen_legal_metadata_characters + gen_percent_encoding_tables +) + +add_custom_target(tools + DEPENDS tools_c tools_cxx) + +protobuf_generate_grpc_cpp( + src/proto/grpc/channelz/channelz.proto +) +protobuf_generate_grpc_cpp( + src/proto/grpc/core/stats.proto +) +protobuf_generate_grpc_cpp( + src/proto/grpc/health/v1/health.proto +) +protobuf_generate_grpc_cpp( + src/proto/grpc/lb/v1/load_balancer.proto +) +protobuf_generate_grpc_cpp( + src/proto/grpc/reflection/v1alpha/reflection.proto +) +protobuf_generate_grpc_cpp( + src/proto/grpc/status/status.proto +) +protobuf_generate_grpc_cpp( + src/proto/grpc/testing/benchmark_service.proto +) +protobuf_generate_grpc_cpp( + src/proto/grpc/testing/control.proto +) +protobuf_generate_grpc_cpp( + src/proto/grpc/testing/duplicate/echo_duplicate.proto +) +protobuf_generate_grpc_cpp( + src/proto/grpc/testing/echo.proto +) +protobuf_generate_grpc_cpp( + src/proto/grpc/testing/echo_messages.proto +) +protobuf_generate_grpc_cpp( + src/proto/grpc/testing/empty.proto +) +protobuf_generate_grpc_cpp( + src/proto/grpc/testing/messages.proto +) +protobuf_generate_grpc_cpp( + src/proto/grpc/testing/payloads.proto +) +protobuf_generate_grpc_cpp( + src/proto/grpc/testing/report_qps_scenario_service.proto +) +protobuf_generate_grpc_cpp( + src/proto/grpc/testing/simple_messages.proto +) +protobuf_generate_grpc_cpp( + src/proto/grpc/testing/stats.proto +) +protobuf_generate_grpc_cpp( + src/proto/grpc/testing/test.proto +) +protobuf_generate_grpc_cpp( + src/proto/grpc/testing/worker_service.proto +) +protobuf_generate_grpc_cpp( + src/proto/grpc/testing/xds/ads_for_test.proto +) +protobuf_generate_grpc_cpp( + src/proto/grpc/testing/xds/cds_for_test.proto +) +protobuf_generate_grpc_cpp( + src/proto/grpc/testing/xds/eds_for_test.proto +) +protobuf_generate_grpc_cpp( + src/proto/grpc/testing/xds/lds_rds_for_test.proto +) +protobuf_generate_grpc_cpp( + src/proto/grpc/testing/xds/lrs_for_test.proto +) +protobuf_generate_grpc_cpp( + src/proto/grpc/testing/xds/orca_load_report_for_test.proto +) +protobuf_generate_grpc_cpp( + test/core/tsi/alts/fake_handshaker/handshaker.proto +) +protobuf_generate_grpc_cpp( + test/core/tsi/alts/fake_handshaker/transport_security_common.proto +) + +if(gRPC_BUILD_TESTS) + add_custom_target(buildtests_c) + add_dependencies(buildtests_c algorithm_test) + add_dependencies(buildtests_c alloc_test) + add_dependencies(buildtests_c alpn_test) + add_dependencies(buildtests_c alts_counter_test) + add_dependencies(buildtests_c alts_crypt_test) + add_dependencies(buildtests_c alts_crypter_test) + add_dependencies(buildtests_c alts_frame_protector_test) + add_dependencies(buildtests_c alts_grpc_record_protocol_test) + add_dependencies(buildtests_c alts_handshaker_client_test) + add_dependencies(buildtests_c alts_iovec_record_protocol_test) + add_dependencies(buildtests_c alts_security_connector_test) + add_dependencies(buildtests_c alts_tsi_handshaker_test) + add_dependencies(buildtests_c alts_tsi_utils_test) + add_dependencies(buildtests_c alts_zero_copy_grpc_protector_test) + add_dependencies(buildtests_c arena_test) + add_dependencies(buildtests_c auth_context_test) + add_dependencies(buildtests_c avl_test) + add_dependencies(buildtests_c b64_test) + add_dependencies(buildtests_c bad_server_response_test) + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_c bad_ssl_alpn_test) + endif() + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_c bad_ssl_cert_test) + endif() + add_dependencies(buildtests_c bin_decoder_test) + add_dependencies(buildtests_c bin_encoder_test) + add_dependencies(buildtests_c buffer_list_test) + add_dependencies(buildtests_c channel_args_test) + add_dependencies(buildtests_c channel_create_test) + add_dependencies(buildtests_c channel_stack_builder_test) + add_dependencies(buildtests_c channel_stack_test) + add_dependencies(buildtests_c check_gcp_environment_linux_test) + add_dependencies(buildtests_c check_gcp_environment_windows_test) + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_c client_ssl_test) + endif() + add_dependencies(buildtests_c cmdline_test) + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_c combiner_test) + endif() + add_dependencies(buildtests_c completion_queue_threading_test) + add_dependencies(buildtests_c compression_test) + add_dependencies(buildtests_c concurrent_connectivity_test) + add_dependencies(buildtests_c connection_refused_test) + add_dependencies(buildtests_c cpu_test) + add_dependencies(buildtests_c dns_resolver_connectivity_using_ares_resolver_test) + add_dependencies(buildtests_c dns_resolver_connectivity_using_native_resolver_test) + add_dependencies(buildtests_c dns_resolver_cooldown_test) + add_dependencies(buildtests_c dns_resolver_test) + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_c dualstack_socket_test) + endif() + add_dependencies(buildtests_c endpoint_pair_test) + add_dependencies(buildtests_c env_test) + add_dependencies(buildtests_c error_test) + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_c ev_epollex_linux_test) + endif() + add_dependencies(buildtests_c fake_resolver_test) + add_dependencies(buildtests_c fake_transport_security_test) + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_c fd_conservation_posix_test) + endif() + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_c fd_posix_test) + endif() + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_c fling_stream_test) + endif() + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_c fling_test) + endif() + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_c fork_test) + endif() + add_dependencies(buildtests_c format_request_test) + add_dependencies(buildtests_c frame_handler_test) + add_dependencies(buildtests_c goaway_server_test) + add_dependencies(buildtests_c grpc_alts_credentials_options_test) + add_dependencies(buildtests_c grpc_byte_buffer_reader_test) + add_dependencies(buildtests_c grpc_completion_queue_test) + add_dependencies(buildtests_c grpc_ipv6_loopback_available_test) + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_c handshake_server_with_readahead_handshaker_test) + endif() + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_c handshake_verify_peer_options_test) + endif() + add_dependencies(buildtests_c histogram_test) + add_dependencies(buildtests_c host_port_test) + add_dependencies(buildtests_c hpack_encoder_test) + add_dependencies(buildtests_c hpack_parser_test) + add_dependencies(buildtests_c hpack_table_test) + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_c httpcli_test) + endif() + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_c httpscli_test) + endif() + add_dependencies(buildtests_c init_test) + add_dependencies(buildtests_c inproc_callback_test) + add_dependencies(buildtests_c invalid_call_argument_test) + add_dependencies(buildtests_c json_token_test) + add_dependencies(buildtests_c jwt_verifier_test) + add_dependencies(buildtests_c lame_client_test) + add_dependencies(buildtests_c load_file_test) + add_dependencies(buildtests_c log_test) + add_dependencies(buildtests_c manual_constructor_test) + add_dependencies(buildtests_c message_compress_test) + add_dependencies(buildtests_c metadata_test) + add_dependencies(buildtests_c minimal_stack_is_minimal_test) + add_dependencies(buildtests_c mpmcqueue_test) + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_c mpscq_test) + endif() + add_dependencies(buildtests_c multiple_server_queues_test) + add_dependencies(buildtests_c murmur_hash_test) + add_dependencies(buildtests_c no_server_test) + add_dependencies(buildtests_c num_external_connectivity_watchers_test) + add_dependencies(buildtests_c parse_address_test) + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_c parse_address_with_named_scope_id_test) + endif() + add_dependencies(buildtests_c parser_test) + add_dependencies(buildtests_c percent_encoding_test) + add_dependencies(buildtests_c public_headers_must_be_c89) + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_c resolve_address_using_ares_resolver_posix_test) + endif() + add_dependencies(buildtests_c resolve_address_using_ares_resolver_test) + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_c resolve_address_using_native_resolver_posix_test) + endif() + add_dependencies(buildtests_c resolve_address_using_native_resolver_test) + add_dependencies(buildtests_c resource_quota_test) + add_dependencies(buildtests_c secure_channel_create_test) + add_dependencies(buildtests_c secure_endpoint_test) + add_dependencies(buildtests_c security_connector_test) + add_dependencies(buildtests_c sequential_connectivity_test) + add_dependencies(buildtests_c server_chttp2_test) + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_c server_ssl_test) + endif() + add_dependencies(buildtests_c server_test) + add_dependencies(buildtests_c slice_buffer_test) + add_dependencies(buildtests_c slice_string_helpers_test) + add_dependencies(buildtests_c sockaddr_resolver_test) + add_dependencies(buildtests_c sockaddr_utils_test) + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_c socket_utils_test) + endif() + add_dependencies(buildtests_c spinlock_test) + add_dependencies(buildtests_c ssl_credentials_test) + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_c ssl_transport_security_test) + endif() + add_dependencies(buildtests_c status_conversion_test) + add_dependencies(buildtests_c stream_compression_test) + add_dependencies(buildtests_c stream_map_test) + add_dependencies(buildtests_c stream_owned_slice_test) + add_dependencies(buildtests_c string_test) + add_dependencies(buildtests_c sync_test) + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_c tcp_client_posix_test) + endif() + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_c tcp_posix_test) + endif() + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_c tcp_server_posix_test) + endif() + add_dependencies(buildtests_c test_core_gpr_time_test) + add_dependencies(buildtests_c test_core_security_credentials_test) + add_dependencies(buildtests_c test_core_slice_slice_test) + add_dependencies(buildtests_c thd_test) + add_dependencies(buildtests_c threadpool_test) + add_dependencies(buildtests_c time_averaged_stats_test) + add_dependencies(buildtests_c timeout_encoding_test) + add_dependencies(buildtests_c timer_heap_test) + add_dependencies(buildtests_c timer_list_test) + add_dependencies(buildtests_c tls_test) + add_dependencies(buildtests_c transport_security_common_api_test) + add_dependencies(buildtests_c transport_security_test) + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_c udp_server_test) + endif() + add_dependencies(buildtests_c uri_parser_test) + add_dependencies(buildtests_c useful_test) + add_dependencies(buildtests_c varint_test) + + add_custom_target(buildtests_cxx) + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx address_sorting_test) + endif() + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx address_sorting_test_unsecure) + endif() + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx alarm_test) + endif() + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx alts_concurrent_connectivity_test) + endif() + add_dependencies(buildtests_cxx alts_util_test) + add_dependencies(buildtests_cxx async_end2end_test) + add_dependencies(buildtests_cxx auth_property_iterator_test) + add_dependencies(buildtests_cxx backoff_test) + add_dependencies(buildtests_cxx bad_streaming_id_bad_client_test) + add_dependencies(buildtests_cxx badreq_bad_client_test) + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx bdp_estimator_test) + endif() + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx bm_alarm) + endif() + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx bm_arena) + endif() + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx bm_byte_buffer) + endif() + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx bm_call_create) + endif() + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx bm_callback_streaming_ping_pong) + endif() + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx bm_callback_unary_ping_pong) + endif() + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx bm_channel) + endif() + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx bm_chttp2_hpack) + endif() + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx bm_chttp2_transport) + endif() + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx bm_closure) + endif() + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx bm_cq) + endif() + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx bm_cq_multiple_threads) + endif() + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx bm_error) + endif() + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx bm_fullstack_streaming_ping_pong) + endif() + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx bm_fullstack_streaming_pump) + endif() + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx bm_fullstack_trickle) + endif() + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx bm_fullstack_unary_ping_pong) + endif() + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx bm_metadata) + endif() + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx bm_pollset) + endif() + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx bm_threadpool) + endif() + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx bm_timer) + endif() + add_dependencies(buildtests_cxx byte_buffer_test) + add_dependencies(buildtests_cxx byte_stream_test) + add_dependencies(buildtests_cxx cancel_ares_query_test) + add_dependencies(buildtests_cxx cfstream_test) + add_dependencies(buildtests_cxx channel_arguments_test) + add_dependencies(buildtests_cxx channel_filter_test) + add_dependencies(buildtests_cxx channel_trace_test) + add_dependencies(buildtests_cxx channelz_registry_test) + add_dependencies(buildtests_cxx channelz_service_test) + add_dependencies(buildtests_cxx channelz_test) + add_dependencies(buildtests_cxx cli_call_test) + add_dependencies(buildtests_cxx client_callback_end2end_test) + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx client_channel_stress_test) + endif() + add_dependencies(buildtests_cxx client_interceptors_end2end_test) + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx client_lb_end2end_test) + endif() + add_dependencies(buildtests_cxx codegen_test_full) + add_dependencies(buildtests_cxx codegen_test_minimal) + add_dependencies(buildtests_cxx connection_prefix_bad_client_test) + add_dependencies(buildtests_cxx connectivity_state_test) + add_dependencies(buildtests_cxx context_list_test) + add_dependencies(buildtests_cxx delegating_channel_test) + add_dependencies(buildtests_cxx destroy_grpclb_channel_with_active_connect_stress_test) + add_dependencies(buildtests_cxx duplicate_header_bad_client_test) + add_dependencies(buildtests_cxx end2end_test) + add_dependencies(buildtests_cxx error_details_test) + add_dependencies(buildtests_cxx eventmanager_libuv_test) + add_dependencies(buildtests_cxx exception_test) + add_dependencies(buildtests_cxx filter_end2end_test) + add_dependencies(buildtests_cxx flaky_network_test) + add_dependencies(buildtests_cxx generic_end2end_test) + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx global_config_env_test) + endif() + add_dependencies(buildtests_cxx global_config_test) + add_dependencies(buildtests_cxx grpc_cli) + add_dependencies(buildtests_cxx grpc_tls_credentials_options_test) + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx grpc_tool_test) + endif() + add_dependencies(buildtests_cxx grpclb_api_test) + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx grpclb_end2end_test) + endif() + add_dependencies(buildtests_cxx h2_ssl_session_reuse_test) + add_dependencies(buildtests_cxx head_of_line_blocking_bad_client_test) + add_dependencies(buildtests_cxx headers_bad_client_test) + add_dependencies(buildtests_cxx health_service_end2end_test) + add_dependencies(buildtests_cxx http2_client) + add_dependencies(buildtests_cxx hybrid_end2end_test) + add_dependencies(buildtests_cxx initial_settings_frame_bad_client_test) + add_dependencies(buildtests_cxx interop_client) + add_dependencies(buildtests_cxx interop_server) + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx interop_test) + endif() + add_dependencies(buildtests_cxx json_test) + add_dependencies(buildtests_cxx large_metadata_bad_client_test) + add_dependencies(buildtests_cxx lb_get_cpu_stats_test) + add_dependencies(buildtests_cxx lb_load_data_store_test) + add_dependencies(buildtests_cxx linux_system_roots_test) + add_dependencies(buildtests_cxx message_allocator_end2end_test) + add_dependencies(buildtests_cxx mock_test) + add_dependencies(buildtests_cxx nonblocking_test) + add_dependencies(buildtests_cxx noop-benchmark) + add_dependencies(buildtests_cxx orphanable_test) + add_dependencies(buildtests_cxx out_of_bounds_bad_client_test) + add_dependencies(buildtests_cxx pid_controller_test) + add_dependencies(buildtests_cxx port_sharing_end2end_test) + add_dependencies(buildtests_cxx proto_server_reflection_test) + add_dependencies(buildtests_cxx proto_utils_test) + add_dependencies(buildtests_cxx qps_json_driver) + add_dependencies(buildtests_cxx qps_worker) + add_dependencies(buildtests_cxx raw_end2end_test) + add_dependencies(buildtests_cxx ref_counted_ptr_test) + add_dependencies(buildtests_cxx ref_counted_test) + add_dependencies(buildtests_cxx retry_throttle_test) + add_dependencies(buildtests_cxx secure_auth_context_test) + add_dependencies(buildtests_cxx server_builder_plugin_test) + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx server_builder_test) + endif() + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx server_builder_with_socket_mutator_test) + endif() + add_dependencies(buildtests_cxx server_context_test_spouse_test) + add_dependencies(buildtests_cxx server_early_return_test) + add_dependencies(buildtests_cxx server_interceptors_end2end_test) + add_dependencies(buildtests_cxx server_registered_method_bad_client_test) + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx server_request_call_test) + endif() + add_dependencies(buildtests_cxx service_config_end2end_test) + add_dependencies(buildtests_cxx service_config_test) + add_dependencies(buildtests_cxx settings_timeout_test) + add_dependencies(buildtests_cxx shutdown_test) + add_dependencies(buildtests_cxx simple_request_bad_client_test) + add_dependencies(buildtests_cxx slice_hash_table_test) + add_dependencies(buildtests_cxx slice_weak_hash_table_test) + add_dependencies(buildtests_cxx static_metadata_test) + add_dependencies(buildtests_cxx stats_test) + add_dependencies(buildtests_cxx status_metadata_test) + add_dependencies(buildtests_cxx status_util_test) + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx streaming_throughput_test) + endif() + add_dependencies(buildtests_cxx string_ref_test) + add_dependencies(buildtests_cxx test_cpp_client_credentials_test) + add_dependencies(buildtests_cxx test_cpp_util_slice_test) + add_dependencies(buildtests_cxx test_cpp_util_time_test) + add_dependencies(buildtests_cxx thread_manager_test) + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx thread_stress_test) + endif() + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx time_jump_test) + endif() + add_dependencies(buildtests_cxx timer_test) + add_dependencies(buildtests_cxx tls_security_connector_test) + add_dependencies(buildtests_cxx unknown_frame_bad_client_test) + add_dependencies(buildtests_cxx window_overflow_bad_client_test) + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx work_serializer_test) + endif() + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx writes_per_rpc_test) + endif() + add_dependencies(buildtests_cxx xds_bootstrap_test) + if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_dependencies(buildtests_cxx xds_end2end_test) + endif() + add_dependencies(buildtests_cxx xds_interop_client) + add_dependencies(buildtests_cxx xds_interop_server) + add_dependencies(buildtests_cxx alts_credentials_fuzzer_one_entry) + add_dependencies(buildtests_cxx client_fuzzer_one_entry) + add_dependencies(buildtests_cxx hpack_parser_fuzzer_test_one_entry) + add_dependencies(buildtests_cxx http_request_fuzzer_test_one_entry) + add_dependencies(buildtests_cxx http_response_fuzzer_test_one_entry) + add_dependencies(buildtests_cxx json_fuzzer_test_one_entry) + add_dependencies(buildtests_cxx nanopb_fuzzer_response_test_one_entry) + add_dependencies(buildtests_cxx nanopb_fuzzer_serverlist_test_one_entry) + add_dependencies(buildtests_cxx percent_decode_fuzzer_one_entry) + add_dependencies(buildtests_cxx percent_encode_fuzzer_one_entry) + add_dependencies(buildtests_cxx server_fuzzer_one_entry) + add_dependencies(buildtests_cxx ssl_server_fuzzer_one_entry) + add_dependencies(buildtests_cxx uri_fuzzer_test_one_entry) + + add_custom_target(buildtests + DEPENDS buildtests_c buildtests_cxx) +endif() + + +add_library(address_sorting + third_party/address_sorting/address_sorting.c + third_party/address_sorting/address_sorting_posix.c + third_party/address_sorting/address_sorting_windows.c +) + +set_target_properties(address_sorting PROPERTIES + VERSION ${gRPC_CORE_VERSION} + SOVERSION ${gRPC_CORE_SOVERSION} +) + +if(WIN32 AND MSVC) + set_target_properties(address_sorting PROPERTIES COMPILE_PDB_NAME "address_sorting" + COMPILE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" + ) + if(gRPC_INSTALL) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/address_sorting.pdb + DESTINATION ${gRPC_INSTALL_LIBDIR} OPTIONAL + ) + endif() +endif() + +target_include_directories(address_sorting + PUBLIC $ $ + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) +target_link_libraries(address_sorting + ${_gRPC_BASELIB_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} +) + + + +if(gRPC_INSTALL) + install(TARGETS address_sorting EXPORT gRPCTargets + RUNTIME DESTINATION ${gRPC_INSTALL_BINDIR} + LIBRARY DESTINATION ${gRPC_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${gRPC_INSTALL_LIBDIR} + ) +endif() + +if(gRPC_BUILD_TESTS) + +add_library(end2end_nosec_tests + test/core/end2end/cq_verifier.cc + test/core/end2end/data/client_certs.cc + test/core/end2end/data/server1_cert.cc + test/core/end2end/data/server1_key.cc + test/core/end2end/data/test_root_cert.cc + test/core/end2end/end2end_nosec_tests.cc + test/core/end2end/end2end_test_utils.cc + test/core/end2end/fixtures/http_proxy_fixture.cc + test/core/end2end/fixtures/local_util.cc + test/core/end2end/fixtures/proxy.cc + test/core/end2end/tests/authority_not_supported.cc + test/core/end2end/tests/bad_hostname.cc + test/core/end2end/tests/bad_ping.cc + test/core/end2end/tests/binary_metadata.cc + test/core/end2end/tests/call_host_override.cc + test/core/end2end/tests/cancel_after_accept.cc + test/core/end2end/tests/cancel_after_client_done.cc + test/core/end2end/tests/cancel_after_invoke.cc + test/core/end2end/tests/cancel_after_round_trip.cc + test/core/end2end/tests/cancel_before_invoke.cc + test/core/end2end/tests/cancel_in_a_vacuum.cc + test/core/end2end/tests/cancel_with_status.cc + test/core/end2end/tests/channelz.cc + test/core/end2end/tests/client_streaming.cc + test/core/end2end/tests/compressed_payload.cc + test/core/end2end/tests/connectivity.cc + test/core/end2end/tests/default_host.cc + test/core/end2end/tests/disappearing_server.cc + test/core/end2end/tests/empty_batch.cc + test/core/end2end/tests/filter_call_init_fails.cc + test/core/end2end/tests/filter_causes_close.cc + test/core/end2end/tests/filter_context.cc + test/core/end2end/tests/filter_latency.cc + test/core/end2end/tests/filter_status_code.cc + test/core/end2end/tests/graceful_server_shutdown.cc + test/core/end2end/tests/high_initial_seqno.cc + test/core/end2end/tests/hpack_size.cc + test/core/end2end/tests/idempotent_request.cc + test/core/end2end/tests/invoke_large_request.cc + test/core/end2end/tests/keepalive_timeout.cc + test/core/end2end/tests/large_metadata.cc + test/core/end2end/tests/max_concurrent_streams.cc + test/core/end2end/tests/max_connection_age.cc + test/core/end2end/tests/max_connection_idle.cc + test/core/end2end/tests/max_message_length.cc + test/core/end2end/tests/negative_deadline.cc + test/core/end2end/tests/no_error_on_hotpath.cc + test/core/end2end/tests/no_logging.cc + test/core/end2end/tests/no_op.cc + test/core/end2end/tests/payload.cc + test/core/end2end/tests/ping.cc + test/core/end2end/tests/ping_pong_streaming.cc + test/core/end2end/tests/proxy_auth.cc + test/core/end2end/tests/registered_call.cc + test/core/end2end/tests/request_with_flags.cc + test/core/end2end/tests/request_with_payload.cc + test/core/end2end/tests/resource_quota_server.cc + test/core/end2end/tests/retry.cc + test/core/end2end/tests/retry_cancellation.cc + test/core/end2end/tests/retry_disabled.cc + test/core/end2end/tests/retry_exceeds_buffer_size_in_initial_batch.cc + test/core/end2end/tests/retry_exceeds_buffer_size_in_subsequent_batch.cc + test/core/end2end/tests/retry_non_retriable_status.cc + test/core/end2end/tests/retry_non_retriable_status_before_recv_trailing_metadata_started.cc + test/core/end2end/tests/retry_recv_initial_metadata.cc + test/core/end2end/tests/retry_recv_message.cc + test/core/end2end/tests/retry_server_pushback_delay.cc + test/core/end2end/tests/retry_server_pushback_disabled.cc + test/core/end2end/tests/retry_streaming.cc + test/core/end2end/tests/retry_streaming_after_commit.cc + test/core/end2end/tests/retry_streaming_succeeds_before_replay_finished.cc + test/core/end2end/tests/retry_throttled.cc + test/core/end2end/tests/retry_too_many_attempts.cc + test/core/end2end/tests/server_finishes_request.cc + test/core/end2end/tests/shutdown_finishes_calls.cc + test/core/end2end/tests/shutdown_finishes_tags.cc + test/core/end2end/tests/simple_cacheable_request.cc + test/core/end2end/tests/simple_delayed_request.cc + test/core/end2end/tests/simple_metadata.cc + test/core/end2end/tests/simple_request.cc + test/core/end2end/tests/stream_compression_compressed_payload.cc + test/core/end2end/tests/stream_compression_payload.cc + test/core/end2end/tests/stream_compression_ping_pong_streaming.cc + test/core/end2end/tests/streaming_error_response.cc + test/core/end2end/tests/trailing_metadata.cc + test/core/end2end/tests/workaround_cronet_compression.cc + test/core/end2end/tests/write_buffering.cc + test/core/end2end/tests/write_buffering_at_end.cc +) + +set_target_properties(end2end_nosec_tests PROPERTIES + VERSION ${gRPC_CORE_VERSION} + SOVERSION ${gRPC_CORE_SOVERSION} +) + +if(WIN32 AND MSVC) + set_target_properties(end2end_nosec_tests PROPERTIES COMPILE_PDB_NAME "end2end_nosec_tests" + COMPILE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" + ) + if(gRPC_INSTALL) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/end2end_nosec_tests.pdb + DESTINATION ${gRPC_INSTALL_LIBDIR} OPTIONAL + ) + endif() +endif() + +target_include_directories(end2end_nosec_tests + PUBLIC $ $ + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) +target_link_libraries(end2end_nosec_tests + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_library(end2end_tests + test/core/end2end/cq_verifier.cc + test/core/end2end/data/client_certs.cc + test/core/end2end/data/server1_cert.cc + test/core/end2end/data/server1_key.cc + test/core/end2end/data/test_root_cert.cc + test/core/end2end/end2end_test_utils.cc + test/core/end2end/end2end_tests.cc + test/core/end2end/fixtures/http_proxy_fixture.cc + test/core/end2end/fixtures/local_util.cc + test/core/end2end/fixtures/proxy.cc + test/core/end2end/tests/authority_not_supported.cc + test/core/end2end/tests/bad_hostname.cc + test/core/end2end/tests/bad_ping.cc + test/core/end2end/tests/binary_metadata.cc + test/core/end2end/tests/call_creds.cc + test/core/end2end/tests/call_host_override.cc + test/core/end2end/tests/cancel_after_accept.cc + test/core/end2end/tests/cancel_after_client_done.cc + test/core/end2end/tests/cancel_after_invoke.cc + test/core/end2end/tests/cancel_after_round_trip.cc + test/core/end2end/tests/cancel_before_invoke.cc + test/core/end2end/tests/cancel_in_a_vacuum.cc + test/core/end2end/tests/cancel_with_status.cc + test/core/end2end/tests/channelz.cc + test/core/end2end/tests/client_streaming.cc + test/core/end2end/tests/compressed_payload.cc + test/core/end2end/tests/connectivity.cc + test/core/end2end/tests/default_host.cc + test/core/end2end/tests/disappearing_server.cc + test/core/end2end/tests/empty_batch.cc + test/core/end2end/tests/filter_call_init_fails.cc + test/core/end2end/tests/filter_causes_close.cc + test/core/end2end/tests/filter_context.cc + test/core/end2end/tests/filter_latency.cc + test/core/end2end/tests/filter_status_code.cc + test/core/end2end/tests/graceful_server_shutdown.cc + test/core/end2end/tests/high_initial_seqno.cc + test/core/end2end/tests/hpack_size.cc + test/core/end2end/tests/idempotent_request.cc + test/core/end2end/tests/invoke_large_request.cc + test/core/end2end/tests/keepalive_timeout.cc + test/core/end2end/tests/large_metadata.cc + test/core/end2end/tests/max_concurrent_streams.cc + test/core/end2end/tests/max_connection_age.cc + test/core/end2end/tests/max_connection_idle.cc + test/core/end2end/tests/max_message_length.cc + test/core/end2end/tests/negative_deadline.cc + test/core/end2end/tests/no_error_on_hotpath.cc + test/core/end2end/tests/no_logging.cc + test/core/end2end/tests/no_op.cc + test/core/end2end/tests/payload.cc + test/core/end2end/tests/ping.cc + test/core/end2end/tests/ping_pong_streaming.cc + test/core/end2end/tests/proxy_auth.cc + test/core/end2end/tests/registered_call.cc + test/core/end2end/tests/request_with_flags.cc + test/core/end2end/tests/request_with_payload.cc + test/core/end2end/tests/resource_quota_server.cc + test/core/end2end/tests/retry.cc + test/core/end2end/tests/retry_cancellation.cc + test/core/end2end/tests/retry_disabled.cc + test/core/end2end/tests/retry_exceeds_buffer_size_in_initial_batch.cc + test/core/end2end/tests/retry_exceeds_buffer_size_in_subsequent_batch.cc + test/core/end2end/tests/retry_non_retriable_status.cc + test/core/end2end/tests/retry_non_retriable_status_before_recv_trailing_metadata_started.cc + test/core/end2end/tests/retry_recv_initial_metadata.cc + test/core/end2end/tests/retry_recv_message.cc + test/core/end2end/tests/retry_server_pushback_delay.cc + test/core/end2end/tests/retry_server_pushback_disabled.cc + test/core/end2end/tests/retry_streaming.cc + test/core/end2end/tests/retry_streaming_after_commit.cc + test/core/end2end/tests/retry_streaming_succeeds_before_replay_finished.cc + test/core/end2end/tests/retry_throttled.cc + test/core/end2end/tests/retry_too_many_attempts.cc + test/core/end2end/tests/server_finishes_request.cc + test/core/end2end/tests/shutdown_finishes_calls.cc + test/core/end2end/tests/shutdown_finishes_tags.cc + test/core/end2end/tests/simple_cacheable_request.cc + test/core/end2end/tests/simple_delayed_request.cc + test/core/end2end/tests/simple_metadata.cc + test/core/end2end/tests/simple_request.cc + test/core/end2end/tests/stream_compression_compressed_payload.cc + test/core/end2end/tests/stream_compression_payload.cc + test/core/end2end/tests/stream_compression_ping_pong_streaming.cc + test/core/end2end/tests/streaming_error_response.cc + test/core/end2end/tests/trailing_metadata.cc + test/core/end2end/tests/workaround_cronet_compression.cc + test/core/end2end/tests/write_buffering.cc + test/core/end2end/tests/write_buffering_at_end.cc +) + +set_target_properties(end2end_tests PROPERTIES + VERSION ${gRPC_CORE_VERSION} + SOVERSION ${gRPC_CORE_SOVERSION} +) + +if(WIN32 AND MSVC) + set_target_properties(end2end_tests PROPERTIES COMPILE_PDB_NAME "end2end_tests" + COMPILE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" + ) + if(gRPC_INSTALL) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/end2end_tests.pdb + DESTINATION ${gRPC_INSTALL_LIBDIR} OPTIONAL + ) + endif() +endif() + +target_include_directories(end2end_tests + PUBLIC $ $ + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) +target_link_libraries(end2end_tests + ${_gRPC_SSL_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() + +add_library(gpr + src/core/lib/gpr/alloc.cc + src/core/lib/gpr/atm.cc + src/core/lib/gpr/cpu_iphone.cc + src/core/lib/gpr/cpu_linux.cc + src/core/lib/gpr/cpu_posix.cc + src/core/lib/gpr/cpu_windows.cc + src/core/lib/gpr/env_linux.cc + src/core/lib/gpr/env_posix.cc + src/core/lib/gpr/env_windows.cc + src/core/lib/gpr/log.cc + src/core/lib/gpr/log_android.cc + src/core/lib/gpr/log_linux.cc + src/core/lib/gpr/log_posix.cc + src/core/lib/gpr/log_windows.cc + src/core/lib/gpr/murmur_hash.cc + src/core/lib/gpr/string.cc + src/core/lib/gpr/string_posix.cc + src/core/lib/gpr/string_util_windows.cc + src/core/lib/gpr/string_windows.cc + src/core/lib/gpr/sync.cc + src/core/lib/gpr/sync_abseil.cc + src/core/lib/gpr/sync_posix.cc + src/core/lib/gpr/sync_windows.cc + src/core/lib/gpr/time.cc + src/core/lib/gpr/time_posix.cc + src/core/lib/gpr/time_precise.cc + src/core/lib/gpr/time_windows.cc + src/core/lib/gpr/tls_pthread.cc + src/core/lib/gpr/tmpfile_msys.cc + src/core/lib/gpr/tmpfile_posix.cc + src/core/lib/gpr/tmpfile_windows.cc + src/core/lib/gpr/wrap_memcpy.cc + src/core/lib/gprpp/arena.cc + src/core/lib/gprpp/fork.cc + src/core/lib/gprpp/global_config_env.cc + src/core/lib/gprpp/host_port.cc + src/core/lib/gprpp/mpscq.cc + src/core/lib/gprpp/thd_posix.cc + src/core/lib/gprpp/thd_windows.cc + src/core/lib/profiling/basic_timers.cc + src/core/lib/profiling/stap_timers.cc +) + +set_target_properties(gpr PROPERTIES + VERSION ${gRPC_CORE_VERSION} + SOVERSION ${gRPC_CORE_SOVERSION} +) + +if(WIN32 AND MSVC) + set_target_properties(gpr PROPERTIES COMPILE_PDB_NAME "gpr" + COMPILE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" + ) + if(gRPC_INSTALL) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/gpr.pdb + DESTINATION ${gRPC_INSTALL_LIBDIR} OPTIONAL + ) + endif() +endif() + +target_include_directories(gpr + PUBLIC $ $ + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) +target_link_libraries(gpr + ${_gRPC_ALLTARGETS_LIBRARIES} + absl::time + absl::strings + absl::str_format + absl::memory +) +if(_gRPC_PLATFORM_ANDROID) + target_link_libraries(gpr + android + log + ) +endif() + +foreach(_hdr + include/grpc/impl/codegen/atm.h + include/grpc/impl/codegen/atm_gcc_atomic.h + include/grpc/impl/codegen/atm_gcc_sync.h + include/grpc/impl/codegen/atm_windows.h + include/grpc/impl/codegen/byte_buffer.h + include/grpc/impl/codegen/byte_buffer_reader.h + include/grpc/impl/codegen/compression_types.h + include/grpc/impl/codegen/connectivity_state.h + include/grpc/impl/codegen/fork.h + include/grpc/impl/codegen/gpr_slice.h + include/grpc/impl/codegen/gpr_types.h + include/grpc/impl/codegen/grpc_types.h + include/grpc/impl/codegen/log.h + include/grpc/impl/codegen/port_platform.h + include/grpc/impl/codegen/propagation_bits.h + include/grpc/impl/codegen/slice.h + include/grpc/impl/codegen/status.h + include/grpc/impl/codegen/sync.h + include/grpc/impl/codegen/sync_abseil.h + include/grpc/impl/codegen/sync_custom.h + include/grpc/impl/codegen/sync_generic.h + include/grpc/impl/codegen/sync_posix.h + include/grpc/impl/codegen/sync_windows.h + include/grpc/support/alloc.h + include/grpc/support/atm.h + include/grpc/support/atm_gcc_atomic.h + include/grpc/support/atm_gcc_sync.h + include/grpc/support/atm_windows.h + include/grpc/support/cpu.h + include/grpc/support/log.h + include/grpc/support/log_windows.h + include/grpc/support/port_platform.h + include/grpc/support/string_util.h + include/grpc/support/sync.h + include/grpc/support/sync_abseil.h + include/grpc/support/sync_custom.h + include/grpc/support/sync_generic.h + include/grpc/support/sync_posix.h + include/grpc/support/sync_windows.h + include/grpc/support/thd_id.h + include/grpc/support/time.h +) + string(REPLACE "include/" "" _path ${_hdr}) + get_filename_component(_path ${_path} PATH) + install(FILES ${_hdr} + DESTINATION "${gRPC_INSTALL_INCLUDEDIR}/${_path}" + ) +endforeach() + + +if(gRPC_INSTALL) + install(TARGETS gpr EXPORT gRPCTargets + RUNTIME DESTINATION ${gRPC_INSTALL_BINDIR} + LIBRARY DESTINATION ${gRPC_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${gRPC_INSTALL_LIBDIR} + ) +endif() + + +add_library(grpc + src/core/ext/filters/census/grpc_context.cc + src/core/ext/filters/client_channel/backend_metric.cc + src/core/ext/filters/client_channel/backup_poller.cc + src/core/ext/filters/client_channel/channel_connectivity.cc + src/core/ext/filters/client_channel/client_channel.cc + src/core/ext/filters/client_channel/client_channel_channelz.cc + src/core/ext/filters/client_channel/client_channel_factory.cc + src/core/ext/filters/client_channel/client_channel_plugin.cc + src/core/ext/filters/client_channel/global_subchannel_pool.cc + src/core/ext/filters/client_channel/health/health_check_client.cc + src/core/ext/filters/client_channel/http_connect_handshaker.cc + src/core/ext/filters/client_channel/http_proxy.cc + src/core/ext/filters/client_channel/lb_policy.cc + src/core/ext/filters/client_channel/lb_policy/address_filtering.cc + src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc + src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc + src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc + src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc + src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc + src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc + src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc + src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc + src/core/ext/filters/client_channel/lb_policy/priority/priority.cc + src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc + src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc + src/core/ext/filters/client_channel/lb_policy/xds/cds.cc + src/core/ext/filters/client_channel/lb_policy/xds/eds.cc + src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc + src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc + src/core/ext/filters/client_channel/lb_policy_registry.cc + src/core/ext/filters/client_channel/local_subchannel_pool.cc + src/core/ext/filters/client_channel/parse_address.cc + src/core/ext/filters/client_channel/proxy_mapper_registry.cc + src/core/ext/filters/client_channel/resolver.cc + src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc + src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc + src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc + src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc + src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc + src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc + src/core/ext/filters/client_channel/resolver_registry.cc + src/core/ext/filters/client_channel/resolver_result_parsing.cc + src/core/ext/filters/client_channel/resolving_lb_policy.cc + src/core/ext/filters/client_channel/retry_throttle.cc + src/core/ext/filters/client_channel/server_address.cc + src/core/ext/filters/client_channel/service_config.cc + src/core/ext/filters/client_channel/service_config_parser.cc + src/core/ext/filters/client_channel/subchannel.cc + src/core/ext/filters/client_channel/subchannel_pool_interface.cc + src/core/ext/filters/client_channel/xds/xds_api.cc + src/core/ext/filters/client_channel/xds/xds_bootstrap.cc + src/core/ext/filters/client_channel/xds/xds_channel_secure.cc + src/core/ext/filters/client_channel/xds/xds_client.cc + src/core/ext/filters/client_channel/xds/xds_client_stats.cc + src/core/ext/filters/client_idle/client_idle_filter.cc + src/core/ext/filters/deadline/deadline_filter.cc + src/core/ext/filters/http/client/http_client_filter.cc + src/core/ext/filters/http/client_authority_filter.cc + src/core/ext/filters/http/http_filters_plugin.cc + src/core/ext/filters/http/message_compress/message_compress_filter.cc + src/core/ext/filters/http/message_compress/message_decompress_filter.cc + src/core/ext/filters/http/server/http_server_filter.cc + src/core/ext/filters/max_age/max_age_filter.cc + src/core/ext/filters/message_size/message_size_filter.cc + src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc + src/core/ext/filters/workarounds/workaround_utils.cc + src/core/ext/transport/chttp2/alpn/alpn.cc + src/core/ext/transport/chttp2/client/authority.cc + src/core/ext/transport/chttp2/client/chttp2_connector.cc + src/core/ext/transport/chttp2/client/insecure/channel_create.cc + src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc + src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc + src/core/ext/transport/chttp2/server/chttp2_server.cc + src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc + src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc + src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc + src/core/ext/transport/chttp2/transport/bin_decoder.cc + src/core/ext/transport/chttp2/transport/bin_encoder.cc + src/core/ext/transport/chttp2/transport/chttp2_plugin.cc + src/core/ext/transport/chttp2/transport/chttp2_transport.cc + src/core/ext/transport/chttp2/transport/context_list.cc + src/core/ext/transport/chttp2/transport/flow_control.cc + src/core/ext/transport/chttp2/transport/frame_data.cc + src/core/ext/transport/chttp2/transport/frame_goaway.cc + src/core/ext/transport/chttp2/transport/frame_ping.cc + src/core/ext/transport/chttp2/transport/frame_rst_stream.cc + src/core/ext/transport/chttp2/transport/frame_settings.cc + src/core/ext/transport/chttp2/transport/frame_window_update.cc + src/core/ext/transport/chttp2/transport/hpack_encoder.cc + src/core/ext/transport/chttp2/transport/hpack_parser.cc + src/core/ext/transport/chttp2/transport/hpack_table.cc + src/core/ext/transport/chttp2/transport/http2_settings.cc + src/core/ext/transport/chttp2/transport/huffsyms.cc + src/core/ext/transport/chttp2/transport/incoming_metadata.cc + src/core/ext/transport/chttp2/transport/parsing.cc + src/core/ext/transport/chttp2/transport/stream_lists.cc + src/core/ext/transport/chttp2/transport/stream_map.cc + src/core/ext/transport/chttp2/transport/varint.cc + src/core/ext/transport/chttp2/transport/writing.cc + src/core/ext/transport/inproc/inproc_plugin.cc + src/core/ext/transport/inproc/inproc_transport.cc + src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c + src/core/ext/upb-generated/envoy/annotations/resource.upb.c + src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c + src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c + src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c + src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c + src/core/ext/upb-generated/envoy/api/v2/cds.upb.c + src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c + src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c + src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c + src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c + src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c + src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c + src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c + src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c + src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c + src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c + src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c + src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c + src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c + src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c + src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c + src/core/ext/upb-generated/envoy/api/v2/eds.upb.c + src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c + src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c + src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c + src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c + src/core/ext/upb-generated/envoy/api/v2/lds.upb.c + src/core/ext/upb-generated/envoy/api/v2/listener.upb.c + src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c + src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c + src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c + src/core/ext/upb-generated/envoy/api/v2/rds.upb.c + src/core/ext/upb-generated/envoy/api/v2/route.upb.c + src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c + src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c + src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c + src/core/ext/upb-generated/envoy/api/v2/srds.upb.c + src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c + src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c + src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c + src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c + src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c + src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c + src/core/ext/upb-generated/envoy/type/http.upb.c + src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c + src/core/ext/upb-generated/envoy/type/matcher/string.upb.c + src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c + src/core/ext/upb-generated/envoy/type/percent.upb.c + src/core/ext/upb-generated/envoy/type/range.upb.c + src/core/ext/upb-generated/envoy/type/semantic_version.upb.c + src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c + src/core/ext/upb-generated/gogoproto/gogo.upb.c + src/core/ext/upb-generated/google/api/annotations.upb.c + src/core/ext/upb-generated/google/api/http.upb.c + src/core/ext/upb-generated/google/protobuf/any.upb.c + src/core/ext/upb-generated/google/protobuf/descriptor.upb.c + src/core/ext/upb-generated/google/protobuf/duration.upb.c + src/core/ext/upb-generated/google/protobuf/empty.upb.c + src/core/ext/upb-generated/google/protobuf/struct.upb.c + src/core/ext/upb-generated/google/protobuf/timestamp.upb.c + src/core/ext/upb-generated/google/protobuf/wrappers.upb.c + src/core/ext/upb-generated/google/rpc/status.upb.c + src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c + src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c + src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c + src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c + src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c + src/core/ext/upb-generated/udpa/annotations/migrate.upb.c + src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c + src/core/ext/upb-generated/udpa/annotations/status.upb.c + src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c + src/core/ext/upb-generated/validate/validate.upb.c + src/core/lib/avl/avl.cc + src/core/lib/backoff/backoff.cc + src/core/lib/channel/channel_args.cc + src/core/lib/channel/channel_stack.cc + src/core/lib/channel/channel_stack_builder.cc + src/core/lib/channel/channel_trace.cc + src/core/lib/channel/channelz.cc + src/core/lib/channel/channelz_registry.cc + src/core/lib/channel/connected_channel.cc + src/core/lib/channel/handshaker.cc + src/core/lib/channel/handshaker_registry.cc + src/core/lib/channel/status_util.cc + src/core/lib/compression/compression.cc + src/core/lib/compression/compression_args.cc + src/core/lib/compression/compression_internal.cc + src/core/lib/compression/message_compress.cc + src/core/lib/compression/stream_compression.cc + src/core/lib/compression/stream_compression_gzip.cc + src/core/lib/compression/stream_compression_identity.cc + src/core/lib/debug/stats.cc + src/core/lib/debug/stats_data.cc + src/core/lib/debug/trace.cc + src/core/lib/http/format_request.cc + src/core/lib/http/httpcli.cc + src/core/lib/http/httpcli_security_connector.cc + src/core/lib/http/parser.cc + src/core/lib/iomgr/buffer_list.cc + src/core/lib/iomgr/call_combiner.cc + src/core/lib/iomgr/cfstream_handle.cc + src/core/lib/iomgr/combiner.cc + src/core/lib/iomgr/dualstack_socket_posix.cc + src/core/lib/iomgr/endpoint.cc + src/core/lib/iomgr/endpoint_cfstream.cc + src/core/lib/iomgr/endpoint_pair_posix.cc + src/core/lib/iomgr/endpoint_pair_uv.cc + src/core/lib/iomgr/endpoint_pair_windows.cc + src/core/lib/iomgr/error.cc + src/core/lib/iomgr/error_cfstream.cc + src/core/lib/iomgr/ev_apple.cc + src/core/lib/iomgr/ev_epoll1_linux.cc + src/core/lib/iomgr/ev_epollex_linux.cc + src/core/lib/iomgr/ev_poll_posix.cc + src/core/lib/iomgr/ev_posix.cc + src/core/lib/iomgr/ev_windows.cc + src/core/lib/iomgr/exec_ctx.cc + src/core/lib/iomgr/executor.cc + src/core/lib/iomgr/executor/mpmcqueue.cc + src/core/lib/iomgr/executor/threadpool.cc + src/core/lib/iomgr/fork_posix.cc + src/core/lib/iomgr/fork_windows.cc + src/core/lib/iomgr/gethostname_fallback.cc + src/core/lib/iomgr/gethostname_host_name_max.cc + src/core/lib/iomgr/gethostname_sysconf.cc + src/core/lib/iomgr/grpc_if_nametoindex_posix.cc + src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc + src/core/lib/iomgr/internal_errqueue.cc + src/core/lib/iomgr/iocp_windows.cc + src/core/lib/iomgr/iomgr.cc + src/core/lib/iomgr/iomgr_custom.cc + src/core/lib/iomgr/iomgr_internal.cc + src/core/lib/iomgr/iomgr_posix.cc + src/core/lib/iomgr/iomgr_posix_cfstream.cc + src/core/lib/iomgr/iomgr_uv.cc + src/core/lib/iomgr/iomgr_windows.cc + src/core/lib/iomgr/is_epollexclusive_available.cc + src/core/lib/iomgr/load_file.cc + src/core/lib/iomgr/lockfree_event.cc + src/core/lib/iomgr/poller/eventmanager_libuv.cc + src/core/lib/iomgr/polling_entity.cc + src/core/lib/iomgr/pollset.cc + src/core/lib/iomgr/pollset_custom.cc + src/core/lib/iomgr/pollset_set.cc + src/core/lib/iomgr/pollset_set_custom.cc + src/core/lib/iomgr/pollset_set_windows.cc + src/core/lib/iomgr/pollset_uv.cc + src/core/lib/iomgr/pollset_windows.cc + src/core/lib/iomgr/resolve_address.cc + src/core/lib/iomgr/resolve_address_custom.cc + src/core/lib/iomgr/resolve_address_posix.cc + src/core/lib/iomgr/resolve_address_windows.cc + src/core/lib/iomgr/resource_quota.cc + src/core/lib/iomgr/sockaddr_utils.cc + src/core/lib/iomgr/socket_factory_posix.cc + src/core/lib/iomgr/socket_mutator.cc + src/core/lib/iomgr/socket_utils_common_posix.cc + src/core/lib/iomgr/socket_utils_linux.cc + src/core/lib/iomgr/socket_utils_posix.cc + src/core/lib/iomgr/socket_utils_uv.cc + src/core/lib/iomgr/socket_utils_windows.cc + src/core/lib/iomgr/socket_windows.cc + src/core/lib/iomgr/tcp_client.cc + src/core/lib/iomgr/tcp_client_cfstream.cc + src/core/lib/iomgr/tcp_client_custom.cc + src/core/lib/iomgr/tcp_client_posix.cc + src/core/lib/iomgr/tcp_client_windows.cc + src/core/lib/iomgr/tcp_custom.cc + src/core/lib/iomgr/tcp_posix.cc + src/core/lib/iomgr/tcp_server.cc + src/core/lib/iomgr/tcp_server_custom.cc + src/core/lib/iomgr/tcp_server_posix.cc + src/core/lib/iomgr/tcp_server_utils_posix_common.cc + src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc + src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc + src/core/lib/iomgr/tcp_server_windows.cc + src/core/lib/iomgr/tcp_uv.cc + src/core/lib/iomgr/tcp_windows.cc + src/core/lib/iomgr/time_averaged_stats.cc + src/core/lib/iomgr/timer.cc + src/core/lib/iomgr/timer_custom.cc + src/core/lib/iomgr/timer_generic.cc + src/core/lib/iomgr/timer_heap.cc + src/core/lib/iomgr/timer_manager.cc + src/core/lib/iomgr/timer_uv.cc + src/core/lib/iomgr/udp_server.cc + src/core/lib/iomgr/unix_sockets_posix.cc + src/core/lib/iomgr/unix_sockets_posix_noop.cc + src/core/lib/iomgr/wakeup_fd_eventfd.cc + src/core/lib/iomgr/wakeup_fd_nospecial.cc + src/core/lib/iomgr/wakeup_fd_pipe.cc + src/core/lib/iomgr/wakeup_fd_posix.cc + src/core/lib/iomgr/work_serializer.cc + src/core/lib/json/json_reader.cc + src/core/lib/json/json_writer.cc + src/core/lib/security/context/security_context.cc + src/core/lib/security/credentials/alts/alts_credentials.cc + src/core/lib/security/credentials/alts/check_gcp_environment.cc + src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc + src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc + src/core/lib/security/credentials/alts/check_gcp_environment_windows.cc + src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc + src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc + src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc + src/core/lib/security/credentials/composite/composite_credentials.cc + src/core/lib/security/credentials/credentials.cc + src/core/lib/security/credentials/credentials_metadata.cc + src/core/lib/security/credentials/fake/fake_credentials.cc + src/core/lib/security/credentials/google_default/credentials_generic.cc + src/core/lib/security/credentials/google_default/google_default_credentials.cc + src/core/lib/security/credentials/iam/iam_credentials.cc + src/core/lib/security/credentials/jwt/json_token.cc + src/core/lib/security/credentials/jwt/jwt_credentials.cc + src/core/lib/security/credentials/jwt/jwt_verifier.cc + src/core/lib/security/credentials/local/local_credentials.cc + src/core/lib/security/credentials/oauth2/oauth2_credentials.cc + src/core/lib/security/credentials/plugin/plugin_credentials.cc + src/core/lib/security/credentials/ssl/ssl_credentials.cc + src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc + src/core/lib/security/credentials/tls/tls_credentials.cc + src/core/lib/security/security_connector/alts/alts_security_connector.cc + src/core/lib/security/security_connector/fake/fake_security_connector.cc + src/core/lib/security/security_connector/load_system_roots_fallback.cc + src/core/lib/security/security_connector/load_system_roots_linux.cc + src/core/lib/security/security_connector/local/local_security_connector.cc + src/core/lib/security/security_connector/security_connector.cc + src/core/lib/security/security_connector/ssl/ssl_security_connector.cc + src/core/lib/security/security_connector/ssl_utils.cc + src/core/lib/security/security_connector/ssl_utils_config.cc + src/core/lib/security/security_connector/tls/tls_security_connector.cc + src/core/lib/security/transport/client_auth_filter.cc + src/core/lib/security/transport/secure_endpoint.cc + src/core/lib/security/transport/security_handshaker.cc + src/core/lib/security/transport/server_auth_filter.cc + src/core/lib/security/transport/target_authority_table.cc + src/core/lib/security/transport/tsi_error.cc + src/core/lib/security/util/json_util.cc + src/core/lib/slice/b64.cc + src/core/lib/slice/percent_encoding.cc + src/core/lib/slice/slice.cc + src/core/lib/slice/slice_buffer.cc + src/core/lib/slice/slice_intern.cc + src/core/lib/slice/slice_string_helpers.cc + src/core/lib/surface/api_trace.cc + src/core/lib/surface/byte_buffer.cc + src/core/lib/surface/byte_buffer_reader.cc + src/core/lib/surface/call.cc + src/core/lib/surface/call_details.cc + src/core/lib/surface/call_log_batch.cc + src/core/lib/surface/channel.cc + src/core/lib/surface/channel_init.cc + src/core/lib/surface/channel_ping.cc + src/core/lib/surface/channel_stack_type.cc + src/core/lib/surface/completion_queue.cc + src/core/lib/surface/completion_queue_factory.cc + src/core/lib/surface/event_string.cc + src/core/lib/surface/init.cc + src/core/lib/surface/init_secure.cc + src/core/lib/surface/lame_client.cc + src/core/lib/surface/metadata_array.cc + src/core/lib/surface/server.cc + src/core/lib/surface/validate_metadata.cc + src/core/lib/surface/version.cc + src/core/lib/transport/bdp_estimator.cc + src/core/lib/transport/byte_stream.cc + src/core/lib/transport/connectivity_state.cc + src/core/lib/transport/error_utils.cc + src/core/lib/transport/metadata.cc + src/core/lib/transport/metadata_batch.cc + src/core/lib/transport/pid_controller.cc + src/core/lib/transport/static_metadata.cc + src/core/lib/transport/status_conversion.cc + src/core/lib/transport/status_metadata.cc + src/core/lib/transport/timeout_encoding.cc + src/core/lib/transport/transport.cc + src/core/lib/transport/transport_op_string.cc + src/core/lib/uri/uri_parser.cc + src/core/plugin_registry/grpc_plugin_registry.cc + src/core/tsi/alts/crypt/aes_gcm.cc + src/core/tsi/alts/crypt/gsec.cc + src/core/tsi/alts/frame_protector/alts_counter.cc + src/core/tsi/alts/frame_protector/alts_crypter.cc + src/core/tsi/alts/frame_protector/alts_frame_protector.cc + src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.cc + src/core/tsi/alts/frame_protector/alts_seal_privacy_integrity_crypter.cc + src/core/tsi/alts/frame_protector/alts_unseal_privacy_integrity_crypter.cc + src/core/tsi/alts/frame_protector/frame_handler.cc + src/core/tsi/alts/handshaker/alts_handshaker_client.cc + src/core/tsi/alts/handshaker/alts_shared_resource.cc + src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc + src/core/tsi/alts/handshaker/alts_tsi_utils.cc + src/core/tsi/alts/handshaker/transport_security_common_api.cc + src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc + src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc + src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc + src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc + src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc + src/core/tsi/fake_transport_security.cc + src/core/tsi/local_transport_security.cc + src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc + src/core/tsi/ssl/session_cache/ssl_session_cache.cc + src/core/tsi/ssl/session_cache/ssl_session_openssl.cc + src/core/tsi/ssl_transport_security.cc + src/core/tsi/transport_security.cc + src/core/tsi/transport_security_grpc.cc +) + +set_target_properties(grpc PROPERTIES + VERSION ${gRPC_CORE_VERSION} + SOVERSION ${gRPC_CORE_SOVERSION} +) + +if(WIN32 AND MSVC) + set_target_properties(grpc PROPERTIES COMPILE_PDB_NAME "grpc" + COMPILE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" + ) + if(gRPC_INSTALL) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/grpc.pdb + DESTINATION ${gRPC_INSTALL_LIBDIR} OPTIONAL + ) + endif() +endif() + +target_include_directories(grpc + PUBLIC $ $ + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) +target_link_libraries(grpc + ${_gRPC_BASELIB_LIBRARIES} + ${_gRPC_SSL_LIBRARIES} + ${_gRPC_ZLIB_LIBRARIES} + ${_gRPC_CARES_LIBRARIES} + ${_gRPC_ADDRESS_SORTING_LIBRARIES} + ${_gRPC_UPB_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + gpr + address_sorting + upb + absl::optional + absl::strings + absl::inlined_vector +) +if(_gRPC_PLATFORM_IOS OR _gRPC_PLATFORM_MAC) + target_link_libraries(grpc "-framework CoreFoundation") +endif() + +foreach(_hdr + include/grpc/byte_buffer.h + include/grpc/byte_buffer_reader.h + include/grpc/census.h + include/grpc/compression.h + include/grpc/fork.h + include/grpc/grpc.h + include/grpc/grpc_posix.h + include/grpc/grpc_security.h + include/grpc/grpc_security_constants.h + include/grpc/load_reporting.h + include/grpc/slice.h + include/grpc/slice_buffer.h + include/grpc/status.h + include/grpc/support/workaround_list.h +) + string(REPLACE "include/" "" _path ${_hdr}) + get_filename_component(_path ${_path} PATH) + install(FILES ${_hdr} + DESTINATION "${gRPC_INSTALL_INCLUDEDIR}/${_path}" + ) +endforeach() + + +if(gRPC_INSTALL) + install(TARGETS grpc EXPORT gRPCTargets + RUNTIME DESTINATION ${gRPC_INSTALL_BINDIR} + LIBRARY DESTINATION ${gRPC_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${gRPC_INSTALL_LIBDIR} + ) +endif() + +if(gRPC_BUILD_CSHARP_EXT) + +add_library(grpc_csharp_ext SHARED + src/csharp/ext/grpc_csharp_ext.c +) + +set_target_properties(grpc_csharp_ext PROPERTIES + VERSION ${gRPC_CORE_VERSION} + SOVERSION ${gRPC_CORE_SOVERSION} +) + +if(WIN32 AND MSVC) + set_target_properties(grpc_csharp_ext PROPERTIES COMPILE_PDB_NAME "grpc_csharp_ext" + COMPILE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" + ) + if(gRPC_INSTALL) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/grpc_csharp_ext.pdb + DESTINATION ${gRPC_INSTALL_LIBDIR} OPTIONAL + ) + endif() +endif() + +target_include_directories(grpc_csharp_ext + PUBLIC $ $ + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) +target_link_libraries(grpc_csharp_ext + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_library(grpc_test_util + test/core/util/cmdline.cc + test/core/util/debugger_macros.cc + test/core/util/fuzzer_util.cc + test/core/util/grpc_profiler.cc + test/core/util/histogram.cc + test/core/util/memory_counters.cc + test/core/util/mock_endpoint.cc + test/core/util/parse_hexstring.cc + test/core/util/passthru_endpoint.cc + test/core/util/port.cc + test/core/util/port_isolated_runtime_environment.cc + test/core/util/port_server_client.cc + test/core/util/reconnect_server.cc + test/core/util/slice_splitter.cc + test/core/util/subprocess_posix.cc + test/core/util/subprocess_windows.cc + test/core/util/test_config.cc + test/core/util/test_tcp_server.cc + test/core/util/tracer_util.cc + test/core/util/trickle_endpoint.cc +) + +set_target_properties(grpc_test_util PROPERTIES + VERSION ${gRPC_CORE_VERSION} + SOVERSION ${gRPC_CORE_SOVERSION} +) + +if(WIN32 AND MSVC) + set_target_properties(grpc_test_util PROPERTIES COMPILE_PDB_NAME "grpc_test_util" + COMPILE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" + ) + if(gRPC_INSTALL) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/grpc_test_util.pdb + DESTINATION ${gRPC_INSTALL_LIBDIR} OPTIONAL + ) + endif() +endif() + +target_include_directories(grpc_test_util + PUBLIC $ $ + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) +target_link_libraries(grpc_test_util + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc + gpr + address_sorting + upb +) +if(_gRPC_PLATFORM_IOS OR _gRPC_PLATFORM_MAC) + target_link_libraries(grpc_test_util "-framework CoreFoundation") +endif() + + +endif() +if(gRPC_BUILD_TESTS) + +add_library(grpc_test_util_unsecure + test/core/util/cmdline.cc + test/core/util/debugger_macros.cc + test/core/util/fuzzer_util.cc + test/core/util/grpc_profiler.cc + test/core/util/histogram.cc + test/core/util/memory_counters.cc + test/core/util/mock_endpoint.cc + test/core/util/parse_hexstring.cc + test/core/util/passthru_endpoint.cc + test/core/util/port.cc + test/core/util/port_isolated_runtime_environment.cc + test/core/util/port_server_client.cc + test/core/util/reconnect_server.cc + test/core/util/slice_splitter.cc + test/core/util/subprocess_posix.cc + test/core/util/subprocess_windows.cc + test/core/util/test_config.cc + test/core/util/test_tcp_server.cc + test/core/util/tracer_util.cc + test/core/util/trickle_endpoint.cc +) + +set_target_properties(grpc_test_util_unsecure PROPERTIES + VERSION ${gRPC_CORE_VERSION} + SOVERSION ${gRPC_CORE_SOVERSION} +) + +if(WIN32 AND MSVC) + set_target_properties(grpc_test_util_unsecure PROPERTIES COMPILE_PDB_NAME "grpc_test_util_unsecure" + COMPILE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" + ) + if(gRPC_INSTALL) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/grpc_test_util_unsecure.pdb + DESTINATION ${gRPC_INSTALL_LIBDIR} OPTIONAL + ) + endif() +endif() + +target_include_directories(grpc_test_util_unsecure + PUBLIC $ $ + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) +target_link_libraries(grpc_test_util_unsecure + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_unsecure + gpr + address_sorting + upb +) +if(_gRPC_PLATFORM_IOS OR _gRPC_PLATFORM_MAC) + target_link_libraries(grpc_test_util_unsecure "-framework CoreFoundation") +endif() + + +endif() + +add_library(grpc_unsecure + src/core/ext/filters/census/grpc_context.cc + src/core/ext/filters/client_channel/backend_metric.cc + src/core/ext/filters/client_channel/backup_poller.cc + src/core/ext/filters/client_channel/channel_connectivity.cc + src/core/ext/filters/client_channel/client_channel.cc + src/core/ext/filters/client_channel/client_channel_channelz.cc + src/core/ext/filters/client_channel/client_channel_factory.cc + src/core/ext/filters/client_channel/client_channel_plugin.cc + src/core/ext/filters/client_channel/global_subchannel_pool.cc + src/core/ext/filters/client_channel/health/health_check_client.cc + src/core/ext/filters/client_channel/http_connect_handshaker.cc + src/core/ext/filters/client_channel/http_proxy.cc + src/core/ext/filters/client_channel/lb_policy.cc + src/core/ext/filters/client_channel/lb_policy/address_filtering.cc + src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc + src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc + src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc + src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc + src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.cc + src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc + src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc + src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc + src/core/ext/filters/client_channel/lb_policy/priority/priority.cc + src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc + src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc + src/core/ext/filters/client_channel/lb_policy/xds/cds.cc + src/core/ext/filters/client_channel/lb_policy/xds/eds.cc + src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc + src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc + src/core/ext/filters/client_channel/lb_policy_registry.cc + src/core/ext/filters/client_channel/local_subchannel_pool.cc + src/core/ext/filters/client_channel/parse_address.cc + src/core/ext/filters/client_channel/proxy_mapper_registry.cc + src/core/ext/filters/client_channel/resolver.cc + src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc + src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc + src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc + src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc + src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc + src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc + src/core/ext/filters/client_channel/resolver_registry.cc + src/core/ext/filters/client_channel/resolver_result_parsing.cc + src/core/ext/filters/client_channel/resolving_lb_policy.cc + src/core/ext/filters/client_channel/retry_throttle.cc + src/core/ext/filters/client_channel/server_address.cc + src/core/ext/filters/client_channel/service_config.cc + src/core/ext/filters/client_channel/service_config_parser.cc + src/core/ext/filters/client_channel/subchannel.cc + src/core/ext/filters/client_channel/subchannel_pool_interface.cc + src/core/ext/filters/client_channel/xds/xds_api.cc + src/core/ext/filters/client_channel/xds/xds_bootstrap.cc + src/core/ext/filters/client_channel/xds/xds_channel.cc + src/core/ext/filters/client_channel/xds/xds_client.cc + src/core/ext/filters/client_channel/xds/xds_client_stats.cc + src/core/ext/filters/client_idle/client_idle_filter.cc + src/core/ext/filters/deadline/deadline_filter.cc + src/core/ext/filters/http/client/http_client_filter.cc + src/core/ext/filters/http/client_authority_filter.cc + src/core/ext/filters/http/http_filters_plugin.cc + src/core/ext/filters/http/message_compress/message_compress_filter.cc + src/core/ext/filters/http/message_compress/message_decompress_filter.cc + src/core/ext/filters/http/server/http_server_filter.cc + src/core/ext/filters/max_age/max_age_filter.cc + src/core/ext/filters/message_size/message_size_filter.cc + src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc + src/core/ext/filters/workarounds/workaround_utils.cc + src/core/ext/transport/chttp2/alpn/alpn.cc + src/core/ext/transport/chttp2/client/authority.cc + src/core/ext/transport/chttp2/client/chttp2_connector.cc + src/core/ext/transport/chttp2/client/insecure/channel_create.cc + src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc + src/core/ext/transport/chttp2/server/chttp2_server.cc + src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc + src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc + src/core/ext/transport/chttp2/transport/bin_decoder.cc + src/core/ext/transport/chttp2/transport/bin_encoder.cc + src/core/ext/transport/chttp2/transport/chttp2_plugin.cc + src/core/ext/transport/chttp2/transport/chttp2_transport.cc + src/core/ext/transport/chttp2/transport/context_list.cc + src/core/ext/transport/chttp2/transport/flow_control.cc + src/core/ext/transport/chttp2/transport/frame_data.cc + src/core/ext/transport/chttp2/transport/frame_goaway.cc + src/core/ext/transport/chttp2/transport/frame_ping.cc + src/core/ext/transport/chttp2/transport/frame_rst_stream.cc + src/core/ext/transport/chttp2/transport/frame_settings.cc + src/core/ext/transport/chttp2/transport/frame_window_update.cc + src/core/ext/transport/chttp2/transport/hpack_encoder.cc + src/core/ext/transport/chttp2/transport/hpack_parser.cc + src/core/ext/transport/chttp2/transport/hpack_table.cc + src/core/ext/transport/chttp2/transport/http2_settings.cc + src/core/ext/transport/chttp2/transport/huffsyms.cc + src/core/ext/transport/chttp2/transport/incoming_metadata.cc + src/core/ext/transport/chttp2/transport/parsing.cc + src/core/ext/transport/chttp2/transport/stream_lists.cc + src/core/ext/transport/chttp2/transport/stream_map.cc + src/core/ext/transport/chttp2/transport/varint.cc + src/core/ext/transport/chttp2/transport/writing.cc + src/core/ext/transport/inproc/inproc_plugin.cc + src/core/ext/transport/inproc/inproc_transport.cc + src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c + src/core/ext/upb-generated/envoy/annotations/resource.upb.c + src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c + src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c + src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c + src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c + src/core/ext/upb-generated/envoy/api/v2/cds.upb.c + src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c + src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c + src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c + src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c + src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c + src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c + src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c + src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c + src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c + src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c + src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c + src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c + src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c + src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c + src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c + src/core/ext/upb-generated/envoy/api/v2/eds.upb.c + src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c + src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c + src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c + src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c + src/core/ext/upb-generated/envoy/api/v2/lds.upb.c + src/core/ext/upb-generated/envoy/api/v2/listener.upb.c + src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c + src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c + src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c + src/core/ext/upb-generated/envoy/api/v2/rds.upb.c + src/core/ext/upb-generated/envoy/api/v2/route.upb.c + src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c + src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c + src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c + src/core/ext/upb-generated/envoy/api/v2/srds.upb.c + src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c + src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c + src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c + src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c + src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c + src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c + src/core/ext/upb-generated/envoy/type/http.upb.c + src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c + src/core/ext/upb-generated/envoy/type/matcher/string.upb.c + src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c + src/core/ext/upb-generated/envoy/type/percent.upb.c + src/core/ext/upb-generated/envoy/type/range.upb.c + src/core/ext/upb-generated/envoy/type/semantic_version.upb.c + src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c + src/core/ext/upb-generated/gogoproto/gogo.upb.c + src/core/ext/upb-generated/google/api/annotations.upb.c + src/core/ext/upb-generated/google/api/http.upb.c + src/core/ext/upb-generated/google/protobuf/any.upb.c + src/core/ext/upb-generated/google/protobuf/descriptor.upb.c + src/core/ext/upb-generated/google/protobuf/duration.upb.c + src/core/ext/upb-generated/google/protobuf/empty.upb.c + src/core/ext/upb-generated/google/protobuf/struct.upb.c + src/core/ext/upb-generated/google/protobuf/timestamp.upb.c + src/core/ext/upb-generated/google/protobuf/wrappers.upb.c + src/core/ext/upb-generated/google/rpc/status.upb.c + src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c + src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c + src/core/ext/upb-generated/udpa/annotations/migrate.upb.c + src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c + src/core/ext/upb-generated/udpa/annotations/status.upb.c + src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c + src/core/ext/upb-generated/validate/validate.upb.c + src/core/lib/avl/avl.cc + src/core/lib/backoff/backoff.cc + src/core/lib/channel/channel_args.cc + src/core/lib/channel/channel_stack.cc + src/core/lib/channel/channel_stack_builder.cc + src/core/lib/channel/channel_trace.cc + src/core/lib/channel/channelz.cc + src/core/lib/channel/channelz_registry.cc + src/core/lib/channel/connected_channel.cc + src/core/lib/channel/handshaker.cc + src/core/lib/channel/handshaker_registry.cc + src/core/lib/channel/status_util.cc + src/core/lib/compression/compression.cc + src/core/lib/compression/compression_args.cc + src/core/lib/compression/compression_internal.cc + src/core/lib/compression/message_compress.cc + src/core/lib/compression/stream_compression.cc + src/core/lib/compression/stream_compression_gzip.cc + src/core/lib/compression/stream_compression_identity.cc + src/core/lib/debug/stats.cc + src/core/lib/debug/stats_data.cc + src/core/lib/debug/trace.cc + src/core/lib/http/format_request.cc + src/core/lib/http/httpcli.cc + src/core/lib/http/parser.cc + src/core/lib/iomgr/buffer_list.cc + src/core/lib/iomgr/call_combiner.cc + src/core/lib/iomgr/cfstream_handle.cc + src/core/lib/iomgr/combiner.cc + src/core/lib/iomgr/dualstack_socket_posix.cc + src/core/lib/iomgr/endpoint.cc + src/core/lib/iomgr/endpoint_cfstream.cc + src/core/lib/iomgr/endpoint_pair_posix.cc + src/core/lib/iomgr/endpoint_pair_uv.cc + src/core/lib/iomgr/endpoint_pair_windows.cc + src/core/lib/iomgr/error.cc + src/core/lib/iomgr/error_cfstream.cc + src/core/lib/iomgr/ev_apple.cc + src/core/lib/iomgr/ev_epoll1_linux.cc + src/core/lib/iomgr/ev_epollex_linux.cc + src/core/lib/iomgr/ev_poll_posix.cc + src/core/lib/iomgr/ev_posix.cc + src/core/lib/iomgr/ev_windows.cc + src/core/lib/iomgr/exec_ctx.cc + src/core/lib/iomgr/executor.cc + src/core/lib/iomgr/executor/mpmcqueue.cc + src/core/lib/iomgr/executor/threadpool.cc + src/core/lib/iomgr/fork_posix.cc + src/core/lib/iomgr/fork_windows.cc + src/core/lib/iomgr/gethostname_fallback.cc + src/core/lib/iomgr/gethostname_host_name_max.cc + src/core/lib/iomgr/gethostname_sysconf.cc + src/core/lib/iomgr/grpc_if_nametoindex_posix.cc + src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc + src/core/lib/iomgr/internal_errqueue.cc + src/core/lib/iomgr/iocp_windows.cc + src/core/lib/iomgr/iomgr.cc + src/core/lib/iomgr/iomgr_custom.cc + src/core/lib/iomgr/iomgr_internal.cc + src/core/lib/iomgr/iomgr_posix.cc + src/core/lib/iomgr/iomgr_posix_cfstream.cc + src/core/lib/iomgr/iomgr_uv.cc + src/core/lib/iomgr/iomgr_windows.cc + src/core/lib/iomgr/is_epollexclusive_available.cc + src/core/lib/iomgr/load_file.cc + src/core/lib/iomgr/lockfree_event.cc + src/core/lib/iomgr/poller/eventmanager_libuv.cc + src/core/lib/iomgr/polling_entity.cc + src/core/lib/iomgr/pollset.cc + src/core/lib/iomgr/pollset_custom.cc + src/core/lib/iomgr/pollset_set.cc + src/core/lib/iomgr/pollset_set_custom.cc + src/core/lib/iomgr/pollset_set_windows.cc + src/core/lib/iomgr/pollset_uv.cc + src/core/lib/iomgr/pollset_windows.cc + src/core/lib/iomgr/resolve_address.cc + src/core/lib/iomgr/resolve_address_custom.cc + src/core/lib/iomgr/resolve_address_posix.cc + src/core/lib/iomgr/resolve_address_windows.cc + src/core/lib/iomgr/resource_quota.cc + src/core/lib/iomgr/sockaddr_utils.cc + src/core/lib/iomgr/socket_factory_posix.cc + src/core/lib/iomgr/socket_mutator.cc + src/core/lib/iomgr/socket_utils_common_posix.cc + src/core/lib/iomgr/socket_utils_linux.cc + src/core/lib/iomgr/socket_utils_posix.cc + src/core/lib/iomgr/socket_utils_uv.cc + src/core/lib/iomgr/socket_utils_windows.cc + src/core/lib/iomgr/socket_windows.cc + src/core/lib/iomgr/tcp_client.cc + src/core/lib/iomgr/tcp_client_cfstream.cc + src/core/lib/iomgr/tcp_client_custom.cc + src/core/lib/iomgr/tcp_client_posix.cc + src/core/lib/iomgr/tcp_client_windows.cc + src/core/lib/iomgr/tcp_custom.cc + src/core/lib/iomgr/tcp_posix.cc + src/core/lib/iomgr/tcp_server.cc + src/core/lib/iomgr/tcp_server_custom.cc + src/core/lib/iomgr/tcp_server_posix.cc + src/core/lib/iomgr/tcp_server_utils_posix_common.cc + src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc + src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc + src/core/lib/iomgr/tcp_server_windows.cc + src/core/lib/iomgr/tcp_uv.cc + src/core/lib/iomgr/tcp_windows.cc + src/core/lib/iomgr/time_averaged_stats.cc + src/core/lib/iomgr/timer.cc + src/core/lib/iomgr/timer_custom.cc + src/core/lib/iomgr/timer_generic.cc + src/core/lib/iomgr/timer_heap.cc + src/core/lib/iomgr/timer_manager.cc + src/core/lib/iomgr/timer_uv.cc + src/core/lib/iomgr/udp_server.cc + src/core/lib/iomgr/unix_sockets_posix.cc + src/core/lib/iomgr/unix_sockets_posix_noop.cc + src/core/lib/iomgr/wakeup_fd_eventfd.cc + src/core/lib/iomgr/wakeup_fd_nospecial.cc + src/core/lib/iomgr/wakeup_fd_pipe.cc + src/core/lib/iomgr/wakeup_fd_posix.cc + src/core/lib/iomgr/work_serializer.cc + src/core/lib/json/json_reader.cc + src/core/lib/json/json_writer.cc + src/core/lib/slice/b64.cc + src/core/lib/slice/percent_encoding.cc + src/core/lib/slice/slice.cc + src/core/lib/slice/slice_buffer.cc + src/core/lib/slice/slice_intern.cc + src/core/lib/slice/slice_string_helpers.cc + src/core/lib/surface/api_trace.cc + src/core/lib/surface/byte_buffer.cc + src/core/lib/surface/byte_buffer_reader.cc + src/core/lib/surface/call.cc + src/core/lib/surface/call_details.cc + src/core/lib/surface/call_log_batch.cc + src/core/lib/surface/channel.cc + src/core/lib/surface/channel_init.cc + src/core/lib/surface/channel_ping.cc + src/core/lib/surface/channel_stack_type.cc + src/core/lib/surface/completion_queue.cc + src/core/lib/surface/completion_queue_factory.cc + src/core/lib/surface/event_string.cc + src/core/lib/surface/init.cc + src/core/lib/surface/init_unsecure.cc + src/core/lib/surface/lame_client.cc + src/core/lib/surface/metadata_array.cc + src/core/lib/surface/server.cc + src/core/lib/surface/validate_metadata.cc + src/core/lib/surface/version.cc + src/core/lib/transport/bdp_estimator.cc + src/core/lib/transport/byte_stream.cc + src/core/lib/transport/connectivity_state.cc + src/core/lib/transport/error_utils.cc + src/core/lib/transport/metadata.cc + src/core/lib/transport/metadata_batch.cc + src/core/lib/transport/pid_controller.cc + src/core/lib/transport/static_metadata.cc + src/core/lib/transport/status_conversion.cc + src/core/lib/transport/status_metadata.cc + src/core/lib/transport/timeout_encoding.cc + src/core/lib/transport/transport.cc + src/core/lib/transport/transport_op_string.cc + src/core/lib/uri/uri_parser.cc + src/core/plugin_registry/grpc_unsecure_plugin_registry.cc +) + +set_target_properties(grpc_unsecure PROPERTIES + VERSION ${gRPC_CORE_VERSION} + SOVERSION ${gRPC_CORE_SOVERSION} +) + +if(WIN32 AND MSVC) + set_target_properties(grpc_unsecure PROPERTIES COMPILE_PDB_NAME "grpc_unsecure" + COMPILE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" + ) + if(gRPC_INSTALL) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/grpc_unsecure.pdb + DESTINATION ${gRPC_INSTALL_LIBDIR} OPTIONAL + ) + endif() +endif() + +target_include_directories(grpc_unsecure + PUBLIC $ $ + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) +target_link_libraries(grpc_unsecure + ${_gRPC_BASELIB_LIBRARIES} + ${_gRPC_ZLIB_LIBRARIES} + ${_gRPC_CARES_LIBRARIES} + ${_gRPC_ADDRESS_SORTING_LIBRARIES} + ${_gRPC_UPB_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + gpr + address_sorting + upb + absl::optional + absl::strings + absl::inlined_vector +) +if(_gRPC_PLATFORM_IOS OR _gRPC_PLATFORM_MAC) + target_link_libraries(grpc_unsecure "-framework CoreFoundation") +endif() + +foreach(_hdr + include/grpc/byte_buffer.h + include/grpc/byte_buffer_reader.h + include/grpc/census.h + include/grpc/compression.h + include/grpc/fork.h + include/grpc/grpc.h + include/grpc/grpc_posix.h + include/grpc/grpc_security_constants.h + include/grpc/load_reporting.h + include/grpc/slice.h + include/grpc/slice_buffer.h + include/grpc/status.h + include/grpc/support/workaround_list.h +) + string(REPLACE "include/" "" _path ${_hdr}) + get_filename_component(_path ${_path} PATH) + install(FILES ${_hdr} + DESTINATION "${gRPC_INSTALL_INCLUDEDIR}/${_path}" + ) +endforeach() + + +if(gRPC_INSTALL) + install(TARGETS grpc_unsecure EXPORT gRPCTargets + RUNTIME DESTINATION ${gRPC_INSTALL_BINDIR} + LIBRARY DESTINATION ${gRPC_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${gRPC_INSTALL_LIBDIR} + ) +endif() + +if(gRPC_BUILD_TESTS) + +if(gRPC_BUILD_CODEGEN) +add_library(benchmark_helpers + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_mock.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.h + test/cpp/microbenchmarks/helpers.cc +) + +set_target_properties(benchmark_helpers PROPERTIES + VERSION ${gRPC_CPP_VERSION} + SOVERSION ${gRPC_CPP_SOVERSION} +) + +if(WIN32 AND MSVC) + set_target_properties(benchmark_helpers PROPERTIES COMPILE_PDB_NAME "benchmark_helpers" + COMPILE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" + ) + if(gRPC_INSTALL) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/benchmark_helpers.pdb + DESTINATION ${gRPC_INSTALL_LIBDIR} OPTIONAL + ) + endif() +endif() + +target_include_directories(benchmark_helpers + PUBLIC $ $ + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) +target_link_libraries(benchmark_helpers + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util_unsecure + grpc++_unsecure + grpc_unsecure + grpc++_test_config + gpr + address_sorting + upb + ${_gRPC_BENCHMARK_LIBRARIES} + ${_gRPC_GFLAGS_LIBRARIES} +) + +endif() + +endif() + +add_library(grpc++ + src/cpp/client/channel_cc.cc + src/cpp/client/client_context.cc + src/cpp/client/client_interceptor.cc + src/cpp/client/create_channel.cc + src/cpp/client/create_channel_internal.cc + src/cpp/client/create_channel_posix.cc + src/cpp/client/credentials_cc.cc + src/cpp/client/insecure_credentials.cc + src/cpp/client/secure_credentials.cc + src/cpp/codegen/codegen_init.cc + src/cpp/common/alarm.cc + src/cpp/common/auth_property_iterator.cc + src/cpp/common/channel_arguments.cc + src/cpp/common/channel_filter.cc + src/cpp/common/completion_queue_cc.cc + src/cpp/common/core_codegen.cc + src/cpp/common/resource_quota_cc.cc + src/cpp/common/rpc_method.cc + src/cpp/common/secure_auth_context.cc + src/cpp/common/secure_channel_arguments.cc + src/cpp/common/secure_create_auth_context.cc + src/cpp/common/tls_credentials_options.cc + src/cpp/common/tls_credentials_options_util.cc + src/cpp/common/validate_service_config.cc + src/cpp/common/version_cc.cc + src/cpp/server/async_generic_service.cc + src/cpp/server/channel_argument_option.cc + src/cpp/server/create_default_thread_pool.cc + src/cpp/server/dynamic_thread_pool.cc + src/cpp/server/external_connection_acceptor_impl.cc + src/cpp/server/health/default_health_check_service.cc + src/cpp/server/health/health_check_service.cc + src/cpp/server/health/health_check_service_server_builder_option.cc + src/cpp/server/insecure_server_credentials.cc + src/cpp/server/secure_server_credentials.cc + src/cpp/server/server_builder.cc + src/cpp/server/server_callback.cc + src/cpp/server/server_cc.cc + src/cpp/server/server_context.cc + src/cpp/server/server_credentials.cc + src/cpp/server/server_posix.cc + src/cpp/thread_manager/thread_manager.cc + src/cpp/util/byte_buffer_cc.cc + src/cpp/util/status.cc + src/cpp/util/string_ref.cc + src/cpp/util/time_cc.cc +) + +set_target_properties(grpc++ PROPERTIES + VERSION ${gRPC_CPP_VERSION} + SOVERSION ${gRPC_CPP_SOVERSION} +) + +if(WIN32 AND MSVC) + set_target_properties(grpc++ PROPERTIES COMPILE_PDB_NAME "grpc++" + COMPILE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" + ) + if(gRPC_INSTALL) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/grpc++.pdb + DESTINATION ${gRPC_INSTALL_LIBDIR} OPTIONAL + ) + endif() +endif() + +target_include_directories(grpc++ + PUBLIC $ $ + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ${_gRPC_PROTO_GENS_DIR} +) +target_link_libraries(grpc++ + ${_gRPC_BASELIB_LIBRARIES} + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc + gpr + address_sorting + upb +) + +foreach(_hdr + include/grpc++/alarm.h + include/grpc++/channel.h + include/grpc++/client_context.h + include/grpc++/completion_queue.h + include/grpc++/create_channel.h + include/grpc++/create_channel_posix.h + include/grpc++/ext/health_check_service_server_builder_option.h + include/grpc++/generic/async_generic_service.h + include/grpc++/generic/generic_stub.h + include/grpc++/grpc++.h + include/grpc++/health_check_service_interface.h + include/grpc++/impl/call.h + include/grpc++/impl/channel_argument_option.h + include/grpc++/impl/client_unary_call.h + include/grpc++/impl/codegen/async_stream.h + include/grpc++/impl/codegen/async_unary_call.h + include/grpc++/impl/codegen/byte_buffer.h + include/grpc++/impl/codegen/call.h + include/grpc++/impl/codegen/call_hook.h + include/grpc++/impl/codegen/channel_interface.h + include/grpc++/impl/codegen/client_context.h + include/grpc++/impl/codegen/client_unary_call.h + include/grpc++/impl/codegen/completion_queue.h + include/grpc++/impl/codegen/completion_queue_tag.h + include/grpc++/impl/codegen/config.h + include/grpc++/impl/codegen/config_protobuf.h + include/grpc++/impl/codegen/core_codegen.h + include/grpc++/impl/codegen/core_codegen_interface.h + include/grpc++/impl/codegen/create_auth_context.h + include/grpc++/impl/codegen/grpc_library.h + include/grpc++/impl/codegen/metadata_map.h + include/grpc++/impl/codegen/method_handler_impl.h + include/grpc++/impl/codegen/proto_utils.h + include/grpc++/impl/codegen/rpc_method.h + include/grpc++/impl/codegen/rpc_service_method.h + include/grpc++/impl/codegen/security/auth_context.h + include/grpc++/impl/codegen/serialization_traits.h + include/grpc++/impl/codegen/server_context.h + include/grpc++/impl/codegen/server_interface.h + include/grpc++/impl/codegen/service_type.h + include/grpc++/impl/codegen/slice.h + include/grpc++/impl/codegen/status.h + include/grpc++/impl/codegen/status_code_enum.h + include/grpc++/impl/codegen/string_ref.h + include/grpc++/impl/codegen/stub_options.h + include/grpc++/impl/codegen/sync_stream.h + include/grpc++/impl/codegen/time.h + include/grpc++/impl/grpc_library.h + include/grpc++/impl/method_handler_impl.h + include/grpc++/impl/rpc_method.h + include/grpc++/impl/rpc_service_method.h + include/grpc++/impl/serialization_traits.h + include/grpc++/impl/server_builder_option.h + include/grpc++/impl/server_builder_plugin.h + include/grpc++/impl/server_initializer.h + include/grpc++/impl/service_type.h + include/grpc++/resource_quota.h + include/grpc++/security/auth_context.h + include/grpc++/security/auth_metadata_processor.h + include/grpc++/security/credentials.h + include/grpc++/security/server_credentials.h + include/grpc++/server.h + include/grpc++/server_builder.h + include/grpc++/server_context.h + include/grpc++/server_posix.h + include/grpc++/support/async_stream.h + include/grpc++/support/async_unary_call.h + include/grpc++/support/byte_buffer.h + include/grpc++/support/channel_arguments.h + include/grpc++/support/config.h + include/grpc++/support/slice.h + include/grpc++/support/status.h + include/grpc++/support/status_code_enum.h + include/grpc++/support/string_ref.h + include/grpc++/support/stub_options.h + include/grpc++/support/sync_stream.h + include/grpc++/support/time.h + include/grpcpp/alarm.h + include/grpcpp/alarm_impl.h + include/grpcpp/channel.h + include/grpcpp/channel_impl.h + include/grpcpp/client_context.h + include/grpcpp/completion_queue.h + include/grpcpp/completion_queue_impl.h + include/grpcpp/create_channel.h + include/grpcpp/create_channel_impl.h + include/grpcpp/create_channel_posix.h + include/grpcpp/create_channel_posix_impl.h + include/grpcpp/ext/health_check_service_server_builder_option.h + include/grpcpp/generic/async_generic_service.h + include/grpcpp/generic/generic_stub.h + include/grpcpp/generic/generic_stub_impl.h + include/grpcpp/grpcpp.h + include/grpcpp/health_check_service_interface.h + include/grpcpp/health_check_service_interface_impl.h + include/grpcpp/impl/call.h + include/grpcpp/impl/channel_argument_option.h + include/grpcpp/impl/client_unary_call.h + include/grpcpp/impl/codegen/async_generic_service.h + include/grpcpp/impl/codegen/async_stream.h + include/grpcpp/impl/codegen/async_stream_impl.h + include/grpcpp/impl/codegen/async_unary_call.h + include/grpcpp/impl/codegen/async_unary_call_impl.h + include/grpcpp/impl/codegen/byte_buffer.h + include/grpcpp/impl/codegen/call.h + include/grpcpp/impl/codegen/call_hook.h + include/grpcpp/impl/codegen/call_op_set.h + include/grpcpp/impl/codegen/call_op_set_interface.h + include/grpcpp/impl/codegen/callback_common.h + include/grpcpp/impl/codegen/channel_interface.h + include/grpcpp/impl/codegen/client_callback.h + include/grpcpp/impl/codegen/client_callback_impl.h + include/grpcpp/impl/codegen/client_context.h + include/grpcpp/impl/codegen/client_context_impl.h + include/grpcpp/impl/codegen/client_interceptor.h + include/grpcpp/impl/codegen/client_unary_call.h + include/grpcpp/impl/codegen/completion_queue.h + include/grpcpp/impl/codegen/completion_queue_impl.h + include/grpcpp/impl/codegen/completion_queue_tag.h + include/grpcpp/impl/codegen/config.h + include/grpcpp/impl/codegen/config_protobuf.h + include/grpcpp/impl/codegen/core_codegen.h + include/grpcpp/impl/codegen/core_codegen_interface.h + include/grpcpp/impl/codegen/create_auth_context.h + include/grpcpp/impl/codegen/delegating_channel.h + include/grpcpp/impl/codegen/grpc_library.h + include/grpcpp/impl/codegen/intercepted_channel.h + include/grpcpp/impl/codegen/interceptor.h + include/grpcpp/impl/codegen/interceptor_common.h + include/grpcpp/impl/codegen/message_allocator.h + include/grpcpp/impl/codegen/metadata_map.h + include/grpcpp/impl/codegen/method_handler.h + include/grpcpp/impl/codegen/method_handler_impl.h + include/grpcpp/impl/codegen/proto_buffer_reader.h + include/grpcpp/impl/codegen/proto_buffer_writer.h + include/grpcpp/impl/codegen/proto_utils.h + include/grpcpp/impl/codegen/rpc_method.h + include/grpcpp/impl/codegen/rpc_service_method.h + include/grpcpp/impl/codegen/security/auth_context.h + include/grpcpp/impl/codegen/serialization_traits.h + include/grpcpp/impl/codegen/server_callback.h + include/grpcpp/impl/codegen/server_callback_handlers.h + include/grpcpp/impl/codegen/server_callback_impl.h + include/grpcpp/impl/codegen/server_context.h + include/grpcpp/impl/codegen/server_context_impl.h + include/grpcpp/impl/codegen/server_interceptor.h + include/grpcpp/impl/codegen/server_interface.h + include/grpcpp/impl/codegen/service_type.h + include/grpcpp/impl/codegen/slice.h + include/grpcpp/impl/codegen/status.h + include/grpcpp/impl/codegen/status_code_enum.h + include/grpcpp/impl/codegen/string_ref.h + include/grpcpp/impl/codegen/stub_options.h + include/grpcpp/impl/codegen/sync.h + include/grpcpp/impl/codegen/sync_stream.h + include/grpcpp/impl/codegen/sync_stream_impl.h + include/grpcpp/impl/codegen/time.h + include/grpcpp/impl/grpc_library.h + include/grpcpp/impl/method_handler_impl.h + include/grpcpp/impl/rpc_method.h + include/grpcpp/impl/rpc_service_method.h + include/grpcpp/impl/serialization_traits.h + include/grpcpp/impl/server_builder_option.h + include/grpcpp/impl/server_builder_option_impl.h + include/grpcpp/impl/server_builder_plugin.h + include/grpcpp/impl/server_initializer.h + include/grpcpp/impl/server_initializer_impl.h + include/grpcpp/impl/service_type.h + include/grpcpp/resource_quota.h + include/grpcpp/resource_quota_impl.h + include/grpcpp/security/auth_context.h + include/grpcpp/security/auth_metadata_processor.h + include/grpcpp/security/auth_metadata_processor_impl.h + include/grpcpp/security/credentials.h + include/grpcpp/security/credentials_impl.h + include/grpcpp/security/server_credentials.h + include/grpcpp/security/server_credentials_impl.h + include/grpcpp/security/tls_credentials_options.h + include/grpcpp/server.h + include/grpcpp/server_builder.h + include/grpcpp/server_builder_impl.h + include/grpcpp/server_context.h + include/grpcpp/server_impl.h + include/grpcpp/server_posix.h + include/grpcpp/server_posix_impl.h + include/grpcpp/support/async_stream.h + include/grpcpp/support/async_stream_impl.h + include/grpcpp/support/async_unary_call.h + include/grpcpp/support/async_unary_call_impl.h + include/grpcpp/support/byte_buffer.h + include/grpcpp/support/channel_arguments.h + include/grpcpp/support/channel_arguments_impl.h + include/grpcpp/support/client_callback.h + include/grpcpp/support/client_callback_impl.h + include/grpcpp/support/client_interceptor.h + include/grpcpp/support/config.h + include/grpcpp/support/interceptor.h + include/grpcpp/support/message_allocator.h + include/grpcpp/support/method_handler.h + include/grpcpp/support/proto_buffer_reader.h + include/grpcpp/support/proto_buffer_writer.h + include/grpcpp/support/server_callback.h + include/grpcpp/support/server_callback_impl.h + include/grpcpp/support/server_interceptor.h + include/grpcpp/support/slice.h + include/grpcpp/support/status.h + include/grpcpp/support/status_code_enum.h + include/grpcpp/support/string_ref.h + include/grpcpp/support/stub_options.h + include/grpcpp/support/sync_stream.h + include/grpcpp/support/sync_stream_impl.h + include/grpcpp/support/time.h + include/grpcpp/support/validate_service_config.h +) + string(REPLACE "include/" "" _path ${_hdr}) + get_filename_component(_path ${_path} PATH) + install(FILES ${_hdr} + DESTINATION "${gRPC_INSTALL_INCLUDEDIR}/${_path}" + ) +endforeach() + + +if(gRPC_INSTALL) + install(TARGETS grpc++ EXPORT gRPCTargets + RUNTIME DESTINATION ${gRPC_INSTALL_BINDIR} + LIBRARY DESTINATION ${gRPC_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${gRPC_INSTALL_LIBDIR} + ) +endif() + + +add_library(grpc++_alts + src/cpp/common/alts_context.cc + src/cpp/common/alts_util.cc +) + +set_target_properties(grpc++_alts PROPERTIES + VERSION ${gRPC_CPP_VERSION} + SOVERSION ${gRPC_CPP_SOVERSION} +) + +if(WIN32 AND MSVC) + set_target_properties(grpc++_alts PROPERTIES COMPILE_PDB_NAME "grpc++_alts" + COMPILE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" + ) + if(gRPC_INSTALL) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/grpc++_alts.pdb + DESTINATION ${gRPC_INSTALL_LIBDIR} OPTIONAL + ) + endif() +endif() + +target_include_directories(grpc++_alts + PUBLIC $ $ + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ${_gRPC_PROTO_GENS_DIR} +) +target_link_libraries(grpc++_alts + ${_gRPC_BASELIB_LIBRARIES} + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++ + grpc + gpr + address_sorting + upb +) + +foreach(_hdr + include/grpcpp/security/alts_context.h + include/grpcpp/security/alts_util.h +) + string(REPLACE "include/" "" _path ${_hdr}) + get_filename_component(_path ${_path} PATH) + install(FILES ${_hdr} + DESTINATION "${gRPC_INSTALL_INCLUDEDIR}/${_path}" + ) +endforeach() + + +if(gRPC_INSTALL) + install(TARGETS grpc++_alts EXPORT gRPCTargets + RUNTIME DESTINATION ${gRPC_INSTALL_BINDIR} + LIBRARY DESTINATION ${gRPC_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${gRPC_INSTALL_LIBDIR} + ) +endif() + + +if(gRPC_BUILD_CODEGEN) +add_library(grpc++_error_details + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/status/status.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/status/status.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/status/status.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/status/status.grpc.pb.h + src/cpp/util/error_details.cc +) + +set_target_properties(grpc++_error_details PROPERTIES + VERSION ${gRPC_CPP_VERSION} + SOVERSION ${gRPC_CPP_SOVERSION} +) + +if(WIN32 AND MSVC) + set_target_properties(grpc++_error_details PROPERTIES COMPILE_PDB_NAME "grpc++_error_details" + COMPILE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" + ) + if(gRPC_INSTALL) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/grpc++_error_details.pdb + DESTINATION ${gRPC_INSTALL_LIBDIR} OPTIONAL + ) + endif() +endif() + +target_include_directories(grpc++_error_details + PUBLIC $ $ + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ${_gRPC_PROTO_GENS_DIR} +) +target_link_libraries(grpc++_error_details + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++ + grpc + gpr + address_sorting + upb +) + +foreach(_hdr + include/grpc++/support/error_details.h + include/grpcpp/support/error_details.h + include/grpcpp/support/error_details_impl.h +) + string(REPLACE "include/" "" _path ${_hdr}) + get_filename_component(_path ${_path} PATH) + install(FILES ${_hdr} + DESTINATION "${gRPC_INSTALL_INCLUDEDIR}/${_path}" + ) +endforeach() +endif() + +if(gRPC_BUILD_CODEGEN) + +if(gRPC_INSTALL) + install(TARGETS grpc++_error_details EXPORT gRPCTargets + RUNTIME DESTINATION ${gRPC_INSTALL_BINDIR} + LIBRARY DESTINATION ${gRPC_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${gRPC_INSTALL_LIBDIR} + ) +endif() + +endif() + +if(gRPC_BUILD_CODEGEN) +add_library(grpc++_reflection + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/reflection/v1alpha/reflection.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/reflection/v1alpha/reflection.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.h + src/cpp/ext/proto_server_reflection.cc + src/cpp/ext/proto_server_reflection_plugin.cc +) + +set_target_properties(grpc++_reflection PROPERTIES + VERSION ${gRPC_CPP_VERSION} + SOVERSION ${gRPC_CPP_SOVERSION} +) + +if(WIN32 AND MSVC) + set_target_properties(grpc++_reflection PROPERTIES COMPILE_PDB_NAME "grpc++_reflection" + COMPILE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" + ) + if(gRPC_INSTALL) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/grpc++_reflection.pdb + DESTINATION ${gRPC_INSTALL_LIBDIR} OPTIONAL + ) + endif() +endif() + +target_include_directories(grpc++_reflection + PUBLIC $ $ + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ${_gRPC_PROTO_GENS_DIR} +) +target_link_libraries(grpc++_reflection + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++ + grpc + gpr + address_sorting + upb +) + +foreach(_hdr + include/grpc++/ext/proto_server_reflection_plugin.h + include/grpcpp/ext/proto_server_reflection_plugin.h + include/grpcpp/ext/proto_server_reflection_plugin_impl.h +) + string(REPLACE "include/" "" _path ${_hdr}) + get_filename_component(_path ${_path} PATH) + install(FILES ${_hdr} + DESTINATION "${gRPC_INSTALL_INCLUDEDIR}/${_path}" + ) +endforeach() +endif() + +if(gRPC_BUILD_CODEGEN) + +if(gRPC_INSTALL) + install(TARGETS grpc++_reflection EXPORT gRPCTargets + RUNTIME DESTINATION ${gRPC_INSTALL_BINDIR} + LIBRARY DESTINATION ${gRPC_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${gRPC_INSTALL_LIBDIR} + ) +endif() + +endif() +if(gRPC_BUILD_TESTS) + +add_library(grpc++_test + src/cpp/client/channel_test_peer.cc +) + +set_target_properties(grpc++_test PROPERTIES + VERSION ${gRPC_CPP_VERSION} + SOVERSION ${gRPC_CPP_SOVERSION} +) + +if(WIN32 AND MSVC) + set_target_properties(grpc++_test PROPERTIES COMPILE_PDB_NAME "grpc++_test" + COMPILE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" + ) + if(gRPC_INSTALL) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/grpc++_test.pdb + DESTINATION ${gRPC_INSTALL_LIBDIR} OPTIONAL + ) + endif() +endif() + +target_include_directories(grpc++_test + PUBLIC $ $ + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) +target_link_libraries(grpc++_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + +foreach(_hdr + include/grpc++/test/mock_stream.h + include/grpc++/test/server_context_test_spouse.h + include/grpcpp/test/channel_test_peer.h + include/grpcpp/test/default_reactor_test_peer.h + include/grpcpp/test/mock_stream.h + include/grpcpp/test/server_context_test_spouse.h +) + string(REPLACE "include/" "" _path ${_hdr}) + get_filename_component(_path ${_path} PATH) + install(FILES ${_hdr} + DESTINATION "${gRPC_INSTALL_INCLUDEDIR}/${_path}" + ) +endforeach() + +endif() +if(gRPC_BUILD_TESTS) + +add_library(grpc++_test_config + test/cpp/util/test_config_cc.cc +) + +set_target_properties(grpc++_test_config PROPERTIES + VERSION ${gRPC_CPP_VERSION} + SOVERSION ${gRPC_CPP_SOVERSION} +) + +if(WIN32 AND MSVC) + set_target_properties(grpc++_test_config PROPERTIES COMPILE_PDB_NAME "grpc++_test_config" + COMPILE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" + ) + if(gRPC_INSTALL) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/grpc++_test_config.pdb + DESTINATION ${gRPC_INSTALL_LIBDIR} OPTIONAL + ) + endif() +endif() + +target_include_directories(grpc++_test_config + PUBLIC $ $ + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) +target_link_libraries(grpc++_test_config + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + gpr + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_library(grpc++_test_util + test/core/end2end/data/client_certs.cc + test/core/end2end/data/server1_cert.cc + test/core/end2end/data/server1_key.cc + test/core/end2end/data/test_root_cert.cc + test/cpp/util/byte_buffer_proto_helper.cc + test/cpp/util/create_test_channel.cc + test/cpp/util/string_ref_helper.cc + test/cpp/util/subprocess.cc + test/cpp/util/test_credentials_provider.cc +) + +set_target_properties(grpc++_test_util PROPERTIES + VERSION ${gRPC_CPP_VERSION} + SOVERSION ${gRPC_CPP_SOVERSION} +) + +if(WIN32 AND MSVC) + set_target_properties(grpc++_test_util PROPERTIES COMPILE_PDB_NAME "grpc++_test_util" + COMPILE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" + ) + if(gRPC_INSTALL) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/grpc++_test_util.pdb + DESTINATION ${gRPC_INSTALL_LIBDIR} OPTIONAL + ) + endif() +endif() + +target_include_directories(grpc++_test_util + PUBLIC $ $ + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) +target_link_libraries(grpc++_test_util + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() + +add_library(grpc++_unsecure + src/cpp/client/channel_cc.cc + src/cpp/client/client_context.cc + src/cpp/client/client_interceptor.cc + src/cpp/client/create_channel.cc + src/cpp/client/create_channel_internal.cc + src/cpp/client/create_channel_posix.cc + src/cpp/client/credentials_cc.cc + src/cpp/client/insecure_credentials.cc + src/cpp/codegen/codegen_init.cc + src/cpp/common/alarm.cc + src/cpp/common/channel_arguments.cc + src/cpp/common/channel_filter.cc + src/cpp/common/completion_queue_cc.cc + src/cpp/common/core_codegen.cc + src/cpp/common/insecure_create_auth_context.cc + src/cpp/common/resource_quota_cc.cc + src/cpp/common/rpc_method.cc + src/cpp/common/validate_service_config.cc + src/cpp/common/version_cc.cc + src/cpp/server/async_generic_service.cc + src/cpp/server/channel_argument_option.cc + src/cpp/server/create_default_thread_pool.cc + src/cpp/server/dynamic_thread_pool.cc + src/cpp/server/external_connection_acceptor_impl.cc + src/cpp/server/health/default_health_check_service.cc + src/cpp/server/health/health_check_service.cc + src/cpp/server/health/health_check_service_server_builder_option.cc + src/cpp/server/insecure_server_credentials.cc + src/cpp/server/server_builder.cc + src/cpp/server/server_callback.cc + src/cpp/server/server_cc.cc + src/cpp/server/server_context.cc + src/cpp/server/server_credentials.cc + src/cpp/server/server_posix.cc + src/cpp/thread_manager/thread_manager.cc + src/cpp/util/byte_buffer_cc.cc + src/cpp/util/status.cc + src/cpp/util/string_ref.cc + src/cpp/util/time_cc.cc +) + +set_target_properties(grpc++_unsecure PROPERTIES + VERSION ${gRPC_CPP_VERSION} + SOVERSION ${gRPC_CPP_SOVERSION} +) + +if(WIN32 AND MSVC) + set_target_properties(grpc++_unsecure PROPERTIES COMPILE_PDB_NAME "grpc++_unsecure" + COMPILE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" + ) + if(gRPC_INSTALL) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/grpc++_unsecure.pdb + DESTINATION ${gRPC_INSTALL_LIBDIR} OPTIONAL + ) + endif() +endif() + +target_include_directories(grpc++_unsecure + PUBLIC $ $ + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ${_gRPC_PROTO_GENS_DIR} +) +target_link_libraries(grpc++_unsecure + ${_gRPC_BASELIB_LIBRARIES} + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_unsecure + gpr + address_sorting + upb +) + +foreach(_hdr + include/grpc++/alarm.h + include/grpc++/channel.h + include/grpc++/client_context.h + include/grpc++/completion_queue.h + include/grpc++/create_channel.h + include/grpc++/create_channel_posix.h + include/grpc++/ext/health_check_service_server_builder_option.h + include/grpc++/generic/async_generic_service.h + include/grpc++/generic/generic_stub.h + include/grpc++/grpc++.h + include/grpc++/health_check_service_interface.h + include/grpc++/impl/call.h + include/grpc++/impl/channel_argument_option.h + include/grpc++/impl/client_unary_call.h + include/grpc++/impl/codegen/async_stream.h + include/grpc++/impl/codegen/async_unary_call.h + include/grpc++/impl/codegen/byte_buffer.h + include/grpc++/impl/codegen/call.h + include/grpc++/impl/codegen/call_hook.h + include/grpc++/impl/codegen/channel_interface.h + include/grpc++/impl/codegen/client_context.h + include/grpc++/impl/codegen/client_unary_call.h + include/grpc++/impl/codegen/completion_queue.h + include/grpc++/impl/codegen/completion_queue_tag.h + include/grpc++/impl/codegen/config.h + include/grpc++/impl/codegen/config_protobuf.h + include/grpc++/impl/codegen/core_codegen.h + include/grpc++/impl/codegen/core_codegen_interface.h + include/grpc++/impl/codegen/create_auth_context.h + include/grpc++/impl/codegen/grpc_library.h + include/grpc++/impl/codegen/metadata_map.h + include/grpc++/impl/codegen/method_handler_impl.h + include/grpc++/impl/codegen/proto_utils.h + include/grpc++/impl/codegen/rpc_method.h + include/grpc++/impl/codegen/rpc_service_method.h + include/grpc++/impl/codegen/security/auth_context.h + include/grpc++/impl/codegen/serialization_traits.h + include/grpc++/impl/codegen/server_context.h + include/grpc++/impl/codegen/server_interface.h + include/grpc++/impl/codegen/service_type.h + include/grpc++/impl/codegen/slice.h + include/grpc++/impl/codegen/status.h + include/grpc++/impl/codegen/status_code_enum.h + include/grpc++/impl/codegen/string_ref.h + include/grpc++/impl/codegen/stub_options.h + include/grpc++/impl/codegen/sync_stream.h + include/grpc++/impl/codegen/time.h + include/grpc++/impl/grpc_library.h + include/grpc++/impl/method_handler_impl.h + include/grpc++/impl/rpc_method.h + include/grpc++/impl/rpc_service_method.h + include/grpc++/impl/serialization_traits.h + include/grpc++/impl/server_builder_option.h + include/grpc++/impl/server_builder_plugin.h + include/grpc++/impl/server_initializer.h + include/grpc++/impl/service_type.h + include/grpc++/resource_quota.h + include/grpc++/security/auth_context.h + include/grpc++/security/auth_metadata_processor.h + include/grpc++/security/credentials.h + include/grpc++/security/server_credentials.h + include/grpc++/server.h + include/grpc++/server_builder.h + include/grpc++/server_context.h + include/grpc++/server_posix.h + include/grpc++/support/async_stream.h + include/grpc++/support/async_unary_call.h + include/grpc++/support/byte_buffer.h + include/grpc++/support/channel_arguments.h + include/grpc++/support/config.h + include/grpc++/support/slice.h + include/grpc++/support/status.h + include/grpc++/support/status_code_enum.h + include/grpc++/support/string_ref.h + include/grpc++/support/stub_options.h + include/grpc++/support/sync_stream.h + include/grpc++/support/time.h + include/grpcpp/alarm.h + include/grpcpp/alarm_impl.h + include/grpcpp/channel.h + include/grpcpp/channel_impl.h + include/grpcpp/client_context.h + include/grpcpp/completion_queue.h + include/grpcpp/completion_queue_impl.h + include/grpcpp/create_channel.h + include/grpcpp/create_channel_impl.h + include/grpcpp/create_channel_posix.h + include/grpcpp/create_channel_posix_impl.h + include/grpcpp/ext/health_check_service_server_builder_option.h + include/grpcpp/generic/async_generic_service.h + include/grpcpp/generic/generic_stub.h + include/grpcpp/generic/generic_stub_impl.h + include/grpcpp/grpcpp.h + include/grpcpp/health_check_service_interface.h + include/grpcpp/health_check_service_interface_impl.h + include/grpcpp/impl/call.h + include/grpcpp/impl/channel_argument_option.h + include/grpcpp/impl/client_unary_call.h + include/grpcpp/impl/codegen/async_generic_service.h + include/grpcpp/impl/codegen/async_stream.h + include/grpcpp/impl/codegen/async_stream_impl.h + include/grpcpp/impl/codegen/async_unary_call.h + include/grpcpp/impl/codegen/async_unary_call_impl.h + include/grpcpp/impl/codegen/byte_buffer.h + include/grpcpp/impl/codegen/call.h + include/grpcpp/impl/codegen/call_hook.h + include/grpcpp/impl/codegen/call_op_set.h + include/grpcpp/impl/codegen/call_op_set_interface.h + include/grpcpp/impl/codegen/callback_common.h + include/grpcpp/impl/codegen/channel_interface.h + include/grpcpp/impl/codegen/client_callback.h + include/grpcpp/impl/codegen/client_callback_impl.h + include/grpcpp/impl/codegen/client_context.h + include/grpcpp/impl/codegen/client_context_impl.h + include/grpcpp/impl/codegen/client_interceptor.h + include/grpcpp/impl/codegen/client_unary_call.h + include/grpcpp/impl/codegen/completion_queue.h + include/grpcpp/impl/codegen/completion_queue_impl.h + include/grpcpp/impl/codegen/completion_queue_tag.h + include/grpcpp/impl/codegen/config.h + include/grpcpp/impl/codegen/config_protobuf.h + include/grpcpp/impl/codegen/core_codegen.h + include/grpcpp/impl/codegen/core_codegen_interface.h + include/grpcpp/impl/codegen/create_auth_context.h + include/grpcpp/impl/codegen/delegating_channel.h + include/grpcpp/impl/codegen/grpc_library.h + include/grpcpp/impl/codegen/intercepted_channel.h + include/grpcpp/impl/codegen/interceptor.h + include/grpcpp/impl/codegen/interceptor_common.h + include/grpcpp/impl/codegen/message_allocator.h + include/grpcpp/impl/codegen/metadata_map.h + include/grpcpp/impl/codegen/method_handler.h + include/grpcpp/impl/codegen/method_handler_impl.h + include/grpcpp/impl/codegen/proto_buffer_reader.h + include/grpcpp/impl/codegen/proto_buffer_writer.h + include/grpcpp/impl/codegen/proto_utils.h + include/grpcpp/impl/codegen/rpc_method.h + include/grpcpp/impl/codegen/rpc_service_method.h + include/grpcpp/impl/codegen/security/auth_context.h + include/grpcpp/impl/codegen/serialization_traits.h + include/grpcpp/impl/codegen/server_callback.h + include/grpcpp/impl/codegen/server_callback_handlers.h + include/grpcpp/impl/codegen/server_callback_impl.h + include/grpcpp/impl/codegen/server_context.h + include/grpcpp/impl/codegen/server_context_impl.h + include/grpcpp/impl/codegen/server_interceptor.h + include/grpcpp/impl/codegen/server_interface.h + include/grpcpp/impl/codegen/service_type.h + include/grpcpp/impl/codegen/slice.h + include/grpcpp/impl/codegen/status.h + include/grpcpp/impl/codegen/status_code_enum.h + include/grpcpp/impl/codegen/string_ref.h + include/grpcpp/impl/codegen/stub_options.h + include/grpcpp/impl/codegen/sync.h + include/grpcpp/impl/codegen/sync_stream.h + include/grpcpp/impl/codegen/sync_stream_impl.h + include/grpcpp/impl/codegen/time.h + include/grpcpp/impl/grpc_library.h + include/grpcpp/impl/method_handler_impl.h + include/grpcpp/impl/rpc_method.h + include/grpcpp/impl/rpc_service_method.h + include/grpcpp/impl/serialization_traits.h + include/grpcpp/impl/server_builder_option.h + include/grpcpp/impl/server_builder_option_impl.h + include/grpcpp/impl/server_builder_plugin.h + include/grpcpp/impl/server_initializer.h + include/grpcpp/impl/server_initializer_impl.h + include/grpcpp/impl/service_type.h + include/grpcpp/resource_quota.h + include/grpcpp/resource_quota_impl.h + include/grpcpp/security/auth_context.h + include/grpcpp/security/auth_metadata_processor.h + include/grpcpp/security/auth_metadata_processor_impl.h + include/grpcpp/security/credentials.h + include/grpcpp/security/credentials_impl.h + include/grpcpp/security/server_credentials.h + include/grpcpp/security/server_credentials_impl.h + include/grpcpp/security/tls_credentials_options.h + include/grpcpp/server.h + include/grpcpp/server_builder.h + include/grpcpp/server_builder_impl.h + include/grpcpp/server_context.h + include/grpcpp/server_impl.h + include/grpcpp/server_posix.h + include/grpcpp/server_posix_impl.h + include/grpcpp/support/async_stream.h + include/grpcpp/support/async_stream_impl.h + include/grpcpp/support/async_unary_call.h + include/grpcpp/support/async_unary_call_impl.h + include/grpcpp/support/byte_buffer.h + include/grpcpp/support/channel_arguments.h + include/grpcpp/support/channel_arguments_impl.h + include/grpcpp/support/client_callback.h + include/grpcpp/support/client_callback_impl.h + include/grpcpp/support/client_interceptor.h + include/grpcpp/support/config.h + include/grpcpp/support/interceptor.h + include/grpcpp/support/message_allocator.h + include/grpcpp/support/method_handler.h + include/grpcpp/support/proto_buffer_reader.h + include/grpcpp/support/proto_buffer_writer.h + include/grpcpp/support/server_callback.h + include/grpcpp/support/server_callback_impl.h + include/grpcpp/support/server_interceptor.h + include/grpcpp/support/slice.h + include/grpcpp/support/status.h + include/grpcpp/support/status_code_enum.h + include/grpcpp/support/string_ref.h + include/grpcpp/support/stub_options.h + include/grpcpp/support/sync_stream.h + include/grpcpp/support/sync_stream_impl.h + include/grpcpp/support/time.h + include/grpcpp/support/validate_service_config.h +) + string(REPLACE "include/" "" _path ${_hdr}) + get_filename_component(_path ${_path} PATH) + install(FILES ${_hdr} + DESTINATION "${gRPC_INSTALL_INCLUDEDIR}/${_path}" + ) +endforeach() + + +if(gRPC_INSTALL) + install(TARGETS grpc++_unsecure EXPORT gRPCTargets + RUNTIME DESTINATION ${gRPC_INSTALL_BINDIR} + LIBRARY DESTINATION ${gRPC_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${gRPC_INSTALL_LIBDIR} + ) +endif() + + +add_library(grpc_plugin_support + src/compiler/cpp_generator.cc + src/compiler/csharp_generator.cc + src/compiler/node_generator.cc + src/compiler/objective_c_generator.cc + src/compiler/php_generator.cc + src/compiler/python_generator.cc + src/compiler/ruby_generator.cc +) + +set_target_properties(grpc_plugin_support PROPERTIES + VERSION ${gRPC_CPP_VERSION} + SOVERSION ${gRPC_CPP_SOVERSION} +) + +if(WIN32 AND MSVC) + set_target_properties(grpc_plugin_support PROPERTIES COMPILE_PDB_NAME "grpc_plugin_support" + COMPILE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" + ) + if(gRPC_INSTALL) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/grpc_plugin_support.pdb + DESTINATION ${gRPC_INSTALL_LIBDIR} OPTIONAL + ) + endif() +endif() + +target_include_directories(grpc_plugin_support + PUBLIC $ $ + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ${_gRPC_PROTO_GENS_DIR} +) +target_link_libraries(grpc_plugin_support + ${_gRPC_PROTOBUF_PROTOC_LIBRARIES} + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} +) + +foreach(_hdr + include/grpc++/impl/codegen/config_protobuf.h + include/grpcpp/impl/codegen/config_protobuf.h +) + string(REPLACE "include/" "" _path ${_hdr}) + get_filename_component(_path ${_path} PATH) + install(FILES ${_hdr} + DESTINATION "${gRPC_INSTALL_INCLUDEDIR}/${_path}" + ) +endforeach() + + +if(gRPC_INSTALL) + install(TARGETS grpc_plugin_support EXPORT gRPCTargets + RUNTIME DESTINATION ${gRPC_INSTALL_BINDIR} + LIBRARY DESTINATION ${gRPC_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${gRPC_INSTALL_LIBDIR} + ) +endif() + + +# grpcpp_channelz doesn't build with protobuf-lite +# See https://github.com/grpc/grpc/issues/19473 +if(gRPC_BUILD_CODEGEN AND NOT gRPC_USE_PROTO_LITE) +add_library(grpcpp_channelz + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/channelz/channelz.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/channelz/channelz.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/channelz/channelz.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/channelz/channelz.grpc.pb.h + src/cpp/server/channelz/channelz_service.cc + src/cpp/server/channelz/channelz_service_plugin.cc +) + +set_target_properties(grpcpp_channelz PROPERTIES + VERSION ${gRPC_CPP_VERSION} + SOVERSION ${gRPC_CPP_SOVERSION} +) + +if(WIN32 AND MSVC) + set_target_properties(grpcpp_channelz PROPERTIES COMPILE_PDB_NAME "grpcpp_channelz" + COMPILE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" + ) + if(gRPC_INSTALL) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/grpcpp_channelz.pdb + DESTINATION ${gRPC_INSTALL_LIBDIR} OPTIONAL + ) + endif() +endif() + +target_include_directories(grpcpp_channelz + PUBLIC $ $ + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ${_gRPC_PROTO_GENS_DIR} +) +target_link_libraries(grpcpp_channelz + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++ + grpc + gpr + address_sorting + upb +) + +foreach(_hdr + include/grpcpp/ext/channelz_service_plugin.h + include/grpcpp/ext/channelz_service_plugin_impl.h +) + string(REPLACE "include/" "" _path ${_hdr}) + get_filename_component(_path ${_path} PATH) + install(FILES ${_hdr} + DESTINATION "${gRPC_INSTALL_INCLUDEDIR}/${_path}" + ) +endforeach() +endif() + +if(gRPC_BUILD_CODEGEN) + +if(gRPC_INSTALL) + install(TARGETS grpcpp_channelz EXPORT gRPCTargets + RUNTIME DESTINATION ${gRPC_INSTALL_BINDIR} + LIBRARY DESTINATION ${gRPC_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${gRPC_INSTALL_LIBDIR} + ) +endif() + +endif() + +add_library(upb + third_party/upb/upb/decode.c + third_party/upb/upb/encode.c + third_party/upb/upb/msg.c + third_party/upb/upb/port.c + third_party/upb/upb/table.c + third_party/upb/upb/upb.c +) + +set_target_properties(upb PROPERTIES + VERSION ${gRPC_CORE_VERSION} + SOVERSION ${gRPC_CORE_SOVERSION} +) + +if(WIN32 AND MSVC) + set_target_properties(upb PROPERTIES COMPILE_PDB_NAME "upb" + COMPILE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" + ) + if(gRPC_INSTALL) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/upb.pdb + DESTINATION ${gRPC_INSTALL_LIBDIR} OPTIONAL + ) + endif() +endif() + +target_include_directories(upb + PUBLIC $ $ + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) +target_link_libraries(upb + ${_gRPC_ALLTARGETS_LIBRARIES} +) + + + +if(gRPC_INSTALL) + install(TARGETS upb EXPORT gRPCTargets + RUNTIME DESTINATION ${gRPC_INSTALL_BINDIR} + LIBRARY DESTINATION ${gRPC_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${gRPC_INSTALL_LIBDIR} + ) +endif() + + + +add_executable(check_epollexclusive + test/build/check_epollexclusive.c +) + +target_include_directories(check_epollexclusive + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(check_epollexclusive + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc + gpr +) + + + +add_executable(gen_hpack_tables + tools/codegen/core/gen_hpack_tables.cc +) + +target_include_directories(gen_hpack_tables + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(gen_hpack_tables + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc + gpr +) + + + +add_executable(gen_legal_metadata_characters + tools/codegen/core/gen_legal_metadata_characters.cc +) + +target_include_directories(gen_legal_metadata_characters + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(gen_legal_metadata_characters + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} +) + + + +add_executable(gen_percent_encoding_tables + tools/codegen/core/gen_percent_encoding_tables.cc +) + +target_include_directories(gen_percent_encoding_tables + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(gen_percent_encoding_tables + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} +) + + +if(gRPC_BUILD_TESTS) + +add_executable(algorithm_test + test/core/compression/algorithm_test.cc +) + +target_include_directories(algorithm_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(algorithm_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(alloc_test + test/core/gpr/alloc_test.cc +) + +target_include_directories(alloc_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(alloc_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(alpn_test + test/core/transport/chttp2/alpn_test.cc +) + +target_include_directories(alpn_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(alpn_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(alts_counter_test + test/core/tsi/alts/crypt/gsec_test_util.cc + test/core/tsi/alts/frame_protector/alts_counter_test.cc +) + +target_include_directories(alts_counter_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(alts_counter_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(alts_crypt_test + test/core/tsi/alts/crypt/aes_gcm_test.cc + test/core/tsi/alts/crypt/gsec_test_util.cc +) + +target_include_directories(alts_crypt_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(alts_crypt_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(alts_crypter_test + test/core/tsi/alts/crypt/gsec_test_util.cc + test/core/tsi/alts/frame_protector/alts_crypter_test.cc +) + +target_include_directories(alts_crypter_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(alts_crypter_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(alts_frame_protector_test + test/core/tsi/alts/crypt/gsec_test_util.cc + test/core/tsi/alts/frame_protector/alts_frame_protector_test.cc + test/core/tsi/transport_security_test_lib.cc +) + +target_include_directories(alts_frame_protector_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(alts_frame_protector_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(alts_grpc_record_protocol_test + test/core/tsi/alts/crypt/gsec_test_util.cc + test/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_test.cc +) + +target_include_directories(alts_grpc_record_protocol_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(alts_grpc_record_protocol_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(alts_handshaker_client_test + test/core/tsi/alts/handshaker/alts_handshaker_client_test.cc + test/core/tsi/alts/handshaker/alts_handshaker_service_api_test_lib.cc +) + +target_include_directories(alts_handshaker_client_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(alts_handshaker_client_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(alts_iovec_record_protocol_test + test/core/tsi/alts/crypt/gsec_test_util.cc + test/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol_test.cc +) + +target_include_directories(alts_iovec_record_protocol_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(alts_iovec_record_protocol_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(alts_security_connector_test + test/core/security/alts_security_connector_test.cc +) + +target_include_directories(alts_security_connector_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(alts_security_connector_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(alts_tsi_handshaker_test + test/core/tsi/alts/handshaker/alts_handshaker_service_api_test_lib.cc + test/core/tsi/alts/handshaker/alts_tsi_handshaker_test.cc +) + +target_include_directories(alts_tsi_handshaker_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(alts_tsi_handshaker_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(alts_tsi_utils_test + test/core/tsi/alts/handshaker/alts_handshaker_service_api_test_lib.cc + test/core/tsi/alts/handshaker/alts_tsi_utils_test.cc +) + +target_include_directories(alts_tsi_utils_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(alts_tsi_utils_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(alts_zero_copy_grpc_protector_test + test/core/tsi/alts/crypt/gsec_test_util.cc + test/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector_test.cc +) + +target_include_directories(alts_zero_copy_grpc_protector_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(alts_zero_copy_grpc_protector_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(arena_test + test/core/gpr/arena_test.cc +) + +target_include_directories(arena_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(arena_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(auth_context_test + test/core/security/auth_context_test.cc +) + +target_include_directories(auth_context_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(auth_context_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(avl_test + test/core/avl/avl_test.cc +) + +target_include_directories(avl_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(avl_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(b64_test + test/core/slice/b64_test.cc +) + +target_include_directories(b64_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(b64_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(bad_server_response_test + test/core/end2end/bad_server_response_test.cc + test/core/end2end/cq_verifier.cc +) + +target_include_directories(bad_server_response_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(bad_server_response_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(bad_ssl_alpn_test + test/core/bad_ssl/bad_ssl_test.cc + test/core/end2end/cq_verifier.cc + ) + + target_include_directories(bad_ssl_alpn_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ) + + target_link_libraries(bad_ssl_alpn_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(bad_ssl_cert_test + test/core/bad_ssl/bad_ssl_test.cc + test/core/end2end/cq_verifier.cc + ) + + target_include_directories(bad_ssl_cert_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ) + + target_link_libraries(bad_ssl_cert_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) + +add_executable(bin_decoder_test + test/core/transport/chttp2/bin_decoder_test.cc +) + +target_include_directories(bin_decoder_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(bin_decoder_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(bin_encoder_test + test/core/transport/chttp2/bin_encoder_test.cc +) + +target_include_directories(bin_encoder_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(bin_encoder_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(buffer_list_test + test/core/iomgr/buffer_list_test.cc +) + +target_include_directories(buffer_list_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(buffer_list_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(channel_args_test + test/core/channel/channel_args_test.cc +) + +target_include_directories(channel_args_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(channel_args_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(channel_create_test + test/core/surface/channel_create_test.cc +) + +target_include_directories(channel_create_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(channel_create_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(channel_stack_builder_test + test/core/channel/channel_stack_builder_test.cc +) + +target_include_directories(channel_stack_builder_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(channel_stack_builder_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(channel_stack_test + test/core/channel/channel_stack_test.cc +) + +target_include_directories(channel_stack_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(channel_stack_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(check_gcp_environment_linux_test + test/core/security/check_gcp_environment_linux_test.cc +) + +target_include_directories(check_gcp_environment_linux_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(check_gcp_environment_linux_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(check_gcp_environment_windows_test + test/core/security/check_gcp_environment_windows_test.cc +) + +target_include_directories(check_gcp_environment_windows_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(check_gcp_environment_windows_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(client_ssl_test + test/core/handshake/client_ssl.cc + ) + + target_include_directories(client_ssl_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ) + + target_link_libraries(client_ssl_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) + +add_executable(cmdline_test + test/core/util/cmdline_test.cc +) + +target_include_directories(cmdline_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(cmdline_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(combiner_test + test/core/iomgr/combiner_test.cc + ) + + target_include_directories(combiner_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ) + + target_link_libraries(combiner_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) + +add_executable(completion_queue_threading_test + test/core/surface/completion_queue_threading_test.cc +) + +target_include_directories(completion_queue_threading_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(completion_queue_threading_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(compression_test + test/core/compression/compression_test.cc +) + +target_include_directories(compression_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(compression_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(concurrent_connectivity_test + test/core/surface/concurrent_connectivity_test.cc +) + +target_include_directories(concurrent_connectivity_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(concurrent_connectivity_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(connection_refused_test + test/core/end2end/connection_refused_test.cc + test/core/end2end/cq_verifier.cc +) + +target_include_directories(connection_refused_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(connection_refused_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(cpu_test + test/core/gpr/cpu_test.cc +) + +target_include_directories(cpu_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(cpu_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(dns_resolver_connectivity_using_ares_resolver_test + test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc +) + +target_include_directories(dns_resolver_connectivity_using_ares_resolver_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(dns_resolver_connectivity_using_ares_resolver_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(dns_resolver_connectivity_using_native_resolver_test + test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc +) + +target_include_directories(dns_resolver_connectivity_using_native_resolver_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(dns_resolver_connectivity_using_native_resolver_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(dns_resolver_cooldown_test + test/core/client_channel/resolvers/dns_resolver_cooldown_test.cc +) + +target_include_directories(dns_resolver_cooldown_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(dns_resolver_cooldown_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(dns_resolver_test + test/core/client_channel/resolvers/dns_resolver_test.cc +) + +target_include_directories(dns_resolver_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(dns_resolver_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(dualstack_socket_test + test/core/end2end/cq_verifier.cc + test/core/end2end/dualstack_socket_test.cc + ) + + target_include_directories(dualstack_socket_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ) + + target_link_libraries(dualstack_socket_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) + +add_executable(endpoint_pair_test + test/core/iomgr/endpoint_pair_test.cc + test/core/iomgr/endpoint_tests.cc +) + +target_include_directories(endpoint_pair_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(endpoint_pair_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(env_test + test/core/gpr/env_test.cc +) + +target_include_directories(env_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(env_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(error_test + test/core/iomgr/endpoint_tests.cc + test/core/iomgr/error_test.cc +) + +target_include_directories(error_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(error_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(ev_epollex_linux_test + test/core/iomgr/ev_epollex_linux_test.cc + ) + + target_include_directories(ev_epollex_linux_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ) + + target_link_libraries(ev_epollex_linux_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) + +add_executable(fake_resolver_test + test/core/client_channel/resolvers/fake_resolver_test.cc +) + +target_include_directories(fake_resolver_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(fake_resolver_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(fake_transport_security_test + test/core/tsi/fake_transport_security_test.cc + test/core/tsi/transport_security_test_lib.cc +) + +target_include_directories(fake_transport_security_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(fake_transport_security_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(fd_conservation_posix_test + test/core/iomgr/fd_conservation_posix_test.cc + ) + + target_include_directories(fd_conservation_posix_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ) + + target_link_libraries(fd_conservation_posix_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(fd_posix_test + test/core/iomgr/fd_posix_test.cc + ) + + target_include_directories(fd_posix_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ) + + target_link_libraries(fd_posix_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(fling_stream_test + test/core/end2end/data/client_certs.cc + test/core/end2end/data/server1_cert.cc + test/core/end2end/data/server1_key.cc + test/core/end2end/data/test_root_cert.cc + test/core/fling/fling_stream_test.cc + ) + + target_include_directories(fling_stream_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ) + + target_link_libraries(fling_stream_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(fling_test + test/core/end2end/data/client_certs.cc + test/core/end2end/data/server1_cert.cc + test/core/end2end/data/server1_key.cc + test/core/end2end/data/test_root_cert.cc + test/core/fling/fling_test.cc + ) + + target_include_directories(fling_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ) + + target_link_libraries(fling_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(fork_test + test/core/gprpp/fork_test.cc + ) + + target_include_directories(fork_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ) + + target_link_libraries(fork_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) + +add_executable(format_request_test + test/core/end2end/data/client_certs.cc + test/core/end2end/data/server1_cert.cc + test/core/end2end/data/server1_key.cc + test/core/end2end/data/test_root_cert.cc + test/core/http/format_request_test.cc +) + +target_include_directories(format_request_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(format_request_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(frame_handler_test + test/core/tsi/alts/crypt/gsec_test_util.cc + test/core/tsi/alts/frame_protector/frame_handler_test.cc +) + +target_include_directories(frame_handler_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(frame_handler_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(goaway_server_test + test/core/end2end/cq_verifier.cc + test/core/end2end/goaway_server_test.cc +) + +target_include_directories(goaway_server_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(goaway_server_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(grpc_alts_credentials_options_test + test/core/security/grpc_alts_credentials_options_test.cc +) + +target_include_directories(grpc_alts_credentials_options_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(grpc_alts_credentials_options_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(grpc_byte_buffer_reader_test + test/core/surface/byte_buffer_reader_test.cc +) + +target_include_directories(grpc_byte_buffer_reader_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(grpc_byte_buffer_reader_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(grpc_completion_queue_test + test/core/surface/completion_queue_test.cc +) + +target_include_directories(grpc_completion_queue_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(grpc_completion_queue_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(grpc_ipv6_loopback_available_test + test/core/iomgr/grpc_ipv6_loopback_available_test.cc +) + +target_include_directories(grpc_ipv6_loopback_available_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(grpc_ipv6_loopback_available_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(handshake_server_with_readahead_handshaker_test + test/core/handshake/readahead_handshaker_server_ssl.cc + test/core/handshake/server_ssl_common.cc + ) + + target_include_directories(handshake_server_with_readahead_handshaker_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ) + + target_link_libraries(handshake_server_with_readahead_handshaker_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(handshake_verify_peer_options_test + test/core/handshake/verify_peer_options.cc + ) + + target_include_directories(handshake_verify_peer_options_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ) + + target_link_libraries(handshake_verify_peer_options_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) + +add_executable(histogram_test + test/core/util/histogram_test.cc +) + +target_include_directories(histogram_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(histogram_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(host_port_test + test/core/gprpp/host_port_test.cc +) + +target_include_directories(host_port_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(host_port_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(hpack_encoder_test + test/core/transport/chttp2/hpack_encoder_test.cc +) + +target_include_directories(hpack_encoder_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(hpack_encoder_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(hpack_parser_test + test/core/transport/chttp2/hpack_parser_test.cc +) + +target_include_directories(hpack_parser_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(hpack_parser_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(hpack_table_test + test/core/transport/chttp2/hpack_table_test.cc +) + +target_include_directories(hpack_table_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(hpack_table_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(httpcli_test + test/core/end2end/data/client_certs.cc + test/core/end2end/data/server1_cert.cc + test/core/end2end/data/server1_key.cc + test/core/end2end/data/test_root_cert.cc + test/core/http/httpcli_test.cc + ) + + target_include_directories(httpcli_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ) + + target_link_libraries(httpcli_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(httpscli_test + test/core/end2end/data/client_certs.cc + test/core/end2end/data/server1_cert.cc + test/core/end2end/data/server1_key.cc + test/core/end2end/data/test_root_cert.cc + test/core/http/httpscli_test.cc + ) + + target_include_directories(httpscli_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ) + + target_link_libraries(httpscli_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) + +add_executable(init_test + test/core/surface/init_test.cc +) + +target_include_directories(init_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(init_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(inproc_callback_test + test/core/end2end/inproc_callback_test.cc +) + +target_include_directories(inproc_callback_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(inproc_callback_test + ${_gRPC_ALLTARGETS_LIBRARIES} + end2end_tests + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(invalid_call_argument_test + test/core/end2end/cq_verifier.cc + test/core/end2end/invalid_call_argument_test.cc +) + +target_include_directories(invalid_call_argument_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(invalid_call_argument_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(json_token_test + test/core/security/json_token_test.cc +) + +target_include_directories(json_token_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(json_token_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(jwt_verifier_test + test/core/security/jwt_verifier_test.cc +) + +target_include_directories(jwt_verifier_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(jwt_verifier_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(lame_client_test + test/core/end2end/cq_verifier.cc + test/core/surface/lame_client_test.cc +) + +target_include_directories(lame_client_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(lame_client_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(load_file_test + test/core/iomgr/load_file_test.cc +) + +target_include_directories(load_file_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(load_file_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(log_test + test/core/gpr/log_test.cc +) + +target_include_directories(log_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(log_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(manual_constructor_test + test/core/gprpp/manual_constructor_test.cc +) + +target_include_directories(manual_constructor_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(manual_constructor_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(message_compress_test + test/core/compression/message_compress_test.cc +) + +target_include_directories(message_compress_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(message_compress_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(metadata_test + test/core/transport/metadata_test.cc +) + +target_include_directories(metadata_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(metadata_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(minimal_stack_is_minimal_test + test/core/channel/minimal_stack_is_minimal_test.cc +) + +target_include_directories(minimal_stack_is_minimal_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(minimal_stack_is_minimal_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(mpmcqueue_test + test/core/iomgr/mpmcqueue_test.cc +) + +target_include_directories(mpmcqueue_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(mpmcqueue_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(mpscq_test + test/core/gprpp/mpscq_test.cc + ) + + target_include_directories(mpscq_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ) + + target_link_libraries(mpscq_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) + +add_executable(multiple_server_queues_test + test/core/end2end/cq_verifier.cc + test/core/end2end/multiple_server_queues_test.cc +) + +target_include_directories(multiple_server_queues_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(multiple_server_queues_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(murmur_hash_test + test/core/gpr/murmur_hash_test.cc +) + +target_include_directories(murmur_hash_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(murmur_hash_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(no_server_test + test/core/end2end/cq_verifier.cc + test/core/end2end/no_server_test.cc +) + +target_include_directories(no_server_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(no_server_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(num_external_connectivity_watchers_test + test/core/surface/num_external_connectivity_watchers_test.cc +) + +target_include_directories(num_external_connectivity_watchers_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(num_external_connectivity_watchers_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(parse_address_test + test/core/client_channel/parse_address_test.cc +) + +target_include_directories(parse_address_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(parse_address_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(parse_address_with_named_scope_id_test + test/core/client_channel/parse_address_with_named_scope_id_test.cc + ) + + target_include_directories(parse_address_with_named_scope_id_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ) + + target_link_libraries(parse_address_with_named_scope_id_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) + +add_executable(parser_test + test/core/end2end/data/client_certs.cc + test/core/end2end/data/server1_cert.cc + test/core/end2end/data/server1_key.cc + test/core/end2end/data/test_root_cert.cc + test/core/http/parser_test.cc +) + +target_include_directories(parser_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(parser_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(percent_encoding_test + test/core/slice/percent_encoding_test.cc +) + +target_include_directories(percent_encoding_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(percent_encoding_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(public_headers_must_be_c89 + test/core/surface/public_headers_must_be_c89.c +) + +target_include_directories(public_headers_must_be_c89 + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(public_headers_must_be_c89 + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(resolve_address_using_ares_resolver_posix_test + test/core/iomgr/resolve_address_posix_test.cc + ) + + target_include_directories(resolve_address_using_ares_resolver_posix_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ) + + target_link_libraries(resolve_address_using_ares_resolver_posix_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) + +add_executable(resolve_address_using_ares_resolver_test + test/core/iomgr/resolve_address_test.cc +) + +target_include_directories(resolve_address_using_ares_resolver_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(resolve_address_using_ares_resolver_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(resolve_address_using_native_resolver_posix_test + test/core/iomgr/resolve_address_posix_test.cc + ) + + target_include_directories(resolve_address_using_native_resolver_posix_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ) + + target_link_libraries(resolve_address_using_native_resolver_posix_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) + +add_executable(resolve_address_using_native_resolver_test + test/core/iomgr/resolve_address_test.cc +) + +target_include_directories(resolve_address_using_native_resolver_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(resolve_address_using_native_resolver_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(resource_quota_test + test/core/iomgr/resource_quota_test.cc +) + +target_include_directories(resource_quota_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(resource_quota_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(secure_channel_create_test + test/core/surface/secure_channel_create_test.cc +) + +target_include_directories(secure_channel_create_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(secure_channel_create_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(secure_endpoint_test + test/core/iomgr/endpoint_tests.cc + test/core/security/secure_endpoint_test.cc +) + +target_include_directories(secure_endpoint_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(secure_endpoint_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(security_connector_test + test/core/security/security_connector_test.cc +) + +target_include_directories(security_connector_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(security_connector_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(sequential_connectivity_test + test/core/surface/sequential_connectivity_test.cc +) + +target_include_directories(sequential_connectivity_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(sequential_connectivity_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(server_chttp2_test + test/core/surface/server_chttp2_test.cc +) + +target_include_directories(server_chttp2_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(server_chttp2_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(server_ssl_test + test/core/handshake/server_ssl.cc + test/core/handshake/server_ssl_common.cc + ) + + target_include_directories(server_ssl_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ) + + target_link_libraries(server_ssl_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) + +add_executable(server_test + test/core/surface/server_test.cc +) + +target_include_directories(server_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(server_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(slice_buffer_test + test/core/slice/slice_buffer_test.cc +) + +target_include_directories(slice_buffer_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(slice_buffer_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(slice_string_helpers_test + test/core/slice/slice_string_helpers_test.cc +) + +target_include_directories(slice_string_helpers_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(slice_string_helpers_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(sockaddr_resolver_test + test/core/client_channel/resolvers/sockaddr_resolver_test.cc +) + +target_include_directories(sockaddr_resolver_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(sockaddr_resolver_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(sockaddr_utils_test + test/core/iomgr/sockaddr_utils_test.cc +) + +target_include_directories(sockaddr_utils_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(sockaddr_utils_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(socket_utils_test + test/core/iomgr/socket_utils_test.cc + ) + + target_include_directories(socket_utils_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ) + + target_link_libraries(socket_utils_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) + +add_executable(spinlock_test + test/core/gpr/spinlock_test.cc +) + +target_include_directories(spinlock_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(spinlock_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(ssl_credentials_test + test/core/security/ssl_credentials_test.cc +) + +target_include_directories(ssl_credentials_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(ssl_credentials_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(ssl_transport_security_test + test/core/tsi/ssl_transport_security_test.cc + test/core/tsi/transport_security_test_lib.cc + ) + + target_include_directories(ssl_transport_security_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ) + + target_link_libraries(ssl_transport_security_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) + +add_executable(status_conversion_test + test/core/transport/status_conversion_test.cc +) + +target_include_directories(status_conversion_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(status_conversion_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(stream_compression_test + test/core/compression/stream_compression_test.cc +) + +target_include_directories(stream_compression_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(stream_compression_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(stream_map_test + test/core/transport/chttp2/stream_map_test.cc +) + +target_include_directories(stream_map_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(stream_map_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(stream_owned_slice_test + test/core/transport/stream_owned_slice_test.cc +) + +target_include_directories(stream_owned_slice_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(stream_owned_slice_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(string_test + test/core/gpr/string_test.cc +) + +target_include_directories(string_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(string_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(sync_test + test/core/gpr/sync_test.cc +) + +target_include_directories(sync_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(sync_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(tcp_client_posix_test + test/core/iomgr/tcp_client_posix_test.cc + ) + + target_include_directories(tcp_client_posix_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ) + + target_link_libraries(tcp_client_posix_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) + + add_executable(tcp_posix_test + test/core/iomgr/endpoint_tests.cc + test/core/iomgr/tcp_posix_test.cc + ) + + target_include_directories(tcp_posix_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ) + + target_link_libraries(tcp_posix_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(tcp_server_posix_test + test/core/iomgr/tcp_server_posix_test.cc + ) + + target_include_directories(tcp_server_posix_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ) + + target_link_libraries(tcp_server_posix_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) + +add_executable(test_core_gpr_time_test + test/core/gpr/time_test.cc +) + +target_include_directories(test_core_gpr_time_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(test_core_gpr_time_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(test_core_security_credentials_test + test/core/security/credentials_test.cc +) + +target_include_directories(test_core_security_credentials_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(test_core_security_credentials_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(test_core_slice_slice_test + test/core/slice/slice_test.cc +) + +target_include_directories(test_core_slice_slice_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(test_core_slice_slice_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(thd_test + test/core/gprpp/thd_test.cc +) + +target_include_directories(thd_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(thd_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(threadpool_test + test/core/iomgr/threadpool_test.cc +) + +target_include_directories(threadpool_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(threadpool_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(time_averaged_stats_test + test/core/iomgr/time_averaged_stats_test.cc +) + +target_include_directories(time_averaged_stats_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(time_averaged_stats_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(timeout_encoding_test + test/core/transport/timeout_encoding_test.cc +) + +target_include_directories(timeout_encoding_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(timeout_encoding_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(timer_heap_test + test/core/iomgr/timer_heap_test.cc +) + +target_include_directories(timer_heap_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(timer_heap_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(timer_list_test + test/core/iomgr/timer_list_test.cc +) + +target_include_directories(timer_list_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(timer_list_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(tls_test + test/core/gpr/tls_test.cc +) + +target_include_directories(tls_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(tls_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(transport_security_common_api_test + test/core/tsi/alts/handshaker/transport_security_common_api_test.cc +) + +target_include_directories(transport_security_common_api_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(transport_security_common_api_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(transport_security_test + test/core/tsi/transport_security_test.cc +) + +target_include_directories(transport_security_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(transport_security_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(udp_server_test + test/core/iomgr/udp_server_test.cc + ) + + target_include_directories(udp_server_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ) + + target_link_libraries(udp_server_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) + +add_executable(uri_parser_test + test/core/client_channel/uri_parser_test.cc +) + +target_include_directories(uri_parser_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(uri_parser_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(useful_test + test/core/gpr/useful_test.cc +) + +target_include_directories(useful_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(useful_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(varint_test + test/core/transport/chttp2/varint_test.cc +) + +target_include_directories(varint_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} +) + +target_link_libraries(varint_test + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb +) + + +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(address_sorting_test + test/cpp/naming/address_sorting_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) + + target_include_directories(address_sorting_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) + + target_link_libraries(address_sorting_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc++_test_config + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(address_sorting_test_unsecure + test/cpp/naming/address_sorting_test.cc + test/cpp/util/byte_buffer_proto_helper.cc + test/cpp/util/string_ref_helper.cc + test/cpp/util/subprocess.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) + + target_include_directories(address_sorting_test_unsecure + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) + + target_link_libraries(address_sorting_test_unsecure + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util_unsecure + grpc++_unsecure + grpc_unsecure + grpc++_test_config + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(alarm_test + test/cpp/common/alarm_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) + + target_include_directories(alarm_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) + + target_link_libraries(alarm_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util_unsecure + grpc++_unsecure + grpc_unsecure + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(alts_concurrent_connectivity_test + ${_gRPC_PROTO_GENS_DIR}/test/core/tsi/alts/fake_handshaker/handshaker.pb.cc + ${_gRPC_PROTO_GENS_DIR}/test/core/tsi/alts/fake_handshaker/handshaker.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/test/core/tsi/alts/fake_handshaker/handshaker.pb.h + ${_gRPC_PROTO_GENS_DIR}/test/core/tsi/alts/fake_handshaker/handshaker.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/test/core/tsi/alts/fake_handshaker/transport_security_common.pb.cc + ${_gRPC_PROTO_GENS_DIR}/test/core/tsi/alts/fake_handshaker/transport_security_common.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/test/core/tsi/alts/fake_handshaker/transport_security_common.pb.h + ${_gRPC_PROTO_GENS_DIR}/test/core/tsi/alts/fake_handshaker/transport_security_common.grpc.pb.h + test/core/end2end/cq_verifier.cc + test/core/tsi/alts/fake_handshaker/fake_handshaker_server.cc + test/core/tsi/alts/handshaker/alts_concurrent_connectivity_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) + + target_include_directories(alts_concurrent_connectivity_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) + + target_link_libraries(alts_concurrent_connectivity_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) + +add_executable(alts_util_test + test/cpp/common/alts_util_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(alts_util_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(alts_util_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc++_alts + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(async_end2end_test + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/health/v1/health.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/health/v1/health.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/health/v1/health.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/health/v1/health.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.h + test/cpp/end2end/async_end2end_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(async_end2end_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(async_end2end_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(auth_property_iterator_test + test/cpp/common/auth_property_iterator_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(auth_property_iterator_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(auth_property_iterator_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(backoff_test + test/core/backoff/backoff_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(backoff_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(backoff_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(bad_streaming_id_bad_client_test + test/core/bad_client/bad_client.cc + test/core/bad_client/tests/bad_streaming_id.cc + test/core/end2end/cq_verifier.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(bad_streaming_id_bad_client_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(bad_streaming_id_bad_client_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(badreq_bad_client_test + test/core/bad_client/bad_client.cc + test/core/bad_client/tests/badreq.cc + test/core/end2end/cq_verifier.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(badreq_bad_client_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(badreq_bad_client_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(bdp_estimator_test + test/core/transport/bdp_estimator_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) + + target_include_directories(bdp_estimator_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) + + target_link_libraries(bdp_estimator_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) + + add_executable(bm_alarm + test/cpp/microbenchmarks/bm_alarm.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) + + target_include_directories(bm_alarm + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) + + target_link_libraries(bm_alarm + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + benchmark_helpers + grpc_test_util_unsecure + grpc++_unsecure + grpc_unsecure + grpc++_test_config + gpr + address_sorting + upb + ${_gRPC_BENCHMARK_LIBRARIES} + ${_gRPC_GFLAGS_LIBRARIES} + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) + + add_executable(bm_arena + test/cpp/microbenchmarks/bm_arena.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) + + target_include_directories(bm_arena + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) + + target_link_libraries(bm_arena + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + benchmark_helpers + grpc_test_util_unsecure + grpc++_unsecure + grpc_unsecure + grpc++_test_config + gpr + address_sorting + upb + ${_gRPC_BENCHMARK_LIBRARIES} + ${_gRPC_GFLAGS_LIBRARIES} + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) + + add_executable(bm_byte_buffer + test/cpp/microbenchmarks/bm_byte_buffer.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) + + target_include_directories(bm_byte_buffer + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) + + target_link_libraries(bm_byte_buffer + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + benchmark_helpers + grpc_test_util_unsecure + grpc++_unsecure + grpc_unsecure + grpc++_test_config + gpr + address_sorting + upb + ${_gRPC_BENCHMARK_LIBRARIES} + ${_gRPC_GFLAGS_LIBRARIES} + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) + + add_executable(bm_call_create + test/cpp/microbenchmarks/bm_call_create.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) + + target_include_directories(bm_call_create + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) + + target_link_libraries(bm_call_create + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + benchmark_helpers + grpc_test_util_unsecure + grpc++_unsecure + grpc_unsecure + grpc++_test_config + gpr + address_sorting + upb + ${_gRPC_BENCHMARK_LIBRARIES} + ${_gRPC_GFLAGS_LIBRARIES} + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) + + add_executable(bm_callback_streaming_ping_pong + test/cpp/microbenchmarks/bm_callback_streaming_ping_pong.cc + test/cpp/microbenchmarks/callback_test_service.cc + test/cpp/util/byte_buffer_proto_helper.cc + test/cpp/util/string_ref_helper.cc + test/cpp/util/subprocess.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) + + target_include_directories(bm_callback_streaming_ping_pong + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) + + target_link_libraries(bm_callback_streaming_ping_pong + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + benchmark_helpers + grpc_test_util_unsecure + grpc++_unsecure + grpc_unsecure + grpc++_test_config + gpr + address_sorting + upb + ${_gRPC_BENCHMARK_LIBRARIES} + ${_gRPC_GFLAGS_LIBRARIES} + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) + + add_executable(bm_callback_unary_ping_pong + test/cpp/microbenchmarks/bm_callback_unary_ping_pong.cc + test/cpp/microbenchmarks/callback_test_service.cc + test/cpp/util/byte_buffer_proto_helper.cc + test/cpp/util/string_ref_helper.cc + test/cpp/util/subprocess.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) + + target_include_directories(bm_callback_unary_ping_pong + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) + + target_link_libraries(bm_callback_unary_ping_pong + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + benchmark_helpers + grpc_test_util_unsecure + grpc++_unsecure + grpc_unsecure + grpc++_test_config + gpr + address_sorting + upb + ${_gRPC_BENCHMARK_LIBRARIES} + ${_gRPC_GFLAGS_LIBRARIES} + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) + + add_executable(bm_channel + test/cpp/microbenchmarks/bm_channel.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) + + target_include_directories(bm_channel + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) + + target_link_libraries(bm_channel + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + benchmark_helpers + grpc_test_util_unsecure + grpc++_unsecure + grpc_unsecure + grpc++_test_config + gpr + address_sorting + upb + ${_gRPC_BENCHMARK_LIBRARIES} + ${_gRPC_GFLAGS_LIBRARIES} + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) + + add_executable(bm_chttp2_hpack + test/cpp/microbenchmarks/bm_chttp2_hpack.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) + + target_include_directories(bm_chttp2_hpack + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) + + target_link_libraries(bm_chttp2_hpack + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + benchmark_helpers + grpc_test_util_unsecure + grpc++_unsecure + grpc_unsecure + grpc++_test_config + gpr + address_sorting + upb + ${_gRPC_BENCHMARK_LIBRARIES} + ${_gRPC_GFLAGS_LIBRARIES} + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) + + add_executable(bm_chttp2_transport + test/cpp/microbenchmarks/bm_chttp2_transport.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) + + target_include_directories(bm_chttp2_transport + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) + + target_link_libraries(bm_chttp2_transport + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + benchmark_helpers + grpc_test_util_unsecure + grpc++_unsecure + grpc_unsecure + grpc++_test_config + gpr + address_sorting + upb + ${_gRPC_BENCHMARK_LIBRARIES} + ${_gRPC_GFLAGS_LIBRARIES} + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) + + add_executable(bm_closure + test/cpp/microbenchmarks/bm_closure.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) + + target_include_directories(bm_closure + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) + + target_link_libraries(bm_closure + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + benchmark_helpers + grpc_test_util_unsecure + grpc++_unsecure + grpc_unsecure + grpc++_test_config + gpr + address_sorting + upb + ${_gRPC_BENCHMARK_LIBRARIES} + ${_gRPC_GFLAGS_LIBRARIES} + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) + + add_executable(bm_cq + test/cpp/microbenchmarks/bm_cq.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) + + target_include_directories(bm_cq + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) + + target_link_libraries(bm_cq + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + benchmark_helpers + grpc_test_util_unsecure + grpc++_unsecure + grpc_unsecure + grpc++_test_config + gpr + address_sorting + upb + ${_gRPC_BENCHMARK_LIBRARIES} + ${_gRPC_GFLAGS_LIBRARIES} + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) + + add_executable(bm_cq_multiple_threads + test/cpp/microbenchmarks/bm_cq_multiple_threads.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) + + target_include_directories(bm_cq_multiple_threads + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) + + target_link_libraries(bm_cq_multiple_threads + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + benchmark_helpers + grpc_test_util_unsecure + grpc++_unsecure + grpc_unsecure + grpc++_test_config + gpr + address_sorting + upb + ${_gRPC_BENCHMARK_LIBRARIES} + ${_gRPC_GFLAGS_LIBRARIES} + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) + + add_executable(bm_error + test/cpp/microbenchmarks/bm_error.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) + + target_include_directories(bm_error + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) + + target_link_libraries(bm_error + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + benchmark_helpers + grpc_test_util_unsecure + grpc++_unsecure + grpc_unsecure + grpc++_test_config + gpr + address_sorting + upb + ${_gRPC_BENCHMARK_LIBRARIES} + ${_gRPC_GFLAGS_LIBRARIES} + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) + + add_executable(bm_fullstack_streaming_ping_pong + test/cpp/microbenchmarks/bm_fullstack_streaming_ping_pong.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) + + target_include_directories(bm_fullstack_streaming_ping_pong + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) + + target_link_libraries(bm_fullstack_streaming_ping_pong + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + benchmark_helpers + grpc_test_util_unsecure + grpc++_unsecure + grpc_unsecure + grpc++_test_config + gpr + address_sorting + upb + ${_gRPC_BENCHMARK_LIBRARIES} + ${_gRPC_GFLAGS_LIBRARIES} + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) + + add_executable(bm_fullstack_streaming_pump + test/cpp/microbenchmarks/bm_fullstack_streaming_pump.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) + + target_include_directories(bm_fullstack_streaming_pump + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) + + target_link_libraries(bm_fullstack_streaming_pump + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + benchmark_helpers + grpc_test_util_unsecure + grpc++_unsecure + grpc_unsecure + grpc++_test_config + gpr + address_sorting + upb + ${_gRPC_BENCHMARK_LIBRARIES} + ${_gRPC_GFLAGS_LIBRARIES} + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(bm_fullstack_trickle + test/cpp/microbenchmarks/bm_fullstack_trickle.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) + + target_include_directories(bm_fullstack_trickle + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) + + target_link_libraries(bm_fullstack_trickle + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + benchmark_helpers + grpc_test_util_unsecure + grpc++_unsecure + grpc_unsecure + grpc++_test_config + gpr + address_sorting + upb + ${_gRPC_BENCHMARK_LIBRARIES} + ${_gRPC_GFLAGS_LIBRARIES} + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) + + add_executable(bm_fullstack_unary_ping_pong + test/cpp/microbenchmarks/bm_fullstack_unary_ping_pong.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) + + target_include_directories(bm_fullstack_unary_ping_pong + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) + + target_link_libraries(bm_fullstack_unary_ping_pong + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + benchmark_helpers + grpc_test_util_unsecure + grpc++_unsecure + grpc_unsecure + grpc++_test_config + gpr + address_sorting + upb + ${_gRPC_BENCHMARK_LIBRARIES} + ${_gRPC_GFLAGS_LIBRARIES} + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) + + add_executable(bm_metadata + test/cpp/microbenchmarks/bm_metadata.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) + + target_include_directories(bm_metadata + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) + + target_link_libraries(bm_metadata + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + benchmark_helpers + grpc_test_util_unsecure + grpc++_unsecure + grpc_unsecure + grpc++_test_config + gpr + address_sorting + upb + ${_gRPC_BENCHMARK_LIBRARIES} + ${_gRPC_GFLAGS_LIBRARIES} + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) + + add_executable(bm_pollset + test/cpp/microbenchmarks/bm_pollset.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) + + target_include_directories(bm_pollset + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) + + target_link_libraries(bm_pollset + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + benchmark_helpers + grpc_test_util_unsecure + grpc++_unsecure + grpc_unsecure + grpc++_test_config + gpr + address_sorting + upb + ${_gRPC_BENCHMARK_LIBRARIES} + ${_gRPC_GFLAGS_LIBRARIES} + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(bm_threadpool + test/cpp/microbenchmarks/bm_threadpool.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) + + target_include_directories(bm_threadpool + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) + + target_link_libraries(bm_threadpool + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + benchmark_helpers + grpc_test_util_unsecure + grpc++_unsecure + grpc_unsecure + grpc++_test_config + gpr + address_sorting + upb + ${_gRPC_BENCHMARK_LIBRARIES} + ${_gRPC_GFLAGS_LIBRARIES} + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) + + add_executable(bm_timer + test/cpp/microbenchmarks/bm_timer.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) + + target_include_directories(bm_timer + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) + + target_link_libraries(bm_timer + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + benchmark_helpers + grpc_test_util_unsecure + grpc++_unsecure + grpc_unsecure + grpc++_test_config + gpr + address_sorting + upb + ${_gRPC_BENCHMARK_LIBRARIES} + ${_gRPC_GFLAGS_LIBRARIES} + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) + +add_executable(byte_buffer_test + test/cpp/util/byte_buffer_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(byte_buffer_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(byte_buffer_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(byte_stream_test + test/core/transport/byte_stream_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(byte_stream_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(byte_stream_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(cancel_ares_query_test + test/core/end2end/cq_verifier.cc + test/cpp/naming/cancel_ares_query_test.cc + test/cpp/naming/dns_test_util.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(cancel_ares_query_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(cancel_ares_query_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc++_test_config + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(cfstream_test + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.h + test/cpp/end2end/cfstream_test.cc + test/cpp/end2end/test_service_impl.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(cfstream_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(cfstream_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(channel_arguments_test + test/cpp/common/channel_arguments_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(channel_arguments_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(channel_arguments_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(channel_filter_test + test/cpp/common/channel_filter_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(channel_filter_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(channel_filter_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(channel_trace_test + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/channelz/channelz.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/channelz/channelz.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/channelz/channelz.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/channelz/channelz.grpc.pb.h + test/core/channel/channel_trace_test.cc + test/cpp/util/channel_trace_proto_helper.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(channel_trace_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(channel_trace_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(channelz_registry_test + test/core/channel/channelz_registry_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(channelz_registry_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(channelz_registry_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(channelz_service_test + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.h + test/cpp/end2end/channelz_service_test.cc + test/cpp/end2end/test_service_impl.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(channelz_service_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(channelz_service_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpcpp_channelz + grpc++_test_util + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(channelz_test + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/channelz/channelz.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/channelz/channelz.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/channelz/channelz.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/channelz/channelz.grpc.pb.h + test/core/channel/channelz_test.cc + test/cpp/util/channel_trace_proto_helper.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(channelz_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(channelz_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(cli_call_test + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/reflection/v1alpha/reflection.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/reflection/v1alpha/reflection.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.h + test/cpp/util/cli_call.cc + test/cpp/util/cli_call_test.cc + test/cpp/util/cli_credentials.cc + test/cpp/util/grpc_tool.cc + test/cpp/util/proto_file_parser.cc + test/cpp/util/proto_reflection_descriptor_database.cc + test/cpp/util/service_describer.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(cli_call_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(cli_call_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(client_callback_end2end_test + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.h + test/cpp/end2end/client_callback_end2end_test.cc + test/cpp/end2end/interceptors_util.cc + test/cpp/end2end/test_service_impl.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(client_callback_end2end_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(client_callback_end2end_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(client_channel_stress_test + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/lb/v1/load_balancer.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/lb/v1/load_balancer.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/lb/v1/load_balancer.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/lb/v1/load_balancer.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.h + test/cpp/client/client_channel_stress_test.cc + test/cpp/end2end/test_service_impl.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) + + target_include_directories(client_channel_stress_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) + + target_link_libraries(client_channel_stress_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) + +add_executable(client_interceptors_end2end_test + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.h + test/cpp/end2end/client_interceptors_end2end_test.cc + test/cpp/end2end/interceptors_util.cc + test/cpp/end2end/test_service_impl.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(client_interceptors_end2end_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(client_interceptors_end2end_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(client_lb_end2end_test + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/orca_load_report_for_test.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/orca_load_report_for_test.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/orca_load_report_for_test.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/orca_load_report_for_test.grpc.pb.h + test/core/util/test_lb_policies.cc + test/cpp/end2end/client_lb_end2end_test.cc + test/cpp/end2end/test_service_impl.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) + + target_include_directories(client_lb_end2end_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) + + target_link_libraries(client_lb_end2end_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) + +add_executable(codegen_test_full + test/cpp/codegen/codegen_test_full.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(codegen_test_full + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(codegen_test_full + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(codegen_test_minimal + test/cpp/codegen/codegen_test_minimal.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(codegen_test_minimal + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(codegen_test_minimal + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(connection_prefix_bad_client_test + test/core/bad_client/bad_client.cc + test/core/bad_client/tests/connection_prefix.cc + test/core/end2end/cq_verifier.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(connection_prefix_bad_client_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(connection_prefix_bad_client_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(connectivity_state_test + test/core/transport/connectivity_state_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(connectivity_state_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(connectivity_state_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(context_list_test + test/core/transport/chttp2/context_list_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(context_list_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(context_list_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(delegating_channel_test + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.h + test/cpp/end2end/delegating_channel_test.cc + test/cpp/end2end/test_service_impl.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(delegating_channel_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(delegating_channel_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(destroy_grpclb_channel_with_active_connect_stress_test + test/cpp/client/destroy_grpclb_channel_with_active_connect_stress_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(destroy_grpclb_channel_with_active_connect_stress_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(destroy_grpclb_channel_with_active_connect_stress_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(duplicate_header_bad_client_test + test/core/bad_client/bad_client.cc + test/core/bad_client/tests/duplicate_header.cc + test/core/end2end/cq_verifier.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(duplicate_header_bad_client_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(duplicate_header_bad_client_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(end2end_test + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.h + test/cpp/end2end/end2end_test.cc + test/cpp/end2end/interceptors_util.cc + test/cpp/end2end/test_service_impl.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(end2end_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(end2end_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc++_test + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(error_details_test + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.h + test/cpp/util/error_details_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(error_details_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(error_details_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_error_details + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(eventmanager_libuv_test + test/core/iomgr/poller/eventmanager_libuv_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(eventmanager_libuv_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(eventmanager_libuv_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(exception_test + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.h + test/cpp/end2end/exception_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(exception_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(exception_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(filter_end2end_test + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.h + test/cpp/end2end/filter_end2end_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(filter_end2end_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(filter_end2end_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(flaky_network_test + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.h + test/cpp/end2end/flaky_network_test.cc + test/cpp/end2end/test_service_impl.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(flaky_network_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(flaky_network_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(generic_end2end_test + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.h + test/cpp/end2end/generic_end2end_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(generic_end2end_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(generic_end2end_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(global_config_env_test + test/core/gprpp/global_config_env_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) + + target_include_directories(global_config_env_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) + + target_link_libraries(global_config_env_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) + +add_executable(global_config_test + test/core/gprpp/global_config_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(global_config_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(global_config_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(grpc_cli + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/reflection/v1alpha/reflection.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/reflection/v1alpha/reflection.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.h + test/cpp/util/cli_call.cc + test/cpp/util/cli_credentials.cc + test/cpp/util/grpc_cli.cc + test/cpp/util/grpc_tool.cc + test/cpp/util/proto_file_parser.cc + test/cpp/util/proto_reflection_descriptor_database.cc + test/cpp/util/service_describer.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(grpc_cli + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(grpc_cli + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++ + grpc++_test_config + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_CODEGEN AND gRPC_BUILD_GRPC_CPP_PLUGIN) + +add_executable(grpc_cpp_plugin + src/compiler/cpp_plugin.cc +) + +target_include_directories(grpc_cpp_plugin + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(grpc_cpp_plugin + ${_gRPC_PROTOBUF_PROTOC_LIBRARIES} + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_plugin_support +) + + + +if(gRPC_INSTALL) + install(TARGETS grpc_cpp_plugin EXPORT gRPCTargets + RUNTIME DESTINATION ${gRPC_INSTALL_BINDIR} + LIBRARY DESTINATION ${gRPC_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${gRPC_INSTALL_LIBDIR} + ) +endif() + +endif() +if(gRPC_BUILD_CODEGEN AND gRPC_BUILD_GRPC_CSHARP_PLUGIN) + +add_executable(grpc_csharp_plugin + src/compiler/csharp_plugin.cc +) + +target_include_directories(grpc_csharp_plugin + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(grpc_csharp_plugin + ${_gRPC_PROTOBUF_PROTOC_LIBRARIES} + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_plugin_support +) + + + +if(gRPC_INSTALL) + install(TARGETS grpc_csharp_plugin EXPORT gRPCTargets + RUNTIME DESTINATION ${gRPC_INSTALL_BINDIR} + LIBRARY DESTINATION ${gRPC_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${gRPC_INSTALL_LIBDIR} + ) +endif() + +endif() +if(gRPC_BUILD_CODEGEN AND gRPC_BUILD_GRPC_NODE_PLUGIN) + +add_executable(grpc_node_plugin + src/compiler/node_plugin.cc +) + +target_include_directories(grpc_node_plugin + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(grpc_node_plugin + ${_gRPC_PROTOBUF_PROTOC_LIBRARIES} + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_plugin_support +) + + + +if(gRPC_INSTALL) + install(TARGETS grpc_node_plugin EXPORT gRPCTargets + RUNTIME DESTINATION ${gRPC_INSTALL_BINDIR} + LIBRARY DESTINATION ${gRPC_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${gRPC_INSTALL_LIBDIR} + ) +endif() + +endif() +if(gRPC_BUILD_CODEGEN AND gRPC_BUILD_GRPC_OBJECTIVE_C_PLUGIN) + +add_executable(grpc_objective_c_plugin + src/compiler/objective_c_plugin.cc +) + +target_include_directories(grpc_objective_c_plugin + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(grpc_objective_c_plugin + ${_gRPC_PROTOBUF_PROTOC_LIBRARIES} + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_plugin_support +) + + + +if(gRPC_INSTALL) + install(TARGETS grpc_objective_c_plugin EXPORT gRPCTargets + RUNTIME DESTINATION ${gRPC_INSTALL_BINDIR} + LIBRARY DESTINATION ${gRPC_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${gRPC_INSTALL_LIBDIR} + ) +endif() + +endif() +if(gRPC_BUILD_CODEGEN AND gRPC_BUILD_GRPC_PHP_PLUGIN) + +add_executable(grpc_php_plugin + src/compiler/php_plugin.cc +) + +target_include_directories(grpc_php_plugin + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(grpc_php_plugin + ${_gRPC_PROTOBUF_PROTOC_LIBRARIES} + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_plugin_support +) + + + +if(gRPC_INSTALL) + install(TARGETS grpc_php_plugin EXPORT gRPCTargets + RUNTIME DESTINATION ${gRPC_INSTALL_BINDIR} + LIBRARY DESTINATION ${gRPC_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${gRPC_INSTALL_LIBDIR} + ) +endif() + +endif() +if(gRPC_BUILD_CODEGEN AND gRPC_BUILD_GRPC_PYTHON_PLUGIN) + +add_executable(grpc_python_plugin + src/compiler/python_plugin.cc +) + +target_include_directories(grpc_python_plugin + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(grpc_python_plugin + ${_gRPC_PROTOBUF_PROTOC_LIBRARIES} + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_plugin_support +) + + + +if(gRPC_INSTALL) + install(TARGETS grpc_python_plugin EXPORT gRPCTargets + RUNTIME DESTINATION ${gRPC_INSTALL_BINDIR} + LIBRARY DESTINATION ${gRPC_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${gRPC_INSTALL_LIBDIR} + ) +endif() + +endif() +if(gRPC_BUILD_CODEGEN AND gRPC_BUILD_GRPC_RUBY_PLUGIN) + +add_executable(grpc_ruby_plugin + src/compiler/ruby_plugin.cc +) + +target_include_directories(grpc_ruby_plugin + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(grpc_ruby_plugin + ${_gRPC_PROTOBUF_PROTOC_LIBRARIES} + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_plugin_support +) + + + +if(gRPC_INSTALL) + install(TARGETS grpc_ruby_plugin EXPORT gRPCTargets + RUNTIME DESTINATION ${gRPC_INSTALL_BINDIR} + LIBRARY DESTINATION ${gRPC_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${gRPC_INSTALL_LIBDIR} + ) +endif() + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(grpc_tls_credentials_options_test + test/core/security/grpc_tls_credentials_options_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(grpc_tls_credentials_options_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(grpc_tls_credentials_options_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(grpc_tool_test + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.h + test/cpp/util/cli_call.cc + test/cpp/util/cli_credentials.cc + test/cpp/util/grpc_tool.cc + test/cpp/util/grpc_tool_test.cc + test/cpp/util/proto_file_parser.cc + test/cpp/util/proto_reflection_descriptor_database.cc + test/cpp/util/service_describer.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) + + target_include_directories(grpc_tool_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) + + target_link_libraries(grpc_tool_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc++_reflection + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) + +add_executable(grpclb_api_test + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/lb/v1/load_balancer.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/lb/v1/load_balancer.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/lb/v1/load_balancer.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/lb/v1/load_balancer.grpc.pb.h + test/cpp/grpclb/grpclb_api_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(grpclb_api_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(grpclb_api_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(grpclb_end2end_test + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/lb/v1/load_balancer.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/lb/v1/load_balancer.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/lb/v1/load_balancer.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/lb/v1/load_balancer.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.h + test/cpp/end2end/grpclb_end2end_test.cc + test/cpp/end2end/test_service_impl.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) + + target_include_directories(grpclb_end2end_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) + + target_link_libraries(grpclb_end2end_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) + +add_executable(h2_ssl_session_reuse_test + test/core/end2end/h2_ssl_session_reuse_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(h2_ssl_session_reuse_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(h2_ssl_session_reuse_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + end2end_tests + grpc_test_util + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(head_of_line_blocking_bad_client_test + test/core/bad_client/bad_client.cc + test/core/bad_client/tests/head_of_line_blocking.cc + test/core/end2end/cq_verifier.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(head_of_line_blocking_bad_client_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(head_of_line_blocking_bad_client_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(headers_bad_client_test + test/core/bad_client/bad_client.cc + test/core/bad_client/tests/headers.cc + test/core/end2end/cq_verifier.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(headers_bad_client_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(headers_bad_client_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(health_service_end2end_test + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/health/v1/health.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/health/v1/health.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/health/v1/health.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/health/v1/health.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.h + test/cpp/end2end/health_service_end2end_test.cc + test/cpp/end2end/test_health_check_service_impl.cc + test/cpp/end2end/test_service_impl.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(health_service_end2end_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(health_service_end2end_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(http2_client + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/empty.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/empty.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/empty.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/empty.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/test.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/test.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/test.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/test.grpc.pb.h + test/cpp/interop/http2_client.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(http2_client + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(http2_client + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc++_test_config + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(hybrid_end2end_test + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.h + test/cpp/end2end/hybrid_end2end_test.cc + test/cpp/end2end/test_service_impl.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(hybrid_end2end_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(hybrid_end2end_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(initial_settings_frame_bad_client_test + test/core/bad_client/bad_client.cc + test/core/bad_client/tests/initial_settings_frame.cc + test/core/end2end/cq_verifier.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(initial_settings_frame_bad_client_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(initial_settings_frame_bad_client_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(interop_client + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/empty.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/empty.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/empty.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/empty.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/test.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/test.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/test.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/test.grpc.pb.h + test/core/security/oauth2_utils.cc + test/cpp/interop/client.cc + test/cpp/interop/client_helper.cc + test/cpp/interop/interop_client.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(interop_client + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(interop_client + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc++_test_config + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(interop_server + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/empty.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/empty.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/empty.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/empty.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/test.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/test.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/test.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/test.grpc.pb.h + test/cpp/interop/interop_server.cc + test/cpp/interop/interop_server_bootstrap.cc + test/cpp/interop/server_helper.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(interop_server + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(interop_server + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc++_test_config + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(interop_test + test/cpp/interop/interop_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) + + target_include_directories(interop_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) + + target_link_libraries(interop_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc++_test_config + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) + +add_executable(json_test + test/core/json/json_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(json_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(json_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(large_metadata_bad_client_test + test/core/bad_client/bad_client.cc + test/core/bad_client/tests/large_metadata.cc + test/core/end2end/cq_verifier.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(large_metadata_bad_client_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(large_metadata_bad_client_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(lb_get_cpu_stats_test + src/cpp/server/load_reporter/get_cpu_stats_linux.cc + src/cpp/server/load_reporter/get_cpu_stats_macos.cc + src/cpp/server/load_reporter/get_cpu_stats_unsupported.cc + src/cpp/server/load_reporter/get_cpu_stats_windows.cc + test/cpp/server/load_reporter/get_cpu_stats_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(lb_get_cpu_stats_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(lb_get_cpu_stats_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(lb_load_data_store_test + src/cpp/server/load_reporter/load_data_store.cc + test/cpp/server/load_reporter/load_data_store_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(lb_load_data_store_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(lb_load_data_store_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(linux_system_roots_test + test/core/security/linux_system_roots_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(linux_system_roots_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(linux_system_roots_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(message_allocator_end2end_test + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.h + test/cpp/end2end/message_allocator_end2end_test.cc + test/cpp/end2end/test_service_impl.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(message_allocator_end2end_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(message_allocator_end2end_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(mock_test + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.h + test/cpp/end2end/mock_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(mock_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(mock_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc++_test + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(nonblocking_test + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.h + test/cpp/end2end/nonblocking_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(nonblocking_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(nonblocking_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(noop-benchmark + test/cpp/microbenchmarks/noop-benchmark.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(noop-benchmark + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(noop-benchmark + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ${_gRPC_BENCHMARK_LIBRARIES} + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(orphanable_test + test/core/gprpp/orphanable_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(orphanable_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(orphanable_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(out_of_bounds_bad_client_test + test/core/bad_client/bad_client.cc + test/core/bad_client/tests/out_of_bounds.cc + test/core/end2end/cq_verifier.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(out_of_bounds_bad_client_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(out_of_bounds_bad_client_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(pid_controller_test + test/core/transport/pid_controller_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(pid_controller_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(pid_controller_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(port_sharing_end2end_test + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.h + test/cpp/end2end/port_sharing_end2end_test.cc + test/cpp/end2end/test_service_impl.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(port_sharing_end2end_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(port_sharing_end2end_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(proto_server_reflection_test + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.h + test/cpp/end2end/proto_server_reflection_test.cc + test/cpp/end2end/test_service_impl.cc + test/cpp/util/proto_reflection_descriptor_database.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(proto_server_reflection_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(proto_server_reflection_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc++_reflection + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(proto_utils_test + test/cpp/codegen/proto_utils_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(proto_utils_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(proto_utils_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(qps_json_driver + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/core/stats.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/core/stats.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/core/stats.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/core/stats.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/benchmark_service.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/benchmark_service.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/benchmark_service.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/benchmark_service.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/control.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/control.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/control.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/control.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/payloads.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/payloads.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/payloads.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/payloads.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/report_qps_scenario_service.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/report_qps_scenario_service.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/report_qps_scenario_service.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/report_qps_scenario_service.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/stats.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/stats.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/stats.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/stats.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/worker_service.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/worker_service.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/worker_service.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/worker_service.grpc.pb.h + src/cpp/util/core_stats.cc + test/cpp/qps/benchmark_config.cc + test/cpp/qps/client_async.cc + test/cpp/qps/client_callback.cc + test/cpp/qps/client_sync.cc + test/cpp/qps/driver.cc + test/cpp/qps/parse_json.cc + test/cpp/qps/qps_json_driver.cc + test/cpp/qps/qps_server_builder.cc + test/cpp/qps/qps_worker.cc + test/cpp/qps/report.cc + test/cpp/qps/server_async.cc + test/cpp/qps/server_callback.cc + test/cpp/qps/server_sync.cc + test/cpp/qps/usage_timer.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(qps_json_driver + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(qps_json_driver + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc++_test_config + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(qps_worker + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/core/stats.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/core/stats.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/core/stats.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/core/stats.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/benchmark_service.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/benchmark_service.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/benchmark_service.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/benchmark_service.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/control.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/control.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/control.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/control.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/payloads.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/payloads.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/payloads.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/payloads.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/stats.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/stats.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/stats.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/stats.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/worker_service.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/worker_service.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/worker_service.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/worker_service.grpc.pb.h + src/cpp/util/core_stats.cc + test/cpp/qps/client_async.cc + test/cpp/qps/client_callback.cc + test/cpp/qps/client_sync.cc + test/cpp/qps/qps_server_builder.cc + test/cpp/qps/qps_worker.cc + test/cpp/qps/server_async.cc + test/cpp/qps/server_callback.cc + test/cpp/qps/server_sync.cc + test/cpp/qps/usage_timer.cc + test/cpp/qps/worker.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(qps_worker + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(qps_worker + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc++_test_config + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(raw_end2end_test + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.h + test/cpp/end2end/raw_end2end_test.cc + test/cpp/end2end/test_service_impl.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(raw_end2end_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(raw_end2end_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(ref_counted_ptr_test + test/core/gprpp/ref_counted_ptr_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(ref_counted_ptr_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(ref_counted_ptr_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(ref_counted_test + test/core/gprpp/ref_counted_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(ref_counted_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(ref_counted_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(retry_throttle_test + test/core/client_channel/retry_throttle_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(retry_throttle_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(retry_throttle_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(secure_auth_context_test + test/cpp/common/secure_auth_context_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(secure_auth_context_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(secure_auth_context_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(server_builder_plugin_test + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.h + test/cpp/end2end/server_builder_plugin_test.cc + test/cpp/end2end/test_service_impl.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(server_builder_plugin_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(server_builder_plugin_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(server_builder_test + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.h + test/cpp/server/server_builder_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) + + target_include_directories(server_builder_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) + + target_link_libraries(server_builder_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util_unsecure + grpc++_unsecure + grpc_unsecure + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(server_builder_with_socket_mutator_test + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.h + test/cpp/server/server_builder_with_socket_mutator_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) + + target_include_directories(server_builder_with_socket_mutator_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) + + target_link_libraries(server_builder_with_socket_mutator_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util_unsecure + grpc++_unsecure + grpc_unsecure + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) + +add_executable(server_context_test_spouse_test + test/cpp/test/server_context_test_spouse_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(server_context_test_spouse_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(server_context_test_spouse_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc++_test + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(server_early_return_test + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.h + test/cpp/end2end/server_early_return_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(server_early_return_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(server_early_return_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(server_interceptors_end2end_test + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.h + test/cpp/end2end/interceptors_util.cc + test/cpp/end2end/server_interceptors_end2end_test.cc + test/cpp/end2end/test_service_impl.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(server_interceptors_end2end_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(server_interceptors_end2end_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(server_registered_method_bad_client_test + test/core/bad_client/bad_client.cc + test/core/bad_client/tests/server_registered_method.cc + test/core/end2end/cq_verifier.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(server_registered_method_bad_client_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(server_registered_method_bad_client_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(server_request_call_test + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.h + test/cpp/server/server_request_call_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) + + target_include_directories(server_request_call_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) + + target_link_libraries(server_request_call_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util_unsecure + grpc++_unsecure + grpc_unsecure + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) + +add_executable(service_config_end2end_test + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.h + test/cpp/end2end/service_config_end2end_test.cc + test/cpp/end2end/test_service_impl.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(service_config_end2end_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(service_config_end2end_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(service_config_test + test/core/client_channel/service_config_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(service_config_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(service_config_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(settings_timeout_test + test/core/transport/chttp2/settings_timeout_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(settings_timeout_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(settings_timeout_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(shutdown_test + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.h + test/cpp/end2end/shutdown_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(shutdown_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(shutdown_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(simple_request_bad_client_test + test/core/bad_client/bad_client.cc + test/core/bad_client/tests/simple_request.cc + test/core/end2end/cq_verifier.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(simple_request_bad_client_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(simple_request_bad_client_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(slice_hash_table_test + test/core/slice/slice_hash_table_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(slice_hash_table_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(slice_hash_table_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(slice_weak_hash_table_test + test/core/slice/slice_weak_hash_table_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(slice_weak_hash_table_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(slice_weak_hash_table_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(static_metadata_test + test/core/transport/static_metadata_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(static_metadata_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(static_metadata_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(stats_test + test/core/debug/stats_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(stats_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(stats_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(status_metadata_test + test/core/transport/status_metadata_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(status_metadata_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(status_metadata_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(status_util_test + test/core/channel/status_util_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(status_util_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(status_util_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(streaming_throughput_test + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.h + test/cpp/end2end/streaming_throughput_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) + + target_include_directories(streaming_throughput_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) + + target_link_libraries(streaming_throughput_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) + +add_executable(string_ref_test + test/cpp/util/string_ref_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(string_ref_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(string_ref_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(test_cpp_client_credentials_test + test/cpp/client/credentials_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(test_cpp_client_credentials_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(test_cpp_client_credentials_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(test_cpp_util_slice_test + test/cpp/util/slice_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(test_cpp_util_slice_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(test_cpp_util_slice_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(test_cpp_util_time_test + test/cpp/util/time_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(test_cpp_util_time_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(test_cpp_util_time_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(thread_manager_test + test/cpp/thread_manager/thread_manager_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(thread_manager_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(thread_manager_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc++_test_config + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(thread_stress_test + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.h + test/cpp/end2end/thread_stress_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) + + target_include_directories(thread_stress_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) + + target_link_libraries(thread_stress_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(time_jump_test + test/cpp/common/time_jump_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) + + target_include_directories(time_jump_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) + + target_link_libraries(time_jump_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) + +add_executable(timer_test + test/cpp/common/timer_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(timer_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(timer_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(tls_security_connector_test + test/core/security/tls_security_connector_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(tls_security_connector_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(tls_security_connector_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(unknown_frame_bad_client_test + test/core/bad_client/bad_client.cc + test/core/bad_client/tests/unknown_frame.cc + test/core/end2end/cq_verifier.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(unknown_frame_bad_client_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(unknown_frame_bad_client_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(window_overflow_bad_client_test + test/core/bad_client/bad_client.cc + test/core/bad_client/tests/window_overflow.cc + test/core/end2end/cq_verifier.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(window_overflow_bad_client_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(window_overflow_bad_client_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(work_serializer_test + test/core/iomgr/work_serializer_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) + + target_include_directories(work_serializer_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) + + target_link_libraries(work_serializer_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(writes_per_rpc_test + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.h + test/core/util/cmdline.cc + test/core/util/debugger_macros.cc + test/core/util/fuzzer_util.cc + test/core/util/grpc_profiler.cc + test/core/util/histogram.cc + test/core/util/memory_counters.cc + test/core/util/mock_endpoint.cc + test/core/util/parse_hexstring.cc + test/core/util/passthru_endpoint.cc + test/core/util/port.cc + test/core/util/port_isolated_runtime_environment.cc + test/core/util/port_server_client.cc + test/core/util/reconnect_server.cc + test/core/util/slice_splitter.cc + test/core/util/subprocess_posix.cc + test/core/util/subprocess_windows.cc + test/core/util/test_config.cc + test/core/util/test_tcp_server.cc + test/core/util/tracer_util.cc + test/core/util/trickle_endpoint.cc + test/cpp/performance/writes_per_rpc_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) + + target_include_directories(writes_per_rpc_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) + + target_link_libraries(writes_per_rpc_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) + +add_executable(xds_bootstrap_test + test/core/client_channel/xds_bootstrap_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(xds_bootstrap_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(xds_bootstrap_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + + add_executable(xds_end2end_test + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/ads_for_test.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/ads_for_test.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/ads_for_test.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/ads_for_test.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/cds_for_test.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/cds_for_test.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/cds_for_test.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/cds_for_test.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/eds_for_test.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/eds_for_test.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/eds_for_test.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/eds_for_test.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/lds_rds_for_test.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/lds_rds_for_test.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/lds_rds_for_test.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/lds_rds_for_test.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/lrs_for_test.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/lrs_for_test.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/lrs_for_test.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/lrs_for_test.grpc.pb.h + test/cpp/end2end/test_service_impl.cc + test/cpp/end2end/xds_end2end_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc + ) + + target_include_directories(xds_end2end_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} + ) + + target_link_libraries(xds_end2end_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} + ) + + +endif() +endif() +if(gRPC_BUILD_TESTS) + +add_executable(xds_interop_client + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/empty.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/empty.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/empty.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/empty.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/test.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/test.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/test.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/test.grpc.pb.h + test/cpp/interop/xds_interop_client.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(xds_interop_client + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(xds_interop_client + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc++ + grpc++_test_config + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(xds_interop_server + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/empty.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/empty.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/empty.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/empty.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/messages.grpc.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/test.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/test.grpc.pb.cc + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/test.pb.h + ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/test.grpc.pb.h + test/cpp/interop/xds_interop_server.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(xds_interop_server + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(xds_interop_server + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc++ + grpc++_test_config + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(alts_credentials_fuzzer_one_entry + test/core/security/alts_credentials_fuzzer.cc + test/core/util/one_corpus_entry_fuzzer.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(alts_credentials_fuzzer_one_entry + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(alts_credentials_fuzzer_one_entry + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc++_test_config + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(client_fuzzer_one_entry + test/core/end2end/fuzzers/client_fuzzer.cc + test/core/util/one_corpus_entry_fuzzer.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(client_fuzzer_one_entry + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(client_fuzzer_one_entry + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc++_test_config + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(hpack_parser_fuzzer_test_one_entry + test/core/transport/chttp2/hpack_parser_fuzzer_test.cc + test/core/util/one_corpus_entry_fuzzer.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(hpack_parser_fuzzer_test_one_entry + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(hpack_parser_fuzzer_test_one_entry + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc++_test_config + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(http_request_fuzzer_test_one_entry + test/core/http/request_fuzzer.cc + test/core/util/one_corpus_entry_fuzzer.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(http_request_fuzzer_test_one_entry + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(http_request_fuzzer_test_one_entry + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc++_test_config + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(http_response_fuzzer_test_one_entry + test/core/http/response_fuzzer.cc + test/core/util/one_corpus_entry_fuzzer.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(http_response_fuzzer_test_one_entry + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(http_response_fuzzer_test_one_entry + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc++_test_config + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(json_fuzzer_test_one_entry + test/core/json/fuzzer.cc + test/core/util/one_corpus_entry_fuzzer.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(json_fuzzer_test_one_entry + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(json_fuzzer_test_one_entry + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc++_test_config + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(nanopb_fuzzer_response_test_one_entry + test/core/nanopb/fuzzer_response.cc + test/core/util/one_corpus_entry_fuzzer.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(nanopb_fuzzer_response_test_one_entry + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(nanopb_fuzzer_response_test_one_entry + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc++_test_config + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(nanopb_fuzzer_serverlist_test_one_entry + test/core/nanopb/fuzzer_serverlist.cc + test/core/util/one_corpus_entry_fuzzer.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(nanopb_fuzzer_serverlist_test_one_entry + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(nanopb_fuzzer_serverlist_test_one_entry + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc++_test_config + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(percent_decode_fuzzer_one_entry + test/core/slice/percent_decode_fuzzer.cc + test/core/util/one_corpus_entry_fuzzer.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(percent_decode_fuzzer_one_entry + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(percent_decode_fuzzer_one_entry + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc++_test_config + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(percent_encode_fuzzer_one_entry + test/core/slice/percent_encode_fuzzer.cc + test/core/util/one_corpus_entry_fuzzer.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(percent_encode_fuzzer_one_entry + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(percent_encode_fuzzer_one_entry + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc++_test_config + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(server_fuzzer_one_entry + test/core/end2end/fuzzers/server_fuzzer.cc + test/core/util/one_corpus_entry_fuzzer.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(server_fuzzer_one_entry + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(server_fuzzer_one_entry + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc++_test_config + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(ssl_server_fuzzer_one_entry + test/core/security/ssl_server_fuzzer.cc + test/core/util/one_corpus_entry_fuzzer.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(ssl_server_fuzzer_one_entry + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(ssl_server_fuzzer_one_entry + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc++_test_config + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(uri_fuzzer_test_one_entry + test/core/client_channel/uri_fuzzer_test.cc + test/core/util/one_corpus_entry_fuzzer.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(uri_fuzzer_test_one_entry + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(uri_fuzzer_test_one_entry + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc++_test_config + grpc + gpr + address_sorting + upb + ${_gRPC_GFLAGS_LIBRARIES} +) + + +endif() + + + + + + + +if(gRPC_INSTALL) + install(EXPORT gRPCTargets + DESTINATION ${gRPC_INSTALL_CMAKEDIR} + NAMESPACE gRPC:: + ) +endif() + +include(CMakePackageConfigHelpers) + +configure_file(cmake/gRPCConfig.cmake.in + gRPCConfig.cmake @ONLY) +write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/gRPCConfigVersion.cmake + VERSION ${PACKAGE_VERSION} + COMPATIBILITY AnyNewerVersion) +install(FILES + ${CMAKE_CURRENT_BINARY_DIR}/gRPCConfig.cmake + ${CMAKE_CURRENT_BINARY_DIR}/gRPCConfigVersion.cmake + DESTINATION ${gRPC_INSTALL_CMAKEDIR} +) +install(FILES + ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules/Findc-ares.cmake + DESTINATION ${gRPC_INSTALL_CMAKEDIR}/modules +) + +install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/etc/roots.pem + DESTINATION ${gRPC_INSTALL_SHAREDIR}) + +# Function to generate pkg-config files. +function(generate_pkgconfig name description version requires + libs libs_private output_filename) + set(PC_NAME "${name}") + set(PC_DESCRIPTION "${description}") + set(PC_VERSION "${version}") + set(PC_REQUIRES "${requires}") + set(PC_LIB "${libs}") + set(PC_LIBS_PRIVATE "${libs_private}") + set(output_filepath "${grpc_BINARY_DIR}/libs/opt/pkgconfig/${output_filename}") + configure_file( + "${grpc_SOURCE_DIR}/cmake/pkg-config-template.pc.in" + "${output_filepath}" + @ONLY) + install(FILES "${output_filepath}" + DESTINATION "lib/pkgconfig/") +endfunction() + +# gpr .pc file +generate_pkgconfig( + "gpr" + "gRPC platform support library" + "${gRPC_CORE_VERSION}" + "" + "-lgpr -labsl_str_format_internal -labsl_time -labsl_time_zone -labsl_civil_time -labsl_strings -labsl_strings_internal -labsl_throw_delegate -labsl_int128 -labsl_base -labsl_spinlock_wait -labsl_raw_logging_internal -labsl_log_severity -labsl_dynamic_annotations" + "" + "gpr.pc") + +# grpc .pc file +generate_pkgconfig( + "gRPC" + "high performance general RPC framework" + "${gRPC_CORE_VERSION}" + "gpr openssl" + "-lgrpc -laddress_sorting -lupb -lcares -lz -labsl_bad_optional_access -labsl_str_format_internal -labsl_time -labsl_time_zone -labsl_civil_time -labsl_strings -labsl_strings_internal -labsl_throw_delegate -labsl_int128 -labsl_base -labsl_spinlock_wait -labsl_raw_logging_internal -labsl_log_severity -labsl_dynamic_annotations" + "" + "grpc.pc") + +# grpc_unsecure .pc file +generate_pkgconfig( + "gRPC unsecure" + "high performance general RPC framework without SSL" + "${gRPC_CORE_VERSION}" + "gpr" + "-lgrpc_unsecure -labsl_bad_optional_access -labsl_str_format_internal -labsl_time -labsl_time_zone -labsl_civil_time -labsl_strings -labsl_strings_internal -labsl_throw_delegate -labsl_int128 -labsl_base -labsl_spinlock_wait -labsl_raw_logging_internal -labsl_log_severity -labsl_dynamic_annotations" + "" + "grpc_unsecure.pc") + +# grpc++ .pc file +generate_pkgconfig( + "gRPC++" + "C++ wrapper for gRPC" + "${PACKAGE_VERSION}" + "grpc" + "-lgrpc++ -labsl_bad_optional_access -labsl_str_format_internal -labsl_time -labsl_time_zone -labsl_civil_time -labsl_strings -labsl_strings_internal -labsl_throw_delegate -labsl_int128 -labsl_base -labsl_spinlock_wait -labsl_raw_logging_internal -labsl_log_severity -labsl_dynamic_annotations" + "" + "grpc++.pc") + +# grpc++_unsecure .pc file +generate_pkgconfig( + "gRPC++ unsecure" + "C++ wrapper for gRPC without SSL" + "${PACKAGE_VERSION}" + "grpc_unsecure" + "-lgrpc++_unsecure -labsl_bad_optional_access -labsl_str_format_internal -labsl_time -labsl_time_zone -labsl_civil_time -labsl_strings -labsl_strings_internal -labsl_throw_delegate -labsl_int128 -labsl_base -labsl_spinlock_wait -labsl_raw_logging_internal -labsl_log_severity -labsl_dynamic_annotations" + "" + "grpc++_unsecure.pc") diff --git a/CODE-OF-CONDUCT.md b/CODE-OF-CONDUCT.md new file mode 100644 index 00000000..9d4213eb --- /dev/null +++ b/CODE-OF-CONDUCT.md @@ -0,0 +1,3 @@ +## Community Code of Conduct + +gRPC follows the [CNCF Code of Conduct](https://github.com/cncf/foundation/blob/master/code-of-conduct.md). diff --git a/CONCEPTS.md b/CONCEPTS.md new file mode 100644 index 00000000..034d58e4 --- /dev/null +++ b/CONCEPTS.md @@ -0,0 +1,63 @@ +# gRPC Concepts Overview + +Remote Procedure Calls (RPCs) provide a useful abstraction for building +distributed applications and services. The libraries in this repository +provide a concrete implementation of the gRPC protocol, layered over HTTP/2. +These libraries enable communication between clients and servers using any +combination of the supported languages. + + +## Interface + +Developers using gRPC start with a language agnostic description of an RPC service (a collection +of methods). From this description, gRPC will generate client and server side interfaces +in any of the supported languages. The server implements +the service interface, which can be remotely invoked by the client interface. + +By default, gRPC uses [Protocol Buffers](https://github.com/google/protobuf) as the +Interface Definition Language (IDL) for describing both the service interface +and the structure of the payload messages. It is possible to use other +alternatives if desired. + +### Invoking & handling remote calls +Starting from an interface definition in a .proto file, gRPC provides +Protocol Compiler plugins that generate Client- and Server-side APIs. +gRPC users call into these APIs on the Client side and implement +the corresponding API on the server side. + +#### Synchronous vs. asynchronous +Synchronous RPC calls, that block until a response arrives from the server, are +the closest approximation to the abstraction of a procedure call that RPC +aspires to. + +On the other hand, networks are inherently asynchronous and in many scenarios, +it is desirable to have the ability to start RPCs without blocking the current +thread. + +The gRPC programming surface in most languages comes in both synchronous and +asynchronous flavors. + + +## Streaming + +gRPC supports streaming semantics, where either the client or the server (or both) +send a stream of messages on a single RPC call. The most general case is +Bidirectional Streaming where a single gRPC call establishes a stream in which both +the client and the server can send a stream of messages to each other. The streamed +messages are delivered in the order they were sent. + + +# Protocol + +The [gRPC protocol](doc/PROTOCOL-HTTP2.md) specifies the abstract requirements for communication between +clients and servers. A concrete embedding over HTTP/2 completes the picture by +fleshing out the details of each of the required operations. + +## Abstract gRPC protocol +A gRPC call comprises of a bidirectional stream of messages, initiated by the client. In the client-to-server direction, this stream begins with a mandatory `Call Header`, followed by optional `Initial-Metadata`, followed by zero or more `Payload Messages`. The server-to-client direction contains an optional `Initial-Metadata`, followed by zero or more `Payload Messages` terminated with a mandatory `Status` and optional `Status-Metadata` (a.k.a.,`Trailing-Metadata`). + +## Implementation over HTTP/2 +The abstract protocol defined above is implemented over [HTTP/2](https://http2.github.io/). gRPC bidirectional streams are mapped to HTTP/2 streams. The contents of `Call Header` and `Initial Metadata` are sent as HTTP/2 headers and subject to HPACK compression. `Payload Messages` are serialized into a byte stream of length prefixed gRPC frames which are then fragmented into HTTP/2 frames at the sender and reassembled at the receiver. `Status` and `Trailing-Metadata` are sent as HTTP/2 trailing headers (a.k.a., trailers). + +## Flow Control +gRPC uses the flow control mechanism in HTTP/2. This enables fine-grained control of memory used for buffering in-flight messages. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..1d074d8d --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,134 @@ +# How to contribute + +We definitely welcome your patches and contributions to gRPC! Please read the gRPC +organization's [governance rules](https://github.com/grpc/grpc-community/blob/master/governance.md) +and [contribution guidelines](https://github.com/grpc/grpc-community/blob/master/CONTRIBUTING.md) before proceeding. + +If you are new to github, please start by reading [Pull Request +howto](https://help.github.com/articles/about-pull-requests/) + +If you are looking for features to work on, please filter the issues list with the label ["disposition/help wanted"](https://github.com/grpc/grpc/issues?q=label%3A%22disposition%2Fhelp+wanted%22). +Please note that some of these feature requests might have been closed in the past as a result of them being marked as stale due to there being no activity, but these are still valid feature requests. + +## Legal requirements + +In order to protect both you and ourselves, you will need to sign the +[Contributor License +Agreement](https://identity.linuxfoundation.org/projects/cncf). + +## Cloning the repository + +Before starting any development work you will need a local copy of the gRPC repository. +Please follow the instructions in [Building gRPC C++: Clone the repository](BUILDING.md#clone-the-repository-including-submodules). + +## Building & Running tests + +Different languages use different build systems. To hide the complexity +of needing to build with many different build systems, a portable python +script that unifies the experience of building and testing gRPC in different +languages and on different platforms is provided. + +To build gRPC in the language of choice (e.g. `c++`, `csharp`, `php`, `python`, `ruby`, ...) +- Prepare your development environment based on language-specific instructions in `src/YOUR-LANGUAGE` directory. +- The language-specific instructions might involve installing C/C++ prerequisites listed in + [Building gRPC C++: Prerequisites](BUILDING.md#pre-requisites). This is because gRPC implementations + in this repository are using the native gRPC "core" library internally. +- Run + ``` + python tools/run_tests/run_tests.py -l YOUR_LANGUAGE --build_only + ``` +- To also run all the unit tests after building + ``` + python tools/run_tests/run_tests.py -l YOUR_LANGUAGE + ``` + +You can also run `python tools/run_tests/run_tests.py --help` to discover useful command line flags supported. For more details, +see [tools/run_tests](tools/run_tests) where you will also find guidance on how to run various other test suites (e.g. interop tests, benchmarks). + +## Generated project files + +To ease maintenance of language- and platform- specific build systems, many +projects files are generated using templates and should not be edited by hand. +Run `tools/buildgen/generate_projects.sh` to regenerate. See +[templates](templates) for details. + +As a rule of thumb, if you see the "sanity tests" failing you've most likely +edited generated files or you didn't regenerate the projects properly (or your +code formatting doesn't match our code style). + +## Guidelines for Pull Requests +How to get your contributions merged smoothly and quickly. + +- Create **small PRs** that are narrowly focused on **addressing a single + concern**. We often times receive PRs that are trying to fix several things + at a time, but only one fix is considered acceptable, nothing gets merged and + both author's & review's time is wasted. Create more PRs to address different + concerns and everyone will be happy. + +- For speculative changes, consider opening an issue and discussing it first. + If you are suggesting a behavioral or API change, consider starting with a + [gRFC proposal](https://github.com/grpc/proposal). + +- Provide a good **PR description** as a record of **what** change is being made + and **why** it was made. Link to a GitHub issue if it exists. + +- Don't fix code style and formatting unless you are already changing that line + to address an issue. PRs with irrelevant changes won't be merged. If you do + want to fix formatting or style, do that in a separate PR. + +- If you are adding a new file, make sure it has the copyright message template + at the top as a comment. You can copy over the message from an existing file + and update the year. + +- Unless your PR is trivial, you should expect there will be reviewer comments + that you'll need to address before merging. We expect you to be reasonably + responsive to those comments, otherwise the PR will be closed after 2-3 weeks + of inactivity. + +- If you have non-trivial contributions, please consider adding an entry to [the + AUTHORS file](https://github.com/grpc/grpc/blob/master/AUTHORS) listing the + copyright holder for the contribution (yourself, if you are signing the + individual CLA, or your company, for corporate CLAs) in the same PR as your + contribution. This needs to be done only once, for each company, or + individual. Please keep this file in alphabetical order. + +- Maintain **clean commit history** and use **meaningful commit messages**. + PRs with messy commit history are difficult to review and won't be merged. + Use `rebase -i upstream/master` to curate your commit history and/or to + bring in latest changes from master (but avoid rebasing in the middle of + a code review). + +- Keep your PR up to date with upstream/master (if there are merge conflicts, + we can't really merge your change). + +- If you are regenerating the projects using + `tools/buildgen/generate_projects.sh`, make changes to generated files a + separate commit with commit message `regenerate projects`. Mixing changes + to generated and hand-written files make your PR difficult to review. + Note that running this script requires the installation of Python packages + `pyyaml` and `mako` (typically installed using `pip`) as well as a recent + version of [`go`](https://golang.org/doc/install#install). + +- **All tests need to be passing** before your change can be merged. + We recommend you **run tests locally** before creating your PR to catch + breakages early on (see [tools/run_tests](tools/run_tests). Ultimately, the + green signal will be provided by our testing infrastructure. The reviewer + will help you if there are test failures that seem not related to the change + you are making. + +- Exceptions to the rules can be made if there's a compelling reason for doing + so. + +## Obtaining Commit Access +We grant Commit Access to contributors based on the following criteria: +* Sustained contribution to the gRPC project. +* Deep understanding of the areas contributed to, and good consideration of various reliability, usability and performance tradeoffs. +* Contributions demonstrate that obtaining Commit Access will significantly reduce friction for the contributors or others. + +In addition to submitting PRs, a Contributor with Commit Access can: +* Review PRs and merge once other checks and criteria pass. +* Triage bugs and PRs and assign appropriate labels and reviewers. + +### Obtaining Commit Access without Code Contributions +The [gRPC organization](https://github.com/grpc) is comprised of multiple repositories and commit access is usually restricted to one or more of these repositories. Some repositories such as the [grpc.github.io](https://github.com/grpc/grpc.github.io/) do not have code, but the same principle of sustained, high quality contributions, with a good understanding of the fundamentals, apply. + diff --git a/GOVERNANCE.md b/GOVERNANCE.md new file mode 100644 index 00000000..d6ff2674 --- /dev/null +++ b/GOVERNANCE.md @@ -0,0 +1 @@ +This repository is governed by the gRPC organization's [governance rules](https://github.com/grpc/grpc-community/blob/master/governance.md). diff --git a/Gemfile b/Gemfile new file mode 100755 index 00000000..597a7d4f --- /dev/null +++ b/Gemfile @@ -0,0 +1,4 @@ +source 'https://rubygems.org' + +# Specify your gem's dependencies in grpc.gemspec +gemspec diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/MAINTAINERS.md b/MAINTAINERS.md new file mode 100644 index 00000000..f338c6b1 --- /dev/null +++ b/MAINTAINERS.md @@ -0,0 +1,84 @@ +This page lists all active maintainers of this repository. If you were a +maintainer and would like to add your name to the Emeritus list, please send us a +PR. + +See [GOVERNANCE.md](https://github.com/grpc/grpc-community/blob/master/governance.md) +for governance guidelines and how to become a maintainer. +See [CONTRIBUTING.md](https://github.com/grpc/grpc-community/blob/master/CONTRIBUTING.md) +for general contribution guidelines. + +## Maintainers (in alphabetical order) +- [a11r](https://github.com/a11r), Google LLC +- [apolcyn](https://github.com/apolcyn), Google LLC +- [arjunroy](https://github.com/arjunroy), Google LLC +- [AspirinSJL](https://github.com/AspirinSJL), Google LLC +- [bogdandrutu](https://github.com/bogdandrutu), Google LLC +- [daniel-j-born](https://github.com/daniel-j-born), Google LLC +- [dapengzhang0](https://github.com/dapengzhang0), Google LLC +- [dfawley](https://github.com/dfawley), Google LLC +- [dklempner](https://github.com/dklempner), Google LLC +- [ejona86](https://github.com/ejona86), Google LLC +- [ericgribkoff](https://github.com/ericgribkoff), Google LLC +- [gnossen](https://github.com/gnossen), Google LLC +- [guantaol](https://github.com/guantaol), Google LLC +- [hcaseyal](https://github.com/hcaseyal), Google LLC +- [jboeuf](https://github.com/jboeuf), Google LLC +- [jiangtaoli2016](https://github.com/jiangtaoli2016), Google LLC +- [jkolhe](https://github.com/jkolhe), Google LLC +- [jtattermusch](https://github.com/jtattermusch), Google LLC +- [karthikravis](https://github.com/karthikravis), Google LLC +- [kumaralokgithub](https://github.com/kumaralokgithub), Google LLC +- [lidizheng](https://github.com/lidizheng), Google LLC +- [markdroth](https://github.com/markdroth), Google LLC +- [matthewstevenson88](https://github.com/matthewstevenson88), Google LLC +- [mehrdada](https://github.com/mehrdada), Dropbox, Inc. +- [mhaidrygoog](https://github.com/mhaidrygoog), Google LLC +- [murgatroid99](https://github.com/murgatroid99), Google LLC +- [muxi](https://github.com/muxi), Google LLC +- [nanahpang](https://github.com/nanahpang), Google LLC +- [nathanielmanistaatgoogle](https://github.com/nathanielmanistaatgoogle), Google LLC +- [nicolasnoble](https://github.com/nicolasnoble), Google LLC +- [pfreixes](https://github.com/pfreixes), Skyscanner Ltd +- [qixuanl1](https://github.com/qixuanl1), Google LLC +- [ran-su](https://github.com/ran-su), Google LLC +- [rmstar](https://github.com/rmstar), Google LLC +- [sanjaypujare](https://github.com/sanjaypujare), Google LLC +- [sheenaqotj](https://github.com/sheenaqotj), Google LLC +- [soheilhy](https://github.com/soheilhy), Google LLC +- [sreecha](https://github.com/sreecha), LinkedIn +- [srini100](https://github.com/srini100), Google LLC +- [stanley-cheung](https://github.com/stanley-cheung), Google LLC +- [veblush](https://github.com/veblush), Google LLC +- [vishalpowar](https://github.com/vishalpowar), Google LLC +- [Vizerai](https://github.com/Vizerai), Google LLC +- [vjpai](https://github.com/vjpai), Google LLC +- [wcevans](https://github.com/wcevans), Google LLC +- [wenbozhu](https://github.com/wenbozhu), Google LLC +- [yang-g](https://github.com/yang-g), Google LLC +- [yashykt](https://github.com/yashykt), Google LLC +- [yihuazhang](https://github.com/yihuazhang), Google LLC +- [ZhenLian](https://github.com/ZhenLian), Google LLC +- [ZhouyihaiDing](https://github.com/ZhouyihaiDing), Google LLC + + +## Emeritus Maintainers (in alphabetical order) +- [adelez](https://github.com/adelez), Google LLC +- [billfeng327](https://github.com/billfeng327), Google LLC +- [ctiller](https://github.com/ctiller), Google LLC +- [dgquintas](https://github.com/dgquintas), Google LLC +- [fengli79](https://github.com/fengli79), Google LLC +- [jcanizales](https://github.com/jcanizales), Google LLC +- [jpalmerLinuxFoundation](https://github.com/jpalmerLinuxFoundation), Linux Foundation +- [justinburke](https://github.com/justinburke), Google LLC +- [kpayson64](https://github.com/kpayson64), Google LLC +- [lyuxuan](https://github.com/lyuxuan), Google LLC +- [matt-kwong](https://github.com/matt-kwong), Google LLC +- [mit-mit](https://github.com/mit-mit), Google LLC +- [mpwarres](https://github.com/mpwarres), Google LLC +- [ncteisen](https://github.com/ncteisen), Google LLC +- [pmarks-net](https://github.com/pmarks-net), Google LLC +- [slash-lib](https://github.com/slash-lib), Google LLC +- [soltanmm](https://github.com/soltanmm), Google LLC +- [summerxyt](https://github.com/summerxyt), Google LLC +- [y-zeng](https://github.com/y-zeng), Google LLC +- [zpencer](https://github.com/zpencer), Google LLC diff --git a/MANIFEST.md b/MANIFEST.md new file mode 100644 index 00000000..9581e1c9 --- /dev/null +++ b/MANIFEST.md @@ -0,0 +1,23 @@ +# Top-level Items by language + +## Bazel +* [grpc.bzl](grpc.bzl) + +## Objective-C +* [gRPC.podspec](gRPC.podspec) + +## PHP +* [composer.json](composer.json) +* [config.m4](config.m4) +* [package.xml](package.xml) + +## Python +* [requirements.txt](requirements.txt) +* [setup.cfg](setup.cfg) +* [setup.py](setup.py) +* [PYTHON-MANIFEST.in](PYTHON-MANIFEST.in) + +## Ruby +* [Gemfile](Gemfile) +* [grpc.gemspec](grpc.gemspec) +* [Rakefile](Rakefile) diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..b801b219 --- /dev/null +++ b/Makefile @@ -0,0 +1,20074 @@ +# GRPC global makefile +# This currently builds C and C++ code. +# This file has been automatically generated from a template file. +# Please look at the templates directory instead. +# This file can be regenerated from the template by running +# tools/buildgen/generate_projects.sh + +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + + +comma := , + + +# Basic platform detection +HOST_SYSTEM = $(shell uname | cut -f 1 -d_) +SYSTEM ?= $(HOST_SYSTEM) +ifeq ($(SYSTEM),MSYS) +SYSTEM = MINGW32 +endif +ifeq ($(SYSTEM),MINGW64) +SYSTEM = MINGW32 +endif + + +MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST))) +ifndef BUILDDIR +BUILDDIR_ABSOLUTE = $(patsubst %/,%,$(dir $(MAKEFILE_PATH))) +else +BUILDDIR_ABSOLUTE = $(abspath $(BUILDDIR)) +endif + +HAS_GCC = $(shell which gcc > /dev/null 2> /dev/null && echo true || echo false) +HAS_CC = $(shell which cc > /dev/null 2> /dev/null && echo true || echo false) +HAS_CLANG = $(shell which clang > /dev/null 2> /dev/null && echo true || echo false) + +ifeq ($(HAS_CC),true) +DEFAULT_CC = cc +DEFAULT_CXX = c++ +else +ifeq ($(HAS_GCC),true) +DEFAULT_CC = gcc +DEFAULT_CXX = g++ +else +ifeq ($(HAS_CLANG),true) +DEFAULT_CC = clang +DEFAULT_CXX = clang++ +else +DEFAULT_CC = no_c_compiler +DEFAULT_CXX = no_c++_compiler +endif +endif +endif + + +BINDIR = $(BUILDDIR_ABSOLUTE)/bins +OBJDIR = $(BUILDDIR_ABSOLUTE)/objs +LIBDIR = $(BUILDDIR_ABSOLUTE)/libs +GENDIR = $(BUILDDIR_ABSOLUTE)/gens + +# Configurations + +VALID_CONFIG_opt = 1 +CC_opt = $(DEFAULT_CC) +CXX_opt = $(DEFAULT_CXX) +LD_opt = $(DEFAULT_CC) +LDXX_opt = $(DEFAULT_CXX) +CPPFLAGS_opt = -O2 -Wframe-larger-than=16384 +DEFINES_opt = NDEBUG + +VALID_CONFIG_asan-trace-cmp = 1 +REQUIRE_CUSTOM_LIBRARIES_asan-trace-cmp = 1 +CC_asan-trace-cmp = clang +CXX_asan-trace-cmp = clang++ +LD_asan-trace-cmp = clang++ +LDXX_asan-trace-cmp = clang++ +CPPFLAGS_asan-trace-cmp = -O0 -fsanitize-coverage=edge,trace-pc-guard -fsanitize-coverage=trace-cmp -fsanitize=address -fno-omit-frame-pointer -Wno-unused-command-line-argument -DGPR_NO_DIRECT_SYSCALLS +LDFLAGS_asan-trace-cmp = -fsanitize=address + +VALID_CONFIG_dbg = 1 +CC_dbg = $(DEFAULT_CC) +CXX_dbg = $(DEFAULT_CXX) +LD_dbg = $(DEFAULT_CC) +LDXX_dbg = $(DEFAULT_CXX) +CPPFLAGS_dbg = -O0 +DEFINES_dbg = _DEBUG DEBUG + +VALID_CONFIG_asan = 1 +REQUIRE_CUSTOM_LIBRARIES_asan = 1 +CC_asan = clang +CXX_asan = clang++ +LD_asan = clang++ +LDXX_asan = clang++ +CPPFLAGS_asan = -O0 -fsanitize-coverage=edge,trace-pc-guard -fsanitize=address -fno-omit-frame-pointer -Wno-unused-command-line-argument -DGPR_NO_DIRECT_SYSCALLS +LDFLAGS_asan = -fsanitize=address + +VALID_CONFIG_msan = 1 +REQUIRE_CUSTOM_LIBRARIES_msan = 1 +CC_msan = clang +CXX_msan = clang++ +LD_msan = clang++ +LDXX_msan = clang++ +CPPFLAGS_msan = -O0 -stdlib=libc++ -fsanitize-coverage=edge,trace-pc-guard -fsanitize=memory -fsanitize-memory-track-origins -fsanitize-memory-use-after-dtor -fno-omit-frame-pointer -DGTEST_HAS_TR1_TUPLE=0 -DGTEST_USE_OWN_TR1_TUPLE=1 -Wno-unused-command-line-argument -fPIE -pie -DGPR_NO_DIRECT_SYSCALLS +LDFLAGS_msan = -stdlib=libc++ -fsanitize=memory -DGTEST_HAS_TR1_TUPLE=0 -DGTEST_USE_OWN_TR1_TUPLE=1 -fPIE -pie $(if $(JENKINS_BUILD),-Wl$(comma)-Ttext-segment=0x7e0000000000,) +DEFINES_msan = NDEBUG + +VALID_CONFIG_basicprof = 1 +CC_basicprof = $(DEFAULT_CC) +CXX_basicprof = $(DEFAULT_CXX) +LD_basicprof = $(DEFAULT_CC) +LDXX_basicprof = $(DEFAULT_CXX) +CPPFLAGS_basicprof = -O2 -DGRPC_BASIC_PROFILER -DGRPC_TIMERS_RDTSC +DEFINES_basicprof = NDEBUG + +VALID_CONFIG_helgrind = 1 +CC_helgrind = $(DEFAULT_CC) +CXX_helgrind = $(DEFAULT_CXX) +LD_helgrind = $(DEFAULT_CC) +LDXX_helgrind = $(DEFAULT_CXX) +CPPFLAGS_helgrind = -O0 +LDFLAGS_helgrind = -rdynamic +DEFINES_helgrind = _DEBUG DEBUG + +VALID_CONFIG_asan-noleaks = 1 +REQUIRE_CUSTOM_LIBRARIES_asan-noleaks = 1 +CC_asan-noleaks = clang +CXX_asan-noleaks = clang++ +LD_asan-noleaks = clang++ +LDXX_asan-noleaks = clang++ +CPPFLAGS_asan-noleaks = -O0 -fsanitize-coverage=edge,trace-pc-guard -fsanitize=address -fno-omit-frame-pointer -Wno-unused-command-line-argument -DGPR_NO_DIRECT_SYSCALLS +LDFLAGS_asan-noleaks = fsanitize=address + +VALID_CONFIG_noexcept = 1 +CC_noexcept = $(DEFAULT_CC) +CXX_noexcept = $(DEFAULT_CXX) +LD_noexcept = $(DEFAULT_CC) +LDXX_noexcept = $(DEFAULT_CXX) +CXXFLAGS_noexcept = -fno-exceptions +CPPFLAGS_noexcept = -O2 -Wframe-larger-than=16384 +DEFINES_noexcept = NDEBUG + +VALID_CONFIG_ubsan = 1 +REQUIRE_CUSTOM_LIBRARIES_ubsan = 1 +CC_ubsan = clang +CXX_ubsan = clang++ +LD_ubsan = clang++ +LDXX_ubsan = clang++ +CPPFLAGS_ubsan = -O0 -stdlib=libc++ -fsanitize-coverage=edge,trace-pc-guard -fsanitize=undefined -fno-omit-frame-pointer -Wno-unused-command-line-argument -Wvarargs +LDFLAGS_ubsan = -stdlib=libc++ -fsanitize=undefined,unsigned-integer-overflow +DEFINES_ubsan = NDEBUG GRPC_UBSAN + +VALID_CONFIG_tsan = 1 +REQUIRE_CUSTOM_LIBRARIES_tsan = 1 +CC_tsan = clang +CXX_tsan = clang++ +LD_tsan = clang++ +LDXX_tsan = clang++ +CPPFLAGS_tsan = -O0 -fsanitize=thread -fno-omit-frame-pointer -Wno-unused-command-line-argument -DGPR_NO_DIRECT_SYSCALLS +LDFLAGS_tsan = -fsanitize=thread +DEFINES_tsan = GRPC_TSAN + +VALID_CONFIG_counters_with_memory_counter = 1 +CC_counters_with_memory_counter = $(DEFAULT_CC) +CXX_counters_with_memory_counter = $(DEFAULT_CXX) +LD_counters_with_memory_counter = $(DEFAULT_CC) +LDXX_counters_with_memory_counter = $(DEFAULT_CXX) +CPPFLAGS_counters_with_memory_counter = -O2 -DGPR_LOW_LEVEL_COUNTERS -DGPR_WRAP_MEMORY_COUNTER +LDFLAGS_counters_with_memory_counter = -Wl,--wrap=malloc -Wl,--wrap=calloc -Wl,--wrap=realloc -Wl,--wrap=free +DEFINES_counters_with_memory_counter = NDEBUG + +VALID_CONFIG_stapprof = 1 +CC_stapprof = $(DEFAULT_CC) +CXX_stapprof = $(DEFAULT_CXX) +LD_stapprof = $(DEFAULT_CC) +LDXX_stapprof = $(DEFAULT_CXX) +CPPFLAGS_stapprof = -O2 -DGRPC_STAP_PROFILER +DEFINES_stapprof = NDEBUG + +VALID_CONFIG_gcov = 1 +CC_gcov = gcc +CXX_gcov = g++ +LD_gcov = gcc +LDXX_gcov = g++ +CPPFLAGS_gcov = -O0 -fprofile-arcs -ftest-coverage -Wno-return-type +LDFLAGS_gcov = -fprofile-arcs -ftest-coverage -rdynamic -lstdc++ +DEFINES_gcov = _DEBUG DEBUG GPR_GCOV + +VALID_CONFIG_memcheck = 1 +CC_memcheck = $(DEFAULT_CC) +CXX_memcheck = $(DEFAULT_CXX) +LD_memcheck = $(DEFAULT_CC) +LDXX_memcheck = $(DEFAULT_CXX) +CPPFLAGS_memcheck = -O0 +LDFLAGS_memcheck = -rdynamic +DEFINES_memcheck = _DEBUG DEBUG + +VALID_CONFIG_lto = 1 +CC_lto = $(DEFAULT_CC) +CXX_lto = $(DEFAULT_CXX) +LD_lto = $(DEFAULT_CC) +LDXX_lto = $(DEFAULT_CXX) +CPPFLAGS_lto = -O2 +DEFINES_lto = NDEBUG + +VALID_CONFIG_c++-compat = 1 +CC_c++-compat = $(DEFAULT_CC) +CXX_c++-compat = $(DEFAULT_CXX) +LD_c++-compat = $(DEFAULT_CC) +LDXX_c++-compat = $(DEFAULT_CXX) +CFLAGS_c++-compat = -Wc++-compat +CPPFLAGS_c++-compat = -O0 +DEFINES_c++-compat = _DEBUG DEBUG + +VALID_CONFIG_mutrace = 1 +CC_mutrace = $(DEFAULT_CC) +CXX_mutrace = $(DEFAULT_CXX) +LD_mutrace = $(DEFAULT_CC) +LDXX_mutrace = $(DEFAULT_CXX) +CPPFLAGS_mutrace = -O3 -fno-omit-frame-pointer +LDFLAGS_mutrace = -rdynamic +DEFINES_mutrace = NDEBUG + +VALID_CONFIG_counters = 1 +CC_counters = $(DEFAULT_CC) +CXX_counters = $(DEFAULT_CXX) +LD_counters = $(DEFAULT_CC) +LDXX_counters = $(DEFAULT_CXX) +CPPFLAGS_counters = -O2 -DGPR_LOW_LEVEL_COUNTERS +DEFINES_counters = NDEBUG + + + +# General settings. +# You may want to change these depending on your system. + +prefix ?= /usr/local + +PROTOC ?= protoc +DTRACE ?= dtrace +CONFIG ?= opt +# Doing X ?= Y is the same as: +# ifeq ($(origin X), undefined) +# X = Y +# endif +# but some variables, such as CC, CXX, LD or AR, have defaults. +# So instead of using ?= on them, we need to check their origin. +# See: +# https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html +# https://www.gnu.org/software/make/manual/html_node/Flavors.html#index-_003f_003d +# https://www.gnu.org/software/make/manual/html_node/Origin-Function.html +ifeq ($(origin CC), default) +CC = $(CC_$(CONFIG)) +endif +ifeq ($(origin CXX), default) +CXX = $(CXX_$(CONFIG)) +endif +ifeq ($(origin LD), default) +LD = $(LD_$(CONFIG)) +endif +LDXX ?= $(LDXX_$(CONFIG)) +ifeq ($(SYSTEM),Linux) +ifeq ($(origin AR), default) +AR = ar rcs +endif +STRIP ?= strip --strip-unneeded +else +ifeq ($(SYSTEM),Darwin) +ifeq ($(origin AR), default) +AR = libtool -no_warning_for_no_symbols -o +endif +STRIP ?= strip -x +else +ifeq ($(SYSTEM),MINGW32) +ifeq ($(origin AR), default) +AR = ar rcs +endif +STRIP ?= strip --strip-unneeded +else +ifeq ($(origin AR), default) +AR = ar rcs +endif +STRIP ?= strip +endif +endif +endif +INSTALL ?= install +RM ?= rm -f +PKG_CONFIG ?= pkg-config + +ifndef VALID_CONFIG_$(CONFIG) +$(error Invalid CONFIG value '$(CONFIG)') +endif + +ifeq ($(SYSTEM),Linux) +TMPOUT = /dev/null +else +TMPOUT = `mktemp /tmp/test-out-XXXXXX` +endif + +CHECK_NO_CXX14_COMPAT_WORKS_CMD = $(CC) -std=c++11 -Werror -Wno-c++14-compat -o $(TMPOUT) -c test/build/no-c++14-compat.cc +HAS_WORKING_NO_CXX14_COMPAT = $(shell $(CHECK_NO_CXX14_COMPAT_WORKS_CMD) 2> /dev/null && echo true || echo false) +ifeq ($(HAS_WORKING_NO_CXX14_COMPAT),true) +W_NO_CXX14_COMPAT=-Wno-c++14-compat +endif + +CHECK_EXTRA_SEMI_WORKS_CMD = $(CC) -std=c99 -Werror -Wextra-semi -o $(TMPOUT) -c test/build/extra-semi.c +HAS_WORKING_EXTRA_SEMI = $(shell $(CHECK_EXTRA_SEMI_WORKS_CMD) 2> /dev/null && echo true || echo false) +ifeq ($(HAS_WORKING_EXTRA_SEMI),true) +W_EXTRA_SEMI=-Wextra-semi +NO_W_EXTRA_SEMI=-Wno-extra-semi +endif +CHECK_NO_SHIFT_NEGATIVE_VALUE_WORKS_CMD = $(CC) -std=c99 -Werror -Wno-shift-negative-value -o $(TMPOUT) -c test/build/no-shift-negative-value.c +HAS_WORKING_NO_SHIFT_NEGATIVE_VALUE = $(shell $(CHECK_NO_SHIFT_NEGATIVE_VALUE_WORKS_CMD) 2> /dev/null && echo true || echo false) +ifeq ($(HAS_WORKING_NO_SHIFT_NEGATIVE_VALUE),true) +W_NO_SHIFT_NEGATIVE_VALUE=-Wno-shift-negative-value +NO_W_NO_SHIFT_NEGATIVE_VALUE=-Wshift-negative-value +endif +CHECK_NO_UNUSED_BUT_SET_VARIABLE_WORKS_CMD = $(CC) -std=c99 -Werror -Wno-unused-but-set-variable -o $(TMPOUT) -c test/build/no-unused-but-set-variable.c +HAS_WORKING_NO_UNUSED_BUT_SET_VARIABLE = $(shell $(CHECK_NO_UNUSED_BUT_SET_VARIABLE_WORKS_CMD) 2> /dev/null && echo true || echo false) +ifeq ($(HAS_WORKING_NO_UNUSED_BUT_SET_VARIABLE),true) +W_NO_UNUSED_BUT_SET_VARIABLE=-Wno-unused-but-set-variable +NO_W_NO_UNUSED_BUT_SET_VARIABLE=-Wunused-but-set-variable +endif +CHECK_NO_MAYBE_UNINITIALIZED_WORKS_CMD = $(CC) -std=c99 -Werror -Wno-maybe-uninitialized -o $(TMPOUT) -c test/build/no-maybe-uninitialized.c +HAS_WORKING_NO_MAYBE_UNINITIALIZED = $(shell $(CHECK_NO_MAYBE_UNINITIALIZED_WORKS_CMD) 2> /dev/null && echo true || echo false) +ifeq ($(HAS_WORKING_NO_MAYBE_UNINITIALIZED),true) +W_NO_MAYBE_UNINITIALIZED=-Wno-maybe-uninitialized +NO_W_NO_MAYBE_UNINITIALIZED=-Wmaybe-uninitialized +endif +CHECK_NO_UNKNOWN_WARNING_OPTION_WORKS_CMD = $(CC) -std=c99 -Werror -Wno-unknown-warning-option -o $(TMPOUT) -c test/build/no-unknown-warning-option.c +HAS_WORKING_NO_UNKNOWN_WARNING_OPTION = $(shell $(CHECK_NO_UNKNOWN_WARNING_OPTION_WORKS_CMD) 2> /dev/null && echo true || echo false) +ifeq ($(HAS_WORKING_NO_UNKNOWN_WARNING_OPTION),true) +W_NO_UNKNOWN_WARNING_OPTION=-Wno-unknown-warning-option +NO_W_NO_UNKNOWN_WARNING_OPTION=-Wunknown-warning-option +endif + +# The HOST compiler settings are used to compile the protoc plugins. +# In most cases, you won't have to change anything, but if you are +# cross-compiling, you can override these variables from GNU make's +# command line: make CC=cross-gcc HOST_CC=gcc + +HOST_CC ?= $(CC) +HOST_CXX ?= $(CXX) +HOST_LD ?= $(LD) +HOST_LDXX ?= $(LDXX) + +CFLAGS += -std=c99 $(W_EXTRA_SEMI) +CXXFLAGS += -std=c++11 +ifeq ($(SYSTEM),Darwin) +CXXFLAGS += -stdlib=libc++ +LDFLAGS += -framework CoreFoundation +endif +CFLAGS += -g +CPPFLAGS += -g -Wall -Wextra -DOSATOMIC_USE_INLINED=1 -Ithird_party/abseil-cpp -Ithird_party/upb -Isrc/core/ext/upb-generated +COREFLAGS += -fno-exceptions +LDFLAGS += -g + +CPPFLAGS += $(CPPFLAGS_$(CONFIG)) +CFLAGS += $(CFLAGS_$(CONFIG)) +CXXFLAGS += $(CXXFLAGS_$(CONFIG)) +DEFINES += $(DEFINES_$(CONFIG)) INSTALL_PREFIX=\"$(prefix)\" +LDFLAGS += $(LDFLAGS_$(CONFIG)) + +ifneq ($(SYSTEM),MINGW32) +PIC_CPPFLAGS = -fPIC +CPPFLAGS += -fPIC +LDFLAGS += -fPIC +endif + +INCLUDES = . include $(GENDIR) +LDFLAGS += -Llibs/$(CONFIG) + +ifeq ($(SYSTEM),Darwin) +ifneq ($(wildcard /usr/local/ssl/include),) +INCLUDES += /usr/local/ssl/include +endif +ifneq ($(wildcard /opt/local/include),) +INCLUDES += /opt/local/include +endif +ifneq ($(wildcard /usr/local/include),) +INCLUDES += /usr/local/include +endif +LIBS = m z +ifneq ($(wildcard /usr/local/ssl/lib),) +LDFLAGS += -L/usr/local/ssl/lib +endif +ifneq ($(wildcard /opt/local/lib),) +LDFLAGS += -L/opt/local/lib +endif +ifneq ($(wildcard /usr/local/lib),) +LDFLAGS += -L/usr/local/lib +endif +endif + +ifeq ($(SYSTEM),Linux) +LIBS = dl rt m pthread +LDFLAGS += -pthread +endif + +ifeq ($(SYSTEM),MINGW32) +LIBS = m pthread ws2_32 dbghelp +LDFLAGS += -pthread +endif + +# If we are installing into a non-default prefix, both +# the libraries we build, and the apps users build, +# need to know how to find the libraries they depend on. +# There is much gnashing of teeth about this subject. +# It's tricky to do that without editing images during install, +# as you don't want tests during build to find previously installed and +# now stale libraries, etc. +ifeq ($(SYSTEM),Linux) +ifneq ($(prefix),/usr) +# Linux best practice for rpath on installed files is probably: +# 1) .pc file provides -Wl,-rpath,$(prefix)/lib +# 2) binaries we install into $(prefix)/bin use -Wl,-rpath,$ORIGIN/../lib +# 3) libraries we install into $(prefix)/lib use -Wl,-rpath,$ORIGIN +# cf. https://www.akkadia.org/drepper/dsohowto.pdf +# Doing all of that right is hard, but using -Wl,-rpath,$ORIGIN is always +# safe, and solves problems seen in the wild. Note that $ORIGIN +# is a literal string interpreted much later by ld.so. Escape it +# here with a dollar sign so Make doesn't expand $O. +LDFLAGS += '-Wl,-rpath,$$ORIGIN' +endif +endif + +# +# The steps for cross-compiling are as follows: +# First, clone and make install of grpc using the native compilers for the host. +# Also, install protoc (e.g., from a package like apt-get) +# Then clone a fresh grpc for the actual cross-compiled build +# Set the environment variable GRPC_CROSS_COMPILE to true +# Set CC, CXX, LD, LDXX, AR, and STRIP to the cross-compiling binaries +# Also set PROTOBUF_CONFIG_OPTS to indicate cross-compilation to protobuf (e.g., +# PROTOBUF_CONFIG_OPTS="--host=arm-linux --with-protoc=/usr/local/bin/protoc" ) +# Set HAS_PKG_CONFIG=false +# To build tests, go to third_party/gflags and follow its ccmake instructions +# Make sure that you enable building shared libraries and set your prefix to +# something useful like /usr/local/cross +# You will also need to set GRPC_CROSS_LDOPTS and GRPC_CROSS_AROPTS to hold +# additional required arguments for LD and AR (examples below) +# Then you can do a make from the cross-compiling fresh clone! +# +ifeq ($(GRPC_CROSS_COMPILE),true) +LDFLAGS += $(GRPC_CROSS_LDOPTS) # e.g. -L/usr/local/lib -L/usr/local/cross/lib +AROPTS = $(GRPC_CROSS_AROPTS) # e.g., rc --target=elf32-little +USE_BUILT_PROTOC = false +endif + +GTEST_LIB = -Ithird_party/googletest/googletest/include -Ithird_party/googletest/googletest third_party/googletest/googletest/src/gtest-all.cc -Ithird_party/googletest/googlemock/include -Ithird_party/googletest/googlemock third_party/googletest/googlemock/src/gmock-all.cc +GTEST_LIB += -lgflags -std=c++11 +ifeq ($(V),1) +E = @: +Q = +else +E = @echo +Q = @ +endif + +CORE_VERSION = 10.0.0 +CPP_VERSION = 1.30.2 +CSHARP_VERSION = 2.30.2 + +CPPFLAGS_NO_ARCH += $(addprefix -I, $(INCLUDES)) $(addprefix -D, $(DEFINES)) +CPPFLAGS += $(CPPFLAGS_NO_ARCH) $(ARCH_FLAGS) + +LDFLAGS += $(ARCH_FLAGS) +LDLIBS += $(addprefix -l, $(LIBS)) +LDLIBSXX += $(addprefix -l, $(LIBSXX)) + + +CFLAGS += $(EXTRA_CFLAGS) +CXXFLAGS += $(EXTRA_CXXFLAGS) +CPPFLAGS += $(EXTRA_CPPFLAGS) +LDFLAGS += $(EXTRA_LDFLAGS) +DEFINES += $(EXTRA_DEFINES) +LDLIBS += $(EXTRA_LDLIBS) + +HOST_CPPFLAGS += $(CPPFLAGS) +HOST_CFLAGS += $(CFLAGS) +HOST_CXXFLAGS += $(CXXFLAGS) +HOST_LDFLAGS += $(LDFLAGS) +HOST_LDLIBS += $(LDLIBS) + +# These are automatically computed variables. +# There shouldn't be any need to change anything from now on. + +-include cache.mk + +CACHE_MK = + +HAS_PKG_CONFIG ?= $(shell command -v $(PKG_CONFIG) >/dev/null 2>&1 && echo true || echo false) + +ifeq ($(HAS_PKG_CONFIG), true) +CACHE_MK += HAS_PKG_CONFIG = true, +endif + +CORE_PC_TEMPLATE = prefix=$(prefix),exec_prefix=\$${prefix},includedir=\$${prefix}/include,libdir=\$${exec_prefix}/lib,,Name: $(PC_NAME),Description: $(PC_DESCRIPTION),Version: $(CORE_VERSION),Cflags: -I\$${includedir} $(PC_CFLAGS),Requires: $(PC_REQUIRES),Libs: -L\$${libdir} $(PC_LIB),Libs.private: $(PC_LIBS_PRIVATE) + +CPP_PC_TEMPLATE = prefix=$(prefix),exec_prefix=\$${prefix},includedir=\$${prefix}/include,libdir=\$${exec_prefix}/lib,,Name: $(PC_NAME),Description: $(PC_DESCRIPTION),Version: $(CPP_VERSION),Cflags: -I\$${includedir} $(PC_CFLAGS),Requires: $(PC_REQUIRES),Libs: -L\$${libdir} $(PC_LIB),Libs.private: $(PC_LIBS_PRIVATE) + +CSHARP_PC_TEMPLATE = prefix=$(prefix),exec_prefix=\$${prefix},includedir=\$${prefix}/include,libdir=\$${exec_prefix}/lib,,Name: $(PC_NAME),Description: $(PC_DESCRIPTION),Version: $(CSHARP_VERSION),Cflags: -I\$${includedir} $(PC_CFLAGS),Requires: $(PC_REQUIRES),Libs: -L\$${libdir} $(PC_LIB),Libs.private: $(PC_LIBS_PRIVATE) + +ifeq ($(SYSTEM),MINGW32) +EXECUTABLE_SUFFIX = .exe +SHARED_EXT_CORE = dll +SHARED_EXT_CPP = dll +SHARED_EXT_CSHARP = dll +SHARED_PREFIX = +SHARED_VERSION_CORE = -10 +SHARED_VERSION_CPP = -1 +SHARED_VERSION_CSHARP = -2 +else ifeq ($(SYSTEM),Darwin) +EXECUTABLE_SUFFIX = +SHARED_EXT_CORE = dylib +SHARED_EXT_CPP = dylib +SHARED_EXT_CSHARP = dylib +SHARED_PREFIX = lib +SHARED_VERSION_CORE = +SHARED_VERSION_CPP = +SHARED_VERSION_CSHARP = +else +EXECUTABLE_SUFFIX = +SHARED_EXT_CORE = so.$(CORE_VERSION) +SHARED_EXT_CPP = so.$(CPP_VERSION) +SHARED_EXT_CSHARP = so.$(CSHARP_VERSION) +SHARED_PREFIX = lib +SHARED_VERSION_CORE = +SHARED_VERSION_CPP = +SHARED_VERSION_CSHARP = +endif + +ifeq ($(wildcard .git),) +IS_GIT_FOLDER = false +else +IS_GIT_FOLDER = true +endif + +ifeq ($(HAS_PKG_CONFIG),true) +OPENSSL_ALPN_CHECK_CMD = $(PKG_CONFIG) --atleast-version=1.0.2 openssl +ZLIB_CHECK_CMD = $(PKG_CONFIG) --exists zlib +PROTOBUF_CHECK_CMD = $(PKG_CONFIG) --atleast-version=3.5.0 protobuf +CARES_CHECK_CMD = $(PKG_CONFIG) --atleast-version=1.11.0 libcares +else # HAS_PKG_CONFIG + +ifeq ($(SYSTEM),MINGW32) +OPENSSL_LIBS = ssl32 eay32 +else +OPENSSL_LIBS = ssl crypto +endif + +OPENSSL_ALPN_CHECK_CMD = $(CC) $(CPPFLAGS) $(CFLAGS) -o $(TMPOUT) test/build/openssl-alpn.c $(addprefix -l, $(OPENSSL_LIBS)) $(LDFLAGS) +BORINGSSL_COMPILE_CHECK_CMD = $(CC) $(CPPFLAGS) -Ithird_party/boringssl-with-bazel/src/include -fvisibility=hidden -DOPENSSL_NO_ASM -D_GNU_SOURCE -DWIN32_LEAN_AND_MEAN -D_HAS_EXCEPTIONS=0 -DNOMINMAX $(CFLAGS) -g -o $(TMPOUT) test/build/boringssl.c $(LDFLAGS) +ZLIB_CHECK_CMD = $(CC) $(CPPFLAGS) $(CFLAGS) -o $(TMPOUT) test/build/zlib.c -lz $(LDFLAGS) +PROTOBUF_CHECK_CMD = $(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $(TMPOUT) test/build/protobuf.cc -lprotobuf $(LDFLAGS) +CARES_CHECK_CMD = $(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $(TMPOUT) test/build/c-ares.c -lcares $(LDFLAGS) + +endif # HAS_PKG_CONFIG + +PERFTOOLS_CHECK_CMD = $(CC) $(CPPFLAGS) $(CFLAGS) -o $(TMPOUT) test/build/perftools.c -lprofiler $(LDFLAGS) + +PROTOC_CHECK_CMD = which protoc > /dev/null +PROTOC_CHECK_VERSION_CMD = protoc --version | grep -q libprotoc.3 +DTRACE_CHECK_CMD = which dtrace > /dev/null +SYSTEMTAP_HEADERS_CHECK_CMD = $(CC) $(CPPFLAGS) $(CFLAGS) -o $(TMPOUT) test/build/systemtap.c $(LDFLAGS) + +ifndef REQUIRE_CUSTOM_LIBRARIES_$(CONFIG) +HAS_SYSTEM_PERFTOOLS ?= $(shell $(PERFTOOLS_CHECK_CMD) 2> /dev/null && echo true || echo false) +ifeq ($(HAS_SYSTEM_PERFTOOLS),true) +DEFINES += GRPC_HAVE_PERFTOOLS +LIBS += profiler +CACHE_MK += HAS_SYSTEM_PERFTOOLS = true, +endif +endif + +HAS_SYSTEM_PROTOBUF_VERIFY = $(shell $(PROTOBUF_CHECK_CMD) 2> /dev/null && echo true || echo false) +ifndef REQUIRE_CUSTOM_LIBRARIES_$(CONFIG) +HAS_SYSTEM_OPENSSL_ALPN ?= $(shell $(OPENSSL_ALPN_CHECK_CMD) 2> /dev/null && echo true || echo false) +ifeq ($(HAS_SYSTEM_OPENSSL_ALPN),true) +CACHE_MK += HAS_SYSTEM_OPENSSL_ALPN = true, +endif +HAS_SYSTEM_ZLIB ?= $(shell $(ZLIB_CHECK_CMD) 2> /dev/null && echo true || echo false) +ifeq ($(HAS_SYSTEM_ZLIB),true) +CACHE_MK += HAS_SYSTEM_ZLIB = true, +endif +HAS_SYSTEM_PROTOBUF ?= $(HAS_SYSTEM_PROTOBUF_VERIFY) +ifeq ($(HAS_SYSTEM_PROTOBUF),true) +CACHE_MK += HAS_SYSTEM_PROTOBUF = true, +endif +HAS_SYSTEM_CARES ?= $(shell $(CARES_CHECK_CMD) 2> /dev/null && echo true || echo false) +ifeq ($(HAS_SYSTEM_CARES),true) +CACHE_MK += HAS_SYSTEM_CARES = true, +endif +else +# override system libraries if the config requires a custom compiled library +HAS_SYSTEM_OPENSSL_ALPN = false +HAS_SYSTEM_ZLIB = false +HAS_SYSTEM_PROTOBUF = false +HAS_SYSTEM_CARES = false +endif + +HAS_PROTOC ?= $(shell $(PROTOC_CHECK_CMD) 2> /dev/null && echo true || echo false) +ifeq ($(HAS_PROTOC),true) +CACHE_MK += HAS_PROTOC = true, +HAS_VALID_PROTOC ?= $(shell $(PROTOC_CHECK_VERSION_CMD) 2> /dev/null && echo true || echo false) +ifeq ($(HAS_VALID_PROTOC),true) +CACHE_MK += HAS_VALID_PROTOC = true, +endif +else +HAS_VALID_PROTOC = false +endif + +# Check for Systemtap (https://sourceware.org/systemtap/), first by making sure is present +# in the system and secondly by checking for the "dtrace" binary (on Linux, this is part of the Systemtap +# distribution. It's part of the base system on BSD/Solaris machines). +ifndef HAS_SYSTEMTAP +HAS_SYSTEMTAP_HEADERS = $(shell $(SYSTEMTAP_HEADERS_CHECK_CMD) 2> /dev/null && echo true || echo false) +HAS_DTRACE = $(shell $(DTRACE_CHECK_CMD) 2> /dev/null && echo true || echo false) +HAS_SYSTEMTAP = false +ifeq ($(HAS_SYSTEMTAP_HEADERS),true) +ifeq ($(HAS_DTRACE),true) +HAS_SYSTEMTAP = true +endif +endif +endif + +ifeq ($(HAS_SYSTEMTAP),true) +CACHE_MK += HAS_SYSTEMTAP = true, +endif + +# Note that for testing purposes, one can do: +# make HAS_EMBEDDED_OPENSSL_ALPN=false +# to emulate the fact we do not have OpenSSL in the third_party folder. +ifeq ($(wildcard third_party/boringssl-with-bazel/src/include/openssl/ssl.h),) +HAS_EMBEDDED_OPENSSL_ALPN = false +else +CAN_COMPILE_EMBEDDED_OPENSSL ?= $(shell $(BORINGSSL_COMPILE_CHECK_CMD) 2> /dev/null && echo true || echo false) +HAS_EMBEDDED_OPENSSL_ALPN = $(CAN_COMPILE_EMBEDDED_OPENSSL) +endif + +ifeq ($(wildcard third_party/zlib/zlib.h),) +HAS_EMBEDDED_ZLIB = false +else +HAS_EMBEDDED_ZLIB = true +endif + +ifeq ($(wildcard third_party/protobuf/src/google/protobuf/descriptor.pb.h),) +HAS_EMBEDDED_PROTOBUF = false +ifneq ($(HAS_VALID_PROTOC),true) +NO_PROTOC = true +endif +else +HAS_EMBEDDED_PROTOBUF = true +endif + +ifeq ($(wildcard third_party/cares/cares/ares.h),) +HAS_EMBEDDED_CARES = false +else +HAS_EMBEDDED_CARES = true +endif + +PC_REQUIRES_GRPC = +PC_LIBS_GRPC = + +ifeq ($(HAS_SYSTEM_ZLIB),false) +ifeq ($(HAS_EMBEDDED_ZLIB), true) +EMBED_ZLIB ?= true +else +DEP_MISSING += zlib +EMBED_ZLIB ?= broken +endif +else +EMBED_ZLIB ?= false +endif + +ifeq ($(EMBED_ZLIB),true) +ZLIB_DEP = $(LIBDIR)/$(CONFIG)/libz.a +ZLIB_MERGE_LIBS = $(LIBDIR)/$(CONFIG)/libz.a +ZLIB_MERGE_OBJS = $(LIBZ_OBJS) +CPPFLAGS += -Ithird_party/zlib +else +ifeq ($(HAS_PKG_CONFIG),true) +CPPFLAGS += $(shell $(PKG_CONFIG) --cflags zlib) +LDFLAGS += $(shell $(PKG_CONFIG) --libs-only-L zlib) +LIBS += $(patsubst -l%,%,$(shell $(PKG_CONFIG) --libs-only-l zlib)) +PC_REQUIRES_GRPC += zlib +else +PC_LIBS_GRPC += -lz +LIBS += z +endif +endif + +CARES_PKG_CONFIG = false + +ifeq ($(HAS_SYSTEM_CARES),false) +ifeq ($(HAS_EMBEDDED_CARES), true) +EMBED_CARES ?= true +else +DEP_MISSING += cares +EMBED_CARES ?= broken +endif +else +EMBED_CARES ?= false +endif + +ADDRESS_SORTING_DEP = $(LIBDIR)/$(CONFIG)/libaddress_sorting.a +ADDRESS_SORTING_MERGE_OBJS = $(LIBADDRESS_SORTING_OBJS) +ADDRESS_SORTING_MERGE_LIBS = $(LIBDIR)/$(CONFIG)/libaddress_sorting.a +CPPFLAGS := -Ithird_party/address_sorting/include $(CPPFLAGS) + +GRPC_ABSEIL_DEP = $(LIBDIR)/$(CONFIG)/libgrpc_abseil.a +GRPC_ABSEIL_MERGE_LIBS = $(LIBDIR)/$(CONFIG)/libgrpc_abseil.a + +UPB_DEP = $(LIBDIR)/$(CONFIG)/libupb.a +UPB_MERGE_OBJS = $(LIBUPB_OBJS) +UPB_MERGE_LIBS = $(LIBDIR)/$(CONFIG)/libupb.a + +ifeq ($(EMBED_CARES),true) +CARES_DEP = $(LIBDIR)/$(CONFIG)/libares.a +CARES_MERGE_OBJS = $(LIBARES_OBJS) +CARES_MERGE_LIBS = $(LIBDIR)/$(CONFIG)/libares.a +CPPFLAGS := -Ithird_party/cares -Ithird_party/cares/cares $(CPPFLAGS) +else +ifeq ($(HAS_PKG_CONFIG),true) +PC_REQUIRES_GRPC += libcares +CPPFLAGS += $(shell $(PKG_CONFIG) --cflags libcares) +LDFLAGS += $(shell $(PKG_CONFIG) --libs-only-L libcares) +LIBS += $(patsubst -l%,%,$(shell $(PKG_CONFIG) --libs-only-l libcares)) +else +PC_LIBS_GRPC += -lcares +LIBS += cares +endif +endif + +OPENSSL_PKG_CONFIG = false + +PC_REQUIRES_SECURE = +PC_LIBS_SECURE = + +ifeq ($(HAS_SYSTEM_OPENSSL_ALPN),true) +EMBED_OPENSSL ?= false +NO_SECURE ?= false +else # HAS_SYSTEM_OPENSSL_ALPN=false +ifneq ($(HAS_EMBEDDED_OPENSSL_ALPN),false) +EMBED_OPENSSL ?= $(HAS_EMBEDDED_OPENSSL_ALPN) +NO_SECURE ?= false +else # HAS_EMBEDDED_OPENSSL_ALPN=false +NO_SECURE ?= true +endif # HAS_EMBEDDED_OPENSSL_ALPN +endif # HAS_SYSTEM_OPENSSL_ALPN + +OPENSSL_DEP := +OPENSSL_MERGE_LIBS := +ifeq ($(NO_SECURE),false) +ifeq ($(EMBED_OPENSSL),true) +OPENSSL_DEP += $(LIBDIR)/$(CONFIG)/libboringssl.a +OPENSSL_MERGE_LIBS += $(LIBDIR)/$(CONFIG)/libboringssl.a +OPENSSL_MERGE_OBJS += $(LIBBORINGSSL_OBJS) +# need to prefix these to ensure overriding system libraries +CPPFLAGS := -Ithird_party/boringssl-with-bazel/src/include $(CPPFLAGS) +else ifneq ($(EMBED_OPENSSL),false) +OPENSSL_DEP += $(EMBED_OPENSSL)/libssl.a $(EMBED_OPENSSL)/libcrypto.a +OPENSSL_MERGE_LIBS += $(EMBED_OPENSSL)/libssl.a $(EMBED_OPENSSL)/libcrypto.a +OPENSSL_MERGE_OBJS += $(wildcard $(EMBED_OPENSSL)/grpc_obj/*.o) +# need to prefix these to ensure overriding system libraries +CPPFLAGS := -I$(EMBED_OPENSSL)/include $(CPPFLAGS) +else # EMBED_OPENSSL=false +ifeq ($(HAS_PKG_CONFIG),true) +OPENSSL_PKG_CONFIG = true +PC_REQUIRES_SECURE = openssl +CPPFLAGS := $(shell $(PKG_CONFIG) --cflags openssl) $(CPPFLAGS) +LDFLAGS_OPENSSL_PKG_CONFIG = $(shell $(PKG_CONFIG) --libs-only-L openssl) +ifeq ($(SYSTEM),Linux) +ifneq ($(LDFLAGS_OPENSSL_PKG_CONFIG),) +LDFLAGS_OPENSSL_PKG_CONFIG += $(shell $(PKG_CONFIG) --libs-only-L openssl | sed s/L/Wl,-rpath,/) +endif # LDFLAGS_OPENSSL_PKG_CONFIG='' +endif # System=Linux +LDFLAGS := $(LDFLAGS_OPENSSL_PKG_CONFIG) $(LDFLAGS) +else # HAS_PKG_CONFIG=false +LIBS_SECURE = $(OPENSSL_LIBS) +endif # HAS_PKG_CONFIG +ifeq ($(DISABLE_ALPN),true) +CPPFLAGS += -DTSI_OPENSSL_ALPN_SUPPORT=0 +LIBS_SECURE = $(OPENSSL_LIBS) +endif # DISABLE_ALPN +PC_LIBS_SECURE = $(addprefix -l, $(LIBS_SECURE)) +endif # EMBED_OPENSSL +endif # NO_SECURE + +ifeq ($(OPENSSL_PKG_CONFIG),true) +LDLIBS_SECURE += $(shell $(PKG_CONFIG) --libs-only-l openssl) +else +LDLIBS_SECURE += $(addprefix -l, $(LIBS_SECURE)) +endif + +# gpr .pc file +PC_NAME = gpr +PC_DESCRIPTION = gRPC platform support library +PC_CFLAGS = +PC_REQUIRES = $(PC_REQUIRES_GPR) +PC_LIBS_PRIVATE = $(PC_LIBS_GPR) +PC_LIB = -lgpr +GPR_PC_FILE := $(CORE_PC_TEMPLATE) + +# grpc .pc file +PC_NAME = gRPC +PC_DESCRIPTION = high performance general RPC framework +PC_CFLAGS = +PC_REQUIRES = gpr $(PC_REQUIRES_GRPC) $(PC_REQUIRES_SECURE) +PC_LIBS_PRIVATE = $(PC_LIBS_GRPC) $(PC_LIBS_SECURE) +PC_LIB = -lgrpc +GRPC_PC_FILE := $(CORE_PC_TEMPLATE) + +# grpc_unsecure .pc file +PC_NAME = gRPC unsecure +PC_DESCRIPTION = high performance general RPC framework without SSL +PC_CFLAGS = +PC_REQUIRES = gpr $(PC_REQUIRES_GRPC) +PC_LIBS_PRIVATE = $(PC_LIBS_GRPC) +PC_LIB = -lgrpc_unsecure +GRPC_UNSECURE_PC_FILE := $(CORE_PC_TEMPLATE) + +PROTOBUF_PKG_CONFIG = false + +PC_REQUIRES_GRPCXX = +PC_LIBS_GRPCXX = + +CPPFLAGS := -Ithird_party/googletest/googletest/include -Ithird_party/googletest/googlemock/include $(CPPFLAGS) + +PROTOC_PLUGINS_ALL = $(BINDIR)/$(CONFIG)/grpc_cpp_plugin $(BINDIR)/$(CONFIG)/grpc_csharp_plugin $(BINDIR)/$(CONFIG)/grpc_node_plugin $(BINDIR)/$(CONFIG)/grpc_objective_c_plugin $(BINDIR)/$(CONFIG)/grpc_php_plugin $(BINDIR)/$(CONFIG)/grpc_python_plugin $(BINDIR)/$(CONFIG)/grpc_ruby_plugin +PROTOC_PLUGINS_DIR = $(BINDIR)/$(CONFIG) + +ifeq ($(HAS_SYSTEM_PROTOBUF),true) +ifeq ($(HAS_PKG_CONFIG),true) +PROTOBUF_PKG_CONFIG = true +PC_REQUIRES_GRPCXX = protobuf +CPPFLAGS := $(CPPFLAGS) $(shell $(PKG_CONFIG) --cflags protobuf) +LDFLAGS_PROTOBUF_PKG_CONFIG = $(shell $(PKG_CONFIG) --libs-only-L protobuf) +ifeq ($(SYSTEM),Linux) +ifneq ($(LDFLAGS_PROTOBUF_PKG_CONFIG),) +LDFLAGS_PROTOBUF_PKG_CONFIG += $(shell $(PKG_CONFIG) --libs-only-L protobuf | sed s/L/Wl,-rpath,/) +endif +endif +else +PC_LIBS_GRPCXX = -lprotobuf +endif +PROTOC_PLUGINS = $(PROTOC_PLUGINS_ALL) +else +ifeq ($(HAS_EMBEDDED_PROTOBUF),true) +PROTOBUF_DEP = $(LIBDIR)/$(CONFIG)/protobuf/libprotobuf.a +CPPFLAGS := -Ithird_party/protobuf/src $(CPPFLAGS) +LDFLAGS := -L$(LIBDIR)/$(CONFIG)/protobuf $(LDFLAGS) +ifneq ($(USE_BUILT_PROTOC),false) +PROTOC = $(BINDIR)/$(CONFIG)/protobuf/protoc +PROTOC_PLUGINS = $(PROTOC_PLUGINS_ALL) +else +PROTOC_PLUGINS = +PROTOC_PLUGINS_DIR = $(prefix)/bin +endif +else +NO_PROTOBUF = true +endif +endif + +LIBS_PROTOBUF = protobuf +LIBS_PROTOC = protoc protobuf + +HOST_LDLIBS_PROTOC += $(addprefix -l, $(LIBS_PROTOC)) + +ifeq ($(PROTOBUF_PKG_CONFIG),true) +LDLIBS_PROTOBUF += $(shell $(PKG_CONFIG) --libs-only-l protobuf) +else +LDLIBS_PROTOBUF += $(addprefix -l, $(LIBS_PROTOBUF)) +endif + +# grpc++ .pc file +PC_NAME = gRPC++ +PC_DESCRIPTION = C++ wrapper for gRPC +PC_CFLAGS = +PC_REQUIRES = grpc $(PC_REQUIRES_GRPCXX) +PC_LIBS_PRIVATE = $(PC_LIBS_GRPCXX) +PC_LIB = -lgrpc++ +GRPCXX_PC_FILE := $(CPP_PC_TEMPLATE) + +# grpc++_unsecure .pc file +PC_NAME = gRPC++ unsecure +PC_DESCRIPTION = C++ wrapper for gRPC without SSL +PC_CFLAGS = +PC_REQUIRES = grpc_unsecure $(PC_REQUIRES_GRPCXX) +PC_LIBS_PRIVATE = $(PC_LIBS_GRPCXX) +PC_LIB = -lgrpc++_unsecure +GRPCXX_UNSECURE_PC_FILE := $(CPP_PC_TEMPLATE) + +ifeq ($(MAKECMDGOALS),clean) +NO_DEPS = true +endif + +.SECONDARY = %.pb.h %.pb.cc + +ifeq ($(DEP_MISSING),) +all: static shared plugins +dep_error: + @echo "You shouldn't see this message - all of your dependencies are correct." +else +all: dep_error git_update stop + +dep_error: + @echo + @echo "DEPENDENCY ERROR" + @echo + @echo "You are missing system dependencies that are essential to build grpc," + @echo "and the third_party directory doesn't have them:" + @echo + @echo " $(DEP_MISSING)" + @echo + @echo "Installing the development packages for your system will solve" + @echo "this issue. Please consult INSTALL to get more information." + @echo + @echo "If you need information about why these tests failed, run:" + @echo + @echo " make run_dep_checks" + @echo +endif + +git_update: +ifeq ($(IS_GIT_FOLDER),true) + @echo "Additionally, since you are in a git clone, you can download the" + @echo "missing dependencies in third_party by running the following command:" + @echo + @echo " git submodule update --init" + @echo +endif + +openssl_dep_error: openssl_dep_message git_update stop + +protobuf_dep_error: protobuf_dep_message git_update stop + +protoc_dep_error: protoc_dep_message git_update stop + +openssl_dep_message: + @echo + @echo "DEPENDENCY ERROR" + @echo + @echo "The target you are trying to run requires an OpenSSL implementation." + @echo "Your system doesn't have one, and either the third_party directory" + @echo "doesn't have it, or your compiler can't build BoringSSL." + @echo + @echo "Please consult INSTALL to get more information." + @echo + @echo "If you need information about why these tests failed, run:" + @echo + @echo " make run_dep_checks" + @echo + +protobuf_dep_message: + @echo + @echo "DEPENDENCY ERROR" + @echo + @echo "The target you are trying to run requires protobuf 3.5.0+" + @echo "Your system doesn't have it, and neither does the third_party directory." + @echo + @echo "Please consult INSTALL to get more information." + @echo + @echo "If you need information about why these tests failed, run:" + @echo + @echo " make run_dep_checks" + @echo + +protoc_dep_message: + @echo + @echo "DEPENDENCY ERROR" + @echo + @echo "The target you are trying to run requires protobuf-compiler 3.5.0+" + @echo "Your system doesn't have it, and neither does the third_party directory." + @echo + @echo "Please consult INSTALL to get more information." + @echo + @echo "If you need information about why these tests failed, run:" + @echo + @echo " make run_dep_checks" + @echo + +systemtap_dep_error: + @echo + @echo "DEPENDENCY ERROR" + @echo + @echo "Under the '$(CONFIG)' configutation, the target you are trying " + @echo "to build requires systemtap 2.7+ (on Linux) or dtrace (on other " + @echo "platforms such as Solaris and *BSD). " + @echo + @echo "Please consult INSTALL to get more information." + @echo + +stop: + @false + +check_epollexclusive: $(BINDIR)/$(CONFIG)/check_epollexclusive +gen_hpack_tables: $(BINDIR)/$(CONFIG)/gen_hpack_tables +gen_legal_metadata_characters: $(BINDIR)/$(CONFIG)/gen_legal_metadata_characters +gen_percent_encoding_tables: $(BINDIR)/$(CONFIG)/gen_percent_encoding_tables +algorithm_test: $(BINDIR)/$(CONFIG)/algorithm_test +alloc_test: $(BINDIR)/$(CONFIG)/alloc_test +alpn_test: $(BINDIR)/$(CONFIG)/alpn_test +alts_counter_test: $(BINDIR)/$(CONFIG)/alts_counter_test +alts_crypt_test: $(BINDIR)/$(CONFIG)/alts_crypt_test +alts_crypter_test: $(BINDIR)/$(CONFIG)/alts_crypter_test +alts_frame_protector_test: $(BINDIR)/$(CONFIG)/alts_frame_protector_test +alts_grpc_record_protocol_test: $(BINDIR)/$(CONFIG)/alts_grpc_record_protocol_test +alts_handshaker_client_test: $(BINDIR)/$(CONFIG)/alts_handshaker_client_test +alts_iovec_record_protocol_test: $(BINDIR)/$(CONFIG)/alts_iovec_record_protocol_test +alts_security_connector_test: $(BINDIR)/$(CONFIG)/alts_security_connector_test +alts_tsi_handshaker_test: $(BINDIR)/$(CONFIG)/alts_tsi_handshaker_test +alts_tsi_utils_test: $(BINDIR)/$(CONFIG)/alts_tsi_utils_test +alts_zero_copy_grpc_protector_test: $(BINDIR)/$(CONFIG)/alts_zero_copy_grpc_protector_test +arena_test: $(BINDIR)/$(CONFIG)/arena_test +auth_context_test: $(BINDIR)/$(CONFIG)/auth_context_test +avl_test: $(BINDIR)/$(CONFIG)/avl_test +b64_test: $(BINDIR)/$(CONFIG)/b64_test +bad_server_response_test: $(BINDIR)/$(CONFIG)/bad_server_response_test +bad_ssl_alpn_test: $(BINDIR)/$(CONFIG)/bad_ssl_alpn_test +bad_ssl_cert_test: $(BINDIR)/$(CONFIG)/bad_ssl_cert_test +bin_decoder_test: $(BINDIR)/$(CONFIG)/bin_decoder_test +bin_encoder_test: $(BINDIR)/$(CONFIG)/bin_encoder_test +buffer_list_test: $(BINDIR)/$(CONFIG)/buffer_list_test +channel_args_test: $(BINDIR)/$(CONFIG)/channel_args_test +channel_create_test: $(BINDIR)/$(CONFIG)/channel_create_test +channel_stack_builder_test: $(BINDIR)/$(CONFIG)/channel_stack_builder_test +channel_stack_test: $(BINDIR)/$(CONFIG)/channel_stack_test +check_gcp_environment_linux_test: $(BINDIR)/$(CONFIG)/check_gcp_environment_linux_test +check_gcp_environment_windows_test: $(BINDIR)/$(CONFIG)/check_gcp_environment_windows_test +client_ssl_test: $(BINDIR)/$(CONFIG)/client_ssl_test +cmdline_test: $(BINDIR)/$(CONFIG)/cmdline_test +combiner_test: $(BINDIR)/$(CONFIG)/combiner_test +completion_queue_threading_test: $(BINDIR)/$(CONFIG)/completion_queue_threading_test +compression_test: $(BINDIR)/$(CONFIG)/compression_test +concurrent_connectivity_test: $(BINDIR)/$(CONFIG)/concurrent_connectivity_test +connection_refused_test: $(BINDIR)/$(CONFIG)/connection_refused_test +cpu_test: $(BINDIR)/$(CONFIG)/cpu_test +dns_resolver_connectivity_using_ares_resolver_test: $(BINDIR)/$(CONFIG)/dns_resolver_connectivity_using_ares_resolver_test +dns_resolver_connectivity_using_native_resolver_test: $(BINDIR)/$(CONFIG)/dns_resolver_connectivity_using_native_resolver_test +dns_resolver_cooldown_test: $(BINDIR)/$(CONFIG)/dns_resolver_cooldown_test +dns_resolver_test: $(BINDIR)/$(CONFIG)/dns_resolver_test +dualstack_socket_test: $(BINDIR)/$(CONFIG)/dualstack_socket_test +endpoint_pair_test: $(BINDIR)/$(CONFIG)/endpoint_pair_test +env_test: $(BINDIR)/$(CONFIG)/env_test +error_test: $(BINDIR)/$(CONFIG)/error_test +ev_epollex_linux_test: $(BINDIR)/$(CONFIG)/ev_epollex_linux_test +fake_resolver_test: $(BINDIR)/$(CONFIG)/fake_resolver_test +fake_transport_security_test: $(BINDIR)/$(CONFIG)/fake_transport_security_test +fd_conservation_posix_test: $(BINDIR)/$(CONFIG)/fd_conservation_posix_test +fd_posix_test: $(BINDIR)/$(CONFIG)/fd_posix_test +fling_stream_test: $(BINDIR)/$(CONFIG)/fling_stream_test +fling_test: $(BINDIR)/$(CONFIG)/fling_test +fork_test: $(BINDIR)/$(CONFIG)/fork_test +format_request_test: $(BINDIR)/$(CONFIG)/format_request_test +frame_handler_test: $(BINDIR)/$(CONFIG)/frame_handler_test +goaway_server_test: $(BINDIR)/$(CONFIG)/goaway_server_test +grpc_alts_credentials_options_test: $(BINDIR)/$(CONFIG)/grpc_alts_credentials_options_test +grpc_byte_buffer_reader_test: $(BINDIR)/$(CONFIG)/grpc_byte_buffer_reader_test +grpc_completion_queue_test: $(BINDIR)/$(CONFIG)/grpc_completion_queue_test +grpc_ipv6_loopback_available_test: $(BINDIR)/$(CONFIG)/grpc_ipv6_loopback_available_test +handshake_server_with_readahead_handshaker_test: $(BINDIR)/$(CONFIG)/handshake_server_with_readahead_handshaker_test +handshake_verify_peer_options_test: $(BINDIR)/$(CONFIG)/handshake_verify_peer_options_test +histogram_test: $(BINDIR)/$(CONFIG)/histogram_test +host_port_test: $(BINDIR)/$(CONFIG)/host_port_test +hpack_encoder_test: $(BINDIR)/$(CONFIG)/hpack_encoder_test +hpack_parser_test: $(BINDIR)/$(CONFIG)/hpack_parser_test +hpack_table_test: $(BINDIR)/$(CONFIG)/hpack_table_test +httpcli_test: $(BINDIR)/$(CONFIG)/httpcli_test +httpscli_test: $(BINDIR)/$(CONFIG)/httpscli_test +init_test: $(BINDIR)/$(CONFIG)/init_test +inproc_callback_test: $(BINDIR)/$(CONFIG)/inproc_callback_test +invalid_call_argument_test: $(BINDIR)/$(CONFIG)/invalid_call_argument_test +json_token_test: $(BINDIR)/$(CONFIG)/json_token_test +jwt_verifier_test: $(BINDIR)/$(CONFIG)/jwt_verifier_test +lame_client_test: $(BINDIR)/$(CONFIG)/lame_client_test +load_file_test: $(BINDIR)/$(CONFIG)/load_file_test +log_test: $(BINDIR)/$(CONFIG)/log_test +manual_constructor_test: $(BINDIR)/$(CONFIG)/manual_constructor_test +message_compress_test: $(BINDIR)/$(CONFIG)/message_compress_test +metadata_test: $(BINDIR)/$(CONFIG)/metadata_test +minimal_stack_is_minimal_test: $(BINDIR)/$(CONFIG)/minimal_stack_is_minimal_test +mpmcqueue_test: $(BINDIR)/$(CONFIG)/mpmcqueue_test +mpscq_test: $(BINDIR)/$(CONFIG)/mpscq_test +multiple_server_queues_test: $(BINDIR)/$(CONFIG)/multiple_server_queues_test +murmur_hash_test: $(BINDIR)/$(CONFIG)/murmur_hash_test +no_server_test: $(BINDIR)/$(CONFIG)/no_server_test +num_external_connectivity_watchers_test: $(BINDIR)/$(CONFIG)/num_external_connectivity_watchers_test +parse_address_test: $(BINDIR)/$(CONFIG)/parse_address_test +parse_address_with_named_scope_id_test: $(BINDIR)/$(CONFIG)/parse_address_with_named_scope_id_test +parser_test: $(BINDIR)/$(CONFIG)/parser_test +percent_encoding_test: $(BINDIR)/$(CONFIG)/percent_encoding_test +public_headers_must_be_c89: $(BINDIR)/$(CONFIG)/public_headers_must_be_c89 +resolve_address_using_ares_resolver_posix_test: $(BINDIR)/$(CONFIG)/resolve_address_using_ares_resolver_posix_test +resolve_address_using_ares_resolver_test: $(BINDIR)/$(CONFIG)/resolve_address_using_ares_resolver_test +resolve_address_using_native_resolver_posix_test: $(BINDIR)/$(CONFIG)/resolve_address_using_native_resolver_posix_test +resolve_address_using_native_resolver_test: $(BINDIR)/$(CONFIG)/resolve_address_using_native_resolver_test +resource_quota_test: $(BINDIR)/$(CONFIG)/resource_quota_test +secure_channel_create_test: $(BINDIR)/$(CONFIG)/secure_channel_create_test +secure_endpoint_test: $(BINDIR)/$(CONFIG)/secure_endpoint_test +security_connector_test: $(BINDIR)/$(CONFIG)/security_connector_test +sequential_connectivity_test: $(BINDIR)/$(CONFIG)/sequential_connectivity_test +server_chttp2_test: $(BINDIR)/$(CONFIG)/server_chttp2_test +server_ssl_test: $(BINDIR)/$(CONFIG)/server_ssl_test +server_test: $(BINDIR)/$(CONFIG)/server_test +slice_buffer_test: $(BINDIR)/$(CONFIG)/slice_buffer_test +slice_string_helpers_test: $(BINDIR)/$(CONFIG)/slice_string_helpers_test +sockaddr_resolver_test: $(BINDIR)/$(CONFIG)/sockaddr_resolver_test +sockaddr_utils_test: $(BINDIR)/$(CONFIG)/sockaddr_utils_test +socket_utils_test: $(BINDIR)/$(CONFIG)/socket_utils_test +spinlock_test: $(BINDIR)/$(CONFIG)/spinlock_test +ssl_credentials_test: $(BINDIR)/$(CONFIG)/ssl_credentials_test +ssl_transport_security_test: $(BINDIR)/$(CONFIG)/ssl_transport_security_test +status_conversion_test: $(BINDIR)/$(CONFIG)/status_conversion_test +stream_compression_test: $(BINDIR)/$(CONFIG)/stream_compression_test +stream_map_test: $(BINDIR)/$(CONFIG)/stream_map_test +stream_owned_slice_test: $(BINDIR)/$(CONFIG)/stream_owned_slice_test +string_test: $(BINDIR)/$(CONFIG)/string_test +sync_test: $(BINDIR)/$(CONFIG)/sync_test +tcp_client_posix_test: $(BINDIR)/$(CONFIG)/tcp_client_posix_test +tcp_posix_test: $(BINDIR)/$(CONFIG)/tcp_posix_test +tcp_server_posix_test: $(BINDIR)/$(CONFIG)/tcp_server_posix_test +test_core_gpr_time_test: $(BINDIR)/$(CONFIG)/test_core_gpr_time_test +test_core_security_credentials_test: $(BINDIR)/$(CONFIG)/test_core_security_credentials_test +test_core_slice_slice_test: $(BINDIR)/$(CONFIG)/test_core_slice_slice_test +thd_test: $(BINDIR)/$(CONFIG)/thd_test +threadpool_test: $(BINDIR)/$(CONFIG)/threadpool_test +time_averaged_stats_test: $(BINDIR)/$(CONFIG)/time_averaged_stats_test +timeout_encoding_test: $(BINDIR)/$(CONFIG)/timeout_encoding_test +timer_heap_test: $(BINDIR)/$(CONFIG)/timer_heap_test +timer_list_test: $(BINDIR)/$(CONFIG)/timer_list_test +tls_test: $(BINDIR)/$(CONFIG)/tls_test +transport_security_common_api_test: $(BINDIR)/$(CONFIG)/transport_security_common_api_test +transport_security_test: $(BINDIR)/$(CONFIG)/transport_security_test +udp_server_test: $(BINDIR)/$(CONFIG)/udp_server_test +uri_parser_test: $(BINDIR)/$(CONFIG)/uri_parser_test +useful_test: $(BINDIR)/$(CONFIG)/useful_test +varint_test: $(BINDIR)/$(CONFIG)/varint_test +address_sorting_test: $(BINDIR)/$(CONFIG)/address_sorting_test +address_sorting_test_unsecure: $(BINDIR)/$(CONFIG)/address_sorting_test_unsecure +alarm_test: $(BINDIR)/$(CONFIG)/alarm_test +alts_concurrent_connectivity_test: $(BINDIR)/$(CONFIG)/alts_concurrent_connectivity_test +alts_credentials_fuzzer: $(BINDIR)/$(CONFIG)/alts_credentials_fuzzer +alts_util_test: $(BINDIR)/$(CONFIG)/alts_util_test +async_end2end_test: $(BINDIR)/$(CONFIG)/async_end2end_test +auth_property_iterator_test: $(BINDIR)/$(CONFIG)/auth_property_iterator_test +backoff_test: $(BINDIR)/$(CONFIG)/backoff_test +bad_streaming_id_bad_client_test: $(BINDIR)/$(CONFIG)/bad_streaming_id_bad_client_test +badreq_bad_client_test: $(BINDIR)/$(CONFIG)/badreq_bad_client_test +bdp_estimator_test: $(BINDIR)/$(CONFIG)/bdp_estimator_test +bm_alarm: $(BINDIR)/$(CONFIG)/bm_alarm +bm_arena: $(BINDIR)/$(CONFIG)/bm_arena +bm_byte_buffer: $(BINDIR)/$(CONFIG)/bm_byte_buffer +bm_call_create: $(BINDIR)/$(CONFIG)/bm_call_create +bm_callback_streaming_ping_pong: $(BINDIR)/$(CONFIG)/bm_callback_streaming_ping_pong +bm_callback_unary_ping_pong: $(BINDIR)/$(CONFIG)/bm_callback_unary_ping_pong +bm_channel: $(BINDIR)/$(CONFIG)/bm_channel +bm_chttp2_hpack: $(BINDIR)/$(CONFIG)/bm_chttp2_hpack +bm_chttp2_transport: $(BINDIR)/$(CONFIG)/bm_chttp2_transport +bm_closure: $(BINDIR)/$(CONFIG)/bm_closure +bm_cq: $(BINDIR)/$(CONFIG)/bm_cq +bm_cq_multiple_threads: $(BINDIR)/$(CONFIG)/bm_cq_multiple_threads +bm_error: $(BINDIR)/$(CONFIG)/bm_error +bm_fullstack_streaming_ping_pong: $(BINDIR)/$(CONFIG)/bm_fullstack_streaming_ping_pong +bm_fullstack_streaming_pump: $(BINDIR)/$(CONFIG)/bm_fullstack_streaming_pump +bm_fullstack_trickle: $(BINDIR)/$(CONFIG)/bm_fullstack_trickle +bm_fullstack_unary_ping_pong: $(BINDIR)/$(CONFIG)/bm_fullstack_unary_ping_pong +bm_metadata: $(BINDIR)/$(CONFIG)/bm_metadata +bm_pollset: $(BINDIR)/$(CONFIG)/bm_pollset +bm_threadpool: $(BINDIR)/$(CONFIG)/bm_threadpool +bm_timer: $(BINDIR)/$(CONFIG)/bm_timer +byte_buffer_test: $(BINDIR)/$(CONFIG)/byte_buffer_test +byte_stream_test: $(BINDIR)/$(CONFIG)/byte_stream_test +cancel_ares_query_test: $(BINDIR)/$(CONFIG)/cancel_ares_query_test +cfstream_test: $(BINDIR)/$(CONFIG)/cfstream_test +channel_arguments_test: $(BINDIR)/$(CONFIG)/channel_arguments_test +channel_filter_test: $(BINDIR)/$(CONFIG)/channel_filter_test +channel_trace_test: $(BINDIR)/$(CONFIG)/channel_trace_test +channelz_registry_test: $(BINDIR)/$(CONFIG)/channelz_registry_test +channelz_service_test: $(BINDIR)/$(CONFIG)/channelz_service_test +channelz_test: $(BINDIR)/$(CONFIG)/channelz_test +cli_call_test: $(BINDIR)/$(CONFIG)/cli_call_test +client_callback_end2end_test: $(BINDIR)/$(CONFIG)/client_callback_end2end_test +client_channel_stress_test: $(BINDIR)/$(CONFIG)/client_channel_stress_test +client_fuzzer: $(BINDIR)/$(CONFIG)/client_fuzzer +client_interceptors_end2end_test: $(BINDIR)/$(CONFIG)/client_interceptors_end2end_test +client_lb_end2end_test: $(BINDIR)/$(CONFIG)/client_lb_end2end_test +codegen_test_full: $(BINDIR)/$(CONFIG)/codegen_test_full +codegen_test_minimal: $(BINDIR)/$(CONFIG)/codegen_test_minimal +connection_prefix_bad_client_test: $(BINDIR)/$(CONFIG)/connection_prefix_bad_client_test +connectivity_state_test: $(BINDIR)/$(CONFIG)/connectivity_state_test +context_list_test: $(BINDIR)/$(CONFIG)/context_list_test +delegating_channel_test: $(BINDIR)/$(CONFIG)/delegating_channel_test +destroy_grpclb_channel_with_active_connect_stress_test: $(BINDIR)/$(CONFIG)/destroy_grpclb_channel_with_active_connect_stress_test +duplicate_header_bad_client_test: $(BINDIR)/$(CONFIG)/duplicate_header_bad_client_test +end2end_test: $(BINDIR)/$(CONFIG)/end2end_test +error_details_test: $(BINDIR)/$(CONFIG)/error_details_test +eventmanager_libuv_test: $(BINDIR)/$(CONFIG)/eventmanager_libuv_test +exception_test: $(BINDIR)/$(CONFIG)/exception_test +filter_end2end_test: $(BINDIR)/$(CONFIG)/filter_end2end_test +flaky_network_test: $(BINDIR)/$(CONFIG)/flaky_network_test +generic_end2end_test: $(BINDIR)/$(CONFIG)/generic_end2end_test +global_config_env_test: $(BINDIR)/$(CONFIG)/global_config_env_test +global_config_test: $(BINDIR)/$(CONFIG)/global_config_test +grpc_cli: $(BINDIR)/$(CONFIG)/grpc_cli +grpc_cpp_plugin: $(BINDIR)/$(CONFIG)/grpc_cpp_plugin +grpc_csharp_plugin: $(BINDIR)/$(CONFIG)/grpc_csharp_plugin +grpc_node_plugin: $(BINDIR)/$(CONFIG)/grpc_node_plugin +grpc_objective_c_plugin: $(BINDIR)/$(CONFIG)/grpc_objective_c_plugin +grpc_php_plugin: $(BINDIR)/$(CONFIG)/grpc_php_plugin +grpc_python_plugin: $(BINDIR)/$(CONFIG)/grpc_python_plugin +grpc_ruby_plugin: $(BINDIR)/$(CONFIG)/grpc_ruby_plugin +grpc_tls_credentials_options_test: $(BINDIR)/$(CONFIG)/grpc_tls_credentials_options_test +grpc_tool_test: $(BINDIR)/$(CONFIG)/grpc_tool_test +grpclb_api_test: $(BINDIR)/$(CONFIG)/grpclb_api_test +grpclb_end2end_test: $(BINDIR)/$(CONFIG)/grpclb_end2end_test +h2_ssl_session_reuse_test: $(BINDIR)/$(CONFIG)/h2_ssl_session_reuse_test +head_of_line_blocking_bad_client_test: $(BINDIR)/$(CONFIG)/head_of_line_blocking_bad_client_test +headers_bad_client_test: $(BINDIR)/$(CONFIG)/headers_bad_client_test +health_service_end2end_test: $(BINDIR)/$(CONFIG)/health_service_end2end_test +hpack_parser_fuzzer_test: $(BINDIR)/$(CONFIG)/hpack_parser_fuzzer_test +http2_client: $(BINDIR)/$(CONFIG)/http2_client +http_request_fuzzer_test: $(BINDIR)/$(CONFIG)/http_request_fuzzer_test +http_response_fuzzer_test: $(BINDIR)/$(CONFIG)/http_response_fuzzer_test +hybrid_end2end_test: $(BINDIR)/$(CONFIG)/hybrid_end2end_test +initial_settings_frame_bad_client_test: $(BINDIR)/$(CONFIG)/initial_settings_frame_bad_client_test +interop_client: $(BINDIR)/$(CONFIG)/interop_client +interop_server: $(BINDIR)/$(CONFIG)/interop_server +interop_test: $(BINDIR)/$(CONFIG)/interop_test +json_fuzzer_test: $(BINDIR)/$(CONFIG)/json_fuzzer_test +json_test: $(BINDIR)/$(CONFIG)/json_test +large_metadata_bad_client_test: $(BINDIR)/$(CONFIG)/large_metadata_bad_client_test +lb_get_cpu_stats_test: $(BINDIR)/$(CONFIG)/lb_get_cpu_stats_test +lb_load_data_store_test: $(BINDIR)/$(CONFIG)/lb_load_data_store_test +linux_system_roots_test: $(BINDIR)/$(CONFIG)/linux_system_roots_test +message_allocator_end2end_test: $(BINDIR)/$(CONFIG)/message_allocator_end2end_test +mock_test: $(BINDIR)/$(CONFIG)/mock_test +nanopb_fuzzer_response_test: $(BINDIR)/$(CONFIG)/nanopb_fuzzer_response_test +nanopb_fuzzer_serverlist_test: $(BINDIR)/$(CONFIG)/nanopb_fuzzer_serverlist_test +nonblocking_test: $(BINDIR)/$(CONFIG)/nonblocking_test +noop-benchmark: $(BINDIR)/$(CONFIG)/noop-benchmark +orphanable_test: $(BINDIR)/$(CONFIG)/orphanable_test +out_of_bounds_bad_client_test: $(BINDIR)/$(CONFIG)/out_of_bounds_bad_client_test +percent_decode_fuzzer: $(BINDIR)/$(CONFIG)/percent_decode_fuzzer +percent_encode_fuzzer: $(BINDIR)/$(CONFIG)/percent_encode_fuzzer +pid_controller_test: $(BINDIR)/$(CONFIG)/pid_controller_test +port_sharing_end2end_test: $(BINDIR)/$(CONFIG)/port_sharing_end2end_test +proto_server_reflection_test: $(BINDIR)/$(CONFIG)/proto_server_reflection_test +proto_utils_test: $(BINDIR)/$(CONFIG)/proto_utils_test +qps_json_driver: $(BINDIR)/$(CONFIG)/qps_json_driver +qps_worker: $(BINDIR)/$(CONFIG)/qps_worker +raw_end2end_test: $(BINDIR)/$(CONFIG)/raw_end2end_test +ref_counted_ptr_test: $(BINDIR)/$(CONFIG)/ref_counted_ptr_test +ref_counted_test: $(BINDIR)/$(CONFIG)/ref_counted_test +retry_throttle_test: $(BINDIR)/$(CONFIG)/retry_throttle_test +secure_auth_context_test: $(BINDIR)/$(CONFIG)/secure_auth_context_test +server_builder_plugin_test: $(BINDIR)/$(CONFIG)/server_builder_plugin_test +server_builder_test: $(BINDIR)/$(CONFIG)/server_builder_test +server_builder_with_socket_mutator_test: $(BINDIR)/$(CONFIG)/server_builder_with_socket_mutator_test +server_context_test_spouse_test: $(BINDIR)/$(CONFIG)/server_context_test_spouse_test +server_early_return_test: $(BINDIR)/$(CONFIG)/server_early_return_test +server_fuzzer: $(BINDIR)/$(CONFIG)/server_fuzzer +server_interceptors_end2end_test: $(BINDIR)/$(CONFIG)/server_interceptors_end2end_test +server_registered_method_bad_client_test: $(BINDIR)/$(CONFIG)/server_registered_method_bad_client_test +server_request_call_test: $(BINDIR)/$(CONFIG)/server_request_call_test +service_config_end2end_test: $(BINDIR)/$(CONFIG)/service_config_end2end_test +service_config_test: $(BINDIR)/$(CONFIG)/service_config_test +settings_timeout_test: $(BINDIR)/$(CONFIG)/settings_timeout_test +shutdown_test: $(BINDIR)/$(CONFIG)/shutdown_test +simple_request_bad_client_test: $(BINDIR)/$(CONFIG)/simple_request_bad_client_test +slice_hash_table_test: $(BINDIR)/$(CONFIG)/slice_hash_table_test +slice_weak_hash_table_test: $(BINDIR)/$(CONFIG)/slice_weak_hash_table_test +ssl_server_fuzzer: $(BINDIR)/$(CONFIG)/ssl_server_fuzzer +static_metadata_test: $(BINDIR)/$(CONFIG)/static_metadata_test +stats_test: $(BINDIR)/$(CONFIG)/stats_test +status_metadata_test: $(BINDIR)/$(CONFIG)/status_metadata_test +status_util_test: $(BINDIR)/$(CONFIG)/status_util_test +streaming_throughput_test: $(BINDIR)/$(CONFIG)/streaming_throughput_test +string_ref_test: $(BINDIR)/$(CONFIG)/string_ref_test +test_cpp_client_credentials_test: $(BINDIR)/$(CONFIG)/test_cpp_client_credentials_test +test_cpp_util_slice_test: $(BINDIR)/$(CONFIG)/test_cpp_util_slice_test +test_cpp_util_time_test: $(BINDIR)/$(CONFIG)/test_cpp_util_time_test +thread_manager_test: $(BINDIR)/$(CONFIG)/thread_manager_test +thread_stress_test: $(BINDIR)/$(CONFIG)/thread_stress_test +time_jump_test: $(BINDIR)/$(CONFIG)/time_jump_test +timer_test: $(BINDIR)/$(CONFIG)/timer_test +tls_security_connector_test: $(BINDIR)/$(CONFIG)/tls_security_connector_test +unknown_frame_bad_client_test: $(BINDIR)/$(CONFIG)/unknown_frame_bad_client_test +uri_fuzzer_test: $(BINDIR)/$(CONFIG)/uri_fuzzer_test +window_overflow_bad_client_test: $(BINDIR)/$(CONFIG)/window_overflow_bad_client_test +work_serializer_test: $(BINDIR)/$(CONFIG)/work_serializer_test +writes_per_rpc_test: $(BINDIR)/$(CONFIG)/writes_per_rpc_test +xds_bootstrap_test: $(BINDIR)/$(CONFIG)/xds_bootstrap_test +xds_end2end_test: $(BINDIR)/$(CONFIG)/xds_end2end_test +xds_interop_client: $(BINDIR)/$(CONFIG)/xds_interop_client +xds_interop_server: $(BINDIR)/$(CONFIG)/xds_interop_server +boringssl_ssl_test: $(BINDIR)/$(CONFIG)/boringssl_ssl_test +boringssl_crypto_test: $(BINDIR)/$(CONFIG)/boringssl_crypto_test +alts_credentials_fuzzer_one_entry: $(BINDIR)/$(CONFIG)/alts_credentials_fuzzer_one_entry +client_fuzzer_one_entry: $(BINDIR)/$(CONFIG)/client_fuzzer_one_entry +hpack_parser_fuzzer_test_one_entry: $(BINDIR)/$(CONFIG)/hpack_parser_fuzzer_test_one_entry +http_request_fuzzer_test_one_entry: $(BINDIR)/$(CONFIG)/http_request_fuzzer_test_one_entry +http_response_fuzzer_test_one_entry: $(BINDIR)/$(CONFIG)/http_response_fuzzer_test_one_entry +json_fuzzer_test_one_entry: $(BINDIR)/$(CONFIG)/json_fuzzer_test_one_entry +nanopb_fuzzer_response_test_one_entry: $(BINDIR)/$(CONFIG)/nanopb_fuzzer_response_test_one_entry +nanopb_fuzzer_serverlist_test_one_entry: $(BINDIR)/$(CONFIG)/nanopb_fuzzer_serverlist_test_one_entry +percent_decode_fuzzer_one_entry: $(BINDIR)/$(CONFIG)/percent_decode_fuzzer_one_entry +percent_encode_fuzzer_one_entry: $(BINDIR)/$(CONFIG)/percent_encode_fuzzer_one_entry +server_fuzzer_one_entry: $(BINDIR)/$(CONFIG)/server_fuzzer_one_entry +ssl_server_fuzzer_one_entry: $(BINDIR)/$(CONFIG)/ssl_server_fuzzer_one_entry +uri_fuzzer_test_one_entry: $(BINDIR)/$(CONFIG)/uri_fuzzer_test_one_entry + +run_dep_checks: + $(OPENSSL_ALPN_CHECK_CMD) || true + $(ZLIB_CHECK_CMD) || true + $(PERFTOOLS_CHECK_CMD) || true + $(PROTOBUF_CHECK_CMD) || true + $(PROTOC_CHECK_VERSION_CMD) || true + $(CARES_CHECK_CMD) || true + +third_party/protobuf/configure: + $(E) "[AUTOGEN] Preparing protobuf" + $(Q)(cd third_party/protobuf ; autoreconf -f -i -Wall,no-obsolete) + +$(LIBDIR)/$(CONFIG)/protobuf/libprotobuf.a: third_party/protobuf/configure + $(E) "[MAKE] Building protobuf" + $(Q)mkdir -p $(LIBDIR)/$(CONFIG)/protobuf + $(Q)(cd third_party/protobuf ; CC="$(CC)" CXX="$(CXX)" LDFLAGS="$(LDFLAGS_$(CONFIG)) -g $(PROTOBUF_LDFLAGS_EXTRA)" CPPFLAGS="$(PIC_CPPFLAGS) $(CPPFLAGS_$(CONFIG)) -g $(PROTOBUF_CPPFLAGS_EXTRA)" ./configure --disable-shared --enable-static $(PROTOBUF_CONFIG_OPTS)) + $(Q)$(MAKE) -C third_party/protobuf clean + $(Q)$(MAKE) -C third_party/protobuf + $(Q)mkdir -p $(BINDIR)/$(CONFIG)/protobuf + $(Q)cp third_party/protobuf/src/.libs/libprotoc.a $(LIBDIR)/$(CONFIG)/protobuf + $(Q)cp third_party/protobuf/src/.libs/libprotobuf.a $(LIBDIR)/$(CONFIG)/protobuf + $(Q)cp third_party/protobuf/src/protoc $(BINDIR)/$(CONFIG)/protobuf + +static: static_c static_cxx + +static_c: pc_c pc_c_unsecure cache.mk $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgrpc_csharp_ext.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libupb.a + +static_cxx: pc_cxx pc_cxx_unsecure cache.mk $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_alts.a $(LIBDIR)/$(CONFIG)/libgrpc++_error_details.a $(LIBDIR)/$(CONFIG)/libgrpc++_reflection.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpcpp_channelz.a + +static_csharp: static_c + +shared: shared_c shared_cxx + +shared_c: pc_c pc_c_unsecure cache.mk $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)address_sorting$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)gpr$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)grpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)grpc_csharp_ext$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)grpc_unsecure$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)upb$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) +shared_cxx: pc_cxx pc_cxx_unsecure cache.mk $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)grpc++$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)grpc++_alts$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)grpc++_error_details$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)grpc++_reflection$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)grpc++_unsecure$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)grpcpp_channelz$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) + +shared_csharp: shared_c +grpc_csharp_ext: shared_csharp + +plugins: $(PROTOC_PLUGINS) + +privatelibs: privatelibs_c privatelibs_cxx + +privatelibs_c: $(LIBDIR)/$(CONFIG)/libend2end_nosec_tests.a $(LIBDIR)/$(CONFIG)/libend2end_tests.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libz.a $(LIBDIR)/$(CONFIG)/libares.a +pc_c: $(LIBDIR)/$(CONFIG)/pkgconfig/grpc.pc $(LIBDIR)/$(CONFIG)/pkgconfig/gpr.pc + +pc_c_unsecure: $(LIBDIR)/$(CONFIG)/pkgconfig/grpc_unsecure.pc $(LIBDIR)/$(CONFIG)/pkgconfig/gpr.pc + +pc_cxx: $(LIBDIR)/$(CONFIG)/pkgconfig/grpc++.pc + +pc_cxx_unsecure: $(LIBDIR)/$(CONFIG)/pkgconfig/grpc++_unsecure.pc + +ifeq ($(EMBED_OPENSSL),true) +privatelibs_cxx: $(LIBDIR)/$(CONFIG)/libgrpc++_test.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libbenchmark.a +else +privatelibs_cxx: $(LIBDIR)/$(CONFIG)/libgrpc++_test.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libbenchmark.a +endif + + +buildtests: buildtests_c buildtests_cxx + +buildtests_c: privatelibs_c \ + $(BINDIR)/$(CONFIG)/algorithm_test \ + $(BINDIR)/$(CONFIG)/alloc_test \ + $(BINDIR)/$(CONFIG)/alpn_test \ + $(BINDIR)/$(CONFIG)/alts_counter_test \ + $(BINDIR)/$(CONFIG)/alts_crypt_test \ + $(BINDIR)/$(CONFIG)/alts_crypter_test \ + $(BINDIR)/$(CONFIG)/alts_frame_protector_test \ + $(BINDIR)/$(CONFIG)/alts_grpc_record_protocol_test \ + $(BINDIR)/$(CONFIG)/alts_handshaker_client_test \ + $(BINDIR)/$(CONFIG)/alts_iovec_record_protocol_test \ + $(BINDIR)/$(CONFIG)/alts_security_connector_test \ + $(BINDIR)/$(CONFIG)/alts_tsi_handshaker_test \ + $(BINDIR)/$(CONFIG)/alts_tsi_utils_test \ + $(BINDIR)/$(CONFIG)/alts_zero_copy_grpc_protector_test \ + $(BINDIR)/$(CONFIG)/arena_test \ + $(BINDIR)/$(CONFIG)/auth_context_test \ + $(BINDIR)/$(CONFIG)/avl_test \ + $(BINDIR)/$(CONFIG)/b64_test \ + $(BINDIR)/$(CONFIG)/bad_server_response_test \ + $(BINDIR)/$(CONFIG)/bad_ssl_alpn_test \ + $(BINDIR)/$(CONFIG)/bad_ssl_cert_test \ + $(BINDIR)/$(CONFIG)/bin_decoder_test \ + $(BINDIR)/$(CONFIG)/bin_encoder_test \ + $(BINDIR)/$(CONFIG)/buffer_list_test \ + $(BINDIR)/$(CONFIG)/channel_args_test \ + $(BINDIR)/$(CONFIG)/channel_create_test \ + $(BINDIR)/$(CONFIG)/channel_stack_builder_test \ + $(BINDIR)/$(CONFIG)/channel_stack_test \ + $(BINDIR)/$(CONFIG)/check_gcp_environment_linux_test \ + $(BINDIR)/$(CONFIG)/check_gcp_environment_windows_test \ + $(BINDIR)/$(CONFIG)/client_ssl_test \ + $(BINDIR)/$(CONFIG)/cmdline_test \ + $(BINDIR)/$(CONFIG)/combiner_test \ + $(BINDIR)/$(CONFIG)/completion_queue_threading_test \ + $(BINDIR)/$(CONFIG)/compression_test \ + $(BINDIR)/$(CONFIG)/concurrent_connectivity_test \ + $(BINDIR)/$(CONFIG)/connection_refused_test \ + $(BINDIR)/$(CONFIG)/cpu_test \ + $(BINDIR)/$(CONFIG)/dns_resolver_connectivity_using_ares_resolver_test \ + $(BINDIR)/$(CONFIG)/dns_resolver_connectivity_using_native_resolver_test \ + $(BINDIR)/$(CONFIG)/dns_resolver_cooldown_test \ + $(BINDIR)/$(CONFIG)/dns_resolver_test \ + $(BINDIR)/$(CONFIG)/dualstack_socket_test \ + $(BINDIR)/$(CONFIG)/endpoint_pair_test \ + $(BINDIR)/$(CONFIG)/env_test \ + $(BINDIR)/$(CONFIG)/error_test \ + $(BINDIR)/$(CONFIG)/ev_epollex_linux_test \ + $(BINDIR)/$(CONFIG)/fake_resolver_test \ + $(BINDIR)/$(CONFIG)/fake_transport_security_test \ + $(BINDIR)/$(CONFIG)/fd_conservation_posix_test \ + $(BINDIR)/$(CONFIG)/fd_posix_test \ + $(BINDIR)/$(CONFIG)/fling_stream_test \ + $(BINDIR)/$(CONFIG)/fling_test \ + $(BINDIR)/$(CONFIG)/fork_test \ + $(BINDIR)/$(CONFIG)/format_request_test \ + $(BINDIR)/$(CONFIG)/frame_handler_test \ + $(BINDIR)/$(CONFIG)/goaway_server_test \ + $(BINDIR)/$(CONFIG)/grpc_alts_credentials_options_test \ + $(BINDIR)/$(CONFIG)/grpc_byte_buffer_reader_test \ + $(BINDIR)/$(CONFIG)/grpc_completion_queue_test \ + $(BINDIR)/$(CONFIG)/grpc_ipv6_loopback_available_test \ + $(BINDIR)/$(CONFIG)/handshake_server_with_readahead_handshaker_test \ + $(BINDIR)/$(CONFIG)/handshake_verify_peer_options_test \ + $(BINDIR)/$(CONFIG)/histogram_test \ + $(BINDIR)/$(CONFIG)/host_port_test \ + $(BINDIR)/$(CONFIG)/hpack_encoder_test \ + $(BINDIR)/$(CONFIG)/hpack_parser_test \ + $(BINDIR)/$(CONFIG)/hpack_table_test \ + $(BINDIR)/$(CONFIG)/httpcli_test \ + $(BINDIR)/$(CONFIG)/httpscli_test \ + $(BINDIR)/$(CONFIG)/init_test \ + $(BINDIR)/$(CONFIG)/inproc_callback_test \ + $(BINDIR)/$(CONFIG)/invalid_call_argument_test \ + $(BINDIR)/$(CONFIG)/json_token_test \ + $(BINDIR)/$(CONFIG)/jwt_verifier_test \ + $(BINDIR)/$(CONFIG)/lame_client_test \ + $(BINDIR)/$(CONFIG)/load_file_test \ + $(BINDIR)/$(CONFIG)/log_test \ + $(BINDIR)/$(CONFIG)/manual_constructor_test \ + $(BINDIR)/$(CONFIG)/message_compress_test \ + $(BINDIR)/$(CONFIG)/metadata_test \ + $(BINDIR)/$(CONFIG)/minimal_stack_is_minimal_test \ + $(BINDIR)/$(CONFIG)/mpmcqueue_test \ + $(BINDIR)/$(CONFIG)/mpscq_test \ + $(BINDIR)/$(CONFIG)/multiple_server_queues_test \ + $(BINDIR)/$(CONFIG)/murmur_hash_test \ + $(BINDIR)/$(CONFIG)/no_server_test \ + $(BINDIR)/$(CONFIG)/num_external_connectivity_watchers_test \ + $(BINDIR)/$(CONFIG)/parse_address_test \ + $(BINDIR)/$(CONFIG)/parse_address_with_named_scope_id_test \ + $(BINDIR)/$(CONFIG)/parser_test \ + $(BINDIR)/$(CONFIG)/percent_encoding_test \ + $(BINDIR)/$(CONFIG)/public_headers_must_be_c89 \ + $(BINDIR)/$(CONFIG)/resolve_address_using_ares_resolver_posix_test \ + $(BINDIR)/$(CONFIG)/resolve_address_using_ares_resolver_test \ + $(BINDIR)/$(CONFIG)/resolve_address_using_native_resolver_posix_test \ + $(BINDIR)/$(CONFIG)/resolve_address_using_native_resolver_test \ + $(BINDIR)/$(CONFIG)/resource_quota_test \ + $(BINDIR)/$(CONFIG)/secure_channel_create_test \ + $(BINDIR)/$(CONFIG)/secure_endpoint_test \ + $(BINDIR)/$(CONFIG)/security_connector_test \ + $(BINDIR)/$(CONFIG)/sequential_connectivity_test \ + $(BINDIR)/$(CONFIG)/server_chttp2_test \ + $(BINDIR)/$(CONFIG)/server_ssl_test \ + $(BINDIR)/$(CONFIG)/server_test \ + $(BINDIR)/$(CONFIG)/slice_buffer_test \ + $(BINDIR)/$(CONFIG)/slice_string_helpers_test \ + $(BINDIR)/$(CONFIG)/sockaddr_resolver_test \ + $(BINDIR)/$(CONFIG)/sockaddr_utils_test \ + $(BINDIR)/$(CONFIG)/socket_utils_test \ + $(BINDIR)/$(CONFIG)/spinlock_test \ + $(BINDIR)/$(CONFIG)/ssl_credentials_test \ + $(BINDIR)/$(CONFIG)/ssl_transport_security_test \ + $(BINDIR)/$(CONFIG)/status_conversion_test \ + $(BINDIR)/$(CONFIG)/stream_compression_test \ + $(BINDIR)/$(CONFIG)/stream_map_test \ + $(BINDIR)/$(CONFIG)/stream_owned_slice_test \ + $(BINDIR)/$(CONFIG)/string_test \ + $(BINDIR)/$(CONFIG)/sync_test \ + $(BINDIR)/$(CONFIG)/tcp_client_posix_test \ + $(BINDIR)/$(CONFIG)/tcp_posix_test \ + $(BINDIR)/$(CONFIG)/tcp_server_posix_test \ + $(BINDIR)/$(CONFIG)/test_core_gpr_time_test \ + $(BINDIR)/$(CONFIG)/test_core_security_credentials_test \ + $(BINDIR)/$(CONFIG)/test_core_slice_slice_test \ + $(BINDIR)/$(CONFIG)/thd_test \ + $(BINDIR)/$(CONFIG)/threadpool_test \ + $(BINDIR)/$(CONFIG)/time_averaged_stats_test \ + $(BINDIR)/$(CONFIG)/timeout_encoding_test \ + $(BINDIR)/$(CONFIG)/timer_heap_test \ + $(BINDIR)/$(CONFIG)/timer_list_test \ + $(BINDIR)/$(CONFIG)/tls_test \ + $(BINDIR)/$(CONFIG)/transport_security_common_api_test \ + $(BINDIR)/$(CONFIG)/transport_security_test \ + $(BINDIR)/$(CONFIG)/udp_server_test \ + $(BINDIR)/$(CONFIG)/uri_parser_test \ + $(BINDIR)/$(CONFIG)/useful_test \ + $(BINDIR)/$(CONFIG)/varint_test \ + + +ifeq ($(EMBED_OPENSSL),true) +buildtests_cxx: privatelibs_cxx \ + $(BINDIR)/$(CONFIG)/address_sorting_test \ + $(BINDIR)/$(CONFIG)/address_sorting_test_unsecure \ + $(BINDIR)/$(CONFIG)/alarm_test \ + $(BINDIR)/$(CONFIG)/alts_concurrent_connectivity_test \ + $(BINDIR)/$(CONFIG)/alts_util_test \ + $(BINDIR)/$(CONFIG)/async_end2end_test \ + $(BINDIR)/$(CONFIG)/auth_property_iterator_test \ + $(BINDIR)/$(CONFIG)/backoff_test \ + $(BINDIR)/$(CONFIG)/bad_streaming_id_bad_client_test \ + $(BINDIR)/$(CONFIG)/badreq_bad_client_test \ + $(BINDIR)/$(CONFIG)/bdp_estimator_test \ + $(BINDIR)/$(CONFIG)/bm_alarm \ + $(BINDIR)/$(CONFIG)/bm_arena \ + $(BINDIR)/$(CONFIG)/bm_byte_buffer \ + $(BINDIR)/$(CONFIG)/bm_call_create \ + $(BINDIR)/$(CONFIG)/bm_callback_streaming_ping_pong \ + $(BINDIR)/$(CONFIG)/bm_callback_unary_ping_pong \ + $(BINDIR)/$(CONFIG)/bm_channel \ + $(BINDIR)/$(CONFIG)/bm_chttp2_hpack \ + $(BINDIR)/$(CONFIG)/bm_chttp2_transport \ + $(BINDIR)/$(CONFIG)/bm_closure \ + $(BINDIR)/$(CONFIG)/bm_cq \ + $(BINDIR)/$(CONFIG)/bm_cq_multiple_threads \ + $(BINDIR)/$(CONFIG)/bm_error \ + $(BINDIR)/$(CONFIG)/bm_fullstack_streaming_ping_pong \ + $(BINDIR)/$(CONFIG)/bm_fullstack_streaming_pump \ + $(BINDIR)/$(CONFIG)/bm_fullstack_trickle \ + $(BINDIR)/$(CONFIG)/bm_fullstack_unary_ping_pong \ + $(BINDIR)/$(CONFIG)/bm_metadata \ + $(BINDIR)/$(CONFIG)/bm_pollset \ + $(BINDIR)/$(CONFIG)/bm_threadpool \ + $(BINDIR)/$(CONFIG)/bm_timer \ + $(BINDIR)/$(CONFIG)/byte_buffer_test \ + $(BINDIR)/$(CONFIG)/byte_stream_test \ + $(BINDIR)/$(CONFIG)/cancel_ares_query_test \ + $(BINDIR)/$(CONFIG)/cfstream_test \ + $(BINDIR)/$(CONFIG)/channel_arguments_test \ + $(BINDIR)/$(CONFIG)/channel_filter_test \ + $(BINDIR)/$(CONFIG)/channel_trace_test \ + $(BINDIR)/$(CONFIG)/channelz_registry_test \ + $(BINDIR)/$(CONFIG)/channelz_service_test \ + $(BINDIR)/$(CONFIG)/channelz_test \ + $(BINDIR)/$(CONFIG)/cli_call_test \ + $(BINDIR)/$(CONFIG)/client_callback_end2end_test \ + $(BINDIR)/$(CONFIG)/client_channel_stress_test \ + $(BINDIR)/$(CONFIG)/client_interceptors_end2end_test \ + $(BINDIR)/$(CONFIG)/client_lb_end2end_test \ + $(BINDIR)/$(CONFIG)/codegen_test_full \ + $(BINDIR)/$(CONFIG)/codegen_test_minimal \ + $(BINDIR)/$(CONFIG)/connection_prefix_bad_client_test \ + $(BINDIR)/$(CONFIG)/connectivity_state_test \ + $(BINDIR)/$(CONFIG)/context_list_test \ + $(BINDIR)/$(CONFIG)/delegating_channel_test \ + $(BINDIR)/$(CONFIG)/destroy_grpclb_channel_with_active_connect_stress_test \ + $(BINDIR)/$(CONFIG)/duplicate_header_bad_client_test \ + $(BINDIR)/$(CONFIG)/end2end_test \ + $(BINDIR)/$(CONFIG)/error_details_test \ + $(BINDIR)/$(CONFIG)/eventmanager_libuv_test \ + $(BINDIR)/$(CONFIG)/exception_test \ + $(BINDIR)/$(CONFIG)/filter_end2end_test \ + $(BINDIR)/$(CONFIG)/flaky_network_test \ + $(BINDIR)/$(CONFIG)/generic_end2end_test \ + $(BINDIR)/$(CONFIG)/global_config_env_test \ + $(BINDIR)/$(CONFIG)/global_config_test \ + $(BINDIR)/$(CONFIG)/grpc_cli \ + $(BINDIR)/$(CONFIG)/grpc_tls_credentials_options_test \ + $(BINDIR)/$(CONFIG)/grpc_tool_test \ + $(BINDIR)/$(CONFIG)/grpclb_api_test \ + $(BINDIR)/$(CONFIG)/grpclb_end2end_test \ + $(BINDIR)/$(CONFIG)/h2_ssl_session_reuse_test \ + $(BINDIR)/$(CONFIG)/head_of_line_blocking_bad_client_test \ + $(BINDIR)/$(CONFIG)/headers_bad_client_test \ + $(BINDIR)/$(CONFIG)/health_service_end2end_test \ + $(BINDIR)/$(CONFIG)/http2_client \ + $(BINDIR)/$(CONFIG)/hybrid_end2end_test \ + $(BINDIR)/$(CONFIG)/initial_settings_frame_bad_client_test \ + $(BINDIR)/$(CONFIG)/interop_client \ + $(BINDIR)/$(CONFIG)/interop_server \ + $(BINDIR)/$(CONFIG)/interop_test \ + $(BINDIR)/$(CONFIG)/json_test \ + $(BINDIR)/$(CONFIG)/large_metadata_bad_client_test \ + $(BINDIR)/$(CONFIG)/lb_get_cpu_stats_test \ + $(BINDIR)/$(CONFIG)/lb_load_data_store_test \ + $(BINDIR)/$(CONFIG)/linux_system_roots_test \ + $(BINDIR)/$(CONFIG)/message_allocator_end2end_test \ + $(BINDIR)/$(CONFIG)/mock_test \ + $(BINDIR)/$(CONFIG)/nonblocking_test \ + $(BINDIR)/$(CONFIG)/noop-benchmark \ + $(BINDIR)/$(CONFIG)/orphanable_test \ + $(BINDIR)/$(CONFIG)/out_of_bounds_bad_client_test \ + $(BINDIR)/$(CONFIG)/pid_controller_test \ + $(BINDIR)/$(CONFIG)/port_sharing_end2end_test \ + $(BINDIR)/$(CONFIG)/proto_server_reflection_test \ + $(BINDIR)/$(CONFIG)/proto_utils_test \ + $(BINDIR)/$(CONFIG)/qps_json_driver \ + $(BINDIR)/$(CONFIG)/qps_worker \ + $(BINDIR)/$(CONFIG)/raw_end2end_test \ + $(BINDIR)/$(CONFIG)/ref_counted_ptr_test \ + $(BINDIR)/$(CONFIG)/ref_counted_test \ + $(BINDIR)/$(CONFIG)/retry_throttle_test \ + $(BINDIR)/$(CONFIG)/secure_auth_context_test \ + $(BINDIR)/$(CONFIG)/server_builder_plugin_test \ + $(BINDIR)/$(CONFIG)/server_builder_test \ + $(BINDIR)/$(CONFIG)/server_builder_with_socket_mutator_test \ + $(BINDIR)/$(CONFIG)/server_context_test_spouse_test \ + $(BINDIR)/$(CONFIG)/server_early_return_test \ + $(BINDIR)/$(CONFIG)/server_interceptors_end2end_test \ + $(BINDIR)/$(CONFIG)/server_registered_method_bad_client_test \ + $(BINDIR)/$(CONFIG)/server_request_call_test \ + $(BINDIR)/$(CONFIG)/service_config_end2end_test \ + $(BINDIR)/$(CONFIG)/service_config_test \ + $(BINDIR)/$(CONFIG)/settings_timeout_test \ + $(BINDIR)/$(CONFIG)/shutdown_test \ + $(BINDIR)/$(CONFIG)/simple_request_bad_client_test \ + $(BINDIR)/$(CONFIG)/slice_hash_table_test \ + $(BINDIR)/$(CONFIG)/slice_weak_hash_table_test \ + $(BINDIR)/$(CONFIG)/static_metadata_test \ + $(BINDIR)/$(CONFIG)/stats_test \ + $(BINDIR)/$(CONFIG)/status_metadata_test \ + $(BINDIR)/$(CONFIG)/status_util_test \ + $(BINDIR)/$(CONFIG)/streaming_throughput_test \ + $(BINDIR)/$(CONFIG)/string_ref_test \ + $(BINDIR)/$(CONFIG)/test_cpp_client_credentials_test \ + $(BINDIR)/$(CONFIG)/test_cpp_util_slice_test \ + $(BINDIR)/$(CONFIG)/test_cpp_util_time_test \ + $(BINDIR)/$(CONFIG)/thread_manager_test \ + $(BINDIR)/$(CONFIG)/thread_stress_test \ + $(BINDIR)/$(CONFIG)/time_jump_test \ + $(BINDIR)/$(CONFIG)/timer_test \ + $(BINDIR)/$(CONFIG)/tls_security_connector_test \ + $(BINDIR)/$(CONFIG)/unknown_frame_bad_client_test \ + $(BINDIR)/$(CONFIG)/window_overflow_bad_client_test \ + $(BINDIR)/$(CONFIG)/work_serializer_test \ + $(BINDIR)/$(CONFIG)/writes_per_rpc_test \ + $(BINDIR)/$(CONFIG)/xds_bootstrap_test \ + $(BINDIR)/$(CONFIG)/xds_end2end_test \ + $(BINDIR)/$(CONFIG)/xds_interop_client \ + $(BINDIR)/$(CONFIG)/xds_interop_server \ + $(BINDIR)/$(CONFIG)/boringssl_ssl_test \ + $(BINDIR)/$(CONFIG)/boringssl_crypto_test \ + $(BINDIR)/$(CONFIG)/alts_credentials_fuzzer_one_entry \ + $(BINDIR)/$(CONFIG)/client_fuzzer_one_entry \ + $(BINDIR)/$(CONFIG)/hpack_parser_fuzzer_test_one_entry \ + $(BINDIR)/$(CONFIG)/http_request_fuzzer_test_one_entry \ + $(BINDIR)/$(CONFIG)/http_response_fuzzer_test_one_entry \ + $(BINDIR)/$(CONFIG)/json_fuzzer_test_one_entry \ + $(BINDIR)/$(CONFIG)/nanopb_fuzzer_response_test_one_entry \ + $(BINDIR)/$(CONFIG)/nanopb_fuzzer_serverlist_test_one_entry \ + $(BINDIR)/$(CONFIG)/percent_decode_fuzzer_one_entry \ + $(BINDIR)/$(CONFIG)/percent_encode_fuzzer_one_entry \ + $(BINDIR)/$(CONFIG)/server_fuzzer_one_entry \ + $(BINDIR)/$(CONFIG)/ssl_server_fuzzer_one_entry \ + $(BINDIR)/$(CONFIG)/uri_fuzzer_test_one_entry \ + +else +buildtests_cxx: privatelibs_cxx \ + $(BINDIR)/$(CONFIG)/address_sorting_test \ + $(BINDIR)/$(CONFIG)/address_sorting_test_unsecure \ + $(BINDIR)/$(CONFIG)/alarm_test \ + $(BINDIR)/$(CONFIG)/alts_concurrent_connectivity_test \ + $(BINDIR)/$(CONFIG)/alts_util_test \ + $(BINDIR)/$(CONFIG)/async_end2end_test \ + $(BINDIR)/$(CONFIG)/auth_property_iterator_test \ + $(BINDIR)/$(CONFIG)/backoff_test \ + $(BINDIR)/$(CONFIG)/bad_streaming_id_bad_client_test \ + $(BINDIR)/$(CONFIG)/badreq_bad_client_test \ + $(BINDIR)/$(CONFIG)/bdp_estimator_test \ + $(BINDIR)/$(CONFIG)/bm_alarm \ + $(BINDIR)/$(CONFIG)/bm_arena \ + $(BINDIR)/$(CONFIG)/bm_byte_buffer \ + $(BINDIR)/$(CONFIG)/bm_call_create \ + $(BINDIR)/$(CONFIG)/bm_callback_streaming_ping_pong \ + $(BINDIR)/$(CONFIG)/bm_callback_unary_ping_pong \ + $(BINDIR)/$(CONFIG)/bm_channel \ + $(BINDIR)/$(CONFIG)/bm_chttp2_hpack \ + $(BINDIR)/$(CONFIG)/bm_chttp2_transport \ + $(BINDIR)/$(CONFIG)/bm_closure \ + $(BINDIR)/$(CONFIG)/bm_cq \ + $(BINDIR)/$(CONFIG)/bm_cq_multiple_threads \ + $(BINDIR)/$(CONFIG)/bm_error \ + $(BINDIR)/$(CONFIG)/bm_fullstack_streaming_ping_pong \ + $(BINDIR)/$(CONFIG)/bm_fullstack_streaming_pump \ + $(BINDIR)/$(CONFIG)/bm_fullstack_trickle \ + $(BINDIR)/$(CONFIG)/bm_fullstack_unary_ping_pong \ + $(BINDIR)/$(CONFIG)/bm_metadata \ + $(BINDIR)/$(CONFIG)/bm_pollset \ + $(BINDIR)/$(CONFIG)/bm_threadpool \ + $(BINDIR)/$(CONFIG)/bm_timer \ + $(BINDIR)/$(CONFIG)/byte_buffer_test \ + $(BINDIR)/$(CONFIG)/byte_stream_test \ + $(BINDIR)/$(CONFIG)/cancel_ares_query_test \ + $(BINDIR)/$(CONFIG)/cfstream_test \ + $(BINDIR)/$(CONFIG)/channel_arguments_test \ + $(BINDIR)/$(CONFIG)/channel_filter_test \ + $(BINDIR)/$(CONFIG)/channel_trace_test \ + $(BINDIR)/$(CONFIG)/channelz_registry_test \ + $(BINDIR)/$(CONFIG)/channelz_service_test \ + $(BINDIR)/$(CONFIG)/channelz_test \ + $(BINDIR)/$(CONFIG)/cli_call_test \ + $(BINDIR)/$(CONFIG)/client_callback_end2end_test \ + $(BINDIR)/$(CONFIG)/client_channel_stress_test \ + $(BINDIR)/$(CONFIG)/client_interceptors_end2end_test \ + $(BINDIR)/$(CONFIG)/client_lb_end2end_test \ + $(BINDIR)/$(CONFIG)/codegen_test_full \ + $(BINDIR)/$(CONFIG)/codegen_test_minimal \ + $(BINDIR)/$(CONFIG)/connection_prefix_bad_client_test \ + $(BINDIR)/$(CONFIG)/connectivity_state_test \ + $(BINDIR)/$(CONFIG)/context_list_test \ + $(BINDIR)/$(CONFIG)/delegating_channel_test \ + $(BINDIR)/$(CONFIG)/destroy_grpclb_channel_with_active_connect_stress_test \ + $(BINDIR)/$(CONFIG)/duplicate_header_bad_client_test \ + $(BINDIR)/$(CONFIG)/end2end_test \ + $(BINDIR)/$(CONFIG)/error_details_test \ + $(BINDIR)/$(CONFIG)/eventmanager_libuv_test \ + $(BINDIR)/$(CONFIG)/exception_test \ + $(BINDIR)/$(CONFIG)/filter_end2end_test \ + $(BINDIR)/$(CONFIG)/flaky_network_test \ + $(BINDIR)/$(CONFIG)/generic_end2end_test \ + $(BINDIR)/$(CONFIG)/global_config_env_test \ + $(BINDIR)/$(CONFIG)/global_config_test \ + $(BINDIR)/$(CONFIG)/grpc_cli \ + $(BINDIR)/$(CONFIG)/grpc_tls_credentials_options_test \ + $(BINDIR)/$(CONFIG)/grpc_tool_test \ + $(BINDIR)/$(CONFIG)/grpclb_api_test \ + $(BINDIR)/$(CONFIG)/grpclb_end2end_test \ + $(BINDIR)/$(CONFIG)/h2_ssl_session_reuse_test \ + $(BINDIR)/$(CONFIG)/head_of_line_blocking_bad_client_test \ + $(BINDIR)/$(CONFIG)/headers_bad_client_test \ + $(BINDIR)/$(CONFIG)/health_service_end2end_test \ + $(BINDIR)/$(CONFIG)/http2_client \ + $(BINDIR)/$(CONFIG)/hybrid_end2end_test \ + $(BINDIR)/$(CONFIG)/initial_settings_frame_bad_client_test \ + $(BINDIR)/$(CONFIG)/interop_client \ + $(BINDIR)/$(CONFIG)/interop_server \ + $(BINDIR)/$(CONFIG)/interop_test \ + $(BINDIR)/$(CONFIG)/json_test \ + $(BINDIR)/$(CONFIG)/large_metadata_bad_client_test \ + $(BINDIR)/$(CONFIG)/lb_get_cpu_stats_test \ + $(BINDIR)/$(CONFIG)/lb_load_data_store_test \ + $(BINDIR)/$(CONFIG)/linux_system_roots_test \ + $(BINDIR)/$(CONFIG)/message_allocator_end2end_test \ + $(BINDIR)/$(CONFIG)/mock_test \ + $(BINDIR)/$(CONFIG)/nonblocking_test \ + $(BINDIR)/$(CONFIG)/noop-benchmark \ + $(BINDIR)/$(CONFIG)/orphanable_test \ + $(BINDIR)/$(CONFIG)/out_of_bounds_bad_client_test \ + $(BINDIR)/$(CONFIG)/pid_controller_test \ + $(BINDIR)/$(CONFIG)/port_sharing_end2end_test \ + $(BINDIR)/$(CONFIG)/proto_server_reflection_test \ + $(BINDIR)/$(CONFIG)/proto_utils_test \ + $(BINDIR)/$(CONFIG)/qps_json_driver \ + $(BINDIR)/$(CONFIG)/qps_worker \ + $(BINDIR)/$(CONFIG)/raw_end2end_test \ + $(BINDIR)/$(CONFIG)/ref_counted_ptr_test \ + $(BINDIR)/$(CONFIG)/ref_counted_test \ + $(BINDIR)/$(CONFIG)/retry_throttle_test \ + $(BINDIR)/$(CONFIG)/secure_auth_context_test \ + $(BINDIR)/$(CONFIG)/server_builder_plugin_test \ + $(BINDIR)/$(CONFIG)/server_builder_test \ + $(BINDIR)/$(CONFIG)/server_builder_with_socket_mutator_test \ + $(BINDIR)/$(CONFIG)/server_context_test_spouse_test \ + $(BINDIR)/$(CONFIG)/server_early_return_test \ + $(BINDIR)/$(CONFIG)/server_interceptors_end2end_test \ + $(BINDIR)/$(CONFIG)/server_registered_method_bad_client_test \ + $(BINDIR)/$(CONFIG)/server_request_call_test \ + $(BINDIR)/$(CONFIG)/service_config_end2end_test \ + $(BINDIR)/$(CONFIG)/service_config_test \ + $(BINDIR)/$(CONFIG)/settings_timeout_test \ + $(BINDIR)/$(CONFIG)/shutdown_test \ + $(BINDIR)/$(CONFIG)/simple_request_bad_client_test \ + $(BINDIR)/$(CONFIG)/slice_hash_table_test \ + $(BINDIR)/$(CONFIG)/slice_weak_hash_table_test \ + $(BINDIR)/$(CONFIG)/static_metadata_test \ + $(BINDIR)/$(CONFIG)/stats_test \ + $(BINDIR)/$(CONFIG)/status_metadata_test \ + $(BINDIR)/$(CONFIG)/status_util_test \ + $(BINDIR)/$(CONFIG)/streaming_throughput_test \ + $(BINDIR)/$(CONFIG)/string_ref_test \ + $(BINDIR)/$(CONFIG)/test_cpp_client_credentials_test \ + $(BINDIR)/$(CONFIG)/test_cpp_util_slice_test \ + $(BINDIR)/$(CONFIG)/test_cpp_util_time_test \ + $(BINDIR)/$(CONFIG)/thread_manager_test \ + $(BINDIR)/$(CONFIG)/thread_stress_test \ + $(BINDIR)/$(CONFIG)/time_jump_test \ + $(BINDIR)/$(CONFIG)/timer_test \ + $(BINDIR)/$(CONFIG)/tls_security_connector_test \ + $(BINDIR)/$(CONFIG)/unknown_frame_bad_client_test \ + $(BINDIR)/$(CONFIG)/window_overflow_bad_client_test \ + $(BINDIR)/$(CONFIG)/work_serializer_test \ + $(BINDIR)/$(CONFIG)/writes_per_rpc_test \ + $(BINDIR)/$(CONFIG)/xds_bootstrap_test \ + $(BINDIR)/$(CONFIG)/xds_end2end_test \ + $(BINDIR)/$(CONFIG)/xds_interop_client \ + $(BINDIR)/$(CONFIG)/xds_interop_server \ + $(BINDIR)/$(CONFIG)/alts_credentials_fuzzer_one_entry \ + $(BINDIR)/$(CONFIG)/client_fuzzer_one_entry \ + $(BINDIR)/$(CONFIG)/hpack_parser_fuzzer_test_one_entry \ + $(BINDIR)/$(CONFIG)/http_request_fuzzer_test_one_entry \ + $(BINDIR)/$(CONFIG)/http_response_fuzzer_test_one_entry \ + $(BINDIR)/$(CONFIG)/json_fuzzer_test_one_entry \ + $(BINDIR)/$(CONFIG)/nanopb_fuzzer_response_test_one_entry \ + $(BINDIR)/$(CONFIG)/nanopb_fuzzer_serverlist_test_one_entry \ + $(BINDIR)/$(CONFIG)/percent_decode_fuzzer_one_entry \ + $(BINDIR)/$(CONFIG)/percent_encode_fuzzer_one_entry \ + $(BINDIR)/$(CONFIG)/server_fuzzer_one_entry \ + $(BINDIR)/$(CONFIG)/ssl_server_fuzzer_one_entry \ + $(BINDIR)/$(CONFIG)/uri_fuzzer_test_one_entry \ + +endif + + +test: test_c test_cxx + +flaky_test: flaky_test_c flaky_test_cxx + +test_c: buildtests_c + $(E) "[RUN] Testing algorithm_test" + $(Q) $(BINDIR)/$(CONFIG)/algorithm_test || ( echo test algorithm_test failed ; exit 1 ) + $(E) "[RUN] Testing alloc_test" + $(Q) $(BINDIR)/$(CONFIG)/alloc_test || ( echo test alloc_test failed ; exit 1 ) + $(E) "[RUN] Testing alpn_test" + $(Q) $(BINDIR)/$(CONFIG)/alpn_test || ( echo test alpn_test failed ; exit 1 ) + $(E) "[RUN] Testing alts_counter_test" + $(Q) $(BINDIR)/$(CONFIG)/alts_counter_test || ( echo test alts_counter_test failed ; exit 1 ) + $(E) "[RUN] Testing alts_crypt_test" + $(Q) $(BINDIR)/$(CONFIG)/alts_crypt_test || ( echo test alts_crypt_test failed ; exit 1 ) + $(E) "[RUN] Testing alts_crypter_test" + $(Q) $(BINDIR)/$(CONFIG)/alts_crypter_test || ( echo test alts_crypter_test failed ; exit 1 ) + $(E) "[RUN] Testing alts_frame_protector_test" + $(Q) $(BINDIR)/$(CONFIG)/alts_frame_protector_test || ( echo test alts_frame_protector_test failed ; exit 1 ) + $(E) "[RUN] Testing alts_grpc_record_protocol_test" + $(Q) $(BINDIR)/$(CONFIG)/alts_grpc_record_protocol_test || ( echo test alts_grpc_record_protocol_test failed ; exit 1 ) + $(E) "[RUN] Testing alts_handshaker_client_test" + $(Q) $(BINDIR)/$(CONFIG)/alts_handshaker_client_test || ( echo test alts_handshaker_client_test failed ; exit 1 ) + $(E) "[RUN] Testing alts_iovec_record_protocol_test" + $(Q) $(BINDIR)/$(CONFIG)/alts_iovec_record_protocol_test || ( echo test alts_iovec_record_protocol_test failed ; exit 1 ) + $(E) "[RUN] Testing alts_security_connector_test" + $(Q) $(BINDIR)/$(CONFIG)/alts_security_connector_test || ( echo test alts_security_connector_test failed ; exit 1 ) + $(E) "[RUN] Testing alts_tsi_handshaker_test" + $(Q) $(BINDIR)/$(CONFIG)/alts_tsi_handshaker_test || ( echo test alts_tsi_handshaker_test failed ; exit 1 ) + $(E) "[RUN] Testing alts_tsi_utils_test" + $(Q) $(BINDIR)/$(CONFIG)/alts_tsi_utils_test || ( echo test alts_tsi_utils_test failed ; exit 1 ) + $(E) "[RUN] Testing alts_zero_copy_grpc_protector_test" + $(Q) $(BINDIR)/$(CONFIG)/alts_zero_copy_grpc_protector_test || ( echo test alts_zero_copy_grpc_protector_test failed ; exit 1 ) + $(E) "[RUN] Testing arena_test" + $(Q) $(BINDIR)/$(CONFIG)/arena_test || ( echo test arena_test failed ; exit 1 ) + $(E) "[RUN] Testing auth_context_test" + $(Q) $(BINDIR)/$(CONFIG)/auth_context_test || ( echo test auth_context_test failed ; exit 1 ) + $(E) "[RUN] Testing avl_test" + $(Q) $(BINDIR)/$(CONFIG)/avl_test || ( echo test avl_test failed ; exit 1 ) + $(E) "[RUN] Testing b64_test" + $(Q) $(BINDIR)/$(CONFIG)/b64_test || ( echo test b64_test failed ; exit 1 ) + $(E) "[RUN] Testing bad_server_response_test" + $(Q) $(BINDIR)/$(CONFIG)/bad_server_response_test || ( echo test bad_server_response_test failed ; exit 1 ) + $(E) "[RUN] Testing bad_ssl_alpn_test" + $(Q) $(BINDIR)/$(CONFIG)/bad_ssl_alpn_test || ( echo test bad_ssl_alpn_test failed ; exit 1 ) + $(E) "[RUN] Testing bad_ssl_cert_test" + $(Q) $(BINDIR)/$(CONFIG)/bad_ssl_cert_test || ( echo test bad_ssl_cert_test failed ; exit 1 ) + $(E) "[RUN] Testing bin_decoder_test" + $(Q) $(BINDIR)/$(CONFIG)/bin_decoder_test || ( echo test bin_decoder_test failed ; exit 1 ) + $(E) "[RUN] Testing bin_encoder_test" + $(Q) $(BINDIR)/$(CONFIG)/bin_encoder_test || ( echo test bin_encoder_test failed ; exit 1 ) + $(E) "[RUN] Testing buffer_list_test" + $(Q) $(BINDIR)/$(CONFIG)/buffer_list_test || ( echo test buffer_list_test failed ; exit 1 ) + $(E) "[RUN] Testing channel_args_test" + $(Q) $(BINDIR)/$(CONFIG)/channel_args_test || ( echo test channel_args_test failed ; exit 1 ) + $(E) "[RUN] Testing channel_create_test" + $(Q) $(BINDIR)/$(CONFIG)/channel_create_test || ( echo test channel_create_test failed ; exit 1 ) + $(E) "[RUN] Testing channel_stack_builder_test" + $(Q) $(BINDIR)/$(CONFIG)/channel_stack_builder_test || ( echo test channel_stack_builder_test failed ; exit 1 ) + $(E) "[RUN] Testing channel_stack_test" + $(Q) $(BINDIR)/$(CONFIG)/channel_stack_test || ( echo test channel_stack_test failed ; exit 1 ) + $(E) "[RUN] Testing check_gcp_environment_linux_test" + $(Q) $(BINDIR)/$(CONFIG)/check_gcp_environment_linux_test || ( echo test check_gcp_environment_linux_test failed ; exit 1 ) + $(E) "[RUN] Testing check_gcp_environment_windows_test" + $(Q) $(BINDIR)/$(CONFIG)/check_gcp_environment_windows_test || ( echo test check_gcp_environment_windows_test failed ; exit 1 ) + $(E) "[RUN] Testing client_ssl_test" + $(Q) $(BINDIR)/$(CONFIG)/client_ssl_test || ( echo test client_ssl_test failed ; exit 1 ) + $(E) "[RUN] Testing cmdline_test" + $(Q) $(BINDIR)/$(CONFIG)/cmdline_test || ( echo test cmdline_test failed ; exit 1 ) + $(E) "[RUN] Testing combiner_test" + $(Q) $(BINDIR)/$(CONFIG)/combiner_test || ( echo test combiner_test failed ; exit 1 ) + $(E) "[RUN] Testing compression_test" + $(Q) $(BINDIR)/$(CONFIG)/compression_test || ( echo test compression_test failed ; exit 1 ) + $(E) "[RUN] Testing connection_refused_test" + $(Q) $(BINDIR)/$(CONFIG)/connection_refused_test || ( echo test connection_refused_test failed ; exit 1 ) + $(E) "[RUN] Testing cpu_test" + $(Q) $(BINDIR)/$(CONFIG)/cpu_test || ( echo test cpu_test failed ; exit 1 ) + $(E) "[RUN] Testing dns_resolver_connectivity_using_ares_resolver_test" + $(Q) $(BINDIR)/$(CONFIG)/dns_resolver_connectivity_using_ares_resolver_test || ( echo test dns_resolver_connectivity_using_ares_resolver_test failed ; exit 1 ) + $(E) "[RUN] Testing dns_resolver_connectivity_using_native_resolver_test" + $(Q) $(BINDIR)/$(CONFIG)/dns_resolver_connectivity_using_native_resolver_test || ( echo test dns_resolver_connectivity_using_native_resolver_test failed ; exit 1 ) + $(E) "[RUN] Testing dns_resolver_cooldown_test" + $(Q) $(BINDIR)/$(CONFIG)/dns_resolver_cooldown_test || ( echo test dns_resolver_cooldown_test failed ; exit 1 ) + $(E) "[RUN] Testing dns_resolver_test" + $(Q) $(BINDIR)/$(CONFIG)/dns_resolver_test || ( echo test dns_resolver_test failed ; exit 1 ) + $(E) "[RUN] Testing dualstack_socket_test" + $(Q) $(BINDIR)/$(CONFIG)/dualstack_socket_test || ( echo test dualstack_socket_test failed ; exit 1 ) + $(E) "[RUN] Testing endpoint_pair_test" + $(Q) $(BINDIR)/$(CONFIG)/endpoint_pair_test || ( echo test endpoint_pair_test failed ; exit 1 ) + $(E) "[RUN] Testing env_test" + $(Q) $(BINDIR)/$(CONFIG)/env_test || ( echo test env_test failed ; exit 1 ) + $(E) "[RUN] Testing error_test" + $(Q) $(BINDIR)/$(CONFIG)/error_test || ( echo test error_test failed ; exit 1 ) + $(E) "[RUN] Testing ev_epollex_linux_test" + $(Q) $(BINDIR)/$(CONFIG)/ev_epollex_linux_test || ( echo test ev_epollex_linux_test failed ; exit 1 ) + $(E) "[RUN] Testing fake_resolver_test" + $(Q) $(BINDIR)/$(CONFIG)/fake_resolver_test || ( echo test fake_resolver_test failed ; exit 1 ) + $(E) "[RUN] Testing fake_transport_security_test" + $(Q) $(BINDIR)/$(CONFIG)/fake_transport_security_test || ( echo test fake_transport_security_test failed ; exit 1 ) + $(E) "[RUN] Testing fd_conservation_posix_test" + $(Q) $(BINDIR)/$(CONFIG)/fd_conservation_posix_test || ( echo test fd_conservation_posix_test failed ; exit 1 ) + $(E) "[RUN] Testing fd_posix_test" + $(Q) $(BINDIR)/$(CONFIG)/fd_posix_test || ( echo test fd_posix_test failed ; exit 1 ) + $(E) "[RUN] Testing fling_stream_test" + $(Q) $(BINDIR)/$(CONFIG)/fling_stream_test || ( echo test fling_stream_test failed ; exit 1 ) + $(E) "[RUN] Testing fling_test" + $(Q) $(BINDIR)/$(CONFIG)/fling_test || ( echo test fling_test failed ; exit 1 ) + $(E) "[RUN] Testing fork_test" + $(Q) $(BINDIR)/$(CONFIG)/fork_test || ( echo test fork_test failed ; exit 1 ) + $(E) "[RUN] Testing format_request_test" + $(Q) $(BINDIR)/$(CONFIG)/format_request_test || ( echo test format_request_test failed ; exit 1 ) + $(E) "[RUN] Testing frame_handler_test" + $(Q) $(BINDIR)/$(CONFIG)/frame_handler_test || ( echo test frame_handler_test failed ; exit 1 ) + $(E) "[RUN] Testing goaway_server_test" + $(Q) $(BINDIR)/$(CONFIG)/goaway_server_test || ( echo test goaway_server_test failed ; exit 1 ) + $(E) "[RUN] Testing grpc_alts_credentials_options_test" + $(Q) $(BINDIR)/$(CONFIG)/grpc_alts_credentials_options_test || ( echo test grpc_alts_credentials_options_test failed ; exit 1 ) + $(E) "[RUN] Testing grpc_byte_buffer_reader_test" + $(Q) $(BINDIR)/$(CONFIG)/grpc_byte_buffer_reader_test || ( echo test grpc_byte_buffer_reader_test failed ; exit 1 ) + $(E) "[RUN] Testing grpc_completion_queue_test" + $(Q) $(BINDIR)/$(CONFIG)/grpc_completion_queue_test || ( echo test grpc_completion_queue_test failed ; exit 1 ) + $(E) "[RUN] Testing grpc_ipv6_loopback_available_test" + $(Q) $(BINDIR)/$(CONFIG)/grpc_ipv6_loopback_available_test || ( echo test grpc_ipv6_loopback_available_test failed ; exit 1 ) + $(E) "[RUN] Testing handshake_server_with_readahead_handshaker_test" + $(Q) $(BINDIR)/$(CONFIG)/handshake_server_with_readahead_handshaker_test || ( echo test handshake_server_with_readahead_handshaker_test failed ; exit 1 ) + $(E) "[RUN] Testing handshake_verify_peer_options_test" + $(Q) $(BINDIR)/$(CONFIG)/handshake_verify_peer_options_test || ( echo test handshake_verify_peer_options_test failed ; exit 1 ) + $(E) "[RUN] Testing histogram_test" + $(Q) $(BINDIR)/$(CONFIG)/histogram_test || ( echo test histogram_test failed ; exit 1 ) + $(E) "[RUN] Testing host_port_test" + $(Q) $(BINDIR)/$(CONFIG)/host_port_test || ( echo test host_port_test failed ; exit 1 ) + $(E) "[RUN] Testing hpack_encoder_test" + $(Q) $(BINDIR)/$(CONFIG)/hpack_encoder_test || ( echo test hpack_encoder_test failed ; exit 1 ) + $(E) "[RUN] Testing hpack_parser_test" + $(Q) $(BINDIR)/$(CONFIG)/hpack_parser_test || ( echo test hpack_parser_test failed ; exit 1 ) + $(E) "[RUN] Testing hpack_table_test" + $(Q) $(BINDIR)/$(CONFIG)/hpack_table_test || ( echo test hpack_table_test failed ; exit 1 ) + $(E) "[RUN] Testing httpcli_test" + $(Q) $(BINDIR)/$(CONFIG)/httpcli_test || ( echo test httpcli_test failed ; exit 1 ) + $(E) "[RUN] Testing httpscli_test" + $(Q) $(BINDIR)/$(CONFIG)/httpscli_test || ( echo test httpscli_test failed ; exit 1 ) + $(E) "[RUN] Testing init_test" + $(Q) $(BINDIR)/$(CONFIG)/init_test || ( echo test init_test failed ; exit 1 ) + $(E) "[RUN] Testing inproc_callback_test" + $(Q) $(BINDIR)/$(CONFIG)/inproc_callback_test || ( echo test inproc_callback_test failed ; exit 1 ) + $(E) "[RUN] Testing invalid_call_argument_test" + $(Q) $(BINDIR)/$(CONFIG)/invalid_call_argument_test || ( echo test invalid_call_argument_test failed ; exit 1 ) + $(E) "[RUN] Testing json_token_test" + $(Q) $(BINDIR)/$(CONFIG)/json_token_test || ( echo test json_token_test failed ; exit 1 ) + $(E) "[RUN] Testing jwt_verifier_test" + $(Q) $(BINDIR)/$(CONFIG)/jwt_verifier_test || ( echo test jwt_verifier_test failed ; exit 1 ) + $(E) "[RUN] Testing lame_client_test" + $(Q) $(BINDIR)/$(CONFIG)/lame_client_test || ( echo test lame_client_test failed ; exit 1 ) + $(E) "[RUN] Testing load_file_test" + $(Q) $(BINDIR)/$(CONFIG)/load_file_test || ( echo test load_file_test failed ; exit 1 ) + $(E) "[RUN] Testing log_test" + $(Q) $(BINDIR)/$(CONFIG)/log_test || ( echo test log_test failed ; exit 1 ) + $(E) "[RUN] Testing manual_constructor_test" + $(Q) $(BINDIR)/$(CONFIG)/manual_constructor_test || ( echo test manual_constructor_test failed ; exit 1 ) + $(E) "[RUN] Testing message_compress_test" + $(Q) $(BINDIR)/$(CONFIG)/message_compress_test || ( echo test message_compress_test failed ; exit 1 ) + $(E) "[RUN] Testing metadata_test" + $(Q) $(BINDIR)/$(CONFIG)/metadata_test || ( echo test metadata_test failed ; exit 1 ) + $(E) "[RUN] Testing minimal_stack_is_minimal_test" + $(Q) $(BINDIR)/$(CONFIG)/minimal_stack_is_minimal_test || ( echo test minimal_stack_is_minimal_test failed ; exit 1 ) + $(E) "[RUN] Testing mpmcqueue_test" + $(Q) $(BINDIR)/$(CONFIG)/mpmcqueue_test || ( echo test mpmcqueue_test failed ; exit 1 ) + $(E) "[RUN] Testing mpscq_test" + $(Q) $(BINDIR)/$(CONFIG)/mpscq_test || ( echo test mpscq_test failed ; exit 1 ) + $(E) "[RUN] Testing multiple_server_queues_test" + $(Q) $(BINDIR)/$(CONFIG)/multiple_server_queues_test || ( echo test multiple_server_queues_test failed ; exit 1 ) + $(E) "[RUN] Testing murmur_hash_test" + $(Q) $(BINDIR)/$(CONFIG)/murmur_hash_test || ( echo test murmur_hash_test failed ; exit 1 ) + $(E) "[RUN] Testing no_server_test" + $(Q) $(BINDIR)/$(CONFIG)/no_server_test || ( echo test no_server_test failed ; exit 1 ) + $(E) "[RUN] Testing num_external_connectivity_watchers_test" + $(Q) $(BINDIR)/$(CONFIG)/num_external_connectivity_watchers_test || ( echo test num_external_connectivity_watchers_test failed ; exit 1 ) + $(E) "[RUN] Testing parse_address_test" + $(Q) $(BINDIR)/$(CONFIG)/parse_address_test || ( echo test parse_address_test failed ; exit 1 ) + $(E) "[RUN] Testing parse_address_with_named_scope_id_test" + $(Q) $(BINDIR)/$(CONFIG)/parse_address_with_named_scope_id_test || ( echo test parse_address_with_named_scope_id_test failed ; exit 1 ) + $(E) "[RUN] Testing parser_test" + $(Q) $(BINDIR)/$(CONFIG)/parser_test || ( echo test parser_test failed ; exit 1 ) + $(E) "[RUN] Testing percent_encoding_test" + $(Q) $(BINDIR)/$(CONFIG)/percent_encoding_test || ( echo test percent_encoding_test failed ; exit 1 ) + $(E) "[RUN] Testing public_headers_must_be_c89" + $(Q) $(BINDIR)/$(CONFIG)/public_headers_must_be_c89 || ( echo test public_headers_must_be_c89 failed ; exit 1 ) + $(E) "[RUN] Testing resolve_address_using_ares_resolver_posix_test" + $(Q) $(BINDIR)/$(CONFIG)/resolve_address_using_ares_resolver_posix_test || ( echo test resolve_address_using_ares_resolver_posix_test failed ; exit 1 ) + $(E) "[RUN] Testing resolve_address_using_ares_resolver_test" + $(Q) $(BINDIR)/$(CONFIG)/resolve_address_using_ares_resolver_test || ( echo test resolve_address_using_ares_resolver_test failed ; exit 1 ) + $(E) "[RUN] Testing resolve_address_using_native_resolver_posix_test" + $(Q) $(BINDIR)/$(CONFIG)/resolve_address_using_native_resolver_posix_test || ( echo test resolve_address_using_native_resolver_posix_test failed ; exit 1 ) + $(E) "[RUN] Testing resolve_address_using_native_resolver_test" + $(Q) $(BINDIR)/$(CONFIG)/resolve_address_using_native_resolver_test || ( echo test resolve_address_using_native_resolver_test failed ; exit 1 ) + $(E) "[RUN] Testing resource_quota_test" + $(Q) $(BINDIR)/$(CONFIG)/resource_quota_test || ( echo test resource_quota_test failed ; exit 1 ) + $(E) "[RUN] Testing secure_channel_create_test" + $(Q) $(BINDIR)/$(CONFIG)/secure_channel_create_test || ( echo test secure_channel_create_test failed ; exit 1 ) + $(E) "[RUN] Testing secure_endpoint_test" + $(Q) $(BINDIR)/$(CONFIG)/secure_endpoint_test || ( echo test secure_endpoint_test failed ; exit 1 ) + $(E) "[RUN] Testing security_connector_test" + $(Q) $(BINDIR)/$(CONFIG)/security_connector_test || ( echo test security_connector_test failed ; exit 1 ) + $(E) "[RUN] Testing server_chttp2_test" + $(Q) $(BINDIR)/$(CONFIG)/server_chttp2_test || ( echo test server_chttp2_test failed ; exit 1 ) + $(E) "[RUN] Testing server_ssl_test" + $(Q) $(BINDIR)/$(CONFIG)/server_ssl_test || ( echo test server_ssl_test failed ; exit 1 ) + $(E) "[RUN] Testing server_test" + $(Q) $(BINDIR)/$(CONFIG)/server_test || ( echo test server_test failed ; exit 1 ) + $(E) "[RUN] Testing slice_buffer_test" + $(Q) $(BINDIR)/$(CONFIG)/slice_buffer_test || ( echo test slice_buffer_test failed ; exit 1 ) + $(E) "[RUN] Testing slice_string_helpers_test" + $(Q) $(BINDIR)/$(CONFIG)/slice_string_helpers_test || ( echo test slice_string_helpers_test failed ; exit 1 ) + $(E) "[RUN] Testing sockaddr_resolver_test" + $(Q) $(BINDIR)/$(CONFIG)/sockaddr_resolver_test || ( echo test sockaddr_resolver_test failed ; exit 1 ) + $(E) "[RUN] Testing sockaddr_utils_test" + $(Q) $(BINDIR)/$(CONFIG)/sockaddr_utils_test || ( echo test sockaddr_utils_test failed ; exit 1 ) + $(E) "[RUN] Testing socket_utils_test" + $(Q) $(BINDIR)/$(CONFIG)/socket_utils_test || ( echo test socket_utils_test failed ; exit 1 ) + $(E) "[RUN] Testing spinlock_test" + $(Q) $(BINDIR)/$(CONFIG)/spinlock_test || ( echo test spinlock_test failed ; exit 1 ) + $(E) "[RUN] Testing ssl_credentials_test" + $(Q) $(BINDIR)/$(CONFIG)/ssl_credentials_test || ( echo test ssl_credentials_test failed ; exit 1 ) + $(E) "[RUN] Testing ssl_transport_security_test" + $(Q) $(BINDIR)/$(CONFIG)/ssl_transport_security_test || ( echo test ssl_transport_security_test failed ; exit 1 ) + $(E) "[RUN] Testing status_conversion_test" + $(Q) $(BINDIR)/$(CONFIG)/status_conversion_test || ( echo test status_conversion_test failed ; exit 1 ) + $(E) "[RUN] Testing stream_compression_test" + $(Q) $(BINDIR)/$(CONFIG)/stream_compression_test || ( echo test stream_compression_test failed ; exit 1 ) + $(E) "[RUN] Testing stream_map_test" + $(Q) $(BINDIR)/$(CONFIG)/stream_map_test || ( echo test stream_map_test failed ; exit 1 ) + $(E) "[RUN] Testing stream_owned_slice_test" + $(Q) $(BINDIR)/$(CONFIG)/stream_owned_slice_test || ( echo test stream_owned_slice_test failed ; exit 1 ) + $(E) "[RUN] Testing string_test" + $(Q) $(BINDIR)/$(CONFIG)/string_test || ( echo test string_test failed ; exit 1 ) + $(E) "[RUN] Testing sync_test" + $(Q) $(BINDIR)/$(CONFIG)/sync_test || ( echo test sync_test failed ; exit 1 ) + $(E) "[RUN] Testing tcp_client_posix_test" + $(Q) $(BINDIR)/$(CONFIG)/tcp_client_posix_test || ( echo test tcp_client_posix_test failed ; exit 1 ) + $(E) "[RUN] Testing tcp_posix_test" + $(Q) $(BINDIR)/$(CONFIG)/tcp_posix_test || ( echo test tcp_posix_test failed ; exit 1 ) + $(E) "[RUN] Testing tcp_server_posix_test" + $(Q) $(BINDIR)/$(CONFIG)/tcp_server_posix_test || ( echo test tcp_server_posix_test failed ; exit 1 ) + $(E) "[RUN] Testing test_core_gpr_time_test" + $(Q) $(BINDIR)/$(CONFIG)/test_core_gpr_time_test || ( echo test test_core_gpr_time_test failed ; exit 1 ) + $(E) "[RUN] Testing test_core_security_credentials_test" + $(Q) $(BINDIR)/$(CONFIG)/test_core_security_credentials_test || ( echo test test_core_security_credentials_test failed ; exit 1 ) + $(E) "[RUN] Testing test_core_slice_slice_test" + $(Q) $(BINDIR)/$(CONFIG)/test_core_slice_slice_test || ( echo test test_core_slice_slice_test failed ; exit 1 ) + $(E) "[RUN] Testing thd_test" + $(Q) $(BINDIR)/$(CONFIG)/thd_test || ( echo test thd_test failed ; exit 1 ) + $(E) "[RUN] Testing threadpool_test" + $(Q) $(BINDIR)/$(CONFIG)/threadpool_test || ( echo test threadpool_test failed ; exit 1 ) + $(E) "[RUN] Testing time_averaged_stats_test" + $(Q) $(BINDIR)/$(CONFIG)/time_averaged_stats_test || ( echo test time_averaged_stats_test failed ; exit 1 ) + $(E) "[RUN] Testing timeout_encoding_test" + $(Q) $(BINDIR)/$(CONFIG)/timeout_encoding_test || ( echo test timeout_encoding_test failed ; exit 1 ) + $(E) "[RUN] Testing timer_heap_test" + $(Q) $(BINDIR)/$(CONFIG)/timer_heap_test || ( echo test timer_heap_test failed ; exit 1 ) + $(E) "[RUN] Testing timer_list_test" + $(Q) $(BINDIR)/$(CONFIG)/timer_list_test || ( echo test timer_list_test failed ; exit 1 ) + $(E) "[RUN] Testing tls_test" + $(Q) $(BINDIR)/$(CONFIG)/tls_test || ( echo test tls_test failed ; exit 1 ) + $(E) "[RUN] Testing transport_security_common_api_test" + $(Q) $(BINDIR)/$(CONFIG)/transport_security_common_api_test || ( echo test transport_security_common_api_test failed ; exit 1 ) + $(E) "[RUN] Testing transport_security_test" + $(Q) $(BINDIR)/$(CONFIG)/transport_security_test || ( echo test transport_security_test failed ; exit 1 ) + $(E) "[RUN] Testing udp_server_test" + $(Q) $(BINDIR)/$(CONFIG)/udp_server_test || ( echo test udp_server_test failed ; exit 1 ) + $(E) "[RUN] Testing uri_parser_test" + $(Q) $(BINDIR)/$(CONFIG)/uri_parser_test || ( echo test uri_parser_test failed ; exit 1 ) + $(E) "[RUN] Testing useful_test" + $(Q) $(BINDIR)/$(CONFIG)/useful_test || ( echo test useful_test failed ; exit 1 ) + $(E) "[RUN] Testing varint_test" + $(Q) $(BINDIR)/$(CONFIG)/varint_test || ( echo test varint_test failed ; exit 1 ) + + +flaky_test_c: buildtests_c + + +test_cxx: buildtests_cxx + $(E) "[RUN] Testing address_sorting_test" + $(Q) $(BINDIR)/$(CONFIG)/address_sorting_test || ( echo test address_sorting_test failed ; exit 1 ) + $(E) "[RUN] Testing address_sorting_test_unsecure" + $(Q) $(BINDIR)/$(CONFIG)/address_sorting_test_unsecure || ( echo test address_sorting_test_unsecure failed ; exit 1 ) + $(E) "[RUN] Testing alarm_test" + $(Q) $(BINDIR)/$(CONFIG)/alarm_test || ( echo test alarm_test failed ; exit 1 ) + $(E) "[RUN] Testing alts_concurrent_connectivity_test" + $(Q) $(BINDIR)/$(CONFIG)/alts_concurrent_connectivity_test || ( echo test alts_concurrent_connectivity_test failed ; exit 1 ) + $(E) "[RUN] Testing alts_util_test" + $(Q) $(BINDIR)/$(CONFIG)/alts_util_test || ( echo test alts_util_test failed ; exit 1 ) + $(E) "[RUN] Testing async_end2end_test" + $(Q) $(BINDIR)/$(CONFIG)/async_end2end_test || ( echo test async_end2end_test failed ; exit 1 ) + $(E) "[RUN] Testing auth_property_iterator_test" + $(Q) $(BINDIR)/$(CONFIG)/auth_property_iterator_test || ( echo test auth_property_iterator_test failed ; exit 1 ) + $(E) "[RUN] Testing backoff_test" + $(Q) $(BINDIR)/$(CONFIG)/backoff_test || ( echo test backoff_test failed ; exit 1 ) + $(E) "[RUN] Testing bad_streaming_id_bad_client_test" + $(Q) $(BINDIR)/$(CONFIG)/bad_streaming_id_bad_client_test || ( echo test bad_streaming_id_bad_client_test failed ; exit 1 ) + $(E) "[RUN] Testing badreq_bad_client_test" + $(Q) $(BINDIR)/$(CONFIG)/badreq_bad_client_test || ( echo test badreq_bad_client_test failed ; exit 1 ) + $(E) "[RUN] Testing bdp_estimator_test" + $(Q) $(BINDIR)/$(CONFIG)/bdp_estimator_test || ( echo test bdp_estimator_test failed ; exit 1 ) + $(E) "[RUN] Testing bm_alarm" + $(Q) $(BINDIR)/$(CONFIG)/bm_alarm || ( echo test bm_alarm failed ; exit 1 ) + $(E) "[RUN] Testing bm_arena" + $(Q) $(BINDIR)/$(CONFIG)/bm_arena || ( echo test bm_arena failed ; exit 1 ) + $(E) "[RUN] Testing bm_byte_buffer" + $(Q) $(BINDIR)/$(CONFIG)/bm_byte_buffer || ( echo test bm_byte_buffer failed ; exit 1 ) + $(E) "[RUN] Testing bm_call_create" + $(Q) $(BINDIR)/$(CONFIG)/bm_call_create || ( echo test bm_call_create failed ; exit 1 ) + $(E) "[RUN] Testing bm_callback_streaming_ping_pong" + $(Q) $(BINDIR)/$(CONFIG)/bm_callback_streaming_ping_pong || ( echo test bm_callback_streaming_ping_pong failed ; exit 1 ) + $(E) "[RUN] Testing bm_callback_unary_ping_pong" + $(Q) $(BINDIR)/$(CONFIG)/bm_callback_unary_ping_pong || ( echo test bm_callback_unary_ping_pong failed ; exit 1 ) + $(E) "[RUN] Testing bm_channel" + $(Q) $(BINDIR)/$(CONFIG)/bm_channel || ( echo test bm_channel failed ; exit 1 ) + $(E) "[RUN] Testing bm_chttp2_hpack" + $(Q) $(BINDIR)/$(CONFIG)/bm_chttp2_hpack || ( echo test bm_chttp2_hpack failed ; exit 1 ) + $(E) "[RUN] Testing bm_chttp2_transport" + $(Q) $(BINDIR)/$(CONFIG)/bm_chttp2_transport || ( echo test bm_chttp2_transport failed ; exit 1 ) + $(E) "[RUN] Testing bm_closure" + $(Q) $(BINDIR)/$(CONFIG)/bm_closure || ( echo test bm_closure failed ; exit 1 ) + $(E) "[RUN] Testing bm_cq" + $(Q) $(BINDIR)/$(CONFIG)/bm_cq || ( echo test bm_cq failed ; exit 1 ) + $(E) "[RUN] Testing bm_cq_multiple_threads" + $(Q) $(BINDIR)/$(CONFIG)/bm_cq_multiple_threads || ( echo test bm_cq_multiple_threads failed ; exit 1 ) + $(E) "[RUN] Testing bm_error" + $(Q) $(BINDIR)/$(CONFIG)/bm_error || ( echo test bm_error failed ; exit 1 ) + $(E) "[RUN] Testing bm_fullstack_streaming_ping_pong" + $(Q) $(BINDIR)/$(CONFIG)/bm_fullstack_streaming_ping_pong || ( echo test bm_fullstack_streaming_ping_pong failed ; exit 1 ) + $(E) "[RUN] Testing bm_fullstack_streaming_pump" + $(Q) $(BINDIR)/$(CONFIG)/bm_fullstack_streaming_pump || ( echo test bm_fullstack_streaming_pump failed ; exit 1 ) + $(E) "[RUN] Testing bm_fullstack_unary_ping_pong" + $(Q) $(BINDIR)/$(CONFIG)/bm_fullstack_unary_ping_pong || ( echo test bm_fullstack_unary_ping_pong failed ; exit 1 ) + $(E) "[RUN] Testing bm_metadata" + $(Q) $(BINDIR)/$(CONFIG)/bm_metadata || ( echo test bm_metadata failed ; exit 1 ) + $(E) "[RUN] Testing bm_pollset" + $(Q) $(BINDIR)/$(CONFIG)/bm_pollset || ( echo test bm_pollset failed ; exit 1 ) + $(E) "[RUN] Testing bm_timer" + $(Q) $(BINDIR)/$(CONFIG)/bm_timer || ( echo test bm_timer failed ; exit 1 ) + $(E) "[RUN] Testing byte_buffer_test" + $(Q) $(BINDIR)/$(CONFIG)/byte_buffer_test || ( echo test byte_buffer_test failed ; exit 1 ) + $(E) "[RUN] Testing byte_stream_test" + $(Q) $(BINDIR)/$(CONFIG)/byte_stream_test || ( echo test byte_stream_test failed ; exit 1 ) + $(E) "[RUN] Testing channel_arguments_test" + $(Q) $(BINDIR)/$(CONFIG)/channel_arguments_test || ( echo test channel_arguments_test failed ; exit 1 ) + $(E) "[RUN] Testing channel_filter_test" + $(Q) $(BINDIR)/$(CONFIG)/channel_filter_test || ( echo test channel_filter_test failed ; exit 1 ) + $(E) "[RUN] Testing channel_trace_test" + $(Q) $(BINDIR)/$(CONFIG)/channel_trace_test || ( echo test channel_trace_test failed ; exit 1 ) + $(E) "[RUN] Testing channelz_registry_test" + $(Q) $(BINDIR)/$(CONFIG)/channelz_registry_test || ( echo test channelz_registry_test failed ; exit 1 ) + $(E) "[RUN] Testing channelz_service_test" + $(Q) $(BINDIR)/$(CONFIG)/channelz_service_test || ( echo test channelz_service_test failed ; exit 1 ) + $(E) "[RUN] Testing channelz_test" + $(Q) $(BINDIR)/$(CONFIG)/channelz_test || ( echo test channelz_test failed ; exit 1 ) + $(E) "[RUN] Testing cli_call_test" + $(Q) $(BINDIR)/$(CONFIG)/cli_call_test || ( echo test cli_call_test failed ; exit 1 ) + $(E) "[RUN] Testing client_callback_end2end_test" + $(Q) $(BINDIR)/$(CONFIG)/client_callback_end2end_test || ( echo test client_callback_end2end_test failed ; exit 1 ) + $(E) "[RUN] Testing client_interceptors_end2end_test" + $(Q) $(BINDIR)/$(CONFIG)/client_interceptors_end2end_test || ( echo test client_interceptors_end2end_test failed ; exit 1 ) + $(E) "[RUN] Testing codegen_test_full" + $(Q) $(BINDIR)/$(CONFIG)/codegen_test_full || ( echo test codegen_test_full failed ; exit 1 ) + $(E) "[RUN] Testing codegen_test_minimal" + $(Q) $(BINDIR)/$(CONFIG)/codegen_test_minimal || ( echo test codegen_test_minimal failed ; exit 1 ) + $(E) "[RUN] Testing connection_prefix_bad_client_test" + $(Q) $(BINDIR)/$(CONFIG)/connection_prefix_bad_client_test || ( echo test connection_prefix_bad_client_test failed ; exit 1 ) + $(E) "[RUN] Testing connectivity_state_test" + $(Q) $(BINDIR)/$(CONFIG)/connectivity_state_test || ( echo test connectivity_state_test failed ; exit 1 ) + $(E) "[RUN] Testing context_list_test" + $(Q) $(BINDIR)/$(CONFIG)/context_list_test || ( echo test context_list_test failed ; exit 1 ) + $(E) "[RUN] Testing delegating_channel_test" + $(Q) $(BINDIR)/$(CONFIG)/delegating_channel_test || ( echo test delegating_channel_test failed ; exit 1 ) + $(E) "[RUN] Testing destroy_grpclb_channel_with_active_connect_stress_test" + $(Q) $(BINDIR)/$(CONFIG)/destroy_grpclb_channel_with_active_connect_stress_test || ( echo test destroy_grpclb_channel_with_active_connect_stress_test failed ; exit 1 ) + $(E) "[RUN] Testing duplicate_header_bad_client_test" + $(Q) $(BINDIR)/$(CONFIG)/duplicate_header_bad_client_test || ( echo test duplicate_header_bad_client_test failed ; exit 1 ) + $(E) "[RUN] Testing error_details_test" + $(Q) $(BINDIR)/$(CONFIG)/error_details_test || ( echo test error_details_test failed ; exit 1 ) + $(E) "[RUN] Testing eventmanager_libuv_test" + $(Q) $(BINDIR)/$(CONFIG)/eventmanager_libuv_test || ( echo test eventmanager_libuv_test failed ; exit 1 ) + $(E) "[RUN] Testing exception_test" + $(Q) $(BINDIR)/$(CONFIG)/exception_test || ( echo test exception_test failed ; exit 1 ) + $(E) "[RUN] Testing filter_end2end_test" + $(Q) $(BINDIR)/$(CONFIG)/filter_end2end_test || ( echo test filter_end2end_test failed ; exit 1 ) + $(E) "[RUN] Testing generic_end2end_test" + $(Q) $(BINDIR)/$(CONFIG)/generic_end2end_test || ( echo test generic_end2end_test failed ; exit 1 ) + $(E) "[RUN] Testing global_config_env_test" + $(Q) $(BINDIR)/$(CONFIG)/global_config_env_test || ( echo test global_config_env_test failed ; exit 1 ) + $(E) "[RUN] Testing global_config_test" + $(Q) $(BINDIR)/$(CONFIG)/global_config_test || ( echo test global_config_test failed ; exit 1 ) + $(E) "[RUN] Testing grpc_tls_credentials_options_test" + $(Q) $(BINDIR)/$(CONFIG)/grpc_tls_credentials_options_test || ( echo test grpc_tls_credentials_options_test failed ; exit 1 ) + $(E) "[RUN] Testing grpc_tool_test" + $(Q) $(BINDIR)/$(CONFIG)/grpc_tool_test || ( echo test grpc_tool_test failed ; exit 1 ) + $(E) "[RUN] Testing grpclb_api_test" + $(Q) $(BINDIR)/$(CONFIG)/grpclb_api_test || ( echo test grpclb_api_test failed ; exit 1 ) + $(E) "[RUN] Testing h2_ssl_session_reuse_test" + $(Q) $(BINDIR)/$(CONFIG)/h2_ssl_session_reuse_test || ( echo test h2_ssl_session_reuse_test failed ; exit 1 ) + $(E) "[RUN] Testing head_of_line_blocking_bad_client_test" + $(Q) $(BINDIR)/$(CONFIG)/head_of_line_blocking_bad_client_test || ( echo test head_of_line_blocking_bad_client_test failed ; exit 1 ) + $(E) "[RUN] Testing headers_bad_client_test" + $(Q) $(BINDIR)/$(CONFIG)/headers_bad_client_test || ( echo test headers_bad_client_test failed ; exit 1 ) + $(E) "[RUN] Testing health_service_end2end_test" + $(Q) $(BINDIR)/$(CONFIG)/health_service_end2end_test || ( echo test health_service_end2end_test failed ; exit 1 ) + $(E) "[RUN] Testing hybrid_end2end_test" + $(Q) $(BINDIR)/$(CONFIG)/hybrid_end2end_test || ( echo test hybrid_end2end_test failed ; exit 1 ) + $(E) "[RUN] Testing initial_settings_frame_bad_client_test" + $(Q) $(BINDIR)/$(CONFIG)/initial_settings_frame_bad_client_test || ( echo test initial_settings_frame_bad_client_test failed ; exit 1 ) + $(E) "[RUN] Testing interop_test" + $(Q) $(BINDIR)/$(CONFIG)/interop_test || ( echo test interop_test failed ; exit 1 ) + $(E) "[RUN] Testing json_test" + $(Q) $(BINDIR)/$(CONFIG)/json_test || ( echo test json_test failed ; exit 1 ) + $(E) "[RUN] Testing large_metadata_bad_client_test" + $(Q) $(BINDIR)/$(CONFIG)/large_metadata_bad_client_test || ( echo test large_metadata_bad_client_test failed ; exit 1 ) + $(E) "[RUN] Testing lb_get_cpu_stats_test" + $(Q) $(BINDIR)/$(CONFIG)/lb_get_cpu_stats_test || ( echo test lb_get_cpu_stats_test failed ; exit 1 ) + $(E) "[RUN] Testing lb_load_data_store_test" + $(Q) $(BINDIR)/$(CONFIG)/lb_load_data_store_test || ( echo test lb_load_data_store_test failed ; exit 1 ) + $(E) "[RUN] Testing linux_system_roots_test" + $(Q) $(BINDIR)/$(CONFIG)/linux_system_roots_test || ( echo test linux_system_roots_test failed ; exit 1 ) + $(E) "[RUN] Testing message_allocator_end2end_test" + $(Q) $(BINDIR)/$(CONFIG)/message_allocator_end2end_test || ( echo test message_allocator_end2end_test failed ; exit 1 ) + $(E) "[RUN] Testing mock_test" + $(Q) $(BINDIR)/$(CONFIG)/mock_test || ( echo test mock_test failed ; exit 1 ) + $(E) "[RUN] Testing nonblocking_test" + $(Q) $(BINDIR)/$(CONFIG)/nonblocking_test || ( echo test nonblocking_test failed ; exit 1 ) + $(E) "[RUN] Testing noop-benchmark" + $(Q) $(BINDIR)/$(CONFIG)/noop-benchmark || ( echo test noop-benchmark failed ; exit 1 ) + $(E) "[RUN] Testing orphanable_test" + $(Q) $(BINDIR)/$(CONFIG)/orphanable_test || ( echo test orphanable_test failed ; exit 1 ) + $(E) "[RUN] Testing out_of_bounds_bad_client_test" + $(Q) $(BINDIR)/$(CONFIG)/out_of_bounds_bad_client_test || ( echo test out_of_bounds_bad_client_test failed ; exit 1 ) + $(E) "[RUN] Testing pid_controller_test" + $(Q) $(BINDIR)/$(CONFIG)/pid_controller_test || ( echo test pid_controller_test failed ; exit 1 ) + $(E) "[RUN] Testing port_sharing_end2end_test" + $(Q) $(BINDIR)/$(CONFIG)/port_sharing_end2end_test || ( echo test port_sharing_end2end_test failed ; exit 1 ) + $(E) "[RUN] Testing proto_server_reflection_test" + $(Q) $(BINDIR)/$(CONFIG)/proto_server_reflection_test || ( echo test proto_server_reflection_test failed ; exit 1 ) + $(E) "[RUN] Testing proto_utils_test" + $(Q) $(BINDIR)/$(CONFIG)/proto_utils_test || ( echo test proto_utils_test failed ; exit 1 ) + $(E) "[RUN] Testing raw_end2end_test" + $(Q) $(BINDIR)/$(CONFIG)/raw_end2end_test || ( echo test raw_end2end_test failed ; exit 1 ) + $(E) "[RUN] Testing ref_counted_ptr_test" + $(Q) $(BINDIR)/$(CONFIG)/ref_counted_ptr_test || ( echo test ref_counted_ptr_test failed ; exit 1 ) + $(E) "[RUN] Testing ref_counted_test" + $(Q) $(BINDIR)/$(CONFIG)/ref_counted_test || ( echo test ref_counted_test failed ; exit 1 ) + $(E) "[RUN] Testing retry_throttle_test" + $(Q) $(BINDIR)/$(CONFIG)/retry_throttle_test || ( echo test retry_throttle_test failed ; exit 1 ) + $(E) "[RUN] Testing secure_auth_context_test" + $(Q) $(BINDIR)/$(CONFIG)/secure_auth_context_test || ( echo test secure_auth_context_test failed ; exit 1 ) + $(E) "[RUN] Testing server_builder_plugin_test" + $(Q) $(BINDIR)/$(CONFIG)/server_builder_plugin_test || ( echo test server_builder_plugin_test failed ; exit 1 ) + $(E) "[RUN] Testing server_builder_test" + $(Q) $(BINDIR)/$(CONFIG)/server_builder_test || ( echo test server_builder_test failed ; exit 1 ) + $(E) "[RUN] Testing server_builder_with_socket_mutator_test" + $(Q) $(BINDIR)/$(CONFIG)/server_builder_with_socket_mutator_test || ( echo test server_builder_with_socket_mutator_test failed ; exit 1 ) + $(E) "[RUN] Testing server_context_test_spouse_test" + $(Q) $(BINDIR)/$(CONFIG)/server_context_test_spouse_test || ( echo test server_context_test_spouse_test failed ; exit 1 ) + $(E) "[RUN] Testing server_early_return_test" + $(Q) $(BINDIR)/$(CONFIG)/server_early_return_test || ( echo test server_early_return_test failed ; exit 1 ) + $(E) "[RUN] Testing server_interceptors_end2end_test" + $(Q) $(BINDIR)/$(CONFIG)/server_interceptors_end2end_test || ( echo test server_interceptors_end2end_test failed ; exit 1 ) + $(E) "[RUN] Testing server_registered_method_bad_client_test" + $(Q) $(BINDIR)/$(CONFIG)/server_registered_method_bad_client_test || ( echo test server_registered_method_bad_client_test failed ; exit 1 ) + $(E) "[RUN] Testing server_request_call_test" + $(Q) $(BINDIR)/$(CONFIG)/server_request_call_test || ( echo test server_request_call_test failed ; exit 1 ) + $(E) "[RUN] Testing service_config_end2end_test" + $(Q) $(BINDIR)/$(CONFIG)/service_config_end2end_test || ( echo test service_config_end2end_test failed ; exit 1 ) + $(E) "[RUN] Testing service_config_test" + $(Q) $(BINDIR)/$(CONFIG)/service_config_test || ( echo test service_config_test failed ; exit 1 ) + $(E) "[RUN] Testing shutdown_test" + $(Q) $(BINDIR)/$(CONFIG)/shutdown_test || ( echo test shutdown_test failed ; exit 1 ) + $(E) "[RUN] Testing simple_request_bad_client_test" + $(Q) $(BINDIR)/$(CONFIG)/simple_request_bad_client_test || ( echo test simple_request_bad_client_test failed ; exit 1 ) + $(E) "[RUN] Testing slice_hash_table_test" + $(Q) $(BINDIR)/$(CONFIG)/slice_hash_table_test || ( echo test slice_hash_table_test failed ; exit 1 ) + $(E) "[RUN] Testing slice_weak_hash_table_test" + $(Q) $(BINDIR)/$(CONFIG)/slice_weak_hash_table_test || ( echo test slice_weak_hash_table_test failed ; exit 1 ) + $(E) "[RUN] Testing static_metadata_test" + $(Q) $(BINDIR)/$(CONFIG)/static_metadata_test || ( echo test static_metadata_test failed ; exit 1 ) + $(E) "[RUN] Testing stats_test" + $(Q) $(BINDIR)/$(CONFIG)/stats_test || ( echo test stats_test failed ; exit 1 ) + $(E) "[RUN] Testing status_metadata_test" + $(Q) $(BINDIR)/$(CONFIG)/status_metadata_test || ( echo test status_metadata_test failed ; exit 1 ) + $(E) "[RUN] Testing status_util_test" + $(Q) $(BINDIR)/$(CONFIG)/status_util_test || ( echo test status_util_test failed ; exit 1 ) + $(E) "[RUN] Testing streaming_throughput_test" + $(Q) $(BINDIR)/$(CONFIG)/streaming_throughput_test || ( echo test streaming_throughput_test failed ; exit 1 ) + $(E) "[RUN] Testing string_ref_test" + $(Q) $(BINDIR)/$(CONFIG)/string_ref_test || ( echo test string_ref_test failed ; exit 1 ) + $(E) "[RUN] Testing test_cpp_client_credentials_test" + $(Q) $(BINDIR)/$(CONFIG)/test_cpp_client_credentials_test || ( echo test test_cpp_client_credentials_test failed ; exit 1 ) + $(E) "[RUN] Testing test_cpp_util_slice_test" + $(Q) $(BINDIR)/$(CONFIG)/test_cpp_util_slice_test || ( echo test test_cpp_util_slice_test failed ; exit 1 ) + $(E) "[RUN] Testing test_cpp_util_time_test" + $(Q) $(BINDIR)/$(CONFIG)/test_cpp_util_time_test || ( echo test test_cpp_util_time_test failed ; exit 1 ) + $(E) "[RUN] Testing thread_manager_test" + $(Q) $(BINDIR)/$(CONFIG)/thread_manager_test || ( echo test thread_manager_test failed ; exit 1 ) + $(E) "[RUN] Testing thread_stress_test" + $(Q) $(BINDIR)/$(CONFIG)/thread_stress_test || ( echo test thread_stress_test failed ; exit 1 ) + $(E) "[RUN] Testing timer_test" + $(Q) $(BINDIR)/$(CONFIG)/timer_test || ( echo test timer_test failed ; exit 1 ) + $(E) "[RUN] Testing tls_security_connector_test" + $(Q) $(BINDIR)/$(CONFIG)/tls_security_connector_test || ( echo test tls_security_connector_test failed ; exit 1 ) + $(E) "[RUN] Testing unknown_frame_bad_client_test" + $(Q) $(BINDIR)/$(CONFIG)/unknown_frame_bad_client_test || ( echo test unknown_frame_bad_client_test failed ; exit 1 ) + $(E) "[RUN] Testing window_overflow_bad_client_test" + $(Q) $(BINDIR)/$(CONFIG)/window_overflow_bad_client_test || ( echo test window_overflow_bad_client_test failed ; exit 1 ) + $(E) "[RUN] Testing work_serializer_test" + $(Q) $(BINDIR)/$(CONFIG)/work_serializer_test || ( echo test work_serializer_test failed ; exit 1 ) + $(E) "[RUN] Testing writes_per_rpc_test" + $(Q) $(BINDIR)/$(CONFIG)/writes_per_rpc_test || ( echo test writes_per_rpc_test failed ; exit 1 ) + $(E) "[RUN] Testing xds_bootstrap_test" + $(Q) $(BINDIR)/$(CONFIG)/xds_bootstrap_test || ( echo test xds_bootstrap_test failed ; exit 1 ) + + +flaky_test_cxx: buildtests_cxx + + +test_python: static_c + $(E) "[RUN] Testing python code" + $(Q) tools/run_tests/run_tests.py -lpython -c$(CONFIG) + + +tools: tools_c tools_cxx + + +tools_c: privatelibs_c $(BINDIR)/$(CONFIG)/check_epollexclusive + +tools_cxx: privatelibs_cxx $(BINDIR)/$(CONFIG)/gen_hpack_tables $(BINDIR)/$(CONFIG)/gen_legal_metadata_characters $(BINDIR)/$(CONFIG)/gen_percent_encoding_tables + +buildbenchmarks: privatelibs + +benchmarks: buildbenchmarks + +strip: strip-static strip-shared + +strip-static: strip-static_c strip-static_cxx + +strip-shared: strip-shared_c strip-shared_cxx + + +# TODO(nnoble): the strip target is stripping in-place, instead +# of copying files in a temporary folder. +# This prevents proper debugging after running make install. + +strip-static_c: static_c +ifeq ($(CONFIG),opt) + $(E) "[STRIP] Stripping libaddress_sorting.a" + $(Q) $(STRIP) $(LIBDIR)/$(CONFIG)/libaddress_sorting.a + $(E) "[STRIP] Stripping libgpr.a" + $(Q) $(STRIP) $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[STRIP] Stripping libgrpc.a" + $(Q) $(STRIP) $(LIBDIR)/$(CONFIG)/libgrpc.a + $(E) "[STRIP] Stripping libgrpc_csharp_ext.a" + $(Q) $(STRIP) $(LIBDIR)/$(CONFIG)/libgrpc_csharp_ext.a + $(E) "[STRIP] Stripping libgrpc_unsecure.a" + $(Q) $(STRIP) $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a + $(E) "[STRIP] Stripping libupb.a" + $(Q) $(STRIP) $(LIBDIR)/$(CONFIG)/libupb.a +endif + +strip-static_cxx: static_cxx +ifeq ($(CONFIG),opt) + $(E) "[STRIP] Stripping libgrpc++.a" + $(Q) $(STRIP) $(LIBDIR)/$(CONFIG)/libgrpc++.a + $(E) "[STRIP] Stripping libgrpc++_alts.a" + $(Q) $(STRIP) $(LIBDIR)/$(CONFIG)/libgrpc++_alts.a + $(E) "[STRIP] Stripping libgrpc++_error_details.a" + $(Q) $(STRIP) $(LIBDIR)/$(CONFIG)/libgrpc++_error_details.a + $(E) "[STRIP] Stripping libgrpc++_reflection.a" + $(Q) $(STRIP) $(LIBDIR)/$(CONFIG)/libgrpc++_reflection.a + $(E) "[STRIP] Stripping libgrpc++_unsecure.a" + $(Q) $(STRIP) $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a + $(E) "[STRIP] Stripping libgrpcpp_channelz.a" + $(Q) $(STRIP) $(LIBDIR)/$(CONFIG)/libgrpcpp_channelz.a +endif + +strip-shared_c: shared_c +ifeq ($(CONFIG),opt) + $(E) "[STRIP] Stripping $(SHARED_PREFIX)address_sorting$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE)" + $(Q) $(STRIP) $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)address_sorting$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) + $(E) "[STRIP] Stripping $(SHARED_PREFIX)gpr$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE)" + $(Q) $(STRIP) $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)gpr$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) + $(E) "[STRIP] Stripping $(SHARED_PREFIX)grpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE)" + $(Q) $(STRIP) $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)grpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) + $(E) "[STRIP] Stripping $(SHARED_PREFIX)grpc_csharp_ext$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE)" + $(Q) $(STRIP) $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)grpc_csharp_ext$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) + $(E) "[STRIP] Stripping $(SHARED_PREFIX)grpc_unsecure$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE)" + $(Q) $(STRIP) $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)grpc_unsecure$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) + $(E) "[STRIP] Stripping $(SHARED_PREFIX)upb$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE)" + $(Q) $(STRIP) $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)upb$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) +endif + +strip-shared_cxx: shared_cxx +ifeq ($(CONFIG),opt) + $(E) "[STRIP] Stripping $(SHARED_PREFIX)grpc++$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP)" + $(Q) $(STRIP) $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)grpc++$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) + $(E) "[STRIP] Stripping $(SHARED_PREFIX)grpc++_alts$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP)" + $(Q) $(STRIP) $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)grpc++_alts$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) + $(E) "[STRIP] Stripping $(SHARED_PREFIX)grpc++_error_details$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP)" + $(Q) $(STRIP) $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)grpc++_error_details$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) + $(E) "[STRIP] Stripping $(SHARED_PREFIX)grpc++_reflection$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP)" + $(Q) $(STRIP) $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)grpc++_reflection$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) + $(E) "[STRIP] Stripping $(SHARED_PREFIX)grpc++_unsecure$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP)" + $(Q) $(STRIP) $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)grpc++_unsecure$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) + $(E) "[STRIP] Stripping $(SHARED_PREFIX)grpcpp_channelz$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP)" + $(Q) $(STRIP) $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)grpcpp_channelz$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) +endif + +strip-shared_csharp: shared_csharp +ifeq ($(CONFIG),opt) +endif + +cache.mk:: + $(E) "[MAKE] Generating $@" + $(Q) echo "$(CACHE_MK)" | tr , '\n' >$@ + +$(LIBDIR)/$(CONFIG)/pkgconfig/gpr.pc: + $(E) "[MAKE] Generating $@" + $(Q) mkdir -p $(@D) + $(Q) echo "$(GPR_PC_FILE)" | tr , '\n' >$@ + +$(LIBDIR)/$(CONFIG)/pkgconfig/grpc.pc: + $(E) "[MAKE] Generating $@" + $(Q) mkdir -p $(@D) + $(Q) echo "$(GRPC_PC_FILE)" | tr , '\n' >$@ + +$(LIBDIR)/$(CONFIG)/pkgconfig/grpc_unsecure.pc: + $(E) "[MAKE] Generating $@" + $(Q) mkdir -p $(@D) + $(Q) echo "$(GRPC_UNSECURE_PC_FILE)" | tr , '\n' >$@ + +$(LIBDIR)/$(CONFIG)/pkgconfig/grpc++.pc: + $(E) "[MAKE] Generating $@" + $(Q) mkdir -p $(@D) + $(Q) echo "$(GRPCXX_PC_FILE)" | tr , '\n' >$@ + +$(LIBDIR)/$(CONFIG)/pkgconfig/grpc++_unsecure.pc: + $(E) "[MAKE] Generating $@" + $(Q) mkdir -p $(@D) + $(Q) echo "$(GRPCXX_UNSECURE_PC_FILE)" | tr , '\n' >$@ + +ifeq ($(NO_PROTOC),true) +$(GENDIR)/src/proto/grpc/channelz/channelz.pb.cc: protoc_dep_error +$(GENDIR)/src/proto/grpc/channelz/channelz.grpc.pb.cc: protoc_dep_error +else + +$(GENDIR)/src/proto/grpc/channelz/channelz.pb.cc: src/proto/grpc/channelz/channelz.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) + $(E) "[PROTOC] Generating protobuf CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --cpp_out=$(GENDIR) $< + +$(GENDIR)/src/proto/grpc/channelz/channelz.grpc.pb.cc: src/proto/grpc/channelz/channelz.proto $(GENDIR)/src/proto/grpc/channelz/channelz.pb.cc $(PROTOBUF_DEP) $(PROTOC_PLUGINS) + $(E) "[GRPC] Generating gRPC's protobuf service CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --grpc_out=$(GENDIR) --plugin=protoc-gen-grpc=$(PROTOC_PLUGINS_DIR)/grpc_cpp_plugin$(EXECUTABLE_SUFFIX) $< +endif + +ifeq ($(NO_PROTOC),true) +$(GENDIR)/src/proto/grpc/core/stats.pb.cc: protoc_dep_error +$(GENDIR)/src/proto/grpc/core/stats.grpc.pb.cc: protoc_dep_error +else + +$(GENDIR)/src/proto/grpc/core/stats.pb.cc: src/proto/grpc/core/stats.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) + $(E) "[PROTOC] Generating protobuf CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --cpp_out=$(GENDIR) $< + +$(GENDIR)/src/proto/grpc/core/stats.grpc.pb.cc: src/proto/grpc/core/stats.proto $(GENDIR)/src/proto/grpc/core/stats.pb.cc $(PROTOBUF_DEP) $(PROTOC_PLUGINS) + $(E) "[GRPC] Generating gRPC's protobuf service CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --grpc_out=$(GENDIR) --plugin=protoc-gen-grpc=$(PROTOC_PLUGINS_DIR)/grpc_cpp_plugin$(EXECUTABLE_SUFFIX) $< +endif + +ifeq ($(NO_PROTOC),true) +$(GENDIR)/src/proto/grpc/health/v1/health.pb.cc: protoc_dep_error +$(GENDIR)/src/proto/grpc/health/v1/health.grpc.pb.cc: protoc_dep_error +else + +$(GENDIR)/src/proto/grpc/health/v1/health.pb.cc: src/proto/grpc/health/v1/health.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) + $(E) "[PROTOC] Generating protobuf CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --cpp_out=$(GENDIR) $< + +$(GENDIR)/src/proto/grpc/health/v1/health.grpc.pb.cc: src/proto/grpc/health/v1/health.proto $(GENDIR)/src/proto/grpc/health/v1/health.pb.cc $(PROTOBUF_DEP) $(PROTOC_PLUGINS) + $(E) "[GRPC] Generating gRPC's protobuf service CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --grpc_out=$(GENDIR) --plugin=protoc-gen-grpc=$(PROTOC_PLUGINS_DIR)/grpc_cpp_plugin$(EXECUTABLE_SUFFIX) $< +endif + +ifeq ($(NO_PROTOC),true) +$(GENDIR)/src/proto/grpc/lb/v1/load_balancer.pb.cc: protoc_dep_error +$(GENDIR)/src/proto/grpc/lb/v1/load_balancer.grpc.pb.cc: protoc_dep_error +else + +$(GENDIR)/src/proto/grpc/lb/v1/load_balancer.pb.cc: src/proto/grpc/lb/v1/load_balancer.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) + $(E) "[PROTOC] Generating protobuf CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --cpp_out=$(GENDIR) $< + +$(GENDIR)/src/proto/grpc/lb/v1/load_balancer.grpc.pb.cc: src/proto/grpc/lb/v1/load_balancer.proto $(GENDIR)/src/proto/grpc/lb/v1/load_balancer.pb.cc $(PROTOBUF_DEP) $(PROTOC_PLUGINS) + $(E) "[GRPC] Generating gRPC's protobuf service CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --grpc_out=$(GENDIR) --plugin=protoc-gen-grpc=$(PROTOC_PLUGINS_DIR)/grpc_cpp_plugin$(EXECUTABLE_SUFFIX) $< +endif + +ifeq ($(NO_PROTOC),true) +$(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.pb.cc: protoc_dep_error +$(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.cc: protoc_dep_error +else + +$(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.pb.cc: src/proto/grpc/reflection/v1alpha/reflection.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) + $(E) "[PROTOC] Generating protobuf CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --cpp_out=$(GENDIR) $< + +$(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.cc: src/proto/grpc/reflection/v1alpha/reflection.proto $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.pb.cc $(PROTOBUF_DEP) $(PROTOC_PLUGINS) + $(E) "[GRPC] Generating gRPC's protobuf service CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --grpc_out=$(GENDIR) --plugin=protoc-gen-grpc=$(PROTOC_PLUGINS_DIR)/grpc_cpp_plugin$(EXECUTABLE_SUFFIX) $< +endif + +ifeq ($(NO_PROTOC),true) +$(GENDIR)/src/proto/grpc/status/status.pb.cc: protoc_dep_error +$(GENDIR)/src/proto/grpc/status/status.grpc.pb.cc: protoc_dep_error +else + +$(GENDIR)/src/proto/grpc/status/status.pb.cc: src/proto/grpc/status/status.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) + $(E) "[PROTOC] Generating protobuf CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --cpp_out=$(GENDIR) $< + +$(GENDIR)/src/proto/grpc/status/status.grpc.pb.cc: src/proto/grpc/status/status.proto $(GENDIR)/src/proto/grpc/status/status.pb.cc $(PROTOBUF_DEP) $(PROTOC_PLUGINS) + $(E) "[GRPC] Generating gRPC's protobuf service CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --grpc_out=$(GENDIR) --plugin=protoc-gen-grpc=$(PROTOC_PLUGINS_DIR)/grpc_cpp_plugin$(EXECUTABLE_SUFFIX) $< +endif + +ifeq ($(NO_PROTOC),true) +$(GENDIR)/src/proto/grpc/testing/benchmark_service.pb.cc: protoc_dep_error +$(GENDIR)/src/proto/grpc/testing/benchmark_service.grpc.pb.cc: protoc_dep_error +else + +$(GENDIR)/src/proto/grpc/testing/benchmark_service.pb.cc: src/proto/grpc/testing/benchmark_service.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) $(GENDIR)/src/proto/grpc/testing/messages.pb.cc + $(E) "[PROTOC] Generating protobuf CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --cpp_out=$(GENDIR) $< + +$(GENDIR)/src/proto/grpc/testing/benchmark_service.grpc.pb.cc: src/proto/grpc/testing/benchmark_service.proto $(GENDIR)/src/proto/grpc/testing/benchmark_service.pb.cc $(PROTOBUF_DEP) $(PROTOC_PLUGINS) $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc + $(E) "[GRPC] Generating gRPC's protobuf service CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --grpc_out=$(GENDIR) --plugin=protoc-gen-grpc=$(PROTOC_PLUGINS_DIR)/grpc_cpp_plugin$(EXECUTABLE_SUFFIX) $< +endif + +ifeq ($(NO_PROTOC),true) +$(GENDIR)/src/proto/grpc/testing/control.pb.cc: protoc_dep_error +$(GENDIR)/src/proto/grpc/testing/control.grpc.pb.cc: protoc_dep_error +else + +$(GENDIR)/src/proto/grpc/testing/control.pb.cc: src/proto/grpc/testing/control.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) $(GENDIR)/src/proto/grpc/testing/payloads.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.pb.cc + $(E) "[PROTOC] Generating protobuf CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --cpp_out=$(GENDIR) $< + +$(GENDIR)/src/proto/grpc/testing/control.grpc.pb.cc: src/proto/grpc/testing/control.proto $(GENDIR)/src/proto/grpc/testing/control.pb.cc $(PROTOBUF_DEP) $(PROTOC_PLUGINS) $(GENDIR)/src/proto/grpc/testing/payloads.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.grpc.pb.cc + $(E) "[GRPC] Generating gRPC's protobuf service CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --grpc_out=$(GENDIR) --plugin=protoc-gen-grpc=$(PROTOC_PLUGINS_DIR)/grpc_cpp_plugin$(EXECUTABLE_SUFFIX) $< +endif + +ifeq ($(NO_PROTOC),true) +$(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc: protoc_dep_error +$(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc: protoc_dep_error +else + +$(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc: src/proto/grpc/testing/duplicate/echo_duplicate.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc + $(E) "[PROTOC] Generating protobuf CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --cpp_out=$(GENDIR) $< + +$(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc: src/proto/grpc/testing/duplicate/echo_duplicate.proto $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(PROTOBUF_DEP) $(PROTOC_PLUGINS) $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc + $(E) "[GRPC] Generating gRPC's protobuf service CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --grpc_out=$(GENDIR) --plugin=protoc-gen-grpc=$(PROTOC_PLUGINS_DIR)/grpc_cpp_plugin$(EXECUTABLE_SUFFIX) $< +endif + +ifeq ($(NO_PROTOC),true) +$(GENDIR)/src/proto/grpc/testing/echo.pb.cc: protoc_dep_error +$(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc: protoc_dep_error +else + + +$(GENDIR)/src/proto/grpc/testing/echo.pb.cc: src/proto/grpc/testing/echo.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc + $(E) "[PROTOC] Generating protobuf CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --cpp_out=$(GENDIR) $< + +$(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc: src/proto/grpc/testing/echo.proto $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(PROTOBUF_DEP) $(PROTOC_PLUGINS) $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc + $(E) "[GRPC] Generating gRPC's protobuf service CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --grpc_out=generate_mock_code=true:$(GENDIR) --plugin=protoc-gen-grpc=$(PROTOC_PLUGINS_DIR)/grpc_cpp_plugin$(EXECUTABLE_SUFFIX) $< +endif + +ifeq ($(NO_PROTOC),true) +$(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc: protoc_dep_error +$(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc: protoc_dep_error +else + +$(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc: src/proto/grpc/testing/echo_messages.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) + $(E) "[PROTOC] Generating protobuf CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --cpp_out=$(GENDIR) $< + +$(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc: src/proto/grpc/testing/echo_messages.proto $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(PROTOBUF_DEP) $(PROTOC_PLUGINS) + $(E) "[GRPC] Generating gRPC's protobuf service CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --grpc_out=$(GENDIR) --plugin=protoc-gen-grpc=$(PROTOC_PLUGINS_DIR)/grpc_cpp_plugin$(EXECUTABLE_SUFFIX) $< +endif + +ifeq ($(NO_PROTOC),true) +$(GENDIR)/src/proto/grpc/testing/empty.pb.cc: protoc_dep_error +$(GENDIR)/src/proto/grpc/testing/empty.grpc.pb.cc: protoc_dep_error +else + +$(GENDIR)/src/proto/grpc/testing/empty.pb.cc: src/proto/grpc/testing/empty.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) + $(E) "[PROTOC] Generating protobuf CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --cpp_out=$(GENDIR) $< + +$(GENDIR)/src/proto/grpc/testing/empty.grpc.pb.cc: src/proto/grpc/testing/empty.proto $(GENDIR)/src/proto/grpc/testing/empty.pb.cc $(PROTOBUF_DEP) $(PROTOC_PLUGINS) + $(E) "[GRPC] Generating gRPC's protobuf service CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --grpc_out=$(GENDIR) --plugin=protoc-gen-grpc=$(PROTOC_PLUGINS_DIR)/grpc_cpp_plugin$(EXECUTABLE_SUFFIX) $< +endif + +ifeq ($(NO_PROTOC),true) +$(GENDIR)/src/proto/grpc/testing/messages.pb.cc: protoc_dep_error +$(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc: protoc_dep_error +else + +$(GENDIR)/src/proto/grpc/testing/messages.pb.cc: src/proto/grpc/testing/messages.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) + $(E) "[PROTOC] Generating protobuf CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --cpp_out=$(GENDIR) $< + +$(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc: src/proto/grpc/testing/messages.proto $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(PROTOBUF_DEP) $(PROTOC_PLUGINS) + $(E) "[GRPC] Generating gRPC's protobuf service CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --grpc_out=$(GENDIR) --plugin=protoc-gen-grpc=$(PROTOC_PLUGINS_DIR)/grpc_cpp_plugin$(EXECUTABLE_SUFFIX) $< +endif + +ifeq ($(NO_PROTOC),true) +$(GENDIR)/src/proto/grpc/testing/payloads.pb.cc: protoc_dep_error +$(GENDIR)/src/proto/grpc/testing/payloads.grpc.pb.cc: protoc_dep_error +else + +$(GENDIR)/src/proto/grpc/testing/payloads.pb.cc: src/proto/grpc/testing/payloads.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) + $(E) "[PROTOC] Generating protobuf CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --cpp_out=$(GENDIR) $< + +$(GENDIR)/src/proto/grpc/testing/payloads.grpc.pb.cc: src/proto/grpc/testing/payloads.proto $(GENDIR)/src/proto/grpc/testing/payloads.pb.cc $(PROTOBUF_DEP) $(PROTOC_PLUGINS) + $(E) "[GRPC] Generating gRPC's protobuf service CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --grpc_out=$(GENDIR) --plugin=protoc-gen-grpc=$(PROTOC_PLUGINS_DIR)/grpc_cpp_plugin$(EXECUTABLE_SUFFIX) $< +endif + +ifeq ($(NO_PROTOC),true) +$(GENDIR)/src/proto/grpc/testing/report_qps_scenario_service.pb.cc: protoc_dep_error +$(GENDIR)/src/proto/grpc/testing/report_qps_scenario_service.grpc.pb.cc: protoc_dep_error +else + +$(GENDIR)/src/proto/grpc/testing/report_qps_scenario_service.pb.cc: src/proto/grpc/testing/report_qps_scenario_service.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) $(GENDIR)/src/proto/grpc/testing/control.pb.cc + $(E) "[PROTOC] Generating protobuf CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --cpp_out=$(GENDIR) $< + +$(GENDIR)/src/proto/grpc/testing/report_qps_scenario_service.grpc.pb.cc: src/proto/grpc/testing/report_qps_scenario_service.proto $(GENDIR)/src/proto/grpc/testing/report_qps_scenario_service.pb.cc $(PROTOBUF_DEP) $(PROTOC_PLUGINS) $(GENDIR)/src/proto/grpc/testing/control.pb.cc $(GENDIR)/src/proto/grpc/testing/control.grpc.pb.cc + $(E) "[GRPC] Generating gRPC's protobuf service CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --grpc_out=$(GENDIR) --plugin=protoc-gen-grpc=$(PROTOC_PLUGINS_DIR)/grpc_cpp_plugin$(EXECUTABLE_SUFFIX) $< +endif + +ifeq ($(NO_PROTOC),true) +$(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc: protoc_dep_error +$(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc: protoc_dep_error +else + +$(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc: src/proto/grpc/testing/simple_messages.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) + $(E) "[PROTOC] Generating protobuf CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --cpp_out=$(GENDIR) $< + +$(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc: src/proto/grpc/testing/simple_messages.proto $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(PROTOBUF_DEP) $(PROTOC_PLUGINS) + $(E) "[GRPC] Generating gRPC's protobuf service CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --grpc_out=$(GENDIR) --plugin=protoc-gen-grpc=$(PROTOC_PLUGINS_DIR)/grpc_cpp_plugin$(EXECUTABLE_SUFFIX) $< +endif + +ifeq ($(NO_PROTOC),true) +$(GENDIR)/src/proto/grpc/testing/stats.pb.cc: protoc_dep_error +$(GENDIR)/src/proto/grpc/testing/stats.grpc.pb.cc: protoc_dep_error +else + +$(GENDIR)/src/proto/grpc/testing/stats.pb.cc: src/proto/grpc/testing/stats.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) $(GENDIR)/src/proto/grpc/core/stats.pb.cc + $(E) "[PROTOC] Generating protobuf CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --cpp_out=$(GENDIR) $< + +$(GENDIR)/src/proto/grpc/testing/stats.grpc.pb.cc: src/proto/grpc/testing/stats.proto $(GENDIR)/src/proto/grpc/testing/stats.pb.cc $(PROTOBUF_DEP) $(PROTOC_PLUGINS) $(GENDIR)/src/proto/grpc/core/stats.pb.cc $(GENDIR)/src/proto/grpc/core/stats.grpc.pb.cc + $(E) "[GRPC] Generating gRPC's protobuf service CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --grpc_out=$(GENDIR) --plugin=protoc-gen-grpc=$(PROTOC_PLUGINS_DIR)/grpc_cpp_plugin$(EXECUTABLE_SUFFIX) $< +endif + +ifeq ($(NO_PROTOC),true) +$(GENDIR)/src/proto/grpc/testing/test.pb.cc: protoc_dep_error +$(GENDIR)/src/proto/grpc/testing/test.grpc.pb.cc: protoc_dep_error +else + +$(GENDIR)/src/proto/grpc/testing/test.pb.cc: src/proto/grpc/testing/test.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) $(GENDIR)/src/proto/grpc/testing/empty.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc + $(E) "[PROTOC] Generating protobuf CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --cpp_out=$(GENDIR) $< + +$(GENDIR)/src/proto/grpc/testing/test.grpc.pb.cc: src/proto/grpc/testing/test.proto $(GENDIR)/src/proto/grpc/testing/test.pb.cc $(PROTOBUF_DEP) $(PROTOC_PLUGINS) $(GENDIR)/src/proto/grpc/testing/empty.pb.cc $(GENDIR)/src/proto/grpc/testing/empty.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc + $(E) "[GRPC] Generating gRPC's protobuf service CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --grpc_out=$(GENDIR) --plugin=protoc-gen-grpc=$(PROTOC_PLUGINS_DIR)/grpc_cpp_plugin$(EXECUTABLE_SUFFIX) $< +endif + +ifeq ($(NO_PROTOC),true) +$(GENDIR)/src/proto/grpc/testing/worker_service.pb.cc: protoc_dep_error +$(GENDIR)/src/proto/grpc/testing/worker_service.grpc.pb.cc: protoc_dep_error +else + +$(GENDIR)/src/proto/grpc/testing/worker_service.pb.cc: src/proto/grpc/testing/worker_service.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) $(GENDIR)/src/proto/grpc/testing/control.pb.cc + $(E) "[PROTOC] Generating protobuf CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --cpp_out=$(GENDIR) $< + +$(GENDIR)/src/proto/grpc/testing/worker_service.grpc.pb.cc: src/proto/grpc/testing/worker_service.proto $(GENDIR)/src/proto/grpc/testing/worker_service.pb.cc $(PROTOBUF_DEP) $(PROTOC_PLUGINS) $(GENDIR)/src/proto/grpc/testing/control.pb.cc $(GENDIR)/src/proto/grpc/testing/control.grpc.pb.cc + $(E) "[GRPC] Generating gRPC's protobuf service CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --grpc_out=$(GENDIR) --plugin=protoc-gen-grpc=$(PROTOC_PLUGINS_DIR)/grpc_cpp_plugin$(EXECUTABLE_SUFFIX) $< +endif + +ifeq ($(NO_PROTOC),true) +$(GENDIR)/src/proto/grpc/testing/xds/ads_for_test.pb.cc: protoc_dep_error +$(GENDIR)/src/proto/grpc/testing/xds/ads_for_test.grpc.pb.cc: protoc_dep_error +else + +$(GENDIR)/src/proto/grpc/testing/xds/ads_for_test.pb.cc: src/proto/grpc/testing/xds/ads_for_test.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) $(GENDIR)/src/proto/grpc/testing/xds/eds_for_test.pb.cc + $(E) "[PROTOC] Generating protobuf CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --cpp_out=$(GENDIR) $< + +$(GENDIR)/src/proto/grpc/testing/xds/ads_for_test.grpc.pb.cc: src/proto/grpc/testing/xds/ads_for_test.proto $(GENDIR)/src/proto/grpc/testing/xds/ads_for_test.pb.cc $(PROTOBUF_DEP) $(PROTOC_PLUGINS) $(GENDIR)/src/proto/grpc/testing/xds/eds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/eds_for_test.grpc.pb.cc + $(E) "[GRPC] Generating gRPC's protobuf service CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --grpc_out=$(GENDIR) --plugin=protoc-gen-grpc=$(PROTOC_PLUGINS_DIR)/grpc_cpp_plugin$(EXECUTABLE_SUFFIX) $< +endif + +ifeq ($(NO_PROTOC),true) +$(GENDIR)/src/proto/grpc/testing/xds/cds_for_test.pb.cc: protoc_dep_error +$(GENDIR)/src/proto/grpc/testing/xds/cds_for_test.grpc.pb.cc: protoc_dep_error +else + +$(GENDIR)/src/proto/grpc/testing/xds/cds_for_test.pb.cc: src/proto/grpc/testing/xds/cds_for_test.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) + $(E) "[PROTOC] Generating protobuf CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --cpp_out=$(GENDIR) $< + +$(GENDIR)/src/proto/grpc/testing/xds/cds_for_test.grpc.pb.cc: src/proto/grpc/testing/xds/cds_for_test.proto $(GENDIR)/src/proto/grpc/testing/xds/cds_for_test.pb.cc $(PROTOBUF_DEP) $(PROTOC_PLUGINS) + $(E) "[GRPC] Generating gRPC's protobuf service CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --grpc_out=$(GENDIR) --plugin=protoc-gen-grpc=$(PROTOC_PLUGINS_DIR)/grpc_cpp_plugin$(EXECUTABLE_SUFFIX) $< +endif + +ifeq ($(NO_PROTOC),true) +$(GENDIR)/src/proto/grpc/testing/xds/eds_for_test.pb.cc: protoc_dep_error +$(GENDIR)/src/proto/grpc/testing/xds/eds_for_test.grpc.pb.cc: protoc_dep_error +else + +$(GENDIR)/src/proto/grpc/testing/xds/eds_for_test.pb.cc: src/proto/grpc/testing/xds/eds_for_test.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) + $(E) "[PROTOC] Generating protobuf CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --cpp_out=$(GENDIR) $< + +$(GENDIR)/src/proto/grpc/testing/xds/eds_for_test.grpc.pb.cc: src/proto/grpc/testing/xds/eds_for_test.proto $(GENDIR)/src/proto/grpc/testing/xds/eds_for_test.pb.cc $(PROTOBUF_DEP) $(PROTOC_PLUGINS) + $(E) "[GRPC] Generating gRPC's protobuf service CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --grpc_out=$(GENDIR) --plugin=protoc-gen-grpc=$(PROTOC_PLUGINS_DIR)/grpc_cpp_plugin$(EXECUTABLE_SUFFIX) $< +endif + +ifeq ($(NO_PROTOC),true) +$(GENDIR)/src/proto/grpc/testing/xds/lds_rds_for_test.pb.cc: protoc_dep_error +$(GENDIR)/src/proto/grpc/testing/xds/lds_rds_for_test.grpc.pb.cc: protoc_dep_error +else + +$(GENDIR)/src/proto/grpc/testing/xds/lds_rds_for_test.pb.cc: src/proto/grpc/testing/xds/lds_rds_for_test.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) $(GENDIR)/src/proto/grpc/testing/xds/cds_for_test.pb.cc + $(E) "[PROTOC] Generating protobuf CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --cpp_out=$(GENDIR) $< + +$(GENDIR)/src/proto/grpc/testing/xds/lds_rds_for_test.grpc.pb.cc: src/proto/grpc/testing/xds/lds_rds_for_test.proto $(GENDIR)/src/proto/grpc/testing/xds/lds_rds_for_test.pb.cc $(PROTOBUF_DEP) $(PROTOC_PLUGINS) $(GENDIR)/src/proto/grpc/testing/xds/cds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/cds_for_test.grpc.pb.cc + $(E) "[GRPC] Generating gRPC's protobuf service CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --grpc_out=$(GENDIR) --plugin=protoc-gen-grpc=$(PROTOC_PLUGINS_DIR)/grpc_cpp_plugin$(EXECUTABLE_SUFFIX) $< +endif + +ifeq ($(NO_PROTOC),true) +$(GENDIR)/src/proto/grpc/testing/xds/lrs_for_test.pb.cc: protoc_dep_error +$(GENDIR)/src/proto/grpc/testing/xds/lrs_for_test.grpc.pb.cc: protoc_dep_error +else + +$(GENDIR)/src/proto/grpc/testing/xds/lrs_for_test.pb.cc: src/proto/grpc/testing/xds/lrs_for_test.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) $(GENDIR)/src/proto/grpc/testing/xds/eds_for_test.pb.cc + $(E) "[PROTOC] Generating protobuf CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --cpp_out=$(GENDIR) $< + +$(GENDIR)/src/proto/grpc/testing/xds/lrs_for_test.grpc.pb.cc: src/proto/grpc/testing/xds/lrs_for_test.proto $(GENDIR)/src/proto/grpc/testing/xds/lrs_for_test.pb.cc $(PROTOBUF_DEP) $(PROTOC_PLUGINS) $(GENDIR)/src/proto/grpc/testing/xds/eds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/eds_for_test.grpc.pb.cc + $(E) "[GRPC] Generating gRPC's protobuf service CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --grpc_out=$(GENDIR) --plugin=protoc-gen-grpc=$(PROTOC_PLUGINS_DIR)/grpc_cpp_plugin$(EXECUTABLE_SUFFIX) $< +endif + +ifeq ($(NO_PROTOC),true) +$(GENDIR)/src/proto/grpc/testing/xds/orca_load_report_for_test.pb.cc: protoc_dep_error +$(GENDIR)/src/proto/grpc/testing/xds/orca_load_report_for_test.grpc.pb.cc: protoc_dep_error +else + +$(GENDIR)/src/proto/grpc/testing/xds/orca_load_report_for_test.pb.cc: src/proto/grpc/testing/xds/orca_load_report_for_test.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) + $(E) "[PROTOC] Generating protobuf CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --cpp_out=$(GENDIR) $< + +$(GENDIR)/src/proto/grpc/testing/xds/orca_load_report_for_test.grpc.pb.cc: src/proto/grpc/testing/xds/orca_load_report_for_test.proto $(GENDIR)/src/proto/grpc/testing/xds/orca_load_report_for_test.pb.cc $(PROTOBUF_DEP) $(PROTOC_PLUGINS) + $(E) "[GRPC] Generating gRPC's protobuf service CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --grpc_out=$(GENDIR) --plugin=protoc-gen-grpc=$(PROTOC_PLUGINS_DIR)/grpc_cpp_plugin$(EXECUTABLE_SUFFIX) $< +endif + +ifeq ($(NO_PROTOC),true) +$(GENDIR)/test/core/tsi/alts/fake_handshaker/handshaker.pb.cc: protoc_dep_error +$(GENDIR)/test/core/tsi/alts/fake_handshaker/handshaker.grpc.pb.cc: protoc_dep_error +else + +$(GENDIR)/test/core/tsi/alts/fake_handshaker/handshaker.pb.cc: test/core/tsi/alts/fake_handshaker/handshaker.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) + $(E) "[PROTOC] Generating protobuf CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --cpp_out=$(GENDIR) $< + +$(GENDIR)/test/core/tsi/alts/fake_handshaker/handshaker.grpc.pb.cc: test/core/tsi/alts/fake_handshaker/handshaker.proto $(GENDIR)/test/core/tsi/alts/fake_handshaker/handshaker.pb.cc $(PROTOBUF_DEP) $(PROTOC_PLUGINS) + $(E) "[GRPC] Generating gRPC's protobuf service CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --grpc_out=$(GENDIR) --plugin=protoc-gen-grpc=$(PROTOC_PLUGINS_DIR)/grpc_cpp_plugin$(EXECUTABLE_SUFFIX) $< +endif + +ifeq ($(NO_PROTOC),true) +$(GENDIR)/test/core/tsi/alts/fake_handshaker/transport_security_common.pb.cc: protoc_dep_error +$(GENDIR)/test/core/tsi/alts/fake_handshaker/transport_security_common.grpc.pb.cc: protoc_dep_error +else + +$(GENDIR)/test/core/tsi/alts/fake_handshaker/transport_security_common.pb.cc: test/core/tsi/alts/fake_handshaker/transport_security_common.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) + $(E) "[PROTOC] Generating protobuf CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --cpp_out=$(GENDIR) $< + +$(GENDIR)/test/core/tsi/alts/fake_handshaker/transport_security_common.grpc.pb.cc: test/core/tsi/alts/fake_handshaker/transport_security_common.proto $(GENDIR)/test/core/tsi/alts/fake_handshaker/transport_security_common.pb.cc $(PROTOBUF_DEP) $(PROTOC_PLUGINS) + $(E) "[GRPC] Generating gRPC's protobuf service CC file from $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --grpc_out=$(GENDIR) --plugin=protoc-gen-grpc=$(PROTOC_PLUGINS_DIR)/grpc_cpp_plugin$(EXECUTABLE_SUFFIX) $< +endif + + +ifeq ($(CONFIG),stapprof) +src/core/profiling/stap_timers.c: $(GENDIR)/src/core/profiling/stap_probes.h +ifeq ($(HAS_SYSTEMTAP),true) +$(GENDIR)/src/core/profiling/stap_probes.h: src/core/profiling/stap_probes.d + $(E) "[DTRACE] Compiling $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(DTRACE) -C -h -s $< -o $@ +else +$(GENDIR)/src/core/profiling/stap_probes.h: systemtap_dep_error stop +endif +endif + +$(OBJDIR)/$(CONFIG)/%.o : %.c + $(E) "[C] Compiling $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(CC) $(CPPFLAGS) $(CFLAGS) -MMD -MF $(addsuffix .dep, $(basename $@)) -c -o $@ $< + +$(OBJDIR)/$(CONFIG)/%.o : $(GENDIR)/%.pb.cc + $(E) "[CXX] Compiling $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(CXX) $(CPPFLAGS) $(CXXFLAGS) -MMD -MF $(addsuffix .dep, $(basename $@)) -c -o $@ $< + +$(OBJDIR)/$(CONFIG)/src/compiler/%.o : src/compiler/%.cc + $(E) "[HOSTCXX] Compiling $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(HOST_CXX) $(HOST_CXXFLAGS) $(HOST_CPPFLAGS) -MMD -MF $(addsuffix .dep, $(basename $@)) -c -o $@ $< + +$(OBJDIR)/$(CONFIG)/src/core/%.o : src/core/%.cc + $(E) "[CXX] Compiling $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(COREFLAGS) -MMD -MF $(addsuffix .dep, $(basename $@)) -c -o $@ $< + +$(OBJDIR)/$(CONFIG)/test/core/%.o : test/core/%.cc + $(E) "[CXX] Compiling $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(COREFLAGS) -MMD -MF $(addsuffix .dep, $(basename $@)) -c -o $@ $< + +$(OBJDIR)/$(CONFIG)/%.o : %.cc + $(E) "[CXX] Compiling $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(CXX) $(CPPFLAGS) $(CXXFLAGS) -MMD -MF $(addsuffix .dep, $(basename $@)) -c -o $@ $< + +$(OBJDIR)/$(CONFIG)/%.o : %.cpp + $(E) "[CXX] Compiling $<" + $(Q) mkdir -p `dirname $@` + $(Q) $(CXX) $(CPPFLAGS) $(CXXFLAGS) -MMD -MF $(addsuffix .dep, $(basename $@)) -c -o $@ $< + +install: install_c install_cxx install-plugins install-certs + +install_c: install-headers_c install-static_c install-shared_c + +install_cxx: install-headers_cxx install-static_cxx install-shared_cxx + +install_csharp: install-shared_csharp install_c + +install_grpc_csharp_ext: install_csharp + +install-headers: install-headers_c install-headers_cxx + +install-headers_c: + $(E) "[INSTALL] Installing public C headers" + $(Q) $(foreach h, $(PUBLIC_HEADERS_C), $(INSTALL) -d $(prefix)/$(dir $(h)) && ) exit 0 || exit 1 + $(Q) $(foreach h, $(PUBLIC_HEADERS_C), $(INSTALL) $(h) $(prefix)/$(h) && ) exit 0 || exit 1 + +install-headers_cxx: + $(E) "[INSTALL] Installing public C++ headers" + $(Q) $(foreach h, $(PUBLIC_HEADERS_CXX), $(INSTALL) -d $(prefix)/$(dir $(h)) && ) exit 0 || exit 1 + $(Q) $(foreach h, $(PUBLIC_HEADERS_CXX), $(INSTALL) $(h) $(prefix)/$(h) && ) exit 0 || exit 1 + +install-static: install-static_c install-static_cxx + +install-static_c: static_c strip-static_c install-pkg-config_c + $(E) "[INSTALL] Installing libaddress_sorting.a" + $(Q) $(INSTALL) -d $(prefix)/lib + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(prefix)/lib/libaddress_sorting.a + $(E) "[INSTALL] Installing libgpr.a" + $(Q) $(INSTALL) -d $(prefix)/lib + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/libgpr.a $(prefix)/lib/libgpr.a + $(E) "[INSTALL] Installing libgrpc.a" + $(Q) $(INSTALL) -d $(prefix)/lib + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/libgrpc.a $(prefix)/lib/libgrpc.a + $(E) "[INSTALL] Installing libgrpc_csharp_ext.a" + $(Q) $(INSTALL) -d $(prefix)/lib + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/libgrpc_csharp_ext.a $(prefix)/lib/libgrpc_csharp_ext.a + $(E) "[INSTALL] Installing libgrpc_unsecure.a" + $(Q) $(INSTALL) -d $(prefix)/lib + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(prefix)/lib/libgrpc_unsecure.a + $(E) "[INSTALL] Installing libupb.a" + $(Q) $(INSTALL) -d $(prefix)/lib + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/libupb.a $(prefix)/lib/libupb.a + +install-static_cxx: static_cxx strip-static_cxx install-pkg-config_cxx + $(E) "[INSTALL] Installing libgrpc++.a" + $(Q) $(INSTALL) -d $(prefix)/lib + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/libgrpc++.a $(prefix)/lib/libgrpc++.a + $(E) "[INSTALL] Installing libgrpc++_alts.a" + $(Q) $(INSTALL) -d $(prefix)/lib + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/libgrpc++_alts.a $(prefix)/lib/libgrpc++_alts.a + $(E) "[INSTALL] Installing libgrpc++_error_details.a" + $(Q) $(INSTALL) -d $(prefix)/lib + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/libgrpc++_error_details.a $(prefix)/lib/libgrpc++_error_details.a + $(E) "[INSTALL] Installing libgrpc++_reflection.a" + $(Q) $(INSTALL) -d $(prefix)/lib + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/libgrpc++_reflection.a $(prefix)/lib/libgrpc++_reflection.a + $(E) "[INSTALL] Installing libgrpc++_unsecure.a" + $(Q) $(INSTALL) -d $(prefix)/lib + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(prefix)/lib/libgrpc++_unsecure.a + $(E) "[INSTALL] Installing libgrpcpp_channelz.a" + $(Q) $(INSTALL) -d $(prefix)/lib + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/libgrpcpp_channelz.a $(prefix)/lib/libgrpcpp_channelz.a + + + +install-shared_c: shared_c strip-shared_c install-pkg-config_c + $(E) "[INSTALL] Installing $(SHARED_PREFIX)address_sorting$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE)" + $(Q) $(INSTALL) -d $(prefix)/lib + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)address_sorting$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(prefix)/lib/$(SHARED_PREFIX)address_sorting$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) +ifeq ($(SYSTEM),MINGW32) + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/libaddress_sorting$(SHARED_VERSION_CORE)-dll.a $(prefix)/lib/libaddress_sorting.a +else ifneq ($(SYSTEM),Darwin) + $(Q) ln -sf $(SHARED_PREFIX)address_sorting$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(prefix)/lib/libaddress_sorting.so.10 + $(Q) ln -sf $(SHARED_PREFIX)address_sorting$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(prefix)/lib/libaddress_sorting.so +endif + $(E) "[INSTALL] Installing $(SHARED_PREFIX)gpr$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE)" + $(Q) $(INSTALL) -d $(prefix)/lib + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)gpr$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(prefix)/lib/$(SHARED_PREFIX)gpr$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) +ifeq ($(SYSTEM),MINGW32) + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/libgpr$(SHARED_VERSION_CORE)-dll.a $(prefix)/lib/libgpr.a +else ifneq ($(SYSTEM),Darwin) + $(Q) ln -sf $(SHARED_PREFIX)gpr$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(prefix)/lib/libgpr.so.10 + $(Q) ln -sf $(SHARED_PREFIX)gpr$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(prefix)/lib/libgpr.so +endif + $(E) "[INSTALL] Installing $(SHARED_PREFIX)grpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE)" + $(Q) $(INSTALL) -d $(prefix)/lib + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)grpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(prefix)/lib/$(SHARED_PREFIX)grpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) +ifeq ($(SYSTEM),MINGW32) + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/libgrpc$(SHARED_VERSION_CORE)-dll.a $(prefix)/lib/libgrpc.a +else ifneq ($(SYSTEM),Darwin) + $(Q) ln -sf $(SHARED_PREFIX)grpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(prefix)/lib/libgrpc.so.10 + $(Q) ln -sf $(SHARED_PREFIX)grpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(prefix)/lib/libgrpc.so +endif + $(E) "[INSTALL] Installing $(SHARED_PREFIX)grpc_csharp_ext$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE)" + $(Q) $(INSTALL) -d $(prefix)/lib + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)grpc_csharp_ext$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(prefix)/lib/$(SHARED_PREFIX)grpc_csharp_ext$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) +ifeq ($(SYSTEM),MINGW32) + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/libgrpc_csharp_ext$(SHARED_VERSION_CORE)-dll.a $(prefix)/lib/libgrpc_csharp_ext.a +else ifneq ($(SYSTEM),Darwin) + $(Q) ln -sf $(SHARED_PREFIX)grpc_csharp_ext$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(prefix)/lib/libgrpc_csharp_ext.so.10 + $(Q) ln -sf $(SHARED_PREFIX)grpc_csharp_ext$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(prefix)/lib/libgrpc_csharp_ext.so +endif + $(E) "[INSTALL] Installing $(SHARED_PREFIX)grpc_unsecure$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE)" + $(Q) $(INSTALL) -d $(prefix)/lib + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)grpc_unsecure$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(prefix)/lib/$(SHARED_PREFIX)grpc_unsecure$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) +ifeq ($(SYSTEM),MINGW32) + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/libgrpc_unsecure$(SHARED_VERSION_CORE)-dll.a $(prefix)/lib/libgrpc_unsecure.a +else ifneq ($(SYSTEM),Darwin) + $(Q) ln -sf $(SHARED_PREFIX)grpc_unsecure$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(prefix)/lib/libgrpc_unsecure.so.10 + $(Q) ln -sf $(SHARED_PREFIX)grpc_unsecure$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(prefix)/lib/libgrpc_unsecure.so +endif + $(E) "[INSTALL] Installing $(SHARED_PREFIX)upb$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE)" + $(Q) $(INSTALL) -d $(prefix)/lib + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)upb$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(prefix)/lib/$(SHARED_PREFIX)upb$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) +ifeq ($(SYSTEM),MINGW32) + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/libupb$(SHARED_VERSION_CORE)-dll.a $(prefix)/lib/libupb.a +else ifneq ($(SYSTEM),Darwin) + $(Q) ln -sf $(SHARED_PREFIX)upb$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(prefix)/lib/libupb.so.10 + $(Q) ln -sf $(SHARED_PREFIX)upb$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(prefix)/lib/libupb.so +endif +ifneq ($(SYSTEM),MINGW32) +ifneq ($(SYSTEM),Darwin) + $(Q) ldconfig || true +endif +endif + + +install-shared_cxx: shared_cxx strip-shared_cxx install-shared_c install-pkg-config_cxx + $(E) "[INSTALL] Installing $(SHARED_PREFIX)grpc++$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP)" + $(Q) $(INSTALL) -d $(prefix)/lib + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)grpc++$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(prefix)/lib/$(SHARED_PREFIX)grpc++$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) +ifeq ($(SYSTEM),MINGW32) + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/libgrpc++$(SHARED_VERSION_CPP)-dll.a $(prefix)/lib/libgrpc++.a +else ifneq ($(SYSTEM),Darwin) + $(Q) ln -sf $(SHARED_PREFIX)grpc++$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(prefix)/lib/libgrpc++.so.1 + $(Q) ln -sf $(SHARED_PREFIX)grpc++$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(prefix)/lib/libgrpc++.so +endif + $(E) "[INSTALL] Installing $(SHARED_PREFIX)grpc++_alts$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP)" + $(Q) $(INSTALL) -d $(prefix)/lib + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)grpc++_alts$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(prefix)/lib/$(SHARED_PREFIX)grpc++_alts$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) +ifeq ($(SYSTEM),MINGW32) + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/libgrpc++_alts$(SHARED_VERSION_CPP)-dll.a $(prefix)/lib/libgrpc++_alts.a +else ifneq ($(SYSTEM),Darwin) + $(Q) ln -sf $(SHARED_PREFIX)grpc++_alts$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(prefix)/lib/libgrpc++_alts.so.1 + $(Q) ln -sf $(SHARED_PREFIX)grpc++_alts$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(prefix)/lib/libgrpc++_alts.so +endif + $(E) "[INSTALL] Installing $(SHARED_PREFIX)grpc++_error_details$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP)" + $(Q) $(INSTALL) -d $(prefix)/lib + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)grpc++_error_details$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(prefix)/lib/$(SHARED_PREFIX)grpc++_error_details$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) +ifeq ($(SYSTEM),MINGW32) + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/libgrpc++_error_details$(SHARED_VERSION_CPP)-dll.a $(prefix)/lib/libgrpc++_error_details.a +else ifneq ($(SYSTEM),Darwin) + $(Q) ln -sf $(SHARED_PREFIX)grpc++_error_details$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(prefix)/lib/libgrpc++_error_details.so.1 + $(Q) ln -sf $(SHARED_PREFIX)grpc++_error_details$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(prefix)/lib/libgrpc++_error_details.so +endif + $(E) "[INSTALL] Installing $(SHARED_PREFIX)grpc++_reflection$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP)" + $(Q) $(INSTALL) -d $(prefix)/lib + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)grpc++_reflection$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(prefix)/lib/$(SHARED_PREFIX)grpc++_reflection$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) +ifeq ($(SYSTEM),MINGW32) + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/libgrpc++_reflection$(SHARED_VERSION_CPP)-dll.a $(prefix)/lib/libgrpc++_reflection.a +else ifneq ($(SYSTEM),Darwin) + $(Q) ln -sf $(SHARED_PREFIX)grpc++_reflection$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(prefix)/lib/libgrpc++_reflection.so.1 + $(Q) ln -sf $(SHARED_PREFIX)grpc++_reflection$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(prefix)/lib/libgrpc++_reflection.so +endif + $(E) "[INSTALL] Installing $(SHARED_PREFIX)grpc++_unsecure$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP)" + $(Q) $(INSTALL) -d $(prefix)/lib + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)grpc++_unsecure$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(prefix)/lib/$(SHARED_PREFIX)grpc++_unsecure$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) +ifeq ($(SYSTEM),MINGW32) + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure$(SHARED_VERSION_CPP)-dll.a $(prefix)/lib/libgrpc++_unsecure.a +else ifneq ($(SYSTEM),Darwin) + $(Q) ln -sf $(SHARED_PREFIX)grpc++_unsecure$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(prefix)/lib/libgrpc++_unsecure.so.1 + $(Q) ln -sf $(SHARED_PREFIX)grpc++_unsecure$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(prefix)/lib/libgrpc++_unsecure.so +endif + $(E) "[INSTALL] Installing $(SHARED_PREFIX)grpcpp_channelz$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP)" + $(Q) $(INSTALL) -d $(prefix)/lib + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)grpcpp_channelz$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(prefix)/lib/$(SHARED_PREFIX)grpcpp_channelz$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) +ifeq ($(SYSTEM),MINGW32) + $(Q) $(INSTALL) $(LIBDIR)/$(CONFIG)/libgrpcpp_channelz$(SHARED_VERSION_CPP)-dll.a $(prefix)/lib/libgrpcpp_channelz.a +else ifneq ($(SYSTEM),Darwin) + $(Q) ln -sf $(SHARED_PREFIX)grpcpp_channelz$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(prefix)/lib/libgrpcpp_channelz.so.1 + $(Q) ln -sf $(SHARED_PREFIX)grpcpp_channelz$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(prefix)/lib/libgrpcpp_channelz.so +endif +ifneq ($(SYSTEM),MINGW32) +ifneq ($(SYSTEM),Darwin) + $(Q) ldconfig || true +endif +endif + + +install-shared_csharp: shared_csharp strip-shared_csharp +ifneq ($(SYSTEM),MINGW32) +ifneq ($(SYSTEM),Darwin) + $(Q) ldconfig || true +endif +endif + + +install-plugins: $(PROTOC_PLUGINS) + $(E) "[INSTALL] Installing grpc protoc plugins" + $(Q) $(INSTALL) -d $(prefix)/bin + $(Q) $(INSTALL) $(BINDIR)/$(CONFIG)/grpc_cpp_plugin $(prefix)/bin/grpc_cpp_plugin + $(Q) $(INSTALL) -d $(prefix)/bin + $(Q) $(INSTALL) $(BINDIR)/$(CONFIG)/grpc_csharp_plugin $(prefix)/bin/grpc_csharp_plugin + $(Q) $(INSTALL) -d $(prefix)/bin + $(Q) $(INSTALL) $(BINDIR)/$(CONFIG)/grpc_node_plugin $(prefix)/bin/grpc_node_plugin + $(Q) $(INSTALL) -d $(prefix)/bin + $(Q) $(INSTALL) $(BINDIR)/$(CONFIG)/grpc_objective_c_plugin $(prefix)/bin/grpc_objective_c_plugin + $(Q) $(INSTALL) -d $(prefix)/bin + $(Q) $(INSTALL) $(BINDIR)/$(CONFIG)/grpc_php_plugin $(prefix)/bin/grpc_php_plugin + $(Q) $(INSTALL) -d $(prefix)/bin + $(Q) $(INSTALL) $(BINDIR)/$(CONFIG)/grpc_python_plugin $(prefix)/bin/grpc_python_plugin + $(Q) $(INSTALL) -d $(prefix)/bin + $(Q) $(INSTALL) $(BINDIR)/$(CONFIG)/grpc_ruby_plugin $(prefix)/bin/grpc_ruby_plugin + +install-grpc-cli: grpc_cli + $(E) "[INSTALL] Installing grpc cli" + $(Q) $(INSTALL) -d $(prefix)/bin + $(Q) $(INSTALL) $(BINDIR)/$(CONFIG)/grpc_cli $(prefix)/bin/grpc_cli + +install-pkg-config_c: pc_c pc_c_unsecure + $(E) "[INSTALL] Installing C pkg-config files" + $(Q) $(INSTALL) -d $(prefix)/lib/pkgconfig + $(Q) $(INSTALL) -m 0644 $(LIBDIR)/$(CONFIG)/pkgconfig/gpr.pc $(prefix)/lib/pkgconfig/gpr.pc + $(Q) $(INSTALL) -m 0644 $(LIBDIR)/$(CONFIG)/pkgconfig/grpc.pc $(prefix)/lib/pkgconfig/grpc.pc + $(Q) $(INSTALL) -m 0644 $(LIBDIR)/$(CONFIG)/pkgconfig/grpc_unsecure.pc $(prefix)/lib/pkgconfig/grpc_unsecure.pc + +install-pkg-config_cxx: pc_cxx pc_cxx_unsecure + $(E) "[INSTALL] Installing C++ pkg-config files" + $(Q) $(INSTALL) -d $(prefix)/lib/pkgconfig + $(Q) $(INSTALL) -m 0644 $(LIBDIR)/$(CONFIG)/pkgconfig/grpc++.pc $(prefix)/lib/pkgconfig/grpc++.pc + $(Q) $(INSTALL) -m 0644 $(LIBDIR)/$(CONFIG)/pkgconfig/grpc++_unsecure.pc $(prefix)/lib/pkgconfig/grpc++_unsecure.pc + +install-certs: etc/roots.pem + $(E) "[INSTALL] Installing root certificates" + $(Q) $(INSTALL) -d $(prefix)/share/grpc + $(Q) $(INSTALL) etc/roots.pem $(prefix)/share/grpc/roots.pem + +clean: + $(E) "[CLEAN] Cleaning build directories." + $(Q) $(RM) -rf $(OBJDIR) $(LIBDIR) $(BINDIR) $(GENDIR) cache.mk + + +# The various libraries + + +LIBADDRESS_SORTING_SRC = \ + third_party/address_sorting/address_sorting.c \ + third_party/address_sorting/address_sorting_posix.c \ + third_party/address_sorting/address_sorting_windows.c \ + +PUBLIC_HEADERS_C += \ + +LIBADDRESS_SORTING_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBADDRESS_SORTING_SRC)))) + + +$(LIBDIR)/$(CONFIG)/libaddress_sorting.a: $(LIBADDRESS_SORTING_OBJS) + $(E) "[AR] Creating $@" + $(Q) mkdir -p `dirname $@` + $(Q) rm -f $(LIBDIR)/$(CONFIG)/libaddress_sorting.a + $(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBADDRESS_SORTING_OBJS) +ifeq ($(SYSTEM),Darwin) + $(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libaddress_sorting.a +endif + + + +ifeq ($(SYSTEM),MINGW32) +$(LIBDIR)/$(CONFIG)/address_sorting$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE): $(LIBADDRESS_SORTING_OBJS) $(ZLIB_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,--output-def=$(LIBDIR)/$(CONFIG)/address_sorting$(SHARED_VERSION_CORE).def -Wl,--out-implib=$(LIBDIR)/$(CONFIG)/libaddress_sorting$(SHARED_VERSION_CORE)-dll.a -o $(LIBDIR)/$(CONFIG)/address_sorting$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBADDRESS_SORTING_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS) +else +$(LIBDIR)/$(CONFIG)/libaddress_sorting$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE): $(LIBADDRESS_SORTING_OBJS) $(ZLIB_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` +ifeq ($(SYSTEM),Darwin) + $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -install_name $(SHARED_PREFIX)address_sorting$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) -dynamiclib -o $(LIBDIR)/$(CONFIG)/libaddress_sorting$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBADDRESS_SORTING_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS) +else + $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,libaddress_sorting.so.10 -o $(LIBDIR)/$(CONFIG)/libaddress_sorting$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBADDRESS_SORTING_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS) + $(Q) ln -sf $(SHARED_PREFIX)address_sorting$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libaddress_sorting$(SHARED_VERSION_CORE).so.10 + $(Q) ln -sf $(SHARED_PREFIX)address_sorting$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libaddress_sorting$(SHARED_VERSION_CORE).so +endif +endif + +ifneq ($(NO_DEPS),true) +-include $(LIBADDRESS_SORTING_OBJS:.o=.dep) +endif + + +LIBEND2END_NOSEC_TESTS_SRC = \ + test/core/end2end/cq_verifier.cc \ + test/core/end2end/data/client_certs.cc \ + test/core/end2end/data/server1_cert.cc \ + test/core/end2end/data/server1_key.cc \ + test/core/end2end/data/test_root_cert.cc \ + test/core/end2end/end2end_nosec_tests.cc \ + test/core/end2end/end2end_test_utils.cc \ + test/core/end2end/fixtures/http_proxy_fixture.cc \ + test/core/end2end/fixtures/local_util.cc \ + test/core/end2end/fixtures/proxy.cc \ + test/core/end2end/tests/authority_not_supported.cc \ + test/core/end2end/tests/bad_hostname.cc \ + test/core/end2end/tests/bad_ping.cc \ + test/core/end2end/tests/binary_metadata.cc \ + test/core/end2end/tests/call_host_override.cc \ + test/core/end2end/tests/cancel_after_accept.cc \ + test/core/end2end/tests/cancel_after_client_done.cc \ + test/core/end2end/tests/cancel_after_invoke.cc \ + test/core/end2end/tests/cancel_after_round_trip.cc \ + test/core/end2end/tests/cancel_before_invoke.cc \ + test/core/end2end/tests/cancel_in_a_vacuum.cc \ + test/core/end2end/tests/cancel_with_status.cc \ + test/core/end2end/tests/channelz.cc \ + test/core/end2end/tests/client_streaming.cc \ + test/core/end2end/tests/compressed_payload.cc \ + test/core/end2end/tests/connectivity.cc \ + test/core/end2end/tests/default_host.cc \ + test/core/end2end/tests/disappearing_server.cc \ + test/core/end2end/tests/empty_batch.cc \ + test/core/end2end/tests/filter_call_init_fails.cc \ + test/core/end2end/tests/filter_causes_close.cc \ + test/core/end2end/tests/filter_context.cc \ + test/core/end2end/tests/filter_latency.cc \ + test/core/end2end/tests/filter_status_code.cc \ + test/core/end2end/tests/graceful_server_shutdown.cc \ + test/core/end2end/tests/high_initial_seqno.cc \ + test/core/end2end/tests/hpack_size.cc \ + test/core/end2end/tests/idempotent_request.cc \ + test/core/end2end/tests/invoke_large_request.cc \ + test/core/end2end/tests/keepalive_timeout.cc \ + test/core/end2end/tests/large_metadata.cc \ + test/core/end2end/tests/max_concurrent_streams.cc \ + test/core/end2end/tests/max_connection_age.cc \ + test/core/end2end/tests/max_connection_idle.cc \ + test/core/end2end/tests/max_message_length.cc \ + test/core/end2end/tests/negative_deadline.cc \ + test/core/end2end/tests/no_error_on_hotpath.cc \ + test/core/end2end/tests/no_logging.cc \ + test/core/end2end/tests/no_op.cc \ + test/core/end2end/tests/payload.cc \ + test/core/end2end/tests/ping.cc \ + test/core/end2end/tests/ping_pong_streaming.cc \ + test/core/end2end/tests/proxy_auth.cc \ + test/core/end2end/tests/registered_call.cc \ + test/core/end2end/tests/request_with_flags.cc \ + test/core/end2end/tests/request_with_payload.cc \ + test/core/end2end/tests/resource_quota_server.cc \ + test/core/end2end/tests/retry.cc \ + test/core/end2end/tests/retry_cancellation.cc \ + test/core/end2end/tests/retry_disabled.cc \ + test/core/end2end/tests/retry_exceeds_buffer_size_in_initial_batch.cc \ + test/core/end2end/tests/retry_exceeds_buffer_size_in_subsequent_batch.cc \ + test/core/end2end/tests/retry_non_retriable_status.cc \ + test/core/end2end/tests/retry_non_retriable_status_before_recv_trailing_metadata_started.cc \ + test/core/end2end/tests/retry_recv_initial_metadata.cc \ + test/core/end2end/tests/retry_recv_message.cc \ + test/core/end2end/tests/retry_server_pushback_delay.cc \ + test/core/end2end/tests/retry_server_pushback_disabled.cc \ + test/core/end2end/tests/retry_streaming.cc \ + test/core/end2end/tests/retry_streaming_after_commit.cc \ + test/core/end2end/tests/retry_streaming_succeeds_before_replay_finished.cc \ + test/core/end2end/tests/retry_throttled.cc \ + test/core/end2end/tests/retry_too_many_attempts.cc \ + test/core/end2end/tests/server_finishes_request.cc \ + test/core/end2end/tests/shutdown_finishes_calls.cc \ + test/core/end2end/tests/shutdown_finishes_tags.cc \ + test/core/end2end/tests/simple_cacheable_request.cc \ + test/core/end2end/tests/simple_delayed_request.cc \ + test/core/end2end/tests/simple_metadata.cc \ + test/core/end2end/tests/simple_request.cc \ + test/core/end2end/tests/stream_compression_compressed_payload.cc \ + test/core/end2end/tests/stream_compression_payload.cc \ + test/core/end2end/tests/stream_compression_ping_pong_streaming.cc \ + test/core/end2end/tests/streaming_error_response.cc \ + test/core/end2end/tests/trailing_metadata.cc \ + test/core/end2end/tests/workaround_cronet_compression.cc \ + test/core/end2end/tests/write_buffering.cc \ + test/core/end2end/tests/write_buffering_at_end.cc \ + +PUBLIC_HEADERS_C += \ + +LIBEND2END_NOSEC_TESTS_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBEND2END_NOSEC_TESTS_SRC)))) + + +$(LIBDIR)/$(CONFIG)/libend2end_nosec_tests.a: $(ZLIB_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(LIBEND2END_NOSEC_TESTS_OBJS) + $(E) "[AR] Creating $@" + $(Q) mkdir -p `dirname $@` + $(Q) rm -f $(LIBDIR)/$(CONFIG)/libend2end_nosec_tests.a + $(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libend2end_nosec_tests.a $(LIBEND2END_NOSEC_TESTS_OBJS) +ifeq ($(SYSTEM),Darwin) + $(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libend2end_nosec_tests.a +endif + + + + +ifneq ($(NO_DEPS),true) +-include $(LIBEND2END_NOSEC_TESTS_OBJS:.o=.dep) +endif + + +LIBEND2END_TESTS_SRC = \ + test/core/end2end/cq_verifier.cc \ + test/core/end2end/data/client_certs.cc \ + test/core/end2end/data/server1_cert.cc \ + test/core/end2end/data/server1_key.cc \ + test/core/end2end/data/test_root_cert.cc \ + test/core/end2end/end2end_test_utils.cc \ + test/core/end2end/end2end_tests.cc \ + test/core/end2end/fixtures/http_proxy_fixture.cc \ + test/core/end2end/fixtures/local_util.cc \ + test/core/end2end/fixtures/proxy.cc \ + test/core/end2end/tests/authority_not_supported.cc \ + test/core/end2end/tests/bad_hostname.cc \ + test/core/end2end/tests/bad_ping.cc \ + test/core/end2end/tests/binary_metadata.cc \ + test/core/end2end/tests/call_creds.cc \ + test/core/end2end/tests/call_host_override.cc \ + test/core/end2end/tests/cancel_after_accept.cc \ + test/core/end2end/tests/cancel_after_client_done.cc \ + test/core/end2end/tests/cancel_after_invoke.cc \ + test/core/end2end/tests/cancel_after_round_trip.cc \ + test/core/end2end/tests/cancel_before_invoke.cc \ + test/core/end2end/tests/cancel_in_a_vacuum.cc \ + test/core/end2end/tests/cancel_with_status.cc \ + test/core/end2end/tests/channelz.cc \ + test/core/end2end/tests/client_streaming.cc \ + test/core/end2end/tests/compressed_payload.cc \ + test/core/end2end/tests/connectivity.cc \ + test/core/end2end/tests/default_host.cc \ + test/core/end2end/tests/disappearing_server.cc \ + test/core/end2end/tests/empty_batch.cc \ + test/core/end2end/tests/filter_call_init_fails.cc \ + test/core/end2end/tests/filter_causes_close.cc \ + test/core/end2end/tests/filter_context.cc \ + test/core/end2end/tests/filter_latency.cc \ + test/core/end2end/tests/filter_status_code.cc \ + test/core/end2end/tests/graceful_server_shutdown.cc \ + test/core/end2end/tests/high_initial_seqno.cc \ + test/core/end2end/tests/hpack_size.cc \ + test/core/end2end/tests/idempotent_request.cc \ + test/core/end2end/tests/invoke_large_request.cc \ + test/core/end2end/tests/keepalive_timeout.cc \ + test/core/end2end/tests/large_metadata.cc \ + test/core/end2end/tests/max_concurrent_streams.cc \ + test/core/end2end/tests/max_connection_age.cc \ + test/core/end2end/tests/max_connection_idle.cc \ + test/core/end2end/tests/max_message_length.cc \ + test/core/end2end/tests/negative_deadline.cc \ + test/core/end2end/tests/no_error_on_hotpath.cc \ + test/core/end2end/tests/no_logging.cc \ + test/core/end2end/tests/no_op.cc \ + test/core/end2end/tests/payload.cc \ + test/core/end2end/tests/ping.cc \ + test/core/end2end/tests/ping_pong_streaming.cc \ + test/core/end2end/tests/proxy_auth.cc \ + test/core/end2end/tests/registered_call.cc \ + test/core/end2end/tests/request_with_flags.cc \ + test/core/end2end/tests/request_with_payload.cc \ + test/core/end2end/tests/resource_quota_server.cc \ + test/core/end2end/tests/retry.cc \ + test/core/end2end/tests/retry_cancellation.cc \ + test/core/end2end/tests/retry_disabled.cc \ + test/core/end2end/tests/retry_exceeds_buffer_size_in_initial_batch.cc \ + test/core/end2end/tests/retry_exceeds_buffer_size_in_subsequent_batch.cc \ + test/core/end2end/tests/retry_non_retriable_status.cc \ + test/core/end2end/tests/retry_non_retriable_status_before_recv_trailing_metadata_started.cc \ + test/core/end2end/tests/retry_recv_initial_metadata.cc \ + test/core/end2end/tests/retry_recv_message.cc \ + test/core/end2end/tests/retry_server_pushback_delay.cc \ + test/core/end2end/tests/retry_server_pushback_disabled.cc \ + test/core/end2end/tests/retry_streaming.cc \ + test/core/end2end/tests/retry_streaming_after_commit.cc \ + test/core/end2end/tests/retry_streaming_succeeds_before_replay_finished.cc \ + test/core/end2end/tests/retry_throttled.cc \ + test/core/end2end/tests/retry_too_many_attempts.cc \ + test/core/end2end/tests/server_finishes_request.cc \ + test/core/end2end/tests/shutdown_finishes_calls.cc \ + test/core/end2end/tests/shutdown_finishes_tags.cc \ + test/core/end2end/tests/simple_cacheable_request.cc \ + test/core/end2end/tests/simple_delayed_request.cc \ + test/core/end2end/tests/simple_metadata.cc \ + test/core/end2end/tests/simple_request.cc \ + test/core/end2end/tests/stream_compression_compressed_payload.cc \ + test/core/end2end/tests/stream_compression_payload.cc \ + test/core/end2end/tests/stream_compression_ping_pong_streaming.cc \ + test/core/end2end/tests/streaming_error_response.cc \ + test/core/end2end/tests/trailing_metadata.cc \ + test/core/end2end/tests/workaround_cronet_compression.cc \ + test/core/end2end/tests/write_buffering.cc \ + test/core/end2end/tests/write_buffering_at_end.cc \ + +PUBLIC_HEADERS_C += \ + +LIBEND2END_TESTS_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBEND2END_TESTS_SRC)))) + + +ifeq ($(NO_SECURE),true) + +# You can't build secure libraries if you don't have OpenSSL. + +$(LIBDIR)/$(CONFIG)/libend2end_tests.a: openssl_dep_error + + +else + + +$(LIBDIR)/$(CONFIG)/libend2end_tests.a: $(ZLIB_DEP) $(OPENSSL_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(LIBEND2END_TESTS_OBJS) + $(E) "[AR] Creating $@" + $(Q) mkdir -p `dirname $@` + $(Q) rm -f $(LIBDIR)/$(CONFIG)/libend2end_tests.a + $(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libend2end_tests.a $(LIBEND2END_TESTS_OBJS) +ifeq ($(SYSTEM),Darwin) + $(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libend2end_tests.a +endif + + + + +endif + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(LIBEND2END_TESTS_OBJS:.o=.dep) +endif +endif + + +LIBGPR_SRC = \ + src/core/lib/gpr/alloc.cc \ + src/core/lib/gpr/atm.cc \ + src/core/lib/gpr/cpu_iphone.cc \ + src/core/lib/gpr/cpu_linux.cc \ + src/core/lib/gpr/cpu_posix.cc \ + src/core/lib/gpr/cpu_windows.cc \ + src/core/lib/gpr/env_linux.cc \ + src/core/lib/gpr/env_posix.cc \ + src/core/lib/gpr/env_windows.cc \ + src/core/lib/gpr/log.cc \ + src/core/lib/gpr/log_android.cc \ + src/core/lib/gpr/log_linux.cc \ + src/core/lib/gpr/log_posix.cc \ + src/core/lib/gpr/log_windows.cc \ + src/core/lib/gpr/murmur_hash.cc \ + src/core/lib/gpr/string.cc \ + src/core/lib/gpr/string_posix.cc \ + src/core/lib/gpr/string_util_windows.cc \ + src/core/lib/gpr/string_windows.cc \ + src/core/lib/gpr/sync.cc \ + src/core/lib/gpr/sync_abseil.cc \ + src/core/lib/gpr/sync_posix.cc \ + src/core/lib/gpr/sync_windows.cc \ + src/core/lib/gpr/time.cc \ + src/core/lib/gpr/time_posix.cc \ + src/core/lib/gpr/time_precise.cc \ + src/core/lib/gpr/time_windows.cc \ + src/core/lib/gpr/tls_pthread.cc \ + src/core/lib/gpr/tmpfile_msys.cc \ + src/core/lib/gpr/tmpfile_posix.cc \ + src/core/lib/gpr/tmpfile_windows.cc \ + src/core/lib/gpr/wrap_memcpy.cc \ + src/core/lib/gprpp/arena.cc \ + src/core/lib/gprpp/fork.cc \ + src/core/lib/gprpp/global_config_env.cc \ + src/core/lib/gprpp/host_port.cc \ + src/core/lib/gprpp/mpscq.cc \ + src/core/lib/gprpp/thd_posix.cc \ + src/core/lib/gprpp/thd_windows.cc \ + src/core/lib/profiling/basic_timers.cc \ + src/core/lib/profiling/stap_timers.cc \ + +PUBLIC_HEADERS_C += \ + include/grpc/impl/codegen/atm.h \ + include/grpc/impl/codegen/atm_gcc_atomic.h \ + include/grpc/impl/codegen/atm_gcc_sync.h \ + include/grpc/impl/codegen/atm_windows.h \ + include/grpc/impl/codegen/byte_buffer.h \ + include/grpc/impl/codegen/byte_buffer_reader.h \ + include/grpc/impl/codegen/compression_types.h \ + include/grpc/impl/codegen/connectivity_state.h \ + include/grpc/impl/codegen/fork.h \ + include/grpc/impl/codegen/gpr_slice.h \ + include/grpc/impl/codegen/gpr_types.h \ + include/grpc/impl/codegen/grpc_types.h \ + include/grpc/impl/codegen/log.h \ + include/grpc/impl/codegen/port_platform.h \ + include/grpc/impl/codegen/propagation_bits.h \ + include/grpc/impl/codegen/slice.h \ + include/grpc/impl/codegen/status.h \ + include/grpc/impl/codegen/sync.h \ + include/grpc/impl/codegen/sync_abseil.h \ + include/grpc/impl/codegen/sync_custom.h \ + include/grpc/impl/codegen/sync_generic.h \ + include/grpc/impl/codegen/sync_posix.h \ + include/grpc/impl/codegen/sync_windows.h \ + include/grpc/support/alloc.h \ + include/grpc/support/atm.h \ + include/grpc/support/atm_gcc_atomic.h \ + include/grpc/support/atm_gcc_sync.h \ + include/grpc/support/atm_windows.h \ + include/grpc/support/cpu.h \ + include/grpc/support/log.h \ + include/grpc/support/log_windows.h \ + include/grpc/support/port_platform.h \ + include/grpc/support/string_util.h \ + include/grpc/support/sync.h \ + include/grpc/support/sync_abseil.h \ + include/grpc/support/sync_custom.h \ + include/grpc/support/sync_generic.h \ + include/grpc/support/sync_posix.h \ + include/grpc/support/sync_windows.h \ + include/grpc/support/thd_id.h \ + include/grpc/support/time.h \ + +LIBGPR_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBGPR_SRC)))) + + +$(LIBDIR)/$(CONFIG)/libgpr.a: $(ZLIB_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(LIBGPR_OBJS) + $(E) "[AR] Creating $@" + $(Q) mkdir -p `dirname $@` + $(Q) rm -f $(LIBDIR)/$(CONFIG)/libgpr.a + $(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBGPR_OBJS) +ifeq ($(SYSTEM),Darwin) + $(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libgpr.a +endif + + + +ifeq ($(SYSTEM),MINGW32) +$(LIBDIR)/$(CONFIG)/gpr$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE): $(LIBGPR_OBJS) $(ZLIB_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,--output-def=$(LIBDIR)/$(CONFIG)/gpr$(SHARED_VERSION_CORE).def -Wl,--out-implib=$(LIBDIR)/$(CONFIG)/libgpr$(SHARED_VERSION_CORE)-dll.a -o $(LIBDIR)/$(CONFIG)/gpr$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBGPR_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS) +else +$(LIBDIR)/$(CONFIG)/libgpr$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE): $(LIBGPR_OBJS) $(ZLIB_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` +ifeq ($(SYSTEM),Darwin) + $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -install_name $(SHARED_PREFIX)gpr$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) -dynamiclib -o $(LIBDIR)/$(CONFIG)/libgpr$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBGPR_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS) +else + $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,libgpr.so.10 -o $(LIBDIR)/$(CONFIG)/libgpr$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBGPR_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS) + $(Q) ln -sf $(SHARED_PREFIX)gpr$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libgpr$(SHARED_VERSION_CORE).so.10 + $(Q) ln -sf $(SHARED_PREFIX)gpr$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libgpr$(SHARED_VERSION_CORE).so +endif +endif + +ifneq ($(NO_DEPS),true) +-include $(LIBGPR_OBJS:.o=.dep) +endif + + +LIBGRPC_SRC = \ + src/core/ext/filters/census/grpc_context.cc \ + src/core/ext/filters/client_channel/backend_metric.cc \ + src/core/ext/filters/client_channel/backup_poller.cc \ + src/core/ext/filters/client_channel/channel_connectivity.cc \ + src/core/ext/filters/client_channel/client_channel.cc \ + src/core/ext/filters/client_channel/client_channel_channelz.cc \ + src/core/ext/filters/client_channel/client_channel_factory.cc \ + src/core/ext/filters/client_channel/client_channel_plugin.cc \ + src/core/ext/filters/client_channel/global_subchannel_pool.cc \ + src/core/ext/filters/client_channel/health/health_check_client.cc \ + src/core/ext/filters/client_channel/http_connect_handshaker.cc \ + src/core/ext/filters/client_channel/http_proxy.cc \ + src/core/ext/filters/client_channel/lb_policy.cc \ + src/core/ext/filters/client_channel/lb_policy/address_filtering.cc \ + src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc \ + src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc \ + src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc \ + src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc \ + src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc \ + src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc \ + src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc \ + src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc \ + src/core/ext/filters/client_channel/lb_policy/priority/priority.cc \ + src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc \ + src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc \ + src/core/ext/filters/client_channel/lb_policy/xds/cds.cc \ + src/core/ext/filters/client_channel/lb_policy/xds/eds.cc \ + src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc \ + src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc \ + src/core/ext/filters/client_channel/lb_policy_registry.cc \ + src/core/ext/filters/client_channel/local_subchannel_pool.cc \ + src/core/ext/filters/client_channel/parse_address.cc \ + src/core/ext/filters/client_channel/proxy_mapper_registry.cc \ + src/core/ext/filters/client_channel/resolver.cc \ + src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc \ + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc \ + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc \ + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc \ + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc \ + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc \ + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc \ + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc \ + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc \ + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc \ + src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc \ + src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc \ + src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc \ + src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc \ + src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc \ + src/core/ext/filters/client_channel/resolver_registry.cc \ + src/core/ext/filters/client_channel/resolver_result_parsing.cc \ + src/core/ext/filters/client_channel/resolving_lb_policy.cc \ + src/core/ext/filters/client_channel/retry_throttle.cc \ + src/core/ext/filters/client_channel/server_address.cc \ + src/core/ext/filters/client_channel/service_config.cc \ + src/core/ext/filters/client_channel/service_config_parser.cc \ + src/core/ext/filters/client_channel/subchannel.cc \ + src/core/ext/filters/client_channel/subchannel_pool_interface.cc \ + src/core/ext/filters/client_channel/xds/xds_api.cc \ + src/core/ext/filters/client_channel/xds/xds_bootstrap.cc \ + src/core/ext/filters/client_channel/xds/xds_channel_secure.cc \ + src/core/ext/filters/client_channel/xds/xds_client.cc \ + src/core/ext/filters/client_channel/xds/xds_client_stats.cc \ + src/core/ext/filters/client_idle/client_idle_filter.cc \ + src/core/ext/filters/deadline/deadline_filter.cc \ + src/core/ext/filters/http/client/http_client_filter.cc \ + src/core/ext/filters/http/client_authority_filter.cc \ + src/core/ext/filters/http/http_filters_plugin.cc \ + src/core/ext/filters/http/message_compress/message_compress_filter.cc \ + src/core/ext/filters/http/message_compress/message_decompress_filter.cc \ + src/core/ext/filters/http/server/http_server_filter.cc \ + src/core/ext/filters/max_age/max_age_filter.cc \ + src/core/ext/filters/message_size/message_size_filter.cc \ + src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc \ + src/core/ext/filters/workarounds/workaround_utils.cc \ + src/core/ext/transport/chttp2/alpn/alpn.cc \ + src/core/ext/transport/chttp2/client/authority.cc \ + src/core/ext/transport/chttp2/client/chttp2_connector.cc \ + src/core/ext/transport/chttp2/client/insecure/channel_create.cc \ + src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc \ + src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc \ + src/core/ext/transport/chttp2/server/chttp2_server.cc \ + src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc \ + src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc \ + src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc \ + src/core/ext/transport/chttp2/transport/bin_decoder.cc \ + src/core/ext/transport/chttp2/transport/bin_encoder.cc \ + src/core/ext/transport/chttp2/transport/chttp2_plugin.cc \ + src/core/ext/transport/chttp2/transport/chttp2_transport.cc \ + src/core/ext/transport/chttp2/transport/context_list.cc \ + src/core/ext/transport/chttp2/transport/flow_control.cc \ + src/core/ext/transport/chttp2/transport/frame_data.cc \ + src/core/ext/transport/chttp2/transport/frame_goaway.cc \ + src/core/ext/transport/chttp2/transport/frame_ping.cc \ + src/core/ext/transport/chttp2/transport/frame_rst_stream.cc \ + src/core/ext/transport/chttp2/transport/frame_settings.cc \ + src/core/ext/transport/chttp2/transport/frame_window_update.cc \ + src/core/ext/transport/chttp2/transport/hpack_encoder.cc \ + src/core/ext/transport/chttp2/transport/hpack_parser.cc \ + src/core/ext/transport/chttp2/transport/hpack_table.cc \ + src/core/ext/transport/chttp2/transport/http2_settings.cc \ + src/core/ext/transport/chttp2/transport/huffsyms.cc \ + src/core/ext/transport/chttp2/transport/incoming_metadata.cc \ + src/core/ext/transport/chttp2/transport/parsing.cc \ + src/core/ext/transport/chttp2/transport/stream_lists.cc \ + src/core/ext/transport/chttp2/transport/stream_map.cc \ + src/core/ext/transport/chttp2/transport/varint.cc \ + src/core/ext/transport/chttp2/transport/writing.cc \ + src/core/ext/transport/inproc/inproc_plugin.cc \ + src/core/ext/transport/inproc/inproc_transport.cc \ + src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c \ + src/core/ext/upb-generated/envoy/annotations/resource.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/cds.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/eds.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/lds.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/listener.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/rds.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/route.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/srds.upb.c \ + src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c \ + src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c \ + src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c \ + src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c \ + src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c \ + src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c \ + src/core/ext/upb-generated/envoy/type/http.upb.c \ + src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c \ + src/core/ext/upb-generated/envoy/type/matcher/string.upb.c \ + src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c \ + src/core/ext/upb-generated/envoy/type/percent.upb.c \ + src/core/ext/upb-generated/envoy/type/range.upb.c \ + src/core/ext/upb-generated/envoy/type/semantic_version.upb.c \ + src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c \ + src/core/ext/upb-generated/gogoproto/gogo.upb.c \ + src/core/ext/upb-generated/google/api/annotations.upb.c \ + src/core/ext/upb-generated/google/api/http.upb.c \ + src/core/ext/upb-generated/google/protobuf/any.upb.c \ + src/core/ext/upb-generated/google/protobuf/descriptor.upb.c \ + src/core/ext/upb-generated/google/protobuf/duration.upb.c \ + src/core/ext/upb-generated/google/protobuf/empty.upb.c \ + src/core/ext/upb-generated/google/protobuf/struct.upb.c \ + src/core/ext/upb-generated/google/protobuf/timestamp.upb.c \ + src/core/ext/upb-generated/google/protobuf/wrappers.upb.c \ + src/core/ext/upb-generated/google/rpc/status.upb.c \ + src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c \ + src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c \ + src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c \ + src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c \ + src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c \ + src/core/ext/upb-generated/udpa/annotations/migrate.upb.c \ + src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c \ + src/core/ext/upb-generated/udpa/annotations/status.upb.c \ + src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c \ + src/core/ext/upb-generated/validate/validate.upb.c \ + src/core/lib/avl/avl.cc \ + src/core/lib/backoff/backoff.cc \ + src/core/lib/channel/channel_args.cc \ + src/core/lib/channel/channel_stack.cc \ + src/core/lib/channel/channel_stack_builder.cc \ + src/core/lib/channel/channel_trace.cc \ + src/core/lib/channel/channelz.cc \ + src/core/lib/channel/channelz_registry.cc \ + src/core/lib/channel/connected_channel.cc \ + src/core/lib/channel/handshaker.cc \ + src/core/lib/channel/handshaker_registry.cc \ + src/core/lib/channel/status_util.cc \ + src/core/lib/compression/compression.cc \ + src/core/lib/compression/compression_args.cc \ + src/core/lib/compression/compression_internal.cc \ + src/core/lib/compression/message_compress.cc \ + src/core/lib/compression/stream_compression.cc \ + src/core/lib/compression/stream_compression_gzip.cc \ + src/core/lib/compression/stream_compression_identity.cc \ + src/core/lib/debug/stats.cc \ + src/core/lib/debug/stats_data.cc \ + src/core/lib/debug/trace.cc \ + src/core/lib/http/format_request.cc \ + src/core/lib/http/httpcli.cc \ + src/core/lib/http/httpcli_security_connector.cc \ + src/core/lib/http/parser.cc \ + src/core/lib/iomgr/buffer_list.cc \ + src/core/lib/iomgr/call_combiner.cc \ + src/core/lib/iomgr/cfstream_handle.cc \ + src/core/lib/iomgr/combiner.cc \ + src/core/lib/iomgr/dualstack_socket_posix.cc \ + src/core/lib/iomgr/endpoint.cc \ + src/core/lib/iomgr/endpoint_cfstream.cc \ + src/core/lib/iomgr/endpoint_pair_posix.cc \ + src/core/lib/iomgr/endpoint_pair_uv.cc \ + src/core/lib/iomgr/endpoint_pair_windows.cc \ + src/core/lib/iomgr/error.cc \ + src/core/lib/iomgr/error_cfstream.cc \ + src/core/lib/iomgr/ev_apple.cc \ + src/core/lib/iomgr/ev_epoll1_linux.cc \ + src/core/lib/iomgr/ev_epollex_linux.cc \ + src/core/lib/iomgr/ev_poll_posix.cc \ + src/core/lib/iomgr/ev_posix.cc \ + src/core/lib/iomgr/ev_windows.cc \ + src/core/lib/iomgr/exec_ctx.cc \ + src/core/lib/iomgr/executor.cc \ + src/core/lib/iomgr/executor/mpmcqueue.cc \ + src/core/lib/iomgr/executor/threadpool.cc \ + src/core/lib/iomgr/fork_posix.cc \ + src/core/lib/iomgr/fork_windows.cc \ + src/core/lib/iomgr/gethostname_fallback.cc \ + src/core/lib/iomgr/gethostname_host_name_max.cc \ + src/core/lib/iomgr/gethostname_sysconf.cc \ + src/core/lib/iomgr/grpc_if_nametoindex_posix.cc \ + src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc \ + src/core/lib/iomgr/internal_errqueue.cc \ + src/core/lib/iomgr/iocp_windows.cc \ + src/core/lib/iomgr/iomgr.cc \ + src/core/lib/iomgr/iomgr_custom.cc \ + src/core/lib/iomgr/iomgr_internal.cc \ + src/core/lib/iomgr/iomgr_posix.cc \ + src/core/lib/iomgr/iomgr_posix_cfstream.cc \ + src/core/lib/iomgr/iomgr_uv.cc \ + src/core/lib/iomgr/iomgr_windows.cc \ + src/core/lib/iomgr/is_epollexclusive_available.cc \ + src/core/lib/iomgr/load_file.cc \ + src/core/lib/iomgr/lockfree_event.cc \ + src/core/lib/iomgr/poller/eventmanager_libuv.cc \ + src/core/lib/iomgr/polling_entity.cc \ + src/core/lib/iomgr/pollset.cc \ + src/core/lib/iomgr/pollset_custom.cc \ + src/core/lib/iomgr/pollset_set.cc \ + src/core/lib/iomgr/pollset_set_custom.cc \ + src/core/lib/iomgr/pollset_set_windows.cc \ + src/core/lib/iomgr/pollset_uv.cc \ + src/core/lib/iomgr/pollset_windows.cc \ + src/core/lib/iomgr/resolve_address.cc \ + src/core/lib/iomgr/resolve_address_custom.cc \ + src/core/lib/iomgr/resolve_address_posix.cc \ + src/core/lib/iomgr/resolve_address_windows.cc \ + src/core/lib/iomgr/resource_quota.cc \ + src/core/lib/iomgr/sockaddr_utils.cc \ + src/core/lib/iomgr/socket_factory_posix.cc \ + src/core/lib/iomgr/socket_mutator.cc \ + src/core/lib/iomgr/socket_utils_common_posix.cc \ + src/core/lib/iomgr/socket_utils_linux.cc \ + src/core/lib/iomgr/socket_utils_posix.cc \ + src/core/lib/iomgr/socket_utils_uv.cc \ + src/core/lib/iomgr/socket_utils_windows.cc \ + src/core/lib/iomgr/socket_windows.cc \ + src/core/lib/iomgr/tcp_client.cc \ + src/core/lib/iomgr/tcp_client_cfstream.cc \ + src/core/lib/iomgr/tcp_client_custom.cc \ + src/core/lib/iomgr/tcp_client_posix.cc \ + src/core/lib/iomgr/tcp_client_windows.cc \ + src/core/lib/iomgr/tcp_custom.cc \ + src/core/lib/iomgr/tcp_posix.cc \ + src/core/lib/iomgr/tcp_server.cc \ + src/core/lib/iomgr/tcp_server_custom.cc \ + src/core/lib/iomgr/tcp_server_posix.cc \ + src/core/lib/iomgr/tcp_server_utils_posix_common.cc \ + src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc \ + src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc \ + src/core/lib/iomgr/tcp_server_windows.cc \ + src/core/lib/iomgr/tcp_uv.cc \ + src/core/lib/iomgr/tcp_windows.cc \ + src/core/lib/iomgr/time_averaged_stats.cc \ + src/core/lib/iomgr/timer.cc \ + src/core/lib/iomgr/timer_custom.cc \ + src/core/lib/iomgr/timer_generic.cc \ + src/core/lib/iomgr/timer_heap.cc \ + src/core/lib/iomgr/timer_manager.cc \ + src/core/lib/iomgr/timer_uv.cc \ + src/core/lib/iomgr/udp_server.cc \ + src/core/lib/iomgr/unix_sockets_posix.cc \ + src/core/lib/iomgr/unix_sockets_posix_noop.cc \ + src/core/lib/iomgr/wakeup_fd_eventfd.cc \ + src/core/lib/iomgr/wakeup_fd_nospecial.cc \ + src/core/lib/iomgr/wakeup_fd_pipe.cc \ + src/core/lib/iomgr/wakeup_fd_posix.cc \ + src/core/lib/iomgr/work_serializer.cc \ + src/core/lib/json/json_reader.cc \ + src/core/lib/json/json_writer.cc \ + src/core/lib/security/context/security_context.cc \ + src/core/lib/security/credentials/alts/alts_credentials.cc \ + src/core/lib/security/credentials/alts/check_gcp_environment.cc \ + src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc \ + src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc \ + src/core/lib/security/credentials/alts/check_gcp_environment_windows.cc \ + src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc \ + src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc \ + src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc \ + src/core/lib/security/credentials/composite/composite_credentials.cc \ + src/core/lib/security/credentials/credentials.cc \ + src/core/lib/security/credentials/credentials_metadata.cc \ + src/core/lib/security/credentials/fake/fake_credentials.cc \ + src/core/lib/security/credentials/google_default/credentials_generic.cc \ + src/core/lib/security/credentials/google_default/google_default_credentials.cc \ + src/core/lib/security/credentials/iam/iam_credentials.cc \ + src/core/lib/security/credentials/jwt/json_token.cc \ + src/core/lib/security/credentials/jwt/jwt_credentials.cc \ + src/core/lib/security/credentials/jwt/jwt_verifier.cc \ + src/core/lib/security/credentials/local/local_credentials.cc \ + src/core/lib/security/credentials/oauth2/oauth2_credentials.cc \ + src/core/lib/security/credentials/plugin/plugin_credentials.cc \ + src/core/lib/security/credentials/ssl/ssl_credentials.cc \ + src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc \ + src/core/lib/security/credentials/tls/tls_credentials.cc \ + src/core/lib/security/security_connector/alts/alts_security_connector.cc \ + src/core/lib/security/security_connector/fake/fake_security_connector.cc \ + src/core/lib/security/security_connector/load_system_roots_fallback.cc \ + src/core/lib/security/security_connector/load_system_roots_linux.cc \ + src/core/lib/security/security_connector/local/local_security_connector.cc \ + src/core/lib/security/security_connector/security_connector.cc \ + src/core/lib/security/security_connector/ssl/ssl_security_connector.cc \ + src/core/lib/security/security_connector/ssl_utils.cc \ + src/core/lib/security/security_connector/ssl_utils_config.cc \ + src/core/lib/security/security_connector/tls/tls_security_connector.cc \ + src/core/lib/security/transport/client_auth_filter.cc \ + src/core/lib/security/transport/secure_endpoint.cc \ + src/core/lib/security/transport/security_handshaker.cc \ + src/core/lib/security/transport/server_auth_filter.cc \ + src/core/lib/security/transport/target_authority_table.cc \ + src/core/lib/security/transport/tsi_error.cc \ + src/core/lib/security/util/json_util.cc \ + src/core/lib/slice/b64.cc \ + src/core/lib/slice/percent_encoding.cc \ + src/core/lib/slice/slice.cc \ + src/core/lib/slice/slice_buffer.cc \ + src/core/lib/slice/slice_intern.cc \ + src/core/lib/slice/slice_string_helpers.cc \ + src/core/lib/surface/api_trace.cc \ + src/core/lib/surface/byte_buffer.cc \ + src/core/lib/surface/byte_buffer_reader.cc \ + src/core/lib/surface/call.cc \ + src/core/lib/surface/call_details.cc \ + src/core/lib/surface/call_log_batch.cc \ + src/core/lib/surface/channel.cc \ + src/core/lib/surface/channel_init.cc \ + src/core/lib/surface/channel_ping.cc \ + src/core/lib/surface/channel_stack_type.cc \ + src/core/lib/surface/completion_queue.cc \ + src/core/lib/surface/completion_queue_factory.cc \ + src/core/lib/surface/event_string.cc \ + src/core/lib/surface/init.cc \ + src/core/lib/surface/init_secure.cc \ + src/core/lib/surface/lame_client.cc \ + src/core/lib/surface/metadata_array.cc \ + src/core/lib/surface/server.cc \ + src/core/lib/surface/validate_metadata.cc \ + src/core/lib/surface/version.cc \ + src/core/lib/transport/bdp_estimator.cc \ + src/core/lib/transport/byte_stream.cc \ + src/core/lib/transport/connectivity_state.cc \ + src/core/lib/transport/error_utils.cc \ + src/core/lib/transport/metadata.cc \ + src/core/lib/transport/metadata_batch.cc \ + src/core/lib/transport/pid_controller.cc \ + src/core/lib/transport/static_metadata.cc \ + src/core/lib/transport/status_conversion.cc \ + src/core/lib/transport/status_metadata.cc \ + src/core/lib/transport/timeout_encoding.cc \ + src/core/lib/transport/transport.cc \ + src/core/lib/transport/transport_op_string.cc \ + src/core/lib/uri/uri_parser.cc \ + src/core/plugin_registry/grpc_plugin_registry.cc \ + src/core/tsi/alts/crypt/aes_gcm.cc \ + src/core/tsi/alts/crypt/gsec.cc \ + src/core/tsi/alts/frame_protector/alts_counter.cc \ + src/core/tsi/alts/frame_protector/alts_crypter.cc \ + src/core/tsi/alts/frame_protector/alts_frame_protector.cc \ + src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.cc \ + src/core/tsi/alts/frame_protector/alts_seal_privacy_integrity_crypter.cc \ + src/core/tsi/alts/frame_protector/alts_unseal_privacy_integrity_crypter.cc \ + src/core/tsi/alts/frame_protector/frame_handler.cc \ + src/core/tsi/alts/handshaker/alts_handshaker_client.cc \ + src/core/tsi/alts/handshaker/alts_shared_resource.cc \ + src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc \ + src/core/tsi/alts/handshaker/alts_tsi_utils.cc \ + src/core/tsi/alts/handshaker/transport_security_common_api.cc \ + src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc \ + src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc \ + src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc \ + src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc \ + src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc \ + src/core/tsi/fake_transport_security.cc \ + src/core/tsi/local_transport_security.cc \ + src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc \ + src/core/tsi/ssl/session_cache/ssl_session_cache.cc \ + src/core/tsi/ssl/session_cache/ssl_session_openssl.cc \ + src/core/tsi/ssl_transport_security.cc \ + src/core/tsi/transport_security.cc \ + src/core/tsi/transport_security_grpc.cc \ + +PUBLIC_HEADERS_C += \ + include/grpc/byte_buffer.h \ + include/grpc/byte_buffer_reader.h \ + include/grpc/census.h \ + include/grpc/compression.h \ + include/grpc/fork.h \ + include/grpc/grpc.h \ + include/grpc/grpc_posix.h \ + include/grpc/grpc_security.h \ + include/grpc/grpc_security_constants.h \ + include/grpc/load_reporting.h \ + include/grpc/slice.h \ + include/grpc/slice_buffer.h \ + include/grpc/status.h \ + include/grpc/support/workaround_list.h \ + +LIBGRPC_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBGRPC_SRC)))) + + +ifeq ($(NO_SECURE),true) + +# You can't build secure libraries if you don't have OpenSSL. + +$(LIBDIR)/$(CONFIG)/libgrpc.a: openssl_dep_error + +$(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)grpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE): openssl_dep_error + +else + + +$(LIBDIR)/$(CONFIG)/libgrpc.a: $(ZLIB_DEP) $(OPENSSL_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(LIBGRPC_OBJS) $(LIBGPR_OBJS) $(LIBGRPC_ABSEIL_OBJS) $(ZLIB_MERGE_OBJS) $(CARES_MERGE_OBJS) $(ADDRESS_SORTING_MERGE_OBJS) $(UPB_MERGE_OBJS) $(OPENSSL_MERGE_OBJS) + $(E) "[AR] Creating $@" + $(Q) mkdir -p `dirname $@` + $(Q) rm -f $(LIBDIR)/$(CONFIG)/libgrpc.a + $(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBGRPC_OBJS) $(LIBGPR_OBJS) $(LIBGRPC_ABSEIL_OBJS) $(ZLIB_MERGE_OBJS) $(CARES_MERGE_OBJS) $(ADDRESS_SORTING_MERGE_OBJS) $(UPB_MERGE_OBJS) $(OPENSSL_MERGE_OBJS) +ifeq ($(SYSTEM),Darwin) + $(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libgrpc.a +endif + + + +ifeq ($(SYSTEM),MINGW32) +$(LIBDIR)/$(CONFIG)/grpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE): $(LIBGRPC_OBJS) $(ZLIB_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(OPENSSL_DEP) + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,--output-def=$(LIBDIR)/$(CONFIG)/grpc$(SHARED_VERSION_CORE).def -Wl,--out-implib=$(LIBDIR)/$(CONFIG)/libgrpc$(SHARED_VERSION_CORE)-dll.a -o $(LIBDIR)/$(CONFIG)/grpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBGRPC_OBJS) $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(OPENSSL_MERGE_LIBS) $(LDLIBS_SECURE) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS) +else +$(LIBDIR)/$(CONFIG)/libgrpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE): $(LIBGRPC_OBJS) $(ZLIB_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(OPENSSL_DEP) + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` +ifeq ($(SYSTEM),Darwin) + $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -install_name $(SHARED_PREFIX)grpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) -dynamiclib -o $(LIBDIR)/$(CONFIG)/libgrpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBGRPC_OBJS) $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(OPENSSL_MERGE_LIBS) $(LDLIBS_SECURE) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS) +else + $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,libgrpc.so.10 -o $(LIBDIR)/$(CONFIG)/libgrpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBGRPC_OBJS) $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(OPENSSL_MERGE_LIBS) $(LDLIBS_SECURE) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS) + $(Q) ln -sf $(SHARED_PREFIX)grpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libgrpc$(SHARED_VERSION_CORE).so.10 + $(Q) ln -sf $(SHARED_PREFIX)grpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libgrpc$(SHARED_VERSION_CORE).so +endif +endif + +endif + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(LIBGRPC_OBJS:.o=.dep) +endif +endif + + +LIBGRPC_CSHARP_EXT_SRC = \ + src/csharp/ext/grpc_csharp_ext.c \ + +PUBLIC_HEADERS_C += \ + +LIBGRPC_CSHARP_EXT_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBGRPC_CSHARP_EXT_SRC)))) + + +ifeq ($(NO_SECURE),true) + +# You can't build secure libraries if you don't have OpenSSL. + +$(LIBDIR)/$(CONFIG)/libgrpc_csharp_ext.a: openssl_dep_error + +$(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)grpc_csharp_ext$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE): openssl_dep_error + +else + + +$(LIBDIR)/$(CONFIG)/libgrpc_csharp_ext.a: $(ZLIB_DEP) $(OPENSSL_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(LIBGRPC_CSHARP_EXT_OBJS) + $(E) "[AR] Creating $@" + $(Q) mkdir -p `dirname $@` + $(Q) rm -f $(LIBDIR)/$(CONFIG)/libgrpc_csharp_ext.a + $(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libgrpc_csharp_ext.a $(LIBGRPC_CSHARP_EXT_OBJS) +ifeq ($(SYSTEM),Darwin) + $(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libgrpc_csharp_ext.a +endif + + + +ifeq ($(SYSTEM),MINGW32) +$(LIBDIR)/$(CONFIG)/grpc_csharp_ext$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE): $(LIBGRPC_CSHARP_EXT_OBJS) $(ZLIB_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(OPENSSL_DEP) + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,--output-def=$(LIBDIR)/$(CONFIG)/grpc_csharp_ext$(SHARED_VERSION_CORE).def -Wl,--out-implib=$(LIBDIR)/$(CONFIG)/libgrpc_csharp_ext$(SHARED_VERSION_CORE)-dll.a -o $(LIBDIR)/$(CONFIG)/grpc_csharp_ext$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBGRPC_CSHARP_EXT_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS) +else +$(LIBDIR)/$(CONFIG)/libgrpc_csharp_ext$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE): $(LIBGRPC_CSHARP_EXT_OBJS) $(ZLIB_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(OPENSSL_DEP) + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` +ifeq ($(SYSTEM),Darwin) + $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -install_name $(SHARED_PREFIX)grpc_csharp_ext$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) -dynamiclib -o $(LIBDIR)/$(CONFIG)/libgrpc_csharp_ext$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBGRPC_CSHARP_EXT_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS) +else + $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,libgrpc_csharp_ext.so.10 -o $(LIBDIR)/$(CONFIG)/libgrpc_csharp_ext$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBGRPC_CSHARP_EXT_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS) + $(Q) ln -sf $(SHARED_PREFIX)grpc_csharp_ext$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libgrpc_csharp_ext$(SHARED_VERSION_CORE).so.10 + $(Q) ln -sf $(SHARED_PREFIX)grpc_csharp_ext$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libgrpc_csharp_ext$(SHARED_VERSION_CORE).so +endif +endif + +endif + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(LIBGRPC_CSHARP_EXT_OBJS:.o=.dep) +endif +endif + + +LIBGRPC_TEST_UTIL_SRC = \ + test/core/util/cmdline.cc \ + test/core/util/debugger_macros.cc \ + test/core/util/fuzzer_util.cc \ + test/core/util/grpc_profiler.cc \ + test/core/util/histogram.cc \ + test/core/util/memory_counters.cc \ + test/core/util/mock_endpoint.cc \ + test/core/util/parse_hexstring.cc \ + test/core/util/passthru_endpoint.cc \ + test/core/util/port.cc \ + test/core/util/port_isolated_runtime_environment.cc \ + test/core/util/port_server_client.cc \ + test/core/util/reconnect_server.cc \ + test/core/util/slice_splitter.cc \ + test/core/util/subprocess_posix.cc \ + test/core/util/subprocess_windows.cc \ + test/core/util/test_config.cc \ + test/core/util/test_tcp_server.cc \ + test/core/util/tracer_util.cc \ + test/core/util/trickle_endpoint.cc \ + +PUBLIC_HEADERS_C += \ + +LIBGRPC_TEST_UTIL_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBGRPC_TEST_UTIL_SRC)))) + + +ifeq ($(NO_SECURE),true) + +# You can't build secure libraries if you don't have OpenSSL. + +$(LIBDIR)/$(CONFIG)/libgrpc_test_util.a: openssl_dep_error + + +else + + +$(LIBDIR)/$(CONFIG)/libgrpc_test_util.a: $(ZLIB_DEP) $(OPENSSL_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(LIBGRPC_TEST_UTIL_OBJS) + $(E) "[AR] Creating $@" + $(Q) mkdir -p `dirname $@` + $(Q) rm -f $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a + $(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBGRPC_TEST_UTIL_OBJS) +ifeq ($(SYSTEM),Darwin) + $(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a +endif + + + + +endif + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(LIBGRPC_TEST_UTIL_OBJS:.o=.dep) +endif +endif + + +LIBGRPC_TEST_UTIL_UNSECURE_SRC = \ + test/core/util/cmdline.cc \ + test/core/util/debugger_macros.cc \ + test/core/util/fuzzer_util.cc \ + test/core/util/grpc_profiler.cc \ + test/core/util/histogram.cc \ + test/core/util/memory_counters.cc \ + test/core/util/mock_endpoint.cc \ + test/core/util/parse_hexstring.cc \ + test/core/util/passthru_endpoint.cc \ + test/core/util/port.cc \ + test/core/util/port_isolated_runtime_environment.cc \ + test/core/util/port_server_client.cc \ + test/core/util/reconnect_server.cc \ + test/core/util/slice_splitter.cc \ + test/core/util/subprocess_posix.cc \ + test/core/util/subprocess_windows.cc \ + test/core/util/test_config.cc \ + test/core/util/test_tcp_server.cc \ + test/core/util/tracer_util.cc \ + test/core/util/trickle_endpoint.cc \ + +PUBLIC_HEADERS_C += \ + +LIBGRPC_TEST_UTIL_UNSECURE_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBGRPC_TEST_UTIL_UNSECURE_SRC)))) + + +$(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a: $(ZLIB_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(LIBGRPC_TEST_UTIL_UNSECURE_OBJS) + $(E) "[AR] Creating $@" + $(Q) mkdir -p `dirname $@` + $(Q) rm -f $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a + $(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBGRPC_TEST_UTIL_UNSECURE_OBJS) +ifeq ($(SYSTEM),Darwin) + $(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a +endif + + + + +ifneq ($(NO_DEPS),true) +-include $(LIBGRPC_TEST_UTIL_UNSECURE_OBJS:.o=.dep) +endif + + +LIBGRPC_UNSECURE_SRC = \ + src/core/ext/filters/census/grpc_context.cc \ + src/core/ext/filters/client_channel/backend_metric.cc \ + src/core/ext/filters/client_channel/backup_poller.cc \ + src/core/ext/filters/client_channel/channel_connectivity.cc \ + src/core/ext/filters/client_channel/client_channel.cc \ + src/core/ext/filters/client_channel/client_channel_channelz.cc \ + src/core/ext/filters/client_channel/client_channel_factory.cc \ + src/core/ext/filters/client_channel/client_channel_plugin.cc \ + src/core/ext/filters/client_channel/global_subchannel_pool.cc \ + src/core/ext/filters/client_channel/health/health_check_client.cc \ + src/core/ext/filters/client_channel/http_connect_handshaker.cc \ + src/core/ext/filters/client_channel/http_proxy.cc \ + src/core/ext/filters/client_channel/lb_policy.cc \ + src/core/ext/filters/client_channel/lb_policy/address_filtering.cc \ + src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc \ + src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc \ + src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc \ + src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc \ + src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.cc \ + src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc \ + src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc \ + src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc \ + src/core/ext/filters/client_channel/lb_policy/priority/priority.cc \ + src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc \ + src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc \ + src/core/ext/filters/client_channel/lb_policy/xds/cds.cc \ + src/core/ext/filters/client_channel/lb_policy/xds/eds.cc \ + src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc \ + src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc \ + src/core/ext/filters/client_channel/lb_policy_registry.cc \ + src/core/ext/filters/client_channel/local_subchannel_pool.cc \ + src/core/ext/filters/client_channel/parse_address.cc \ + src/core/ext/filters/client_channel/proxy_mapper_registry.cc \ + src/core/ext/filters/client_channel/resolver.cc \ + src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc \ + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc \ + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc \ + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc \ + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc \ + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc \ + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc \ + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc \ + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc \ + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc \ + src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc \ + src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc \ + src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc \ + src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc \ + src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc \ + src/core/ext/filters/client_channel/resolver_registry.cc \ + src/core/ext/filters/client_channel/resolver_result_parsing.cc \ + src/core/ext/filters/client_channel/resolving_lb_policy.cc \ + src/core/ext/filters/client_channel/retry_throttle.cc \ + src/core/ext/filters/client_channel/server_address.cc \ + src/core/ext/filters/client_channel/service_config.cc \ + src/core/ext/filters/client_channel/service_config_parser.cc \ + src/core/ext/filters/client_channel/subchannel.cc \ + src/core/ext/filters/client_channel/subchannel_pool_interface.cc \ + src/core/ext/filters/client_channel/xds/xds_api.cc \ + src/core/ext/filters/client_channel/xds/xds_bootstrap.cc \ + src/core/ext/filters/client_channel/xds/xds_channel.cc \ + src/core/ext/filters/client_channel/xds/xds_client.cc \ + src/core/ext/filters/client_channel/xds/xds_client_stats.cc \ + src/core/ext/filters/client_idle/client_idle_filter.cc \ + src/core/ext/filters/deadline/deadline_filter.cc \ + src/core/ext/filters/http/client/http_client_filter.cc \ + src/core/ext/filters/http/client_authority_filter.cc \ + src/core/ext/filters/http/http_filters_plugin.cc \ + src/core/ext/filters/http/message_compress/message_compress_filter.cc \ + src/core/ext/filters/http/message_compress/message_decompress_filter.cc \ + src/core/ext/filters/http/server/http_server_filter.cc \ + src/core/ext/filters/max_age/max_age_filter.cc \ + src/core/ext/filters/message_size/message_size_filter.cc \ + src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc \ + src/core/ext/filters/workarounds/workaround_utils.cc \ + src/core/ext/transport/chttp2/alpn/alpn.cc \ + src/core/ext/transport/chttp2/client/authority.cc \ + src/core/ext/transport/chttp2/client/chttp2_connector.cc \ + src/core/ext/transport/chttp2/client/insecure/channel_create.cc \ + src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc \ + src/core/ext/transport/chttp2/server/chttp2_server.cc \ + src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc \ + src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc \ + src/core/ext/transport/chttp2/transport/bin_decoder.cc \ + src/core/ext/transport/chttp2/transport/bin_encoder.cc \ + src/core/ext/transport/chttp2/transport/chttp2_plugin.cc \ + src/core/ext/transport/chttp2/transport/chttp2_transport.cc \ + src/core/ext/transport/chttp2/transport/context_list.cc \ + src/core/ext/transport/chttp2/transport/flow_control.cc \ + src/core/ext/transport/chttp2/transport/frame_data.cc \ + src/core/ext/transport/chttp2/transport/frame_goaway.cc \ + src/core/ext/transport/chttp2/transport/frame_ping.cc \ + src/core/ext/transport/chttp2/transport/frame_rst_stream.cc \ + src/core/ext/transport/chttp2/transport/frame_settings.cc \ + src/core/ext/transport/chttp2/transport/frame_window_update.cc \ + src/core/ext/transport/chttp2/transport/hpack_encoder.cc \ + src/core/ext/transport/chttp2/transport/hpack_parser.cc \ + src/core/ext/transport/chttp2/transport/hpack_table.cc \ + src/core/ext/transport/chttp2/transport/http2_settings.cc \ + src/core/ext/transport/chttp2/transport/huffsyms.cc \ + src/core/ext/transport/chttp2/transport/incoming_metadata.cc \ + src/core/ext/transport/chttp2/transport/parsing.cc \ + src/core/ext/transport/chttp2/transport/stream_lists.cc \ + src/core/ext/transport/chttp2/transport/stream_map.cc \ + src/core/ext/transport/chttp2/transport/varint.cc \ + src/core/ext/transport/chttp2/transport/writing.cc \ + src/core/ext/transport/inproc/inproc_plugin.cc \ + src/core/ext/transport/inproc/inproc_transport.cc \ + src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c \ + src/core/ext/upb-generated/envoy/annotations/resource.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/cds.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/eds.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/lds.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/listener.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/rds.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/route.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/srds.upb.c \ + src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c \ + src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c \ + src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c \ + src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c \ + src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c \ + src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c \ + src/core/ext/upb-generated/envoy/type/http.upb.c \ + src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c \ + src/core/ext/upb-generated/envoy/type/matcher/string.upb.c \ + src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c \ + src/core/ext/upb-generated/envoy/type/percent.upb.c \ + src/core/ext/upb-generated/envoy/type/range.upb.c \ + src/core/ext/upb-generated/envoy/type/semantic_version.upb.c \ + src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c \ + src/core/ext/upb-generated/gogoproto/gogo.upb.c \ + src/core/ext/upb-generated/google/api/annotations.upb.c \ + src/core/ext/upb-generated/google/api/http.upb.c \ + src/core/ext/upb-generated/google/protobuf/any.upb.c \ + src/core/ext/upb-generated/google/protobuf/descriptor.upb.c \ + src/core/ext/upb-generated/google/protobuf/duration.upb.c \ + src/core/ext/upb-generated/google/protobuf/empty.upb.c \ + src/core/ext/upb-generated/google/protobuf/struct.upb.c \ + src/core/ext/upb-generated/google/protobuf/timestamp.upb.c \ + src/core/ext/upb-generated/google/protobuf/wrappers.upb.c \ + src/core/ext/upb-generated/google/rpc/status.upb.c \ + src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c \ + src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c \ + src/core/ext/upb-generated/udpa/annotations/migrate.upb.c \ + src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c \ + src/core/ext/upb-generated/udpa/annotations/status.upb.c \ + src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c \ + src/core/ext/upb-generated/validate/validate.upb.c \ + src/core/lib/avl/avl.cc \ + src/core/lib/backoff/backoff.cc \ + src/core/lib/channel/channel_args.cc \ + src/core/lib/channel/channel_stack.cc \ + src/core/lib/channel/channel_stack_builder.cc \ + src/core/lib/channel/channel_trace.cc \ + src/core/lib/channel/channelz.cc \ + src/core/lib/channel/channelz_registry.cc \ + src/core/lib/channel/connected_channel.cc \ + src/core/lib/channel/handshaker.cc \ + src/core/lib/channel/handshaker_registry.cc \ + src/core/lib/channel/status_util.cc \ + src/core/lib/compression/compression.cc \ + src/core/lib/compression/compression_args.cc \ + src/core/lib/compression/compression_internal.cc \ + src/core/lib/compression/message_compress.cc \ + src/core/lib/compression/stream_compression.cc \ + src/core/lib/compression/stream_compression_gzip.cc \ + src/core/lib/compression/stream_compression_identity.cc \ + src/core/lib/debug/stats.cc \ + src/core/lib/debug/stats_data.cc \ + src/core/lib/debug/trace.cc \ + src/core/lib/http/format_request.cc \ + src/core/lib/http/httpcli.cc \ + src/core/lib/http/parser.cc \ + src/core/lib/iomgr/buffer_list.cc \ + src/core/lib/iomgr/call_combiner.cc \ + src/core/lib/iomgr/cfstream_handle.cc \ + src/core/lib/iomgr/combiner.cc \ + src/core/lib/iomgr/dualstack_socket_posix.cc \ + src/core/lib/iomgr/endpoint.cc \ + src/core/lib/iomgr/endpoint_cfstream.cc \ + src/core/lib/iomgr/endpoint_pair_posix.cc \ + src/core/lib/iomgr/endpoint_pair_uv.cc \ + src/core/lib/iomgr/endpoint_pair_windows.cc \ + src/core/lib/iomgr/error.cc \ + src/core/lib/iomgr/error_cfstream.cc \ + src/core/lib/iomgr/ev_apple.cc \ + src/core/lib/iomgr/ev_epoll1_linux.cc \ + src/core/lib/iomgr/ev_epollex_linux.cc \ + src/core/lib/iomgr/ev_poll_posix.cc \ + src/core/lib/iomgr/ev_posix.cc \ + src/core/lib/iomgr/ev_windows.cc \ + src/core/lib/iomgr/exec_ctx.cc \ + src/core/lib/iomgr/executor.cc \ + src/core/lib/iomgr/executor/mpmcqueue.cc \ + src/core/lib/iomgr/executor/threadpool.cc \ + src/core/lib/iomgr/fork_posix.cc \ + src/core/lib/iomgr/fork_windows.cc \ + src/core/lib/iomgr/gethostname_fallback.cc \ + src/core/lib/iomgr/gethostname_host_name_max.cc \ + src/core/lib/iomgr/gethostname_sysconf.cc \ + src/core/lib/iomgr/grpc_if_nametoindex_posix.cc \ + src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc \ + src/core/lib/iomgr/internal_errqueue.cc \ + src/core/lib/iomgr/iocp_windows.cc \ + src/core/lib/iomgr/iomgr.cc \ + src/core/lib/iomgr/iomgr_custom.cc \ + src/core/lib/iomgr/iomgr_internal.cc \ + src/core/lib/iomgr/iomgr_posix.cc \ + src/core/lib/iomgr/iomgr_posix_cfstream.cc \ + src/core/lib/iomgr/iomgr_uv.cc \ + src/core/lib/iomgr/iomgr_windows.cc \ + src/core/lib/iomgr/is_epollexclusive_available.cc \ + src/core/lib/iomgr/load_file.cc \ + src/core/lib/iomgr/lockfree_event.cc \ + src/core/lib/iomgr/poller/eventmanager_libuv.cc \ + src/core/lib/iomgr/polling_entity.cc \ + src/core/lib/iomgr/pollset.cc \ + src/core/lib/iomgr/pollset_custom.cc \ + src/core/lib/iomgr/pollset_set.cc \ + src/core/lib/iomgr/pollset_set_custom.cc \ + src/core/lib/iomgr/pollset_set_windows.cc \ + src/core/lib/iomgr/pollset_uv.cc \ + src/core/lib/iomgr/pollset_windows.cc \ + src/core/lib/iomgr/resolve_address.cc \ + src/core/lib/iomgr/resolve_address_custom.cc \ + src/core/lib/iomgr/resolve_address_posix.cc \ + src/core/lib/iomgr/resolve_address_windows.cc \ + src/core/lib/iomgr/resource_quota.cc \ + src/core/lib/iomgr/sockaddr_utils.cc \ + src/core/lib/iomgr/socket_factory_posix.cc \ + src/core/lib/iomgr/socket_mutator.cc \ + src/core/lib/iomgr/socket_utils_common_posix.cc \ + src/core/lib/iomgr/socket_utils_linux.cc \ + src/core/lib/iomgr/socket_utils_posix.cc \ + src/core/lib/iomgr/socket_utils_uv.cc \ + src/core/lib/iomgr/socket_utils_windows.cc \ + src/core/lib/iomgr/socket_windows.cc \ + src/core/lib/iomgr/tcp_client.cc \ + src/core/lib/iomgr/tcp_client_cfstream.cc \ + src/core/lib/iomgr/tcp_client_custom.cc \ + src/core/lib/iomgr/tcp_client_posix.cc \ + src/core/lib/iomgr/tcp_client_windows.cc \ + src/core/lib/iomgr/tcp_custom.cc \ + src/core/lib/iomgr/tcp_posix.cc \ + src/core/lib/iomgr/tcp_server.cc \ + src/core/lib/iomgr/tcp_server_custom.cc \ + src/core/lib/iomgr/tcp_server_posix.cc \ + src/core/lib/iomgr/tcp_server_utils_posix_common.cc \ + src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc \ + src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc \ + src/core/lib/iomgr/tcp_server_windows.cc \ + src/core/lib/iomgr/tcp_uv.cc \ + src/core/lib/iomgr/tcp_windows.cc \ + src/core/lib/iomgr/time_averaged_stats.cc \ + src/core/lib/iomgr/timer.cc \ + src/core/lib/iomgr/timer_custom.cc \ + src/core/lib/iomgr/timer_generic.cc \ + src/core/lib/iomgr/timer_heap.cc \ + src/core/lib/iomgr/timer_manager.cc \ + src/core/lib/iomgr/timer_uv.cc \ + src/core/lib/iomgr/udp_server.cc \ + src/core/lib/iomgr/unix_sockets_posix.cc \ + src/core/lib/iomgr/unix_sockets_posix_noop.cc \ + src/core/lib/iomgr/wakeup_fd_eventfd.cc \ + src/core/lib/iomgr/wakeup_fd_nospecial.cc \ + src/core/lib/iomgr/wakeup_fd_pipe.cc \ + src/core/lib/iomgr/wakeup_fd_posix.cc \ + src/core/lib/iomgr/work_serializer.cc \ + src/core/lib/json/json_reader.cc \ + src/core/lib/json/json_writer.cc \ + src/core/lib/slice/b64.cc \ + src/core/lib/slice/percent_encoding.cc \ + src/core/lib/slice/slice.cc \ + src/core/lib/slice/slice_buffer.cc \ + src/core/lib/slice/slice_intern.cc \ + src/core/lib/slice/slice_string_helpers.cc \ + src/core/lib/surface/api_trace.cc \ + src/core/lib/surface/byte_buffer.cc \ + src/core/lib/surface/byte_buffer_reader.cc \ + src/core/lib/surface/call.cc \ + src/core/lib/surface/call_details.cc \ + src/core/lib/surface/call_log_batch.cc \ + src/core/lib/surface/channel.cc \ + src/core/lib/surface/channel_init.cc \ + src/core/lib/surface/channel_ping.cc \ + src/core/lib/surface/channel_stack_type.cc \ + src/core/lib/surface/completion_queue.cc \ + src/core/lib/surface/completion_queue_factory.cc \ + src/core/lib/surface/event_string.cc \ + src/core/lib/surface/init.cc \ + src/core/lib/surface/init_unsecure.cc \ + src/core/lib/surface/lame_client.cc \ + src/core/lib/surface/metadata_array.cc \ + src/core/lib/surface/server.cc \ + src/core/lib/surface/validate_metadata.cc \ + src/core/lib/surface/version.cc \ + src/core/lib/transport/bdp_estimator.cc \ + src/core/lib/transport/byte_stream.cc \ + src/core/lib/transport/connectivity_state.cc \ + src/core/lib/transport/error_utils.cc \ + src/core/lib/transport/metadata.cc \ + src/core/lib/transport/metadata_batch.cc \ + src/core/lib/transport/pid_controller.cc \ + src/core/lib/transport/static_metadata.cc \ + src/core/lib/transport/status_conversion.cc \ + src/core/lib/transport/status_metadata.cc \ + src/core/lib/transport/timeout_encoding.cc \ + src/core/lib/transport/transport.cc \ + src/core/lib/transport/transport_op_string.cc \ + src/core/lib/uri/uri_parser.cc \ + src/core/plugin_registry/grpc_unsecure_plugin_registry.cc \ + +PUBLIC_HEADERS_C += \ + include/grpc/byte_buffer.h \ + include/grpc/byte_buffer_reader.h \ + include/grpc/census.h \ + include/grpc/compression.h \ + include/grpc/fork.h \ + include/grpc/grpc.h \ + include/grpc/grpc_posix.h \ + include/grpc/grpc_security_constants.h \ + include/grpc/load_reporting.h \ + include/grpc/slice.h \ + include/grpc/slice_buffer.h \ + include/grpc/status.h \ + include/grpc/support/workaround_list.h \ + +LIBGRPC_UNSECURE_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBGRPC_UNSECURE_SRC)))) + + +$(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a: $(ZLIB_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(LIBGRPC_UNSECURE_OBJS) $(LIBGPR_OBJS) $(LIBGRPC_ABSEIL_OBJS) $(ZLIB_MERGE_OBJS) $(CARES_MERGE_OBJS) $(ADDRESS_SORTING_MERGE_OBJS) $(UPB_MERGE_OBJS) + $(E) "[AR] Creating $@" + $(Q) mkdir -p `dirname $@` + $(Q) rm -f $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a + $(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBGRPC_UNSECURE_OBJS) $(LIBGPR_OBJS) $(LIBGRPC_ABSEIL_OBJS) $(ZLIB_MERGE_OBJS) $(CARES_MERGE_OBJS) $(ADDRESS_SORTING_MERGE_OBJS) $(UPB_MERGE_OBJS) +ifeq ($(SYSTEM),Darwin) + $(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a +endif + + + +ifeq ($(SYSTEM),MINGW32) +$(LIBDIR)/$(CONFIG)/grpc_unsecure$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE): $(LIBGRPC_UNSECURE_OBJS) $(ZLIB_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,--output-def=$(LIBDIR)/$(CONFIG)/grpc_unsecure$(SHARED_VERSION_CORE).def -Wl,--out-implib=$(LIBDIR)/$(CONFIG)/libgrpc_unsecure$(SHARED_VERSION_CORE)-dll.a -o $(LIBDIR)/$(CONFIG)/grpc_unsecure$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBGRPC_UNSECURE_OBJS) $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS) +else +$(LIBDIR)/$(CONFIG)/libgrpc_unsecure$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE): $(LIBGRPC_UNSECURE_OBJS) $(ZLIB_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` +ifeq ($(SYSTEM),Darwin) + $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -install_name $(SHARED_PREFIX)grpc_unsecure$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) -dynamiclib -o $(LIBDIR)/$(CONFIG)/libgrpc_unsecure$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBGRPC_UNSECURE_OBJS) $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS) +else + $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,libgrpc_unsecure.so.10 -o $(LIBDIR)/$(CONFIG)/libgrpc_unsecure$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBGRPC_UNSECURE_OBJS) $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS) + $(Q) ln -sf $(SHARED_PREFIX)grpc_unsecure$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libgrpc_unsecure$(SHARED_VERSION_CORE).so.10 + $(Q) ln -sf $(SHARED_PREFIX)grpc_unsecure$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libgrpc_unsecure$(SHARED_VERSION_CORE).so +endif +endif + +ifneq ($(NO_DEPS),true) +-include $(LIBGRPC_UNSECURE_OBJS:.o=.dep) +endif + + +LIBBENCHMARK_HELPERS_SRC = \ + $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc \ + test/cpp/microbenchmarks/helpers.cc \ + +PUBLIC_HEADERS_CXX += \ + +LIBBENCHMARK_HELPERS_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBENCHMARK_HELPERS_SRC)))) + +$(LIBBENCHMARK_HELPERS_OBJS): CPPFLAGS += -Ithird_party/benchmark/include -DHAVE_POSIX_REGEX + +ifeq ($(NO_SECURE),true) + +# You can't build secure libraries if you don't have OpenSSL. + +$(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a: openssl_dep_error + + +else + +ifeq ($(NO_PROTOBUF),true) + +# You can't build a C++ library if you don't have protobuf - a bit overreached, but still okay. + +$(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a: protobuf_dep_error + + +else + +$(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a: $(ZLIB_DEP) $(OPENSSL_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(PROTOBUF_DEP) $(LIBBENCHMARK_HELPERS_OBJS) + $(E) "[AR] Creating $@" + $(Q) mkdir -p `dirname $@` + $(Q) rm -f $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a + $(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBBENCHMARK_HELPERS_OBJS) +ifeq ($(SYSTEM),Darwin) + $(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a +endif + + + + +endif + +endif + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(LIBBENCHMARK_HELPERS_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/cpp/microbenchmarks/helpers.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc + + +LIBGRPC++_SRC = \ + src/cpp/client/channel_cc.cc \ + src/cpp/client/client_context.cc \ + src/cpp/client/client_interceptor.cc \ + src/cpp/client/create_channel.cc \ + src/cpp/client/create_channel_internal.cc \ + src/cpp/client/create_channel_posix.cc \ + src/cpp/client/credentials_cc.cc \ + src/cpp/client/insecure_credentials.cc \ + src/cpp/client/secure_credentials.cc \ + src/cpp/codegen/codegen_init.cc \ + src/cpp/common/alarm.cc \ + src/cpp/common/auth_property_iterator.cc \ + src/cpp/common/channel_arguments.cc \ + src/cpp/common/channel_filter.cc \ + src/cpp/common/completion_queue_cc.cc \ + src/cpp/common/core_codegen.cc \ + src/cpp/common/resource_quota_cc.cc \ + src/cpp/common/rpc_method.cc \ + src/cpp/common/secure_auth_context.cc \ + src/cpp/common/secure_channel_arguments.cc \ + src/cpp/common/secure_create_auth_context.cc \ + src/cpp/common/tls_credentials_options.cc \ + src/cpp/common/tls_credentials_options_util.cc \ + src/cpp/common/validate_service_config.cc \ + src/cpp/common/version_cc.cc \ + src/cpp/server/async_generic_service.cc \ + src/cpp/server/channel_argument_option.cc \ + src/cpp/server/create_default_thread_pool.cc \ + src/cpp/server/dynamic_thread_pool.cc \ + src/cpp/server/external_connection_acceptor_impl.cc \ + src/cpp/server/health/default_health_check_service.cc \ + src/cpp/server/health/health_check_service.cc \ + src/cpp/server/health/health_check_service_server_builder_option.cc \ + src/cpp/server/insecure_server_credentials.cc \ + src/cpp/server/secure_server_credentials.cc \ + src/cpp/server/server_builder.cc \ + src/cpp/server/server_callback.cc \ + src/cpp/server/server_cc.cc \ + src/cpp/server/server_context.cc \ + src/cpp/server/server_credentials.cc \ + src/cpp/server/server_posix.cc \ + src/cpp/thread_manager/thread_manager.cc \ + src/cpp/util/byte_buffer_cc.cc \ + src/cpp/util/status.cc \ + src/cpp/util/string_ref.cc \ + src/cpp/util/time_cc.cc \ + +PUBLIC_HEADERS_CXX += \ + include/grpc++/alarm.h \ + include/grpc++/channel.h \ + include/grpc++/client_context.h \ + include/grpc++/completion_queue.h \ + include/grpc++/create_channel.h \ + include/grpc++/create_channel_posix.h \ + include/grpc++/ext/health_check_service_server_builder_option.h \ + include/grpc++/generic/async_generic_service.h \ + include/grpc++/generic/generic_stub.h \ + include/grpc++/grpc++.h \ + include/grpc++/health_check_service_interface.h \ + include/grpc++/impl/call.h \ + include/grpc++/impl/channel_argument_option.h \ + include/grpc++/impl/client_unary_call.h \ + include/grpc++/impl/codegen/async_stream.h \ + include/grpc++/impl/codegen/async_unary_call.h \ + include/grpc++/impl/codegen/byte_buffer.h \ + include/grpc++/impl/codegen/call.h \ + include/grpc++/impl/codegen/call_hook.h \ + include/grpc++/impl/codegen/channel_interface.h \ + include/grpc++/impl/codegen/client_context.h \ + include/grpc++/impl/codegen/client_unary_call.h \ + include/grpc++/impl/codegen/completion_queue.h \ + include/grpc++/impl/codegen/completion_queue_tag.h \ + include/grpc++/impl/codegen/config.h \ + include/grpc++/impl/codegen/config_protobuf.h \ + include/grpc++/impl/codegen/core_codegen.h \ + include/grpc++/impl/codegen/core_codegen_interface.h \ + include/grpc++/impl/codegen/create_auth_context.h \ + include/grpc++/impl/codegen/grpc_library.h \ + include/grpc++/impl/codegen/metadata_map.h \ + include/grpc++/impl/codegen/method_handler_impl.h \ + include/grpc++/impl/codegen/proto_utils.h \ + include/grpc++/impl/codegen/rpc_method.h \ + include/grpc++/impl/codegen/rpc_service_method.h \ + include/grpc++/impl/codegen/security/auth_context.h \ + include/grpc++/impl/codegen/serialization_traits.h \ + include/grpc++/impl/codegen/server_context.h \ + include/grpc++/impl/codegen/server_interface.h \ + include/grpc++/impl/codegen/service_type.h \ + include/grpc++/impl/codegen/slice.h \ + include/grpc++/impl/codegen/status.h \ + include/grpc++/impl/codegen/status_code_enum.h \ + include/grpc++/impl/codegen/string_ref.h \ + include/grpc++/impl/codegen/stub_options.h \ + include/grpc++/impl/codegen/sync_stream.h \ + include/grpc++/impl/codegen/time.h \ + include/grpc++/impl/grpc_library.h \ + include/grpc++/impl/method_handler_impl.h \ + include/grpc++/impl/rpc_method.h \ + include/grpc++/impl/rpc_service_method.h \ + include/grpc++/impl/serialization_traits.h \ + include/grpc++/impl/server_builder_option.h \ + include/grpc++/impl/server_builder_plugin.h \ + include/grpc++/impl/server_initializer.h \ + include/grpc++/impl/service_type.h \ + include/grpc++/resource_quota.h \ + include/grpc++/security/auth_context.h \ + include/grpc++/security/auth_metadata_processor.h \ + include/grpc++/security/credentials.h \ + include/grpc++/security/server_credentials.h \ + include/grpc++/server.h \ + include/grpc++/server_builder.h \ + include/grpc++/server_context.h \ + include/grpc++/server_posix.h \ + include/grpc++/support/async_stream.h \ + include/grpc++/support/async_unary_call.h \ + include/grpc++/support/byte_buffer.h \ + include/grpc++/support/channel_arguments.h \ + include/grpc++/support/config.h \ + include/grpc++/support/slice.h \ + include/grpc++/support/status.h \ + include/grpc++/support/status_code_enum.h \ + include/grpc++/support/string_ref.h \ + include/grpc++/support/stub_options.h \ + include/grpc++/support/sync_stream.h \ + include/grpc++/support/time.h \ + include/grpcpp/alarm.h \ + include/grpcpp/alarm_impl.h \ + include/grpcpp/channel.h \ + include/grpcpp/channel_impl.h \ + include/grpcpp/client_context.h \ + include/grpcpp/completion_queue.h \ + include/grpcpp/completion_queue_impl.h \ + include/grpcpp/create_channel.h \ + include/grpcpp/create_channel_impl.h \ + include/grpcpp/create_channel_posix.h \ + include/grpcpp/create_channel_posix_impl.h \ + include/grpcpp/ext/health_check_service_server_builder_option.h \ + include/grpcpp/generic/async_generic_service.h \ + include/grpcpp/generic/generic_stub.h \ + include/grpcpp/generic/generic_stub_impl.h \ + include/grpcpp/grpcpp.h \ + include/grpcpp/health_check_service_interface.h \ + include/grpcpp/health_check_service_interface_impl.h \ + include/grpcpp/impl/call.h \ + include/grpcpp/impl/channel_argument_option.h \ + include/grpcpp/impl/client_unary_call.h \ + include/grpcpp/impl/codegen/async_generic_service.h \ + include/grpcpp/impl/codegen/async_stream.h \ + include/grpcpp/impl/codegen/async_stream_impl.h \ + include/grpcpp/impl/codegen/async_unary_call.h \ + include/grpcpp/impl/codegen/async_unary_call_impl.h \ + include/grpcpp/impl/codegen/byte_buffer.h \ + include/grpcpp/impl/codegen/call.h \ + include/grpcpp/impl/codegen/call_hook.h \ + include/grpcpp/impl/codegen/call_op_set.h \ + include/grpcpp/impl/codegen/call_op_set_interface.h \ + include/grpcpp/impl/codegen/callback_common.h \ + include/grpcpp/impl/codegen/channel_interface.h \ + include/grpcpp/impl/codegen/client_callback.h \ + include/grpcpp/impl/codegen/client_callback_impl.h \ + include/grpcpp/impl/codegen/client_context.h \ + include/grpcpp/impl/codegen/client_context_impl.h \ + include/grpcpp/impl/codegen/client_interceptor.h \ + include/grpcpp/impl/codegen/client_unary_call.h \ + include/grpcpp/impl/codegen/completion_queue.h \ + include/grpcpp/impl/codegen/completion_queue_impl.h \ + include/grpcpp/impl/codegen/completion_queue_tag.h \ + include/grpcpp/impl/codegen/config.h \ + include/grpcpp/impl/codegen/config_protobuf.h \ + include/grpcpp/impl/codegen/core_codegen.h \ + include/grpcpp/impl/codegen/core_codegen_interface.h \ + include/grpcpp/impl/codegen/create_auth_context.h \ + include/grpcpp/impl/codegen/delegating_channel.h \ + include/grpcpp/impl/codegen/grpc_library.h \ + include/grpcpp/impl/codegen/intercepted_channel.h \ + include/grpcpp/impl/codegen/interceptor.h \ + include/grpcpp/impl/codegen/interceptor_common.h \ + include/grpcpp/impl/codegen/message_allocator.h \ + include/grpcpp/impl/codegen/metadata_map.h \ + include/grpcpp/impl/codegen/method_handler.h \ + include/grpcpp/impl/codegen/method_handler_impl.h \ + include/grpcpp/impl/codegen/proto_buffer_reader.h \ + include/grpcpp/impl/codegen/proto_buffer_writer.h \ + include/grpcpp/impl/codegen/proto_utils.h \ + include/grpcpp/impl/codegen/rpc_method.h \ + include/grpcpp/impl/codegen/rpc_service_method.h \ + include/grpcpp/impl/codegen/security/auth_context.h \ + include/grpcpp/impl/codegen/serialization_traits.h \ + include/grpcpp/impl/codegen/server_callback.h \ + include/grpcpp/impl/codegen/server_callback_handlers.h \ + include/grpcpp/impl/codegen/server_callback_impl.h \ + include/grpcpp/impl/codegen/server_context.h \ + include/grpcpp/impl/codegen/server_context_impl.h \ + include/grpcpp/impl/codegen/server_interceptor.h \ + include/grpcpp/impl/codegen/server_interface.h \ + include/grpcpp/impl/codegen/service_type.h \ + include/grpcpp/impl/codegen/slice.h \ + include/grpcpp/impl/codegen/status.h \ + include/grpcpp/impl/codegen/status_code_enum.h \ + include/grpcpp/impl/codegen/string_ref.h \ + include/grpcpp/impl/codegen/stub_options.h \ + include/grpcpp/impl/codegen/sync.h \ + include/grpcpp/impl/codegen/sync_stream.h \ + include/grpcpp/impl/codegen/sync_stream_impl.h \ + include/grpcpp/impl/codegen/time.h \ + include/grpcpp/impl/grpc_library.h \ + include/grpcpp/impl/method_handler_impl.h \ + include/grpcpp/impl/rpc_method.h \ + include/grpcpp/impl/rpc_service_method.h \ + include/grpcpp/impl/serialization_traits.h \ + include/grpcpp/impl/server_builder_option.h \ + include/grpcpp/impl/server_builder_option_impl.h \ + include/grpcpp/impl/server_builder_plugin.h \ + include/grpcpp/impl/server_initializer.h \ + include/grpcpp/impl/server_initializer_impl.h \ + include/grpcpp/impl/service_type.h \ + include/grpcpp/resource_quota.h \ + include/grpcpp/resource_quota_impl.h \ + include/grpcpp/security/auth_context.h \ + include/grpcpp/security/auth_metadata_processor.h \ + include/grpcpp/security/auth_metadata_processor_impl.h \ + include/grpcpp/security/credentials.h \ + include/grpcpp/security/credentials_impl.h \ + include/grpcpp/security/server_credentials.h \ + include/grpcpp/security/server_credentials_impl.h \ + include/grpcpp/security/tls_credentials_options.h \ + include/grpcpp/server.h \ + include/grpcpp/server_builder.h \ + include/grpcpp/server_builder_impl.h \ + include/grpcpp/server_context.h \ + include/grpcpp/server_impl.h \ + include/grpcpp/server_posix.h \ + include/grpcpp/server_posix_impl.h \ + include/grpcpp/support/async_stream.h \ + include/grpcpp/support/async_stream_impl.h \ + include/grpcpp/support/async_unary_call.h \ + include/grpcpp/support/async_unary_call_impl.h \ + include/grpcpp/support/byte_buffer.h \ + include/grpcpp/support/channel_arguments.h \ + include/grpcpp/support/channel_arguments_impl.h \ + include/grpcpp/support/client_callback.h \ + include/grpcpp/support/client_callback_impl.h \ + include/grpcpp/support/client_interceptor.h \ + include/grpcpp/support/config.h \ + include/grpcpp/support/interceptor.h \ + include/grpcpp/support/message_allocator.h \ + include/grpcpp/support/method_handler.h \ + include/grpcpp/support/proto_buffer_reader.h \ + include/grpcpp/support/proto_buffer_writer.h \ + include/grpcpp/support/server_callback.h \ + include/grpcpp/support/server_callback_impl.h \ + include/grpcpp/support/server_interceptor.h \ + include/grpcpp/support/slice.h \ + include/grpcpp/support/status.h \ + include/grpcpp/support/status_code_enum.h \ + include/grpcpp/support/string_ref.h \ + include/grpcpp/support/stub_options.h \ + include/grpcpp/support/sync_stream.h \ + include/grpcpp/support/sync_stream_impl.h \ + include/grpcpp/support/time.h \ + include/grpcpp/support/validate_service_config.h \ + +LIBGRPC++_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBGRPC++_SRC)))) + + +ifeq ($(NO_SECURE),true) + +# You can't build secure libraries if you don't have OpenSSL. + +$(LIBDIR)/$(CONFIG)/libgrpc++.a: openssl_dep_error + +$(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)grpc++$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP): openssl_dep_error + +else + +ifeq ($(NO_PROTOBUF),true) + +# You can't build a C++ library if you don't have protobuf - a bit overreached, but still okay. + +$(LIBDIR)/$(CONFIG)/libgrpc++.a: protobuf_dep_error + +$(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)grpc++$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP): protobuf_dep_error + +else + +$(LIBDIR)/$(CONFIG)/libgrpc++.a: $(ZLIB_DEP) $(OPENSSL_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(PROTOBUF_DEP) $(LIBGRPC++_OBJS) $(LIBGPR_OBJS) $(LIBGRPC_ABSEIL_OBJS) $(ZLIB_MERGE_OBJS) $(CARES_MERGE_OBJS) $(ADDRESS_SORTING_MERGE_OBJS) $(UPB_MERGE_OBJS) + $(E) "[AR] Creating $@" + $(Q) mkdir -p `dirname $@` + $(Q) rm -f $(LIBDIR)/$(CONFIG)/libgrpc++.a + $(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBGRPC++_OBJS) $(LIBGPR_OBJS) $(LIBGRPC_ABSEIL_OBJS) $(ZLIB_MERGE_OBJS) $(CARES_MERGE_OBJS) $(ADDRESS_SORTING_MERGE_OBJS) $(UPB_MERGE_OBJS) +ifeq ($(SYSTEM),Darwin) + $(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libgrpc++.a +endif + + + +ifeq ($(SYSTEM),MINGW32) +$(LIBDIR)/$(CONFIG)/grpc++$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP): $(LIBGRPC++_OBJS) $(ZLIB_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(PROTOBUF_DEP) $(LIBDIR)/$(CONFIG)/grpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/gpr$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/address_sorting$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/upb$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(OPENSSL_DEP) + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,--output-def=$(LIBDIR)/$(CONFIG)/grpc++$(SHARED_VERSION_CPP).def -Wl,--out-implib=$(LIBDIR)/$(CONFIG)/libgrpc++$(SHARED_VERSION_CPP)-dll.a -o $(LIBDIR)/$(CONFIG)/grpc++$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(LIBGRPC++_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) -lgrpc$(SHARED_VERSION_CORE)-dll -lgpr$(SHARED_VERSION_CORE)-dll -laddress_sorting$(SHARED_VERSION_CORE)-dll -lupb$(SHARED_VERSION_CORE)-dll +else +$(LIBDIR)/$(CONFIG)/libgrpc++$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP): $(LIBGRPC++_OBJS) $(ZLIB_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(PROTOBUF_DEP) $(LIBDIR)/$(CONFIG)/libgrpc.$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libgpr.$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libaddress_sorting.$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libupb.$(SHARED_EXT_CORE) $(OPENSSL_DEP) + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` +ifeq ($(SYSTEM),Darwin) + $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -install_name $(SHARED_PREFIX)grpc++$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) -dynamiclib -o $(LIBDIR)/$(CONFIG)/libgrpc++$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(LIBGRPC++_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) -lgrpc -lgpr -laddress_sorting -lupb +else + $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,libgrpc++.so.1 -o $(LIBDIR)/$(CONFIG)/libgrpc++$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(LIBGRPC++_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) -lgrpc -lgpr -laddress_sorting -lupb + $(Q) ln -sf $(SHARED_PREFIX)grpc++$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(LIBDIR)/$(CONFIG)/libgrpc++$(SHARED_VERSION_CPP).so.1 + $(Q) ln -sf $(SHARED_PREFIX)grpc++$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(LIBDIR)/$(CONFIG)/libgrpc++$(SHARED_VERSION_CPP).so +endif +endif + +endif + +endif + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(LIBGRPC++_OBJS:.o=.dep) +endif +endif + + +LIBGRPC++_ALTS_SRC = \ + src/cpp/common/alts_context.cc \ + src/cpp/common/alts_util.cc \ + +PUBLIC_HEADERS_CXX += \ + include/grpcpp/security/alts_context.h \ + include/grpcpp/security/alts_util.h \ + +LIBGRPC++_ALTS_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBGRPC++_ALTS_SRC)))) + + +ifeq ($(NO_SECURE),true) + +# You can't build secure libraries if you don't have OpenSSL. + +$(LIBDIR)/$(CONFIG)/libgrpc++_alts.a: openssl_dep_error + +$(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)grpc++_alts$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP): openssl_dep_error + +else + +ifeq ($(NO_PROTOBUF),true) + +# You can't build a C++ library if you don't have protobuf - a bit overreached, but still okay. + +$(LIBDIR)/$(CONFIG)/libgrpc++_alts.a: protobuf_dep_error + +$(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)grpc++_alts$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP): protobuf_dep_error + +else + +$(LIBDIR)/$(CONFIG)/libgrpc++_alts.a: $(ZLIB_DEP) $(OPENSSL_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(PROTOBUF_DEP) $(LIBGRPC++_ALTS_OBJS) $(LIBGPR_OBJS) $(LIBGRPC_ABSEIL_OBJS) $(ZLIB_MERGE_OBJS) $(CARES_MERGE_OBJS) $(ADDRESS_SORTING_MERGE_OBJS) $(UPB_MERGE_OBJS) + $(E) "[AR] Creating $@" + $(Q) mkdir -p `dirname $@` + $(Q) rm -f $(LIBDIR)/$(CONFIG)/libgrpc++_alts.a + $(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libgrpc++_alts.a $(LIBGRPC++_ALTS_OBJS) $(LIBGPR_OBJS) $(LIBGRPC_ABSEIL_OBJS) $(ZLIB_MERGE_OBJS) $(CARES_MERGE_OBJS) $(ADDRESS_SORTING_MERGE_OBJS) $(UPB_MERGE_OBJS) +ifeq ($(SYSTEM),Darwin) + $(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libgrpc++_alts.a +endif + + + +ifeq ($(SYSTEM),MINGW32) +$(LIBDIR)/$(CONFIG)/grpc++_alts$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP): $(LIBGRPC++_ALTS_OBJS) $(ZLIB_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(PROTOBUF_DEP) $(LIBDIR)/$(CONFIG)/grpc++$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(LIBDIR)/$(CONFIG)/grpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/gpr$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/address_sorting$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/upb$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(OPENSSL_DEP) + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,--output-def=$(LIBDIR)/$(CONFIG)/grpc++_alts$(SHARED_VERSION_CPP).def -Wl,--out-implib=$(LIBDIR)/$(CONFIG)/libgrpc++_alts$(SHARED_VERSION_CPP)-dll.a -o $(LIBDIR)/$(CONFIG)/grpc++_alts$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(LIBGRPC++_ALTS_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) -lgrpc++$(SHARED_VERSION_CPP)-dll -lgrpc$(SHARED_VERSION_CORE)-dll -lgpr$(SHARED_VERSION_CORE)-dll -laddress_sorting$(SHARED_VERSION_CORE)-dll -lupb$(SHARED_VERSION_CORE)-dll +else +$(LIBDIR)/$(CONFIG)/libgrpc++_alts$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP): $(LIBGRPC++_ALTS_OBJS) $(ZLIB_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(PROTOBUF_DEP) $(LIBDIR)/$(CONFIG)/libgrpc++.$(SHARED_EXT_CPP) $(LIBDIR)/$(CONFIG)/libgrpc.$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libgpr.$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libaddress_sorting.$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libupb.$(SHARED_EXT_CORE) $(OPENSSL_DEP) + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` +ifeq ($(SYSTEM),Darwin) + $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -install_name $(SHARED_PREFIX)grpc++_alts$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) -dynamiclib -o $(LIBDIR)/$(CONFIG)/libgrpc++_alts$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(LIBGRPC++_ALTS_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) -lgrpc++ -lgrpc -lgpr -laddress_sorting -lupb +else + $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,libgrpc++_alts.so.1 -o $(LIBDIR)/$(CONFIG)/libgrpc++_alts$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(LIBGRPC++_ALTS_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) -lgrpc++ -lgrpc -lgpr -laddress_sorting -lupb + $(Q) ln -sf $(SHARED_PREFIX)grpc++_alts$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(LIBDIR)/$(CONFIG)/libgrpc++_alts$(SHARED_VERSION_CPP).so.1 + $(Q) ln -sf $(SHARED_PREFIX)grpc++_alts$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(LIBDIR)/$(CONFIG)/libgrpc++_alts$(SHARED_VERSION_CPP).so +endif +endif + +endif + +endif + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(LIBGRPC++_ALTS_OBJS:.o=.dep) +endif +endif + + +LIBGRPC++_ERROR_DETAILS_SRC = \ + $(GENDIR)/src/proto/grpc/status/status.pb.cc $(GENDIR)/src/proto/grpc/status/status.grpc.pb.cc \ + src/cpp/util/error_details.cc \ + +PUBLIC_HEADERS_CXX += \ + include/grpc++/support/error_details.h \ + include/grpcpp/support/error_details.h \ + include/grpcpp/support/error_details_impl.h \ + +LIBGRPC++_ERROR_DETAILS_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBGRPC++_ERROR_DETAILS_SRC)))) + + +ifeq ($(NO_SECURE),true) + +# You can't build secure libraries if you don't have OpenSSL. + +$(LIBDIR)/$(CONFIG)/libgrpc++_error_details.a: openssl_dep_error + +$(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)grpc++_error_details$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP): openssl_dep_error + +else + +ifeq ($(NO_PROTOBUF),true) + +# You can't build a C++ library if you don't have protobuf - a bit overreached, but still okay. + +$(LIBDIR)/$(CONFIG)/libgrpc++_error_details.a: protobuf_dep_error + +$(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)grpc++_error_details$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP): protobuf_dep_error + +else + +$(LIBDIR)/$(CONFIG)/libgrpc++_error_details.a: $(ZLIB_DEP) $(OPENSSL_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(PROTOBUF_DEP) $(LIBGRPC++_ERROR_DETAILS_OBJS) + $(E) "[AR] Creating $@" + $(Q) mkdir -p `dirname $@` + $(Q) rm -f $(LIBDIR)/$(CONFIG)/libgrpc++_error_details.a + $(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libgrpc++_error_details.a $(LIBGRPC++_ERROR_DETAILS_OBJS) +ifeq ($(SYSTEM),Darwin) + $(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libgrpc++_error_details.a +endif + + + +ifeq ($(SYSTEM),MINGW32) +$(LIBDIR)/$(CONFIG)/grpc++_error_details$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP): $(LIBGRPC++_ERROR_DETAILS_OBJS) $(ZLIB_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(PROTOBUF_DEP) $(LIBDIR)/$(CONFIG)/grpc++$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(LIBDIR)/$(CONFIG)/grpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/gpr$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/address_sorting$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/upb$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(OPENSSL_DEP) + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,--output-def=$(LIBDIR)/$(CONFIG)/grpc++_error_details$(SHARED_VERSION_CPP).def -Wl,--out-implib=$(LIBDIR)/$(CONFIG)/libgrpc++_error_details$(SHARED_VERSION_CPP)-dll.a -o $(LIBDIR)/$(CONFIG)/grpc++_error_details$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(LIBGRPC++_ERROR_DETAILS_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) -lgrpc++$(SHARED_VERSION_CPP)-dll -lgrpc$(SHARED_VERSION_CORE)-dll -lgpr$(SHARED_VERSION_CORE)-dll -laddress_sorting$(SHARED_VERSION_CORE)-dll -lupb$(SHARED_VERSION_CORE)-dll +else +$(LIBDIR)/$(CONFIG)/libgrpc++_error_details$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP): $(LIBGRPC++_ERROR_DETAILS_OBJS) $(ZLIB_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(PROTOBUF_DEP) $(LIBDIR)/$(CONFIG)/libgrpc++.$(SHARED_EXT_CPP) $(LIBDIR)/$(CONFIG)/libgrpc.$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libgpr.$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libaddress_sorting.$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libupb.$(SHARED_EXT_CORE) $(OPENSSL_DEP) + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` +ifeq ($(SYSTEM),Darwin) + $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -install_name $(SHARED_PREFIX)grpc++_error_details$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) -dynamiclib -o $(LIBDIR)/$(CONFIG)/libgrpc++_error_details$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(LIBGRPC++_ERROR_DETAILS_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) -lgrpc++ -lgrpc -lgpr -laddress_sorting -lupb +else + $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,libgrpc++_error_details.so.1 -o $(LIBDIR)/$(CONFIG)/libgrpc++_error_details$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(LIBGRPC++_ERROR_DETAILS_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) -lgrpc++ -lgrpc -lgpr -laddress_sorting -lupb + $(Q) ln -sf $(SHARED_PREFIX)grpc++_error_details$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(LIBDIR)/$(CONFIG)/libgrpc++_error_details$(SHARED_VERSION_CPP).so.1 + $(Q) ln -sf $(SHARED_PREFIX)grpc++_error_details$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(LIBDIR)/$(CONFIG)/libgrpc++_error_details$(SHARED_VERSION_CPP).so +endif +endif + +endif + +endif + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(LIBGRPC++_ERROR_DETAILS_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/src/cpp/util/error_details.o: $(GENDIR)/src/proto/grpc/status/status.pb.cc $(GENDIR)/src/proto/grpc/status/status.grpc.pb.cc + + +LIBGRPC++_REFLECTION_SRC = \ + $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.pb.cc $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.cc \ + src/cpp/ext/proto_server_reflection.cc \ + src/cpp/ext/proto_server_reflection_plugin.cc \ + +PUBLIC_HEADERS_CXX += \ + include/grpc++/ext/proto_server_reflection_plugin.h \ + include/grpcpp/ext/proto_server_reflection_plugin.h \ + include/grpcpp/ext/proto_server_reflection_plugin_impl.h \ + +LIBGRPC++_REFLECTION_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBGRPC++_REFLECTION_SRC)))) + + +ifeq ($(NO_SECURE),true) + +# You can't build secure libraries if you don't have OpenSSL. + +$(LIBDIR)/$(CONFIG)/libgrpc++_reflection.a: openssl_dep_error + +$(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)grpc++_reflection$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP): openssl_dep_error + +else + +ifeq ($(NO_PROTOBUF),true) + +# You can't build a C++ library if you don't have protobuf - a bit overreached, but still okay. + +$(LIBDIR)/$(CONFIG)/libgrpc++_reflection.a: protobuf_dep_error + +$(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)grpc++_reflection$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP): protobuf_dep_error + +else + +$(LIBDIR)/$(CONFIG)/libgrpc++_reflection.a: $(ZLIB_DEP) $(OPENSSL_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(PROTOBUF_DEP) $(LIBGRPC++_REFLECTION_OBJS) + $(E) "[AR] Creating $@" + $(Q) mkdir -p `dirname $@` + $(Q) rm -f $(LIBDIR)/$(CONFIG)/libgrpc++_reflection.a + $(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libgrpc++_reflection.a $(LIBGRPC++_REFLECTION_OBJS) +ifeq ($(SYSTEM),Darwin) + $(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libgrpc++_reflection.a +endif + + + +ifeq ($(SYSTEM),MINGW32) +$(LIBDIR)/$(CONFIG)/grpc++_reflection$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP): $(LIBGRPC++_REFLECTION_OBJS) $(ZLIB_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(PROTOBUF_DEP) $(LIBDIR)/$(CONFIG)/grpc++$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(LIBDIR)/$(CONFIG)/grpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/gpr$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/address_sorting$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/upb$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(OPENSSL_DEP) + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,--output-def=$(LIBDIR)/$(CONFIG)/grpc++_reflection$(SHARED_VERSION_CPP).def -Wl,--out-implib=$(LIBDIR)/$(CONFIG)/libgrpc++_reflection$(SHARED_VERSION_CPP)-dll.a -o $(LIBDIR)/$(CONFIG)/grpc++_reflection$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(LIBGRPC++_REFLECTION_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) -lgrpc++$(SHARED_VERSION_CPP)-dll -lgrpc$(SHARED_VERSION_CORE)-dll -lgpr$(SHARED_VERSION_CORE)-dll -laddress_sorting$(SHARED_VERSION_CORE)-dll -lupb$(SHARED_VERSION_CORE)-dll +else +$(LIBDIR)/$(CONFIG)/libgrpc++_reflection$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP): $(LIBGRPC++_REFLECTION_OBJS) $(ZLIB_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(PROTOBUF_DEP) $(LIBDIR)/$(CONFIG)/libgrpc++.$(SHARED_EXT_CPP) $(LIBDIR)/$(CONFIG)/libgrpc.$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libgpr.$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libaddress_sorting.$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libupb.$(SHARED_EXT_CORE) $(OPENSSL_DEP) + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` +ifeq ($(SYSTEM),Darwin) + $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -install_name $(SHARED_PREFIX)grpc++_reflection$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) -dynamiclib -o $(LIBDIR)/$(CONFIG)/libgrpc++_reflection$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(LIBGRPC++_REFLECTION_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) -lgrpc++ -lgrpc -lgpr -laddress_sorting -lupb +else + $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,libgrpc++_reflection.so.1 -o $(LIBDIR)/$(CONFIG)/libgrpc++_reflection$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(LIBGRPC++_REFLECTION_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) -lgrpc++ -lgrpc -lgpr -laddress_sorting -lupb + $(Q) ln -sf $(SHARED_PREFIX)grpc++_reflection$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(LIBDIR)/$(CONFIG)/libgrpc++_reflection$(SHARED_VERSION_CPP).so.1 + $(Q) ln -sf $(SHARED_PREFIX)grpc++_reflection$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(LIBDIR)/$(CONFIG)/libgrpc++_reflection$(SHARED_VERSION_CPP).so +endif +endif + +endif + +endif + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(LIBGRPC++_REFLECTION_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/src/cpp/ext/proto_server_reflection.o: $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.pb.cc $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/src/cpp/ext/proto_server_reflection_plugin.o: $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.pb.cc $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.cc + + +LIBGRPC++_TEST_SRC = \ + src/cpp/client/channel_test_peer.cc \ + +PUBLIC_HEADERS_CXX += \ + include/grpc++/test/mock_stream.h \ + include/grpc++/test/server_context_test_spouse.h \ + include/grpcpp/test/channel_test_peer.h \ + include/grpcpp/test/default_reactor_test_peer.h \ + include/grpcpp/test/mock_stream.h \ + include/grpcpp/test/server_context_test_spouse.h \ + +LIBGRPC++_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBGRPC++_TEST_SRC)))) + + +ifeq ($(NO_SECURE),true) + +# You can't build secure libraries if you don't have OpenSSL. + +$(LIBDIR)/$(CONFIG)/libgrpc++_test.a: openssl_dep_error + + +else + +ifeq ($(NO_PROTOBUF),true) + +# You can't build a C++ library if you don't have protobuf - a bit overreached, but still okay. + +$(LIBDIR)/$(CONFIG)/libgrpc++_test.a: protobuf_dep_error + + +else + +$(LIBDIR)/$(CONFIG)/libgrpc++_test.a: $(ZLIB_DEP) $(OPENSSL_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(PROTOBUF_DEP) $(LIBGRPC++_TEST_OBJS) + $(E) "[AR] Creating $@" + $(Q) mkdir -p `dirname $@` + $(Q) rm -f $(LIBDIR)/$(CONFIG)/libgrpc++_test.a + $(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libgrpc++_test.a $(LIBGRPC++_TEST_OBJS) +ifeq ($(SYSTEM),Darwin) + $(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libgrpc++_test.a +endif + + + + +endif + +endif + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(LIBGRPC++_TEST_OBJS:.o=.dep) +endif +endif + + +LIBGRPC++_TEST_CONFIG_SRC = \ + test/cpp/util/test_config_cc.cc \ + +PUBLIC_HEADERS_CXX += \ + +LIBGRPC++_TEST_CONFIG_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBGRPC++_TEST_CONFIG_SRC)))) + + +ifeq ($(NO_SECURE),true) + +# You can't build secure libraries if you don't have OpenSSL. + +$(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a: openssl_dep_error + + +else + +ifeq ($(NO_PROTOBUF),true) + +# You can't build a C++ library if you don't have protobuf - a bit overreached, but still okay. + +$(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a: protobuf_dep_error + + +else + +$(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a: $(ZLIB_DEP) $(OPENSSL_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(PROTOBUF_DEP) $(LIBGRPC++_TEST_CONFIG_OBJS) + $(E) "[AR] Creating $@" + $(Q) mkdir -p `dirname $@` + $(Q) rm -f $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a + $(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBGRPC++_TEST_CONFIG_OBJS) +ifeq ($(SYSTEM),Darwin) + $(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a +endif + + + + +endif + +endif + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(LIBGRPC++_TEST_CONFIG_OBJS:.o=.dep) +endif +endif + + +LIBGRPC++_TEST_UTIL_SRC = \ + test/core/end2end/data/client_certs.cc \ + test/core/end2end/data/server1_cert.cc \ + test/core/end2end/data/server1_key.cc \ + test/core/end2end/data/test_root_cert.cc \ + test/cpp/util/byte_buffer_proto_helper.cc \ + test/cpp/util/create_test_channel.cc \ + test/cpp/util/string_ref_helper.cc \ + test/cpp/util/subprocess.cc \ + test/cpp/util/test_credentials_provider.cc \ + +PUBLIC_HEADERS_CXX += \ + +LIBGRPC++_TEST_UTIL_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBGRPC++_TEST_UTIL_SRC)))) + + +ifeq ($(NO_SECURE),true) + +# You can't build secure libraries if you don't have OpenSSL. + +$(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a: openssl_dep_error + + +else + +ifeq ($(NO_PROTOBUF),true) + +# You can't build a C++ library if you don't have protobuf - a bit overreached, but still okay. + +$(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a: protobuf_dep_error + + +else + +$(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a: $(ZLIB_DEP) $(OPENSSL_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(PROTOBUF_DEP) $(LIBGRPC++_TEST_UTIL_OBJS) + $(E) "[AR] Creating $@" + $(Q) mkdir -p `dirname $@` + $(Q) rm -f $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a + $(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBGRPC++_TEST_UTIL_OBJS) +ifeq ($(SYSTEM),Darwin) + $(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a +endif + + + + +endif + +endif + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(LIBGRPC++_TEST_UTIL_OBJS:.o=.dep) +endif +endif + + +LIBGRPC++_UNSECURE_SRC = \ + src/cpp/client/channel_cc.cc \ + src/cpp/client/client_context.cc \ + src/cpp/client/client_interceptor.cc \ + src/cpp/client/create_channel.cc \ + src/cpp/client/create_channel_internal.cc \ + src/cpp/client/create_channel_posix.cc \ + src/cpp/client/credentials_cc.cc \ + src/cpp/client/insecure_credentials.cc \ + src/cpp/codegen/codegen_init.cc \ + src/cpp/common/alarm.cc \ + src/cpp/common/channel_arguments.cc \ + src/cpp/common/channel_filter.cc \ + src/cpp/common/completion_queue_cc.cc \ + src/cpp/common/core_codegen.cc \ + src/cpp/common/insecure_create_auth_context.cc \ + src/cpp/common/resource_quota_cc.cc \ + src/cpp/common/rpc_method.cc \ + src/cpp/common/validate_service_config.cc \ + src/cpp/common/version_cc.cc \ + src/cpp/server/async_generic_service.cc \ + src/cpp/server/channel_argument_option.cc \ + src/cpp/server/create_default_thread_pool.cc \ + src/cpp/server/dynamic_thread_pool.cc \ + src/cpp/server/external_connection_acceptor_impl.cc \ + src/cpp/server/health/default_health_check_service.cc \ + src/cpp/server/health/health_check_service.cc \ + src/cpp/server/health/health_check_service_server_builder_option.cc \ + src/cpp/server/insecure_server_credentials.cc \ + src/cpp/server/server_builder.cc \ + src/cpp/server/server_callback.cc \ + src/cpp/server/server_cc.cc \ + src/cpp/server/server_context.cc \ + src/cpp/server/server_credentials.cc \ + src/cpp/server/server_posix.cc \ + src/cpp/thread_manager/thread_manager.cc \ + src/cpp/util/byte_buffer_cc.cc \ + src/cpp/util/status.cc \ + src/cpp/util/string_ref.cc \ + src/cpp/util/time_cc.cc \ + +PUBLIC_HEADERS_CXX += \ + include/grpc++/alarm.h \ + include/grpc++/channel.h \ + include/grpc++/client_context.h \ + include/grpc++/completion_queue.h \ + include/grpc++/create_channel.h \ + include/grpc++/create_channel_posix.h \ + include/grpc++/ext/health_check_service_server_builder_option.h \ + include/grpc++/generic/async_generic_service.h \ + include/grpc++/generic/generic_stub.h \ + include/grpc++/grpc++.h \ + include/grpc++/health_check_service_interface.h \ + include/grpc++/impl/call.h \ + include/grpc++/impl/channel_argument_option.h \ + include/grpc++/impl/client_unary_call.h \ + include/grpc++/impl/codegen/async_stream.h \ + include/grpc++/impl/codegen/async_unary_call.h \ + include/grpc++/impl/codegen/byte_buffer.h \ + include/grpc++/impl/codegen/call.h \ + include/grpc++/impl/codegen/call_hook.h \ + include/grpc++/impl/codegen/channel_interface.h \ + include/grpc++/impl/codegen/client_context.h \ + include/grpc++/impl/codegen/client_unary_call.h \ + include/grpc++/impl/codegen/completion_queue.h \ + include/grpc++/impl/codegen/completion_queue_tag.h \ + include/grpc++/impl/codegen/config.h \ + include/grpc++/impl/codegen/config_protobuf.h \ + include/grpc++/impl/codegen/core_codegen.h \ + include/grpc++/impl/codegen/core_codegen_interface.h \ + include/grpc++/impl/codegen/create_auth_context.h \ + include/grpc++/impl/codegen/grpc_library.h \ + include/grpc++/impl/codegen/metadata_map.h \ + include/grpc++/impl/codegen/method_handler_impl.h \ + include/grpc++/impl/codegen/proto_utils.h \ + include/grpc++/impl/codegen/rpc_method.h \ + include/grpc++/impl/codegen/rpc_service_method.h \ + include/grpc++/impl/codegen/security/auth_context.h \ + include/grpc++/impl/codegen/serialization_traits.h \ + include/grpc++/impl/codegen/server_context.h \ + include/grpc++/impl/codegen/server_interface.h \ + include/grpc++/impl/codegen/service_type.h \ + include/grpc++/impl/codegen/slice.h \ + include/grpc++/impl/codegen/status.h \ + include/grpc++/impl/codegen/status_code_enum.h \ + include/grpc++/impl/codegen/string_ref.h \ + include/grpc++/impl/codegen/stub_options.h \ + include/grpc++/impl/codegen/sync_stream.h \ + include/grpc++/impl/codegen/time.h \ + include/grpc++/impl/grpc_library.h \ + include/grpc++/impl/method_handler_impl.h \ + include/grpc++/impl/rpc_method.h \ + include/grpc++/impl/rpc_service_method.h \ + include/grpc++/impl/serialization_traits.h \ + include/grpc++/impl/server_builder_option.h \ + include/grpc++/impl/server_builder_plugin.h \ + include/grpc++/impl/server_initializer.h \ + include/grpc++/impl/service_type.h \ + include/grpc++/resource_quota.h \ + include/grpc++/security/auth_context.h \ + include/grpc++/security/auth_metadata_processor.h \ + include/grpc++/security/credentials.h \ + include/grpc++/security/server_credentials.h \ + include/grpc++/server.h \ + include/grpc++/server_builder.h \ + include/grpc++/server_context.h \ + include/grpc++/server_posix.h \ + include/grpc++/support/async_stream.h \ + include/grpc++/support/async_unary_call.h \ + include/grpc++/support/byte_buffer.h \ + include/grpc++/support/channel_arguments.h \ + include/grpc++/support/config.h \ + include/grpc++/support/slice.h \ + include/grpc++/support/status.h \ + include/grpc++/support/status_code_enum.h \ + include/grpc++/support/string_ref.h \ + include/grpc++/support/stub_options.h \ + include/grpc++/support/sync_stream.h \ + include/grpc++/support/time.h \ + include/grpcpp/alarm.h \ + include/grpcpp/alarm_impl.h \ + include/grpcpp/channel.h \ + include/grpcpp/channel_impl.h \ + include/grpcpp/client_context.h \ + include/grpcpp/completion_queue.h \ + include/grpcpp/completion_queue_impl.h \ + include/grpcpp/create_channel.h \ + include/grpcpp/create_channel_impl.h \ + include/grpcpp/create_channel_posix.h \ + include/grpcpp/create_channel_posix_impl.h \ + include/grpcpp/ext/health_check_service_server_builder_option.h \ + include/grpcpp/generic/async_generic_service.h \ + include/grpcpp/generic/generic_stub.h \ + include/grpcpp/generic/generic_stub_impl.h \ + include/grpcpp/grpcpp.h \ + include/grpcpp/health_check_service_interface.h \ + include/grpcpp/health_check_service_interface_impl.h \ + include/grpcpp/impl/call.h \ + include/grpcpp/impl/channel_argument_option.h \ + include/grpcpp/impl/client_unary_call.h \ + include/grpcpp/impl/codegen/async_generic_service.h \ + include/grpcpp/impl/codegen/async_stream.h \ + include/grpcpp/impl/codegen/async_stream_impl.h \ + include/grpcpp/impl/codegen/async_unary_call.h \ + include/grpcpp/impl/codegen/async_unary_call_impl.h \ + include/grpcpp/impl/codegen/byte_buffer.h \ + include/grpcpp/impl/codegen/call.h \ + include/grpcpp/impl/codegen/call_hook.h \ + include/grpcpp/impl/codegen/call_op_set.h \ + include/grpcpp/impl/codegen/call_op_set_interface.h \ + include/grpcpp/impl/codegen/callback_common.h \ + include/grpcpp/impl/codegen/channel_interface.h \ + include/grpcpp/impl/codegen/client_callback.h \ + include/grpcpp/impl/codegen/client_callback_impl.h \ + include/grpcpp/impl/codegen/client_context.h \ + include/grpcpp/impl/codegen/client_context_impl.h \ + include/grpcpp/impl/codegen/client_interceptor.h \ + include/grpcpp/impl/codegen/client_unary_call.h \ + include/grpcpp/impl/codegen/completion_queue.h \ + include/grpcpp/impl/codegen/completion_queue_impl.h \ + include/grpcpp/impl/codegen/completion_queue_tag.h \ + include/grpcpp/impl/codegen/config.h \ + include/grpcpp/impl/codegen/config_protobuf.h \ + include/grpcpp/impl/codegen/core_codegen.h \ + include/grpcpp/impl/codegen/core_codegen_interface.h \ + include/grpcpp/impl/codegen/create_auth_context.h \ + include/grpcpp/impl/codegen/delegating_channel.h \ + include/grpcpp/impl/codegen/grpc_library.h \ + include/grpcpp/impl/codegen/intercepted_channel.h \ + include/grpcpp/impl/codegen/interceptor.h \ + include/grpcpp/impl/codegen/interceptor_common.h \ + include/grpcpp/impl/codegen/message_allocator.h \ + include/grpcpp/impl/codegen/metadata_map.h \ + include/grpcpp/impl/codegen/method_handler.h \ + include/grpcpp/impl/codegen/method_handler_impl.h \ + include/grpcpp/impl/codegen/proto_buffer_reader.h \ + include/grpcpp/impl/codegen/proto_buffer_writer.h \ + include/grpcpp/impl/codegen/proto_utils.h \ + include/grpcpp/impl/codegen/rpc_method.h \ + include/grpcpp/impl/codegen/rpc_service_method.h \ + include/grpcpp/impl/codegen/security/auth_context.h \ + include/grpcpp/impl/codegen/serialization_traits.h \ + include/grpcpp/impl/codegen/server_callback.h \ + include/grpcpp/impl/codegen/server_callback_handlers.h \ + include/grpcpp/impl/codegen/server_callback_impl.h \ + include/grpcpp/impl/codegen/server_context.h \ + include/grpcpp/impl/codegen/server_context_impl.h \ + include/grpcpp/impl/codegen/server_interceptor.h \ + include/grpcpp/impl/codegen/server_interface.h \ + include/grpcpp/impl/codegen/service_type.h \ + include/grpcpp/impl/codegen/slice.h \ + include/grpcpp/impl/codegen/status.h \ + include/grpcpp/impl/codegen/status_code_enum.h \ + include/grpcpp/impl/codegen/string_ref.h \ + include/grpcpp/impl/codegen/stub_options.h \ + include/grpcpp/impl/codegen/sync.h \ + include/grpcpp/impl/codegen/sync_stream.h \ + include/grpcpp/impl/codegen/sync_stream_impl.h \ + include/grpcpp/impl/codegen/time.h \ + include/grpcpp/impl/grpc_library.h \ + include/grpcpp/impl/method_handler_impl.h \ + include/grpcpp/impl/rpc_method.h \ + include/grpcpp/impl/rpc_service_method.h \ + include/grpcpp/impl/serialization_traits.h \ + include/grpcpp/impl/server_builder_option.h \ + include/grpcpp/impl/server_builder_option_impl.h \ + include/grpcpp/impl/server_builder_plugin.h \ + include/grpcpp/impl/server_initializer.h \ + include/grpcpp/impl/server_initializer_impl.h \ + include/grpcpp/impl/service_type.h \ + include/grpcpp/resource_quota.h \ + include/grpcpp/resource_quota_impl.h \ + include/grpcpp/security/auth_context.h \ + include/grpcpp/security/auth_metadata_processor.h \ + include/grpcpp/security/auth_metadata_processor_impl.h \ + include/grpcpp/security/credentials.h \ + include/grpcpp/security/credentials_impl.h \ + include/grpcpp/security/server_credentials.h \ + include/grpcpp/security/server_credentials_impl.h \ + include/grpcpp/security/tls_credentials_options.h \ + include/grpcpp/server.h \ + include/grpcpp/server_builder.h \ + include/grpcpp/server_builder_impl.h \ + include/grpcpp/server_context.h \ + include/grpcpp/server_impl.h \ + include/grpcpp/server_posix.h \ + include/grpcpp/server_posix_impl.h \ + include/grpcpp/support/async_stream.h \ + include/grpcpp/support/async_stream_impl.h \ + include/grpcpp/support/async_unary_call.h \ + include/grpcpp/support/async_unary_call_impl.h \ + include/grpcpp/support/byte_buffer.h \ + include/grpcpp/support/channel_arguments.h \ + include/grpcpp/support/channel_arguments_impl.h \ + include/grpcpp/support/client_callback.h \ + include/grpcpp/support/client_callback_impl.h \ + include/grpcpp/support/client_interceptor.h \ + include/grpcpp/support/config.h \ + include/grpcpp/support/interceptor.h \ + include/grpcpp/support/message_allocator.h \ + include/grpcpp/support/method_handler.h \ + include/grpcpp/support/proto_buffer_reader.h \ + include/grpcpp/support/proto_buffer_writer.h \ + include/grpcpp/support/server_callback.h \ + include/grpcpp/support/server_callback_impl.h \ + include/grpcpp/support/server_interceptor.h \ + include/grpcpp/support/slice.h \ + include/grpcpp/support/status.h \ + include/grpcpp/support/status_code_enum.h \ + include/grpcpp/support/string_ref.h \ + include/grpcpp/support/stub_options.h \ + include/grpcpp/support/sync_stream.h \ + include/grpcpp/support/sync_stream_impl.h \ + include/grpcpp/support/time.h \ + include/grpcpp/support/validate_service_config.h \ + +LIBGRPC++_UNSECURE_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBGRPC++_UNSECURE_SRC)))) + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build a C++ library if you don't have protobuf - a bit overreached, but still okay. + +$(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a: protobuf_dep_error + +$(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)grpc++_unsecure$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP): protobuf_dep_error + +else + +$(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a: $(ZLIB_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(PROTOBUF_DEP) $(LIBGRPC++_UNSECURE_OBJS) $(LIBGPR_OBJS) $(LIBGRPC_ABSEIL_OBJS) $(ZLIB_MERGE_OBJS) $(CARES_MERGE_OBJS) $(ADDRESS_SORTING_MERGE_OBJS) $(UPB_MERGE_OBJS) + $(E) "[AR] Creating $@" + $(Q) mkdir -p `dirname $@` + $(Q) rm -f $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a + $(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBGRPC++_UNSECURE_OBJS) $(LIBGPR_OBJS) $(LIBGRPC_ABSEIL_OBJS) $(ZLIB_MERGE_OBJS) $(CARES_MERGE_OBJS) $(ADDRESS_SORTING_MERGE_OBJS) $(UPB_MERGE_OBJS) +ifeq ($(SYSTEM),Darwin) + $(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a +endif + + + +ifeq ($(SYSTEM),MINGW32) +$(LIBDIR)/$(CONFIG)/grpc++_unsecure$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP): $(LIBGRPC++_UNSECURE_OBJS) $(ZLIB_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(PROTOBUF_DEP) $(LIBDIR)/$(CONFIG)/grpc_unsecure$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/gpr$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/address_sorting$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/upb$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,--output-def=$(LIBDIR)/$(CONFIG)/grpc++_unsecure$(SHARED_VERSION_CPP).def -Wl,--out-implib=$(LIBDIR)/$(CONFIG)/libgrpc++_unsecure$(SHARED_VERSION_CPP)-dll.a -o $(LIBDIR)/$(CONFIG)/grpc++_unsecure$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(LIBGRPC++_UNSECURE_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) -lgrpc_unsecure$(SHARED_VERSION_CORE)-dll -lgpr$(SHARED_VERSION_CORE)-dll -laddress_sorting$(SHARED_VERSION_CORE)-dll -lupb$(SHARED_VERSION_CORE)-dll +else +$(LIBDIR)/$(CONFIG)/libgrpc++_unsecure$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP): $(LIBGRPC++_UNSECURE_OBJS) $(ZLIB_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(PROTOBUF_DEP) $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libgpr.$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libaddress_sorting.$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libupb.$(SHARED_EXT_CORE) + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` +ifeq ($(SYSTEM),Darwin) + $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -install_name $(SHARED_PREFIX)grpc++_unsecure$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) -dynamiclib -o $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(LIBGRPC++_UNSECURE_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) -lgrpc_unsecure -lgpr -laddress_sorting -lupb +else + $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,libgrpc++_unsecure.so.1 -o $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(LIBGRPC++_UNSECURE_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) -lgrpc_unsecure -lgpr -laddress_sorting -lupb + $(Q) ln -sf $(SHARED_PREFIX)grpc++_unsecure$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure$(SHARED_VERSION_CPP).so.1 + $(Q) ln -sf $(SHARED_PREFIX)grpc++_unsecure$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure$(SHARED_VERSION_CPP).so +endif +endif + +endif + +ifneq ($(NO_DEPS),true) +-include $(LIBGRPC++_UNSECURE_OBJS:.o=.dep) +endif + + +LIBGRPC_PLUGIN_SUPPORT_SRC = \ + src/compiler/cpp_generator.cc \ + src/compiler/csharp_generator.cc \ + src/compiler/node_generator.cc \ + src/compiler/objective_c_generator.cc \ + src/compiler/php_generator.cc \ + src/compiler/python_generator.cc \ + src/compiler/ruby_generator.cc \ + +PUBLIC_HEADERS_CXX += \ + include/grpc++/impl/codegen/config_protobuf.h \ + include/grpcpp/impl/codegen/config_protobuf.h \ + +LIBGRPC_PLUGIN_SUPPORT_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBGRPC_PLUGIN_SUPPORT_SRC)))) + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build a C++ library if you don't have protobuf - a bit overreached, but still okay. + +$(LIBDIR)/$(CONFIG)/libgrpc_plugin_support.a: protobuf_dep_error + + +else + +$(LIBDIR)/$(CONFIG)/libgrpc_plugin_support.a: $(ZLIB_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(PROTOBUF_DEP) $(LIBGRPC_PLUGIN_SUPPORT_OBJS) + $(E) "[AR] Creating $@" + $(Q) mkdir -p `dirname $@` + $(Q) rm -f $(LIBDIR)/$(CONFIG)/libgrpc_plugin_support.a + $(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libgrpc_plugin_support.a $(LIBGRPC_PLUGIN_SUPPORT_OBJS) +ifeq ($(SYSTEM),Darwin) + $(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libgrpc_plugin_support.a +endif + + + + +endif + +ifneq ($(NO_DEPS),true) +-include $(LIBGRPC_PLUGIN_SUPPORT_OBJS:.o=.dep) +endif + + +LIBGRPCPP_CHANNELZ_SRC = \ + $(GENDIR)/src/proto/grpc/channelz/channelz.pb.cc $(GENDIR)/src/proto/grpc/channelz/channelz.grpc.pb.cc \ + src/cpp/server/channelz/channelz_service.cc \ + src/cpp/server/channelz/channelz_service_plugin.cc \ + +PUBLIC_HEADERS_CXX += \ + include/grpcpp/ext/channelz_service_plugin.h \ + include/grpcpp/ext/channelz_service_plugin_impl.h \ + +LIBGRPCPP_CHANNELZ_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBGRPCPP_CHANNELZ_SRC)))) + + +ifeq ($(NO_SECURE),true) + +# You can't build secure libraries if you don't have OpenSSL. + +$(LIBDIR)/$(CONFIG)/libgrpcpp_channelz.a: openssl_dep_error + +$(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)grpcpp_channelz$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP): openssl_dep_error + +else + +ifeq ($(NO_PROTOBUF),true) + +# You can't build a C++ library if you don't have protobuf - a bit overreached, but still okay. + +$(LIBDIR)/$(CONFIG)/libgrpcpp_channelz.a: protobuf_dep_error + +$(LIBDIR)/$(CONFIG)/$(SHARED_PREFIX)grpcpp_channelz$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP): protobuf_dep_error + +else + +$(LIBDIR)/$(CONFIG)/libgrpcpp_channelz.a: $(ZLIB_DEP) $(OPENSSL_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(PROTOBUF_DEP) $(LIBGRPCPP_CHANNELZ_OBJS) + $(E) "[AR] Creating $@" + $(Q) mkdir -p `dirname $@` + $(Q) rm -f $(LIBDIR)/$(CONFIG)/libgrpcpp_channelz.a + $(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libgrpcpp_channelz.a $(LIBGRPCPP_CHANNELZ_OBJS) +ifeq ($(SYSTEM),Darwin) + $(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libgrpcpp_channelz.a +endif + + + +ifeq ($(SYSTEM),MINGW32) +$(LIBDIR)/$(CONFIG)/grpcpp_channelz$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP): $(LIBGRPCPP_CHANNELZ_OBJS) $(ZLIB_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(PROTOBUF_DEP) $(LIBDIR)/$(CONFIG)/grpc++$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(LIBDIR)/$(CONFIG)/grpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/gpr$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/address_sorting$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/upb$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(OPENSSL_DEP) + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,--output-def=$(LIBDIR)/$(CONFIG)/grpcpp_channelz$(SHARED_VERSION_CPP).def -Wl,--out-implib=$(LIBDIR)/$(CONFIG)/libgrpcpp_channelz$(SHARED_VERSION_CPP)-dll.a -o $(LIBDIR)/$(CONFIG)/grpcpp_channelz$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(LIBGRPCPP_CHANNELZ_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) -lgrpc++$(SHARED_VERSION_CPP)-dll -lgrpc$(SHARED_VERSION_CORE)-dll -lgpr$(SHARED_VERSION_CORE)-dll -laddress_sorting$(SHARED_VERSION_CORE)-dll -lupb$(SHARED_VERSION_CORE)-dll +else +$(LIBDIR)/$(CONFIG)/libgrpcpp_channelz$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP): $(LIBGRPCPP_CHANNELZ_OBJS) $(ZLIB_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(PROTOBUF_DEP) $(LIBDIR)/$(CONFIG)/libgrpc++.$(SHARED_EXT_CPP) $(LIBDIR)/$(CONFIG)/libgrpc.$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libgpr.$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libaddress_sorting.$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libupb.$(SHARED_EXT_CORE) $(OPENSSL_DEP) + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` +ifeq ($(SYSTEM),Darwin) + $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -install_name $(SHARED_PREFIX)grpcpp_channelz$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) -dynamiclib -o $(LIBDIR)/$(CONFIG)/libgrpcpp_channelz$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(LIBGRPCPP_CHANNELZ_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) -lgrpc++ -lgrpc -lgpr -laddress_sorting -lupb +else + $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,libgrpcpp_channelz.so.1 -o $(LIBDIR)/$(CONFIG)/libgrpcpp_channelz$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(LIBGRPCPP_CHANNELZ_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) -lgrpc++ -lgrpc -lgpr -laddress_sorting -lupb + $(Q) ln -sf $(SHARED_PREFIX)grpcpp_channelz$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(LIBDIR)/$(CONFIG)/libgrpcpp_channelz$(SHARED_VERSION_CPP).so.1 + $(Q) ln -sf $(SHARED_PREFIX)grpcpp_channelz$(SHARED_VERSION_CPP).$(SHARED_EXT_CPP) $(LIBDIR)/$(CONFIG)/libgrpcpp_channelz$(SHARED_VERSION_CPP).so +endif +endif + +endif + +endif + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(LIBGRPCPP_CHANNELZ_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/src/cpp/server/channelz/channelz_service.o: $(GENDIR)/src/proto/grpc/channelz/channelz.pb.cc $(GENDIR)/src/proto/grpc/channelz/channelz.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/src/cpp/server/channelz/channelz_service_plugin.o: $(GENDIR)/src/proto/grpc/channelz/channelz.pb.cc $(GENDIR)/src/proto/grpc/channelz/channelz.grpc.pb.cc + + +LIBBORINGSSL_SRC = \ + third_party/boringssl-with-bazel/err_data.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_dup.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_i2d_fp.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_octet.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_print.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_utf8.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/asn1_par.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/f_string.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/time_support.c \ + third_party/boringssl-with-bazel/src/crypto/base64/base64.c \ + third_party/boringssl-with-bazel/src/crypto/bio/bio.c \ + third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.c \ + third_party/boringssl-with-bazel/src/crypto/bio/connect.c \ + third_party/boringssl-with-bazel/src/crypto/bio/fd.c \ + third_party/boringssl-with-bazel/src/crypto/bio/file.c \ + third_party/boringssl-with-bazel/src/crypto/bio/hexdump.c \ + third_party/boringssl-with-bazel/src/crypto/bio/pair.c \ + third_party/boringssl-with-bazel/src/crypto/bio/printf.c \ + third_party/boringssl-with-bazel/src/crypto/bio/socket.c \ + third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c \ + third_party/boringssl-with-bazel/src/crypto/bn_extra/bn_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/bn_extra/convert.c \ + third_party/boringssl-with-bazel/src/crypto/buf/buf.c \ + third_party/boringssl-with-bazel/src/crypto/bytestring/asn1_compat.c \ + third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c \ + third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.c \ + third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c \ + third_party/boringssl-with-bazel/src/crypto/bytestring/unicode.c \ + third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_extra.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/derive_key.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesccm.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesctrhmac.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesgcmsiv.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_chacha20poly1305.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_null.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc2.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc4.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c \ + third_party/boringssl-with-bazel/src/crypto/cmac/cmac.c \ + third_party/boringssl-with-bazel/src/crypto/conf/conf.c \ + third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-fuchsia.c \ + third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-linux.c \ + third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c \ + third_party/boringssl-with-bazel/src/crypto/cpu-arm.c \ + third_party/boringssl-with-bazel/src/crypto/cpu-intel.c \ + third_party/boringssl-with-bazel/src/crypto/cpu-ppc64le.c \ + third_party/boringssl-with-bazel/src/crypto/crypto.c \ + third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519.c \ + third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c \ + third_party/boringssl-with-bazel/src/crypto/dh/check.c \ + third_party/boringssl-with-bazel/src/crypto/dh/dh.c \ + third_party/boringssl-with-bazel/src/crypto/dh/dh_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/dh/params.c \ + third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c \ + third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c \ + third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_derive.c \ + third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c \ + third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_extra.c \ + third_party/boringssl-with-bazel/src/crypto/ecdsa_extra/ecdsa_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/engine/engine.c \ + third_party/boringssl-with-bazel/src/crypto/err/err.c \ + third_party/boringssl-with-bazel/src/crypto/evp/digestsign.c \ + third_party/boringssl-with-bazel/src/crypto/evp/evp.c \ + third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/evp/evp_ctx.c \ + third_party/boringssl-with-bazel/src/crypto/evp/p_dsa_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/evp/p_ec.c \ + third_party/boringssl-with-bazel/src/crypto/evp/p_ec_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519.c \ + third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/evp/p_rsa.c \ + third_party/boringssl-with-bazel/src/crypto/evp/p_rsa_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/evp/p_x25519.c \ + third_party/boringssl-with-bazel/src/crypto/evp/p_x25519_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/evp/pbkdf.c \ + third_party/boringssl-with-bazel/src/crypto/evp/print.c \ + third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c \ + third_party/boringssl-with-bazel/src/crypto/evp/sign.c \ + third_party/boringssl-with-bazel/src/crypto/ex_data.c \ + third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c \ + third_party/boringssl-with-bazel/src/crypto/fipsmodule/fips_shared_support.c \ + third_party/boringssl-with-bazel/src/crypto/fipsmodule/is_fips.c \ + third_party/boringssl-with-bazel/src/crypto/hkdf/hkdf.c \ + third_party/boringssl-with-bazel/src/crypto/hrss/hrss.c \ + third_party/boringssl-with-bazel/src/crypto/lhash/lhash.c \ + third_party/boringssl-with-bazel/src/crypto/mem.c \ + third_party/boringssl-with-bazel/src/crypto/obj/obj.c \ + third_party/boringssl-with-bazel/src/crypto/obj/obj_xref.c \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_all.c \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_info.c \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_oth.c \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_pk8.c \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_pkey.c \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_x509.c \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_xaux.c \ + third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c \ + third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c \ + third_party/boringssl-with-bazel/src/crypto/pkcs8/p5_pbev2.c \ + third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c \ + third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c \ + third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.c \ + third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm.c \ + third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_vec.c \ + third_party/boringssl-with-bazel/src/crypto/pool/pool.c \ + third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c \ + third_party/boringssl-with-bazel/src/crypto/rand_extra/forkunsafe.c \ + third_party/boringssl-with-bazel/src/crypto/rand_extra/fuchsia.c \ + third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c \ + third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c \ + third_party/boringssl-with-bazel/src/crypto/rc4/rc4.c \ + third_party/boringssl-with-bazel/src/crypto/refcount_c11.c \ + third_party/boringssl-with-bazel/src/crypto/refcount_lock.c \ + third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_print.c \ + third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c \ + third_party/boringssl-with-bazel/src/crypto/stack/stack.c \ + third_party/boringssl-with-bazel/src/crypto/thread.c \ + third_party/boringssl-with-bazel/src/crypto/thread_none.c \ + third_party/boringssl-with-bazel/src/crypto/thread_pthread.c \ + third_party/boringssl-with-bazel/src/crypto/thread_win.c \ + third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c \ + third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c \ + third_party/boringssl-with-bazel/src/crypto/x509/a_digest.c \ + third_party/boringssl-with-bazel/src/crypto/x509/a_sign.c \ + third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c \ + third_party/boringssl-with-bazel/src/crypto/x509/a_verify.c \ + third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c \ + third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c \ + third_party/boringssl-with-bazel/src/crypto/x509/by_dir.c \ + third_party/boringssl-with-bazel/src/crypto/x509/by_file.c \ + third_party/boringssl-with-bazel/src/crypto/x509/i2d_pr.c \ + third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c \ + third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c \ + third_party/boringssl-with-bazel/src/crypto/x509/t_req.c \ + third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c \ + third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_d2.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_def.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_r2x.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_txt.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509name.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509rset.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509spki.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_algor.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_all.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_exten.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_info.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_name.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_pkey.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_req.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_sig.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_spki.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_val.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_lib.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_node.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akeya.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bcons.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_crld.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_extku.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ia5.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_info.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_int.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ncons.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ocsp.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pci.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pcia.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pcons.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pku.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pmaps.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_sxnet.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c \ + third_party/boringssl-with-bazel/src/ssl/bio_ssl.cc \ + third_party/boringssl-with-bazel/src/ssl/d1_both.cc \ + third_party/boringssl-with-bazel/src/ssl/d1_lib.cc \ + third_party/boringssl-with-bazel/src/ssl/d1_pkt.cc \ + third_party/boringssl-with-bazel/src/ssl/d1_srtp.cc \ + third_party/boringssl-with-bazel/src/ssl/dtls_method.cc \ + third_party/boringssl-with-bazel/src/ssl/dtls_record.cc \ + third_party/boringssl-with-bazel/src/ssl/handoff.cc \ + third_party/boringssl-with-bazel/src/ssl/handshake.cc \ + third_party/boringssl-with-bazel/src/ssl/handshake_client.cc \ + third_party/boringssl-with-bazel/src/ssl/handshake_server.cc \ + third_party/boringssl-with-bazel/src/ssl/s3_both.cc \ + third_party/boringssl-with-bazel/src/ssl/s3_lib.cc \ + third_party/boringssl-with-bazel/src/ssl/s3_pkt.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_aead_ctx.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_buffer.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_file.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_session.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_stat.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc \ + third_party/boringssl-with-bazel/src/ssl/t1_enc.cc \ + third_party/boringssl-with-bazel/src/ssl/t1_lib.cc \ + third_party/boringssl-with-bazel/src/ssl/tls13_both.cc \ + third_party/boringssl-with-bazel/src/ssl/tls13_client.cc \ + third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc \ + third_party/boringssl-with-bazel/src/ssl/tls13_server.cc \ + third_party/boringssl-with-bazel/src/ssl/tls_method.cc \ + third_party/boringssl-with-bazel/src/ssl/tls_record.cc \ + +PUBLIC_HEADERS_C += \ + +LIBBORINGSSL_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_SRC)))) + +$(LIBBORINGSSL_OBJS): CPPFLAGS += -Ithird_party/boringssl-with-bazel/src/include -fvisibility=hidden -DOPENSSL_NO_ASM -D_GNU_SOURCE -DWIN32_LEAN_AND_MEAN -D_HAS_EXCEPTIONS=0 -DNOMINMAX +$(LIBBORINGSSL_OBJS): CXXFLAGS += -fno-exceptions +$(LIBBORINGSSL_OBJS): CFLAGS += -g + +$(LIBDIR)/$(CONFIG)/libboringssl.a: $(ZLIB_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(LIBBORINGSSL_OBJS) + $(E) "[AR] Creating $@" + $(Q) mkdir -p `dirname $@` + $(Q) rm -f $(LIBDIR)/$(CONFIG)/libboringssl.a + $(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libboringssl.a $(LIBBORINGSSL_OBJS) +ifeq ($(SYSTEM),Darwin) + $(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libboringssl.a +endif + + + + +ifneq ($(NO_DEPS),true) +-include $(LIBBORINGSSL_OBJS:.o=.dep) +endif + + +LIBBORINGSSL_TEST_UTIL_SRC = \ + third_party/boringssl-with-bazel/src/crypto/test/file_test.cc \ + third_party/boringssl-with-bazel/src/crypto/test/malloc.cc \ + third_party/boringssl-with-bazel/src/crypto/test/test_util.cc \ + third_party/boringssl-with-bazel/src/crypto/test/wycheproof_util.cc \ + +PUBLIC_HEADERS_CXX += \ + +LIBBORINGSSL_TEST_UTIL_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_TEST_UTIL_SRC)))) + +$(LIBBORINGSSL_TEST_UTIL_OBJS): CPPFLAGS += -Ithird_party/boringssl-with-bazel/src/include -fvisibility=hidden -DOPENSSL_NO_ASM -D_GNU_SOURCE -DWIN32_LEAN_AND_MEAN -D_HAS_EXCEPTIONS=0 -DNOMINMAX +$(LIBBORINGSSL_TEST_UTIL_OBJS): CXXFLAGS += -fno-exceptions +$(LIBBORINGSSL_TEST_UTIL_OBJS): CFLAGS += -g + +ifeq ($(NO_PROTOBUF),true) + +# You can't build a C++ library if you don't have protobuf - a bit overreached, but still okay. + +$(LIBDIR)/$(CONFIG)/libboringssl_test_util.a: protobuf_dep_error + + +else + +$(LIBDIR)/$(CONFIG)/libboringssl_test_util.a: $(ZLIB_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(PROTOBUF_DEP) $(LIBBORINGSSL_TEST_UTIL_OBJS) + $(E) "[AR] Creating $@" + $(Q) mkdir -p `dirname $@` + $(Q) rm -f $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a + $(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBBORINGSSL_TEST_UTIL_OBJS) +ifeq ($(SYSTEM),Darwin) + $(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a +endif + + + + +endif + +ifneq ($(NO_DEPS),true) +-include $(LIBBORINGSSL_TEST_UTIL_OBJS:.o=.dep) +endif + + +LIBBENCHMARK_SRC = \ + third_party/benchmark/src/benchmark.cc \ + third_party/benchmark/src/benchmark_api_internal.cc \ + third_party/benchmark/src/benchmark_main.cc \ + third_party/benchmark/src/benchmark_name.cc \ + third_party/benchmark/src/benchmark_register.cc \ + third_party/benchmark/src/benchmark_runner.cc \ + third_party/benchmark/src/colorprint.cc \ + third_party/benchmark/src/commandlineflags.cc \ + third_party/benchmark/src/complexity.cc \ + third_party/benchmark/src/console_reporter.cc \ + third_party/benchmark/src/counter.cc \ + third_party/benchmark/src/csv_reporter.cc \ + third_party/benchmark/src/json_reporter.cc \ + third_party/benchmark/src/reporter.cc \ + third_party/benchmark/src/sleep.cc \ + third_party/benchmark/src/statistics.cc \ + third_party/benchmark/src/string_util.cc \ + third_party/benchmark/src/sysinfo.cc \ + third_party/benchmark/src/timers.cc \ + +PUBLIC_HEADERS_CXX += \ + +LIBBENCHMARK_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBENCHMARK_SRC)))) + +$(LIBBENCHMARK_OBJS): CPPFLAGS += -Ithird_party/benchmark/include -DHAVE_POSIX_REGEX + +ifeq ($(NO_PROTOBUF),true) + +# You can't build a C++ library if you don't have protobuf - a bit overreached, but still okay. + +$(LIBDIR)/$(CONFIG)/libbenchmark.a: protobuf_dep_error + + +else + +$(LIBDIR)/$(CONFIG)/libbenchmark.a: $(ZLIB_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(PROTOBUF_DEP) $(LIBBENCHMARK_OBJS) + $(E) "[AR] Creating $@" + $(Q) mkdir -p `dirname $@` + $(Q) rm -f $(LIBDIR)/$(CONFIG)/libbenchmark.a + $(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libbenchmark.a $(LIBBENCHMARK_OBJS) +ifeq ($(SYSTEM),Darwin) + $(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libbenchmark.a +endif + + + + +endif + +ifneq ($(NO_DEPS),true) +-include $(LIBBENCHMARK_OBJS:.o=.dep) +endif + + +LIBUPB_SRC = \ + third_party/upb/upb/decode.c \ + third_party/upb/upb/encode.c \ + third_party/upb/upb/msg.c \ + third_party/upb/upb/port.c \ + third_party/upb/upb/table.c \ + third_party/upb/upb/upb.c \ + +PUBLIC_HEADERS_C += \ + +LIBUPB_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBUPB_SRC)))) + + +$(LIBDIR)/$(CONFIG)/libupb.a: $(LIBUPB_OBJS) + $(E) "[AR] Creating $@" + $(Q) mkdir -p `dirname $@` + $(Q) rm -f $(LIBDIR)/$(CONFIG)/libupb.a + $(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libupb.a $(LIBUPB_OBJS) +ifeq ($(SYSTEM),Darwin) + $(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libupb.a +endif + + + +ifeq ($(SYSTEM),MINGW32) +$(LIBDIR)/$(CONFIG)/upb$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE): $(LIBUPB_OBJS) $(ZLIB_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,--output-def=$(LIBDIR)/$(CONFIG)/upb$(SHARED_VERSION_CORE).def -Wl,--out-implib=$(LIBDIR)/$(CONFIG)/libupb$(SHARED_VERSION_CORE)-dll.a -o $(LIBDIR)/$(CONFIG)/upb$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBUPB_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS) +else +$(LIBDIR)/$(CONFIG)/libupb$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE): $(LIBUPB_OBJS) $(ZLIB_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` +ifeq ($(SYSTEM),Darwin) + $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -install_name $(SHARED_PREFIX)upb$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) -dynamiclib -o $(LIBDIR)/$(CONFIG)/libupb$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBUPB_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS) +else + $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,libupb.so.10 -o $(LIBDIR)/$(CONFIG)/libupb$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBUPB_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS) + $(Q) ln -sf $(SHARED_PREFIX)upb$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libupb$(SHARED_VERSION_CORE).so.10 + $(Q) ln -sf $(SHARED_PREFIX)upb$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libupb$(SHARED_VERSION_CORE).so +endif +endif + +ifneq ($(NO_DEPS),true) +-include $(LIBUPB_OBJS:.o=.dep) +endif + + +LIBZ_SRC = \ + third_party/zlib/adler32.c \ + third_party/zlib/compress.c \ + third_party/zlib/crc32.c \ + third_party/zlib/deflate.c \ + third_party/zlib/gzclose.c \ + third_party/zlib/gzlib.c \ + third_party/zlib/gzread.c \ + third_party/zlib/gzwrite.c \ + third_party/zlib/infback.c \ + third_party/zlib/inffast.c \ + third_party/zlib/inflate.c \ + third_party/zlib/inftrees.c \ + third_party/zlib/trees.c \ + third_party/zlib/uncompr.c \ + third_party/zlib/zutil.c \ + +PUBLIC_HEADERS_C += \ + +LIBZ_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBZ_SRC)))) + +$(LIBZ_OBJS): CFLAGS += -fvisibility=hidden + +$(LIBDIR)/$(CONFIG)/libz.a: $(LIBZ_OBJS) + $(E) "[AR] Creating $@" + $(Q) mkdir -p `dirname $@` + $(Q) rm -f $(LIBDIR)/$(CONFIG)/libz.a + $(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libz.a $(LIBZ_OBJS) +ifeq ($(SYSTEM),Darwin) + $(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libz.a +endif + + + + +ifneq ($(NO_DEPS),true) +-include $(LIBZ_OBJS:.o=.dep) +endif + + +LIBARES_SRC = \ + third_party/cares/cares/ares__close_sockets.c \ + third_party/cares/cares/ares__get_hostent.c \ + third_party/cares/cares/ares__read_line.c \ + third_party/cares/cares/ares__timeval.c \ + third_party/cares/cares/ares_cancel.c \ + third_party/cares/cares/ares_create_query.c \ + third_party/cares/cares/ares_data.c \ + third_party/cares/cares/ares_destroy.c \ + third_party/cares/cares/ares_expand_name.c \ + third_party/cares/cares/ares_expand_string.c \ + third_party/cares/cares/ares_fds.c \ + third_party/cares/cares/ares_free_hostent.c \ + third_party/cares/cares/ares_free_string.c \ + third_party/cares/cares/ares_getenv.c \ + third_party/cares/cares/ares_gethostbyaddr.c \ + third_party/cares/cares/ares_gethostbyname.c \ + third_party/cares/cares/ares_getnameinfo.c \ + third_party/cares/cares/ares_getopt.c \ + third_party/cares/cares/ares_getsock.c \ + third_party/cares/cares/ares_init.c \ + third_party/cares/cares/ares_library_init.c \ + third_party/cares/cares/ares_llist.c \ + third_party/cares/cares/ares_mkquery.c \ + third_party/cares/cares/ares_nowarn.c \ + third_party/cares/cares/ares_options.c \ + third_party/cares/cares/ares_parse_a_reply.c \ + third_party/cares/cares/ares_parse_aaaa_reply.c \ + third_party/cares/cares/ares_parse_mx_reply.c \ + third_party/cares/cares/ares_parse_naptr_reply.c \ + third_party/cares/cares/ares_parse_ns_reply.c \ + third_party/cares/cares/ares_parse_ptr_reply.c \ + third_party/cares/cares/ares_parse_soa_reply.c \ + third_party/cares/cares/ares_parse_srv_reply.c \ + third_party/cares/cares/ares_parse_txt_reply.c \ + third_party/cares/cares/ares_platform.c \ + third_party/cares/cares/ares_process.c \ + third_party/cares/cares/ares_query.c \ + third_party/cares/cares/ares_search.c \ + third_party/cares/cares/ares_send.c \ + third_party/cares/cares/ares_strcasecmp.c \ + third_party/cares/cares/ares_strdup.c \ + third_party/cares/cares/ares_strerror.c \ + third_party/cares/cares/ares_strsplit.c \ + third_party/cares/cares/ares_timeout.c \ + third_party/cares/cares/ares_version.c \ + third_party/cares/cares/ares_writev.c \ + third_party/cares/cares/bitncmp.c \ + third_party/cares/cares/inet_net_pton.c \ + third_party/cares/cares/inet_ntop.c \ + third_party/cares/cares/windows_port.c \ + +PUBLIC_HEADERS_C += \ + +LIBARES_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBARES_SRC)))) + +$(LIBARES_OBJS): CPPFLAGS += -Ithird_party/cares -Ithird_party/cares/cares -fvisibility=hidden -D_GNU_SOURCE $(if $(subst Darwin,,$(SYSTEM)),,-Ithird_party/cares/config_darwin) $(if $(subst FreeBSD,,$(SYSTEM)),,-Ithird_party/cares/config_freebsd) $(if $(subst Linux,,$(SYSTEM)),,-Ithird_party/cares/config_linux) $(if $(subst OpenBSD,,$(SYSTEM)),,-Ithird_party/cares/config_openbsd) -DWIN32_LEAN_AND_MEAN -D_HAS_EXCEPTIONS=0 -DNOMINMAX $(if $(subst MINGW32,,$(SYSTEM)),-DHAVE_CONFIG_H,) +$(LIBARES_OBJS): CFLAGS += -g + +$(LIBDIR)/$(CONFIG)/libares.a: $(LIBARES_OBJS) + $(E) "[AR] Creating $@" + $(Q) mkdir -p `dirname $@` + $(Q) rm -f $(LIBDIR)/$(CONFIG)/libares.a + $(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libares.a $(LIBARES_OBJS) +ifeq ($(SYSTEM),Darwin) + $(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libares.a +endif + + + + +ifneq ($(NO_DEPS),true) +-include $(LIBARES_OBJS:.o=.dep) +endif + + +# Add private ABSEIL target which contains all sources used by all baselib libraries. + + +LIBGRPC_ABSEIL_SRC = \ + third_party/abseil-cpp/absl/base/dynamic_annotations.cc \ + third_party/abseil-cpp/absl/base/internal/cycleclock.cc \ + third_party/abseil-cpp/absl/base/internal/raw_logging.cc \ + third_party/abseil-cpp/absl/base/internal/spinlock.cc \ + third_party/abseil-cpp/absl/base/internal/spinlock_wait.cc \ + third_party/abseil-cpp/absl/base/internal/sysinfo.cc \ + third_party/abseil-cpp/absl/base/internal/thread_identity.cc \ + third_party/abseil-cpp/absl/base/internal/throw_delegate.cc \ + third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc \ + third_party/abseil-cpp/absl/base/log_severity.cc \ + third_party/abseil-cpp/absl/numeric/int128.cc \ + third_party/abseil-cpp/absl/strings/ascii.cc \ + third_party/abseil-cpp/absl/strings/charconv.cc \ + third_party/abseil-cpp/absl/strings/escaping.cc \ + third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc \ + third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc \ + third_party/abseil-cpp/absl/strings/internal/escaping.cc \ + third_party/abseil-cpp/absl/strings/internal/memutil.cc \ + third_party/abseil-cpp/absl/strings/internal/ostringstream.cc \ + third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc \ + third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc \ + third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc \ + third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc \ + third_party/abseil-cpp/absl/strings/internal/str_format/output.cc \ + third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc \ + third_party/abseil-cpp/absl/strings/internal/utf8.cc \ + third_party/abseil-cpp/absl/strings/match.cc \ + third_party/abseil-cpp/absl/strings/numbers.cc \ + third_party/abseil-cpp/absl/strings/str_cat.cc \ + third_party/abseil-cpp/absl/strings/str_replace.cc \ + third_party/abseil-cpp/absl/strings/str_split.cc \ + third_party/abseil-cpp/absl/strings/string_view.cc \ + third_party/abseil-cpp/absl/strings/substitute.cc \ + third_party/abseil-cpp/absl/time/civil_time.cc \ + third_party/abseil-cpp/absl/time/clock.cc \ + third_party/abseil-cpp/absl/time/duration.cc \ + third_party/abseil-cpp/absl/time/format.cc \ + third_party/abseil-cpp/absl/time/internal/cctz/src/civil_time_detail.cc \ + third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc \ + third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc \ + third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.cc \ + third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc \ + third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc \ + third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc \ + third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc \ + third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.cc \ + third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc \ + third_party/abseil-cpp/absl/time/time.cc \ + third_party/abseil-cpp/absl/types/bad_optional_access.cc \ + + +LIBGRPC_ABSEIL_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBGRPC_ABSEIL_SRC)))) + + +$(LIBDIR)/$(CONFIG)/libgrpc_abseil.a: $(LIBGRPC_ABSEIL_OBJS) + $(E) "[AR] Creating $@" + $(Q) mkdir -p `dirname $@` + $(Q) rm -f $(LIBDIR)/$(CONFIG)/libgrpc_abseil.a + $(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libgrpc_abseil.a $(LIBGRPC_ABSEIL_OBJS) +ifeq ($(SYSTEM),Darwin) + $(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libgrpc_abseil.a +endif + + + + +ifneq ($(NO_DEPS),true) +-include $(LIBGRPC_ABSEIL_OBJS:.o=.dep) +endif + + +# All of the test targets, and protoc plugins + + +CHECK_EPOLLEXCLUSIVE_SRC = \ + test/build/check_epollexclusive.c \ + +CHECK_EPOLLEXCLUSIVE_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CHECK_EPOLLEXCLUSIVE_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/check_epollexclusive: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/check_epollexclusive: $(CHECK_EPOLLEXCLUSIVE_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(CHECK_EPOLLEXCLUSIVE_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/check_epollexclusive + +endif + +$(OBJDIR)/$(CONFIG)/test/build/check_epollexclusive.o: $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a + +deps_check_epollexclusive: $(CHECK_EPOLLEXCLUSIVE_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(CHECK_EPOLLEXCLUSIVE_OBJS:.o=.dep) +endif +endif + + +GEN_HPACK_TABLES_SRC = \ + tools/codegen/core/gen_hpack_tables.cc \ + +GEN_HPACK_TABLES_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GEN_HPACK_TABLES_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/gen_hpack_tables: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/gen_hpack_tables: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/gen_hpack_tables: $(PROTOBUF_DEP) $(GEN_HPACK_TABLES_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(GEN_HPACK_TABLES_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/gen_hpack_tables + +endif + +endif + +$(OBJDIR)/$(CONFIG)/tools/codegen/core/gen_hpack_tables.o: $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a + +deps_gen_hpack_tables: $(GEN_HPACK_TABLES_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(GEN_HPACK_TABLES_OBJS:.o=.dep) +endif +endif + + +GEN_LEGAL_METADATA_CHARACTERS_SRC = \ + tools/codegen/core/gen_legal_metadata_characters.cc \ + +GEN_LEGAL_METADATA_CHARACTERS_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GEN_LEGAL_METADATA_CHARACTERS_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/gen_legal_metadata_characters: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/gen_legal_metadata_characters: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/gen_legal_metadata_characters: $(PROTOBUF_DEP) $(GEN_LEGAL_METADATA_CHARACTERS_OBJS) + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(GEN_LEGAL_METADATA_CHARACTERS_OBJS) $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/gen_legal_metadata_characters + +endif + +endif + +$(OBJDIR)/$(CONFIG)/tools/codegen/core/gen_legal_metadata_characters.o: + +deps_gen_legal_metadata_characters: $(GEN_LEGAL_METADATA_CHARACTERS_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(GEN_LEGAL_METADATA_CHARACTERS_OBJS:.o=.dep) +endif +endif + + +GEN_PERCENT_ENCODING_TABLES_SRC = \ + tools/codegen/core/gen_percent_encoding_tables.cc \ + +GEN_PERCENT_ENCODING_TABLES_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GEN_PERCENT_ENCODING_TABLES_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/gen_percent_encoding_tables: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/gen_percent_encoding_tables: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/gen_percent_encoding_tables: $(PROTOBUF_DEP) $(GEN_PERCENT_ENCODING_TABLES_OBJS) + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(GEN_PERCENT_ENCODING_TABLES_OBJS) $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/gen_percent_encoding_tables + +endif + +endif + +$(OBJDIR)/$(CONFIG)/tools/codegen/core/gen_percent_encoding_tables.o: + +deps_gen_percent_encoding_tables: $(GEN_PERCENT_ENCODING_TABLES_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(GEN_PERCENT_ENCODING_TABLES_OBJS:.o=.dep) +endif +endif + + +ALGORITHM_TEST_SRC = \ + test/core/compression/algorithm_test.cc \ + +ALGORITHM_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(ALGORITHM_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/algorithm_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/algorithm_test: $(ALGORITHM_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(ALGORITHM_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/algorithm_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/compression/algorithm_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_algorithm_test: $(ALGORITHM_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(ALGORITHM_TEST_OBJS:.o=.dep) +endif +endif + + +ALLOC_TEST_SRC = \ + test/core/gpr/alloc_test.cc \ + +ALLOC_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(ALLOC_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/alloc_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/alloc_test: $(ALLOC_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(ALLOC_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/alloc_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/gpr/alloc_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_alloc_test: $(ALLOC_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(ALLOC_TEST_OBJS:.o=.dep) +endif +endif + + +ALPN_TEST_SRC = \ + test/core/transport/chttp2/alpn_test.cc \ + +ALPN_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(ALPN_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/alpn_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/alpn_test: $(ALPN_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(ALPN_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/alpn_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/transport/chttp2/alpn_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_alpn_test: $(ALPN_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(ALPN_TEST_OBJS:.o=.dep) +endif +endif + + +ALTS_COUNTER_TEST_SRC = \ + test/core/tsi/alts/crypt/gsec_test_util.cc \ + test/core/tsi/alts/frame_protector/alts_counter_test.cc \ + +ALTS_COUNTER_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(ALTS_COUNTER_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/alts_counter_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/alts_counter_test: $(ALTS_COUNTER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(ALTS_COUNTER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/alts_counter_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/tsi/alts/crypt/gsec_test_util.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/tsi/alts/frame_protector/alts_counter_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_alts_counter_test: $(ALTS_COUNTER_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(ALTS_COUNTER_TEST_OBJS:.o=.dep) +endif +endif + + +ALTS_CRYPT_TEST_SRC = \ + test/core/tsi/alts/crypt/aes_gcm_test.cc \ + test/core/tsi/alts/crypt/gsec_test_util.cc \ + +ALTS_CRYPT_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(ALTS_CRYPT_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/alts_crypt_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/alts_crypt_test: $(ALTS_CRYPT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(ALTS_CRYPT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/alts_crypt_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/tsi/alts/crypt/aes_gcm_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/tsi/alts/crypt/gsec_test_util.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_alts_crypt_test: $(ALTS_CRYPT_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(ALTS_CRYPT_TEST_OBJS:.o=.dep) +endif +endif + + +ALTS_CRYPTER_TEST_SRC = \ + test/core/tsi/alts/crypt/gsec_test_util.cc \ + test/core/tsi/alts/frame_protector/alts_crypter_test.cc \ + +ALTS_CRYPTER_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(ALTS_CRYPTER_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/alts_crypter_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/alts_crypter_test: $(ALTS_CRYPTER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(ALTS_CRYPTER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/alts_crypter_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/tsi/alts/crypt/gsec_test_util.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/tsi/alts/frame_protector/alts_crypter_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_alts_crypter_test: $(ALTS_CRYPTER_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(ALTS_CRYPTER_TEST_OBJS:.o=.dep) +endif +endif + + +ALTS_FRAME_PROTECTOR_TEST_SRC = \ + test/core/tsi/alts/crypt/gsec_test_util.cc \ + test/core/tsi/alts/frame_protector/alts_frame_protector_test.cc \ + test/core/tsi/transport_security_test_lib.cc \ + +ALTS_FRAME_PROTECTOR_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(ALTS_FRAME_PROTECTOR_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/alts_frame_protector_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/alts_frame_protector_test: $(ALTS_FRAME_PROTECTOR_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(ALTS_FRAME_PROTECTOR_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/alts_frame_protector_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/tsi/alts/crypt/gsec_test_util.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/tsi/alts/frame_protector/alts_frame_protector_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/tsi/transport_security_test_lib.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_alts_frame_protector_test: $(ALTS_FRAME_PROTECTOR_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(ALTS_FRAME_PROTECTOR_TEST_OBJS:.o=.dep) +endif +endif + + +ALTS_GRPC_RECORD_PROTOCOL_TEST_SRC = \ + test/core/tsi/alts/crypt/gsec_test_util.cc \ + test/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_test.cc \ + +ALTS_GRPC_RECORD_PROTOCOL_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(ALTS_GRPC_RECORD_PROTOCOL_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/alts_grpc_record_protocol_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/alts_grpc_record_protocol_test: $(ALTS_GRPC_RECORD_PROTOCOL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(ALTS_GRPC_RECORD_PROTOCOL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/alts_grpc_record_protocol_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/tsi/alts/crypt/gsec_test_util.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_alts_grpc_record_protocol_test: $(ALTS_GRPC_RECORD_PROTOCOL_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(ALTS_GRPC_RECORD_PROTOCOL_TEST_OBJS:.o=.dep) +endif +endif + + +ALTS_HANDSHAKER_CLIENT_TEST_SRC = \ + test/core/tsi/alts/handshaker/alts_handshaker_client_test.cc \ + test/core/tsi/alts/handshaker/alts_handshaker_service_api_test_lib.cc \ + +ALTS_HANDSHAKER_CLIENT_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(ALTS_HANDSHAKER_CLIENT_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/alts_handshaker_client_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/alts_handshaker_client_test: $(ALTS_HANDSHAKER_CLIENT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(ALTS_HANDSHAKER_CLIENT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/alts_handshaker_client_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/tsi/alts/handshaker/alts_handshaker_client_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/tsi/alts/handshaker/alts_handshaker_service_api_test_lib.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_alts_handshaker_client_test: $(ALTS_HANDSHAKER_CLIENT_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(ALTS_HANDSHAKER_CLIENT_TEST_OBJS:.o=.dep) +endif +endif + + +ALTS_IOVEC_RECORD_PROTOCOL_TEST_SRC = \ + test/core/tsi/alts/crypt/gsec_test_util.cc \ + test/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol_test.cc \ + +ALTS_IOVEC_RECORD_PROTOCOL_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(ALTS_IOVEC_RECORD_PROTOCOL_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/alts_iovec_record_protocol_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/alts_iovec_record_protocol_test: $(ALTS_IOVEC_RECORD_PROTOCOL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(ALTS_IOVEC_RECORD_PROTOCOL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/alts_iovec_record_protocol_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/tsi/alts/crypt/gsec_test_util.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_alts_iovec_record_protocol_test: $(ALTS_IOVEC_RECORD_PROTOCOL_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(ALTS_IOVEC_RECORD_PROTOCOL_TEST_OBJS:.o=.dep) +endif +endif + + +ALTS_SECURITY_CONNECTOR_TEST_SRC = \ + test/core/security/alts_security_connector_test.cc \ + +ALTS_SECURITY_CONNECTOR_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(ALTS_SECURITY_CONNECTOR_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/alts_security_connector_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/alts_security_connector_test: $(ALTS_SECURITY_CONNECTOR_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(ALTS_SECURITY_CONNECTOR_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/alts_security_connector_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/security/alts_security_connector_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_alts_security_connector_test: $(ALTS_SECURITY_CONNECTOR_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(ALTS_SECURITY_CONNECTOR_TEST_OBJS:.o=.dep) +endif +endif + + +ALTS_TSI_HANDSHAKER_TEST_SRC = \ + test/core/tsi/alts/handshaker/alts_handshaker_service_api_test_lib.cc \ + test/core/tsi/alts/handshaker/alts_tsi_handshaker_test.cc \ + +ALTS_TSI_HANDSHAKER_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(ALTS_TSI_HANDSHAKER_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/alts_tsi_handshaker_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/alts_tsi_handshaker_test: $(ALTS_TSI_HANDSHAKER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(ALTS_TSI_HANDSHAKER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/alts_tsi_handshaker_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/tsi/alts/handshaker/alts_handshaker_service_api_test_lib.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/tsi/alts/handshaker/alts_tsi_handshaker_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_alts_tsi_handshaker_test: $(ALTS_TSI_HANDSHAKER_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(ALTS_TSI_HANDSHAKER_TEST_OBJS:.o=.dep) +endif +endif + + +ALTS_TSI_UTILS_TEST_SRC = \ + test/core/tsi/alts/handshaker/alts_handshaker_service_api_test_lib.cc \ + test/core/tsi/alts/handshaker/alts_tsi_utils_test.cc \ + +ALTS_TSI_UTILS_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(ALTS_TSI_UTILS_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/alts_tsi_utils_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/alts_tsi_utils_test: $(ALTS_TSI_UTILS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(ALTS_TSI_UTILS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/alts_tsi_utils_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/tsi/alts/handshaker/alts_handshaker_service_api_test_lib.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/tsi/alts/handshaker/alts_tsi_utils_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_alts_tsi_utils_test: $(ALTS_TSI_UTILS_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(ALTS_TSI_UTILS_TEST_OBJS:.o=.dep) +endif +endif + + +ALTS_ZERO_COPY_GRPC_PROTECTOR_TEST_SRC = \ + test/core/tsi/alts/crypt/gsec_test_util.cc \ + test/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector_test.cc \ + +ALTS_ZERO_COPY_GRPC_PROTECTOR_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(ALTS_ZERO_COPY_GRPC_PROTECTOR_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/alts_zero_copy_grpc_protector_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/alts_zero_copy_grpc_protector_test: $(ALTS_ZERO_COPY_GRPC_PROTECTOR_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(ALTS_ZERO_COPY_GRPC_PROTECTOR_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/alts_zero_copy_grpc_protector_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/tsi/alts/crypt/gsec_test_util.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_alts_zero_copy_grpc_protector_test: $(ALTS_ZERO_COPY_GRPC_PROTECTOR_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(ALTS_ZERO_COPY_GRPC_PROTECTOR_TEST_OBJS:.o=.dep) +endif +endif + + +ARENA_TEST_SRC = \ + test/core/gpr/arena_test.cc \ + +ARENA_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(ARENA_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/arena_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/arena_test: $(ARENA_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(ARENA_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/arena_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/gpr/arena_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_arena_test: $(ARENA_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(ARENA_TEST_OBJS:.o=.dep) +endif +endif + + +AUTH_CONTEXT_TEST_SRC = \ + test/core/security/auth_context_test.cc \ + +AUTH_CONTEXT_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(AUTH_CONTEXT_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/auth_context_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/auth_context_test: $(AUTH_CONTEXT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(AUTH_CONTEXT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/auth_context_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/security/auth_context_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_auth_context_test: $(AUTH_CONTEXT_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(AUTH_CONTEXT_TEST_OBJS:.o=.dep) +endif +endif + + +AVL_TEST_SRC = \ + test/core/avl/avl_test.cc \ + +AVL_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(AVL_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/avl_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/avl_test: $(AVL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(AVL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/avl_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/avl/avl_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_avl_test: $(AVL_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(AVL_TEST_OBJS:.o=.dep) +endif +endif + + +B64_TEST_SRC = \ + test/core/slice/b64_test.cc \ + +B64_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(B64_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/b64_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/b64_test: $(B64_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(B64_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/b64_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/slice/b64_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_b64_test: $(B64_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(B64_TEST_OBJS:.o=.dep) +endif +endif + + +BAD_SERVER_RESPONSE_TEST_SRC = \ + test/core/end2end/bad_server_response_test.cc \ + test/core/end2end/cq_verifier.cc \ + +BAD_SERVER_RESPONSE_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BAD_SERVER_RESPONSE_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/bad_server_response_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/bad_server_response_test: $(BAD_SERVER_RESPONSE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(BAD_SERVER_RESPONSE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/bad_server_response_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/end2end/bad_server_response_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/end2end/cq_verifier.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_bad_server_response_test: $(BAD_SERVER_RESPONSE_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(BAD_SERVER_RESPONSE_TEST_OBJS:.o=.dep) +endif +endif + + +BAD_SSL_ALPN_TEST_SRC = \ + test/core/bad_ssl/bad_ssl_test.cc \ + test/core/end2end/cq_verifier.cc \ + +BAD_SSL_ALPN_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BAD_SSL_ALPN_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/bad_ssl_alpn_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/bad_ssl_alpn_test: $(BAD_SSL_ALPN_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(BAD_SSL_ALPN_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/bad_ssl_alpn_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/bad_ssl/bad_ssl_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/end2end/cq_verifier.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_bad_ssl_alpn_test: $(BAD_SSL_ALPN_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(BAD_SSL_ALPN_TEST_OBJS:.o=.dep) +endif +endif + + +BAD_SSL_CERT_TEST_SRC = \ + test/core/bad_ssl/bad_ssl_test.cc \ + test/core/end2end/cq_verifier.cc \ + +BAD_SSL_CERT_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BAD_SSL_CERT_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/bad_ssl_cert_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/bad_ssl_cert_test: $(BAD_SSL_CERT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(BAD_SSL_CERT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/bad_ssl_cert_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/bad_ssl/bad_ssl_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/end2end/cq_verifier.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_bad_ssl_cert_test: $(BAD_SSL_CERT_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(BAD_SSL_CERT_TEST_OBJS:.o=.dep) +endif +endif + + +BIN_DECODER_TEST_SRC = \ + test/core/transport/chttp2/bin_decoder_test.cc \ + +BIN_DECODER_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BIN_DECODER_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/bin_decoder_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/bin_decoder_test: $(BIN_DECODER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(BIN_DECODER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/bin_decoder_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/transport/chttp2/bin_decoder_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_bin_decoder_test: $(BIN_DECODER_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(BIN_DECODER_TEST_OBJS:.o=.dep) +endif +endif + + +BIN_ENCODER_TEST_SRC = \ + test/core/transport/chttp2/bin_encoder_test.cc \ + +BIN_ENCODER_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BIN_ENCODER_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/bin_encoder_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/bin_encoder_test: $(BIN_ENCODER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(BIN_ENCODER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/bin_encoder_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/transport/chttp2/bin_encoder_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_bin_encoder_test: $(BIN_ENCODER_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(BIN_ENCODER_TEST_OBJS:.o=.dep) +endif +endif + + +BUFFER_LIST_TEST_SRC = \ + test/core/iomgr/buffer_list_test.cc \ + +BUFFER_LIST_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BUFFER_LIST_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/buffer_list_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/buffer_list_test: $(BUFFER_LIST_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(BUFFER_LIST_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/buffer_list_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/iomgr/buffer_list_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_buffer_list_test: $(BUFFER_LIST_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(BUFFER_LIST_TEST_OBJS:.o=.dep) +endif +endif + + +CHANNEL_ARGS_TEST_SRC = \ + test/core/channel/channel_args_test.cc \ + +CHANNEL_ARGS_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CHANNEL_ARGS_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/channel_args_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/channel_args_test: $(CHANNEL_ARGS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(CHANNEL_ARGS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/channel_args_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/channel/channel_args_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_channel_args_test: $(CHANNEL_ARGS_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(CHANNEL_ARGS_TEST_OBJS:.o=.dep) +endif +endif + + +CHANNEL_CREATE_TEST_SRC = \ + test/core/surface/channel_create_test.cc \ + +CHANNEL_CREATE_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CHANNEL_CREATE_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/channel_create_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/channel_create_test: $(CHANNEL_CREATE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(CHANNEL_CREATE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/channel_create_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/surface/channel_create_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_channel_create_test: $(CHANNEL_CREATE_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(CHANNEL_CREATE_TEST_OBJS:.o=.dep) +endif +endif + + +CHANNEL_STACK_BUILDER_TEST_SRC = \ + test/core/channel/channel_stack_builder_test.cc \ + +CHANNEL_STACK_BUILDER_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CHANNEL_STACK_BUILDER_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/channel_stack_builder_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/channel_stack_builder_test: $(CHANNEL_STACK_BUILDER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(CHANNEL_STACK_BUILDER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/channel_stack_builder_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/channel/channel_stack_builder_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_channel_stack_builder_test: $(CHANNEL_STACK_BUILDER_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(CHANNEL_STACK_BUILDER_TEST_OBJS:.o=.dep) +endif +endif + + +CHANNEL_STACK_TEST_SRC = \ + test/core/channel/channel_stack_test.cc \ + +CHANNEL_STACK_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CHANNEL_STACK_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/channel_stack_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/channel_stack_test: $(CHANNEL_STACK_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(CHANNEL_STACK_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/channel_stack_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/channel/channel_stack_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_channel_stack_test: $(CHANNEL_STACK_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(CHANNEL_STACK_TEST_OBJS:.o=.dep) +endif +endif + + +CHECK_GCP_ENVIRONMENT_LINUX_TEST_SRC = \ + test/core/security/check_gcp_environment_linux_test.cc \ + +CHECK_GCP_ENVIRONMENT_LINUX_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CHECK_GCP_ENVIRONMENT_LINUX_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/check_gcp_environment_linux_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/check_gcp_environment_linux_test: $(CHECK_GCP_ENVIRONMENT_LINUX_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(CHECK_GCP_ENVIRONMENT_LINUX_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/check_gcp_environment_linux_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/security/check_gcp_environment_linux_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_check_gcp_environment_linux_test: $(CHECK_GCP_ENVIRONMENT_LINUX_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(CHECK_GCP_ENVIRONMENT_LINUX_TEST_OBJS:.o=.dep) +endif +endif + + +CHECK_GCP_ENVIRONMENT_WINDOWS_TEST_SRC = \ + test/core/security/check_gcp_environment_windows_test.cc \ + +CHECK_GCP_ENVIRONMENT_WINDOWS_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CHECK_GCP_ENVIRONMENT_WINDOWS_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/check_gcp_environment_windows_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/check_gcp_environment_windows_test: $(CHECK_GCP_ENVIRONMENT_WINDOWS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(CHECK_GCP_ENVIRONMENT_WINDOWS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/check_gcp_environment_windows_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/security/check_gcp_environment_windows_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_check_gcp_environment_windows_test: $(CHECK_GCP_ENVIRONMENT_WINDOWS_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(CHECK_GCP_ENVIRONMENT_WINDOWS_TEST_OBJS:.o=.dep) +endif +endif + + +CLIENT_SSL_TEST_SRC = \ + test/core/handshake/client_ssl.cc \ + +CLIENT_SSL_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CLIENT_SSL_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/client_ssl_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/client_ssl_test: $(CLIENT_SSL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(CLIENT_SSL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/client_ssl_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/handshake/client_ssl.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_client_ssl_test: $(CLIENT_SSL_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(CLIENT_SSL_TEST_OBJS:.o=.dep) +endif +endif + + +CMDLINE_TEST_SRC = \ + test/core/util/cmdline_test.cc \ + +CMDLINE_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CMDLINE_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/cmdline_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/cmdline_test: $(CMDLINE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(CMDLINE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/cmdline_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/util/cmdline_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_cmdline_test: $(CMDLINE_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(CMDLINE_TEST_OBJS:.o=.dep) +endif +endif + + +COMBINER_TEST_SRC = \ + test/core/iomgr/combiner_test.cc \ + +COMBINER_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(COMBINER_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/combiner_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/combiner_test: $(COMBINER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(COMBINER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/combiner_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/iomgr/combiner_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_combiner_test: $(COMBINER_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(COMBINER_TEST_OBJS:.o=.dep) +endif +endif + + +COMPLETION_QUEUE_THREADING_TEST_SRC = \ + test/core/surface/completion_queue_threading_test.cc \ + +COMPLETION_QUEUE_THREADING_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(COMPLETION_QUEUE_THREADING_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/completion_queue_threading_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/completion_queue_threading_test: $(COMPLETION_QUEUE_THREADING_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(COMPLETION_QUEUE_THREADING_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/completion_queue_threading_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/surface/completion_queue_threading_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_completion_queue_threading_test: $(COMPLETION_QUEUE_THREADING_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(COMPLETION_QUEUE_THREADING_TEST_OBJS:.o=.dep) +endif +endif + + +COMPRESSION_TEST_SRC = \ + test/core/compression/compression_test.cc \ + +COMPRESSION_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(COMPRESSION_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/compression_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/compression_test: $(COMPRESSION_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(COMPRESSION_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/compression_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/compression/compression_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_compression_test: $(COMPRESSION_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(COMPRESSION_TEST_OBJS:.o=.dep) +endif +endif + + +CONCURRENT_CONNECTIVITY_TEST_SRC = \ + test/core/surface/concurrent_connectivity_test.cc \ + +CONCURRENT_CONNECTIVITY_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CONCURRENT_CONNECTIVITY_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/concurrent_connectivity_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/concurrent_connectivity_test: $(CONCURRENT_CONNECTIVITY_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(CONCURRENT_CONNECTIVITY_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/concurrent_connectivity_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/surface/concurrent_connectivity_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_concurrent_connectivity_test: $(CONCURRENT_CONNECTIVITY_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(CONCURRENT_CONNECTIVITY_TEST_OBJS:.o=.dep) +endif +endif + + +CONNECTION_REFUSED_TEST_SRC = \ + test/core/end2end/connection_refused_test.cc \ + test/core/end2end/cq_verifier.cc \ + +CONNECTION_REFUSED_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CONNECTION_REFUSED_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/connection_refused_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/connection_refused_test: $(CONNECTION_REFUSED_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(CONNECTION_REFUSED_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/connection_refused_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/end2end/connection_refused_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/end2end/cq_verifier.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_connection_refused_test: $(CONNECTION_REFUSED_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(CONNECTION_REFUSED_TEST_OBJS:.o=.dep) +endif +endif + + +CPU_TEST_SRC = \ + test/core/gpr/cpu_test.cc \ + +CPU_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CPU_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/cpu_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/cpu_test: $(CPU_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(CPU_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/cpu_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/gpr/cpu_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_cpu_test: $(CPU_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(CPU_TEST_OBJS:.o=.dep) +endif +endif + + +DNS_RESOLVER_CONNECTIVITY_USING_ARES_RESOLVER_TEST_SRC = \ + test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc \ + +DNS_RESOLVER_CONNECTIVITY_USING_ARES_RESOLVER_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(DNS_RESOLVER_CONNECTIVITY_USING_ARES_RESOLVER_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/dns_resolver_connectivity_using_ares_resolver_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/dns_resolver_connectivity_using_ares_resolver_test: $(DNS_RESOLVER_CONNECTIVITY_USING_ARES_RESOLVER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(DNS_RESOLVER_CONNECTIVITY_USING_ARES_RESOLVER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/dns_resolver_connectivity_using_ares_resolver_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/client_channel/resolvers/dns_resolver_connectivity_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_dns_resolver_connectivity_using_ares_resolver_test: $(DNS_RESOLVER_CONNECTIVITY_USING_ARES_RESOLVER_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(DNS_RESOLVER_CONNECTIVITY_USING_ARES_RESOLVER_TEST_OBJS:.o=.dep) +endif +endif + + +DNS_RESOLVER_CONNECTIVITY_USING_NATIVE_RESOLVER_TEST_SRC = \ + test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc \ + +DNS_RESOLVER_CONNECTIVITY_USING_NATIVE_RESOLVER_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(DNS_RESOLVER_CONNECTIVITY_USING_NATIVE_RESOLVER_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/dns_resolver_connectivity_using_native_resolver_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/dns_resolver_connectivity_using_native_resolver_test: $(DNS_RESOLVER_CONNECTIVITY_USING_NATIVE_RESOLVER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(DNS_RESOLVER_CONNECTIVITY_USING_NATIVE_RESOLVER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/dns_resolver_connectivity_using_native_resolver_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/client_channel/resolvers/dns_resolver_connectivity_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_dns_resolver_connectivity_using_native_resolver_test: $(DNS_RESOLVER_CONNECTIVITY_USING_NATIVE_RESOLVER_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(DNS_RESOLVER_CONNECTIVITY_USING_NATIVE_RESOLVER_TEST_OBJS:.o=.dep) +endif +endif + + +DNS_RESOLVER_COOLDOWN_TEST_SRC = \ + test/core/client_channel/resolvers/dns_resolver_cooldown_test.cc \ + +DNS_RESOLVER_COOLDOWN_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(DNS_RESOLVER_COOLDOWN_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/dns_resolver_cooldown_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/dns_resolver_cooldown_test: $(DNS_RESOLVER_COOLDOWN_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(DNS_RESOLVER_COOLDOWN_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/dns_resolver_cooldown_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/client_channel/resolvers/dns_resolver_cooldown_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_dns_resolver_cooldown_test: $(DNS_RESOLVER_COOLDOWN_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(DNS_RESOLVER_COOLDOWN_TEST_OBJS:.o=.dep) +endif +endif + + +DNS_RESOLVER_TEST_SRC = \ + test/core/client_channel/resolvers/dns_resolver_test.cc \ + +DNS_RESOLVER_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(DNS_RESOLVER_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/dns_resolver_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/dns_resolver_test: $(DNS_RESOLVER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(DNS_RESOLVER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/dns_resolver_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/client_channel/resolvers/dns_resolver_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_dns_resolver_test: $(DNS_RESOLVER_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(DNS_RESOLVER_TEST_OBJS:.o=.dep) +endif +endif + + +DUALSTACK_SOCKET_TEST_SRC = \ + test/core/end2end/cq_verifier.cc \ + test/core/end2end/dualstack_socket_test.cc \ + +DUALSTACK_SOCKET_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(DUALSTACK_SOCKET_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/dualstack_socket_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/dualstack_socket_test: $(DUALSTACK_SOCKET_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(DUALSTACK_SOCKET_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/dualstack_socket_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/end2end/cq_verifier.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/end2end/dualstack_socket_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_dualstack_socket_test: $(DUALSTACK_SOCKET_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(DUALSTACK_SOCKET_TEST_OBJS:.o=.dep) +endif +endif + + +ENDPOINT_PAIR_TEST_SRC = \ + test/core/iomgr/endpoint_pair_test.cc \ + test/core/iomgr/endpoint_tests.cc \ + +ENDPOINT_PAIR_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(ENDPOINT_PAIR_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/endpoint_pair_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/endpoint_pair_test: $(ENDPOINT_PAIR_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(ENDPOINT_PAIR_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/endpoint_pair_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/iomgr/endpoint_pair_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/iomgr/endpoint_tests.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_endpoint_pair_test: $(ENDPOINT_PAIR_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(ENDPOINT_PAIR_TEST_OBJS:.o=.dep) +endif +endif + + +ENV_TEST_SRC = \ + test/core/gpr/env_test.cc \ + +ENV_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(ENV_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/env_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/env_test: $(ENV_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(ENV_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/env_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/gpr/env_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_env_test: $(ENV_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(ENV_TEST_OBJS:.o=.dep) +endif +endif + + +ERROR_TEST_SRC = \ + test/core/iomgr/endpoint_tests.cc \ + test/core/iomgr/error_test.cc \ + +ERROR_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(ERROR_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/error_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/error_test: $(ERROR_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(ERROR_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/error_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/iomgr/endpoint_tests.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/iomgr/error_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_error_test: $(ERROR_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(ERROR_TEST_OBJS:.o=.dep) +endif +endif + + +EV_EPOLLEX_LINUX_TEST_SRC = \ + test/core/iomgr/ev_epollex_linux_test.cc \ + +EV_EPOLLEX_LINUX_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(EV_EPOLLEX_LINUX_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/ev_epollex_linux_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/ev_epollex_linux_test: $(EV_EPOLLEX_LINUX_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(EV_EPOLLEX_LINUX_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/ev_epollex_linux_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/iomgr/ev_epollex_linux_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_ev_epollex_linux_test: $(EV_EPOLLEX_LINUX_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(EV_EPOLLEX_LINUX_TEST_OBJS:.o=.dep) +endif +endif + + +FAKE_RESOLVER_TEST_SRC = \ + test/core/client_channel/resolvers/fake_resolver_test.cc \ + +FAKE_RESOLVER_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(FAKE_RESOLVER_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/fake_resolver_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/fake_resolver_test: $(FAKE_RESOLVER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(FAKE_RESOLVER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/fake_resolver_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/client_channel/resolvers/fake_resolver_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_fake_resolver_test: $(FAKE_RESOLVER_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(FAKE_RESOLVER_TEST_OBJS:.o=.dep) +endif +endif + + +FAKE_TRANSPORT_SECURITY_TEST_SRC = \ + test/core/tsi/fake_transport_security_test.cc \ + test/core/tsi/transport_security_test_lib.cc \ + +FAKE_TRANSPORT_SECURITY_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(FAKE_TRANSPORT_SECURITY_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/fake_transport_security_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/fake_transport_security_test: $(FAKE_TRANSPORT_SECURITY_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(FAKE_TRANSPORT_SECURITY_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/fake_transport_security_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/tsi/fake_transport_security_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/tsi/transport_security_test_lib.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_fake_transport_security_test: $(FAKE_TRANSPORT_SECURITY_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(FAKE_TRANSPORT_SECURITY_TEST_OBJS:.o=.dep) +endif +endif + + +FD_CONSERVATION_POSIX_TEST_SRC = \ + test/core/iomgr/fd_conservation_posix_test.cc \ + +FD_CONSERVATION_POSIX_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(FD_CONSERVATION_POSIX_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/fd_conservation_posix_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/fd_conservation_posix_test: $(FD_CONSERVATION_POSIX_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(FD_CONSERVATION_POSIX_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/fd_conservation_posix_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/iomgr/fd_conservation_posix_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_fd_conservation_posix_test: $(FD_CONSERVATION_POSIX_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(FD_CONSERVATION_POSIX_TEST_OBJS:.o=.dep) +endif +endif + + +FD_POSIX_TEST_SRC = \ + test/core/iomgr/fd_posix_test.cc \ + +FD_POSIX_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(FD_POSIX_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/fd_posix_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/fd_posix_test: $(FD_POSIX_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(FD_POSIX_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/fd_posix_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/iomgr/fd_posix_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_fd_posix_test: $(FD_POSIX_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(FD_POSIX_TEST_OBJS:.o=.dep) +endif +endif + + +FLING_STREAM_TEST_SRC = \ + test/core/end2end/data/client_certs.cc \ + test/core/end2end/data/server1_cert.cc \ + test/core/end2end/data/server1_key.cc \ + test/core/end2end/data/test_root_cert.cc \ + test/core/fling/fling_stream_test.cc \ + +FLING_STREAM_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(FLING_STREAM_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/fling_stream_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/fling_stream_test: $(FLING_STREAM_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(FLING_STREAM_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/fling_stream_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/end2end/data/client_certs.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/end2end/data/server1_cert.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/end2end/data/server1_key.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/end2end/data/test_root_cert.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/fling/fling_stream_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_fling_stream_test: $(FLING_STREAM_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(FLING_STREAM_TEST_OBJS:.o=.dep) +endif +endif + + +FLING_TEST_SRC = \ + test/core/end2end/data/client_certs.cc \ + test/core/end2end/data/server1_cert.cc \ + test/core/end2end/data/server1_key.cc \ + test/core/end2end/data/test_root_cert.cc \ + test/core/fling/fling_test.cc \ + +FLING_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(FLING_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/fling_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/fling_test: $(FLING_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(FLING_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/fling_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/end2end/data/client_certs.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/end2end/data/server1_cert.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/end2end/data/server1_key.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/end2end/data/test_root_cert.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/fling/fling_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_fling_test: $(FLING_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(FLING_TEST_OBJS:.o=.dep) +endif +endif + + +FORK_TEST_SRC = \ + test/core/gprpp/fork_test.cc \ + +FORK_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(FORK_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/fork_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/fork_test: $(FORK_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(FORK_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/fork_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/gprpp/fork_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_fork_test: $(FORK_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(FORK_TEST_OBJS:.o=.dep) +endif +endif + + +FORMAT_REQUEST_TEST_SRC = \ + test/core/end2end/data/client_certs.cc \ + test/core/end2end/data/server1_cert.cc \ + test/core/end2end/data/server1_key.cc \ + test/core/end2end/data/test_root_cert.cc \ + test/core/http/format_request_test.cc \ + +FORMAT_REQUEST_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(FORMAT_REQUEST_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/format_request_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/format_request_test: $(FORMAT_REQUEST_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(FORMAT_REQUEST_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/format_request_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/end2end/data/client_certs.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/end2end/data/server1_cert.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/end2end/data/server1_key.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/end2end/data/test_root_cert.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/http/format_request_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_format_request_test: $(FORMAT_REQUEST_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(FORMAT_REQUEST_TEST_OBJS:.o=.dep) +endif +endif + + +FRAME_HANDLER_TEST_SRC = \ + test/core/tsi/alts/crypt/gsec_test_util.cc \ + test/core/tsi/alts/frame_protector/frame_handler_test.cc \ + +FRAME_HANDLER_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(FRAME_HANDLER_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/frame_handler_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/frame_handler_test: $(FRAME_HANDLER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(FRAME_HANDLER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/frame_handler_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/tsi/alts/crypt/gsec_test_util.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/tsi/alts/frame_protector/frame_handler_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_frame_handler_test: $(FRAME_HANDLER_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(FRAME_HANDLER_TEST_OBJS:.o=.dep) +endif +endif + + +GOAWAY_SERVER_TEST_SRC = \ + test/core/end2end/cq_verifier.cc \ + test/core/end2end/goaway_server_test.cc \ + +GOAWAY_SERVER_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GOAWAY_SERVER_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/goaway_server_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/goaway_server_test: $(GOAWAY_SERVER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(GOAWAY_SERVER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/goaway_server_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/end2end/cq_verifier.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/end2end/goaway_server_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_goaway_server_test: $(GOAWAY_SERVER_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(GOAWAY_SERVER_TEST_OBJS:.o=.dep) +endif +endif + + +GRPC_ALTS_CREDENTIALS_OPTIONS_TEST_SRC = \ + test/core/security/grpc_alts_credentials_options_test.cc \ + +GRPC_ALTS_CREDENTIALS_OPTIONS_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GRPC_ALTS_CREDENTIALS_OPTIONS_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/grpc_alts_credentials_options_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/grpc_alts_credentials_options_test: $(GRPC_ALTS_CREDENTIALS_OPTIONS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(GRPC_ALTS_CREDENTIALS_OPTIONS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/grpc_alts_credentials_options_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/security/grpc_alts_credentials_options_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_grpc_alts_credentials_options_test: $(GRPC_ALTS_CREDENTIALS_OPTIONS_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(GRPC_ALTS_CREDENTIALS_OPTIONS_TEST_OBJS:.o=.dep) +endif +endif + + +GRPC_BYTE_BUFFER_READER_TEST_SRC = \ + test/core/surface/byte_buffer_reader_test.cc \ + +GRPC_BYTE_BUFFER_READER_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GRPC_BYTE_BUFFER_READER_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/grpc_byte_buffer_reader_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/grpc_byte_buffer_reader_test: $(GRPC_BYTE_BUFFER_READER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(GRPC_BYTE_BUFFER_READER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/grpc_byte_buffer_reader_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/surface/byte_buffer_reader_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_grpc_byte_buffer_reader_test: $(GRPC_BYTE_BUFFER_READER_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(GRPC_BYTE_BUFFER_READER_TEST_OBJS:.o=.dep) +endif +endif + + +GRPC_COMPLETION_QUEUE_TEST_SRC = \ + test/core/surface/completion_queue_test.cc \ + +GRPC_COMPLETION_QUEUE_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GRPC_COMPLETION_QUEUE_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/grpc_completion_queue_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/grpc_completion_queue_test: $(GRPC_COMPLETION_QUEUE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(GRPC_COMPLETION_QUEUE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/grpc_completion_queue_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/surface/completion_queue_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_grpc_completion_queue_test: $(GRPC_COMPLETION_QUEUE_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(GRPC_COMPLETION_QUEUE_TEST_OBJS:.o=.dep) +endif +endif + + +GRPC_IPV6_LOOPBACK_AVAILABLE_TEST_SRC = \ + test/core/iomgr/grpc_ipv6_loopback_available_test.cc \ + +GRPC_IPV6_LOOPBACK_AVAILABLE_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GRPC_IPV6_LOOPBACK_AVAILABLE_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/grpc_ipv6_loopback_available_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/grpc_ipv6_loopback_available_test: $(GRPC_IPV6_LOOPBACK_AVAILABLE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(GRPC_IPV6_LOOPBACK_AVAILABLE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/grpc_ipv6_loopback_available_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/iomgr/grpc_ipv6_loopback_available_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_grpc_ipv6_loopback_available_test: $(GRPC_IPV6_LOOPBACK_AVAILABLE_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(GRPC_IPV6_LOOPBACK_AVAILABLE_TEST_OBJS:.o=.dep) +endif +endif + + +HANDSHAKE_SERVER_WITH_READAHEAD_HANDSHAKER_TEST_SRC = \ + test/core/handshake/readahead_handshaker_server_ssl.cc \ + test/core/handshake/server_ssl_common.cc \ + +HANDSHAKE_SERVER_WITH_READAHEAD_HANDSHAKER_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(HANDSHAKE_SERVER_WITH_READAHEAD_HANDSHAKER_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/handshake_server_with_readahead_handshaker_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/handshake_server_with_readahead_handshaker_test: $(HANDSHAKE_SERVER_WITH_READAHEAD_HANDSHAKER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(HANDSHAKE_SERVER_WITH_READAHEAD_HANDSHAKER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/handshake_server_with_readahead_handshaker_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/handshake/readahead_handshaker_server_ssl.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/handshake/server_ssl_common.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_handshake_server_with_readahead_handshaker_test: $(HANDSHAKE_SERVER_WITH_READAHEAD_HANDSHAKER_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(HANDSHAKE_SERVER_WITH_READAHEAD_HANDSHAKER_TEST_OBJS:.o=.dep) +endif +endif + + +HANDSHAKE_VERIFY_PEER_OPTIONS_TEST_SRC = \ + test/core/handshake/verify_peer_options.cc \ + +HANDSHAKE_VERIFY_PEER_OPTIONS_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(HANDSHAKE_VERIFY_PEER_OPTIONS_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/handshake_verify_peer_options_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/handshake_verify_peer_options_test: $(HANDSHAKE_VERIFY_PEER_OPTIONS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(HANDSHAKE_VERIFY_PEER_OPTIONS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/handshake_verify_peer_options_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/handshake/verify_peer_options.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_handshake_verify_peer_options_test: $(HANDSHAKE_VERIFY_PEER_OPTIONS_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(HANDSHAKE_VERIFY_PEER_OPTIONS_TEST_OBJS:.o=.dep) +endif +endif + + +HISTOGRAM_TEST_SRC = \ + test/core/util/histogram_test.cc \ + +HISTOGRAM_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(HISTOGRAM_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/histogram_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/histogram_test: $(HISTOGRAM_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(HISTOGRAM_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/histogram_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/util/histogram_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_histogram_test: $(HISTOGRAM_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(HISTOGRAM_TEST_OBJS:.o=.dep) +endif +endif + + +HOST_PORT_TEST_SRC = \ + test/core/gprpp/host_port_test.cc \ + +HOST_PORT_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(HOST_PORT_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/host_port_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/host_port_test: $(HOST_PORT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(HOST_PORT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/host_port_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/gprpp/host_port_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_host_port_test: $(HOST_PORT_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(HOST_PORT_TEST_OBJS:.o=.dep) +endif +endif + + +HPACK_ENCODER_TEST_SRC = \ + test/core/transport/chttp2/hpack_encoder_test.cc \ + +HPACK_ENCODER_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(HPACK_ENCODER_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/hpack_encoder_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/hpack_encoder_test: $(HPACK_ENCODER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(HPACK_ENCODER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/hpack_encoder_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/transport/chttp2/hpack_encoder_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_hpack_encoder_test: $(HPACK_ENCODER_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(HPACK_ENCODER_TEST_OBJS:.o=.dep) +endif +endif + + +HPACK_PARSER_TEST_SRC = \ + test/core/transport/chttp2/hpack_parser_test.cc \ + +HPACK_PARSER_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(HPACK_PARSER_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/hpack_parser_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/hpack_parser_test: $(HPACK_PARSER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(HPACK_PARSER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/hpack_parser_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/transport/chttp2/hpack_parser_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_hpack_parser_test: $(HPACK_PARSER_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(HPACK_PARSER_TEST_OBJS:.o=.dep) +endif +endif + + +HPACK_TABLE_TEST_SRC = \ + test/core/transport/chttp2/hpack_table_test.cc \ + +HPACK_TABLE_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(HPACK_TABLE_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/hpack_table_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/hpack_table_test: $(HPACK_TABLE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(HPACK_TABLE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/hpack_table_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/transport/chttp2/hpack_table_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_hpack_table_test: $(HPACK_TABLE_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(HPACK_TABLE_TEST_OBJS:.o=.dep) +endif +endif + + +HTTPCLI_TEST_SRC = \ + test/core/end2end/data/client_certs.cc \ + test/core/end2end/data/server1_cert.cc \ + test/core/end2end/data/server1_key.cc \ + test/core/end2end/data/test_root_cert.cc \ + test/core/http/httpcli_test.cc \ + +HTTPCLI_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(HTTPCLI_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/httpcli_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/httpcli_test: $(HTTPCLI_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(HTTPCLI_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/httpcli_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/end2end/data/client_certs.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/end2end/data/server1_cert.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/end2end/data/server1_key.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/end2end/data/test_root_cert.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/http/httpcli_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_httpcli_test: $(HTTPCLI_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(HTTPCLI_TEST_OBJS:.o=.dep) +endif +endif + + +HTTPSCLI_TEST_SRC = \ + test/core/end2end/data/client_certs.cc \ + test/core/end2end/data/server1_cert.cc \ + test/core/end2end/data/server1_key.cc \ + test/core/end2end/data/test_root_cert.cc \ + test/core/http/httpscli_test.cc \ + +HTTPSCLI_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(HTTPSCLI_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/httpscli_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/httpscli_test: $(HTTPSCLI_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(HTTPSCLI_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/httpscli_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/end2end/data/client_certs.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/end2end/data/server1_cert.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/end2end/data/server1_key.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/end2end/data/test_root_cert.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/http/httpscli_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_httpscli_test: $(HTTPSCLI_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(HTTPSCLI_TEST_OBJS:.o=.dep) +endif +endif + + +INIT_TEST_SRC = \ + test/core/surface/init_test.cc \ + +INIT_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(INIT_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/init_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/init_test: $(INIT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(INIT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/init_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/surface/init_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_init_test: $(INIT_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(INIT_TEST_OBJS:.o=.dep) +endif +endif + + +INPROC_CALLBACK_TEST_SRC = \ + test/core/end2end/inproc_callback_test.cc \ + +INPROC_CALLBACK_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(INPROC_CALLBACK_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/inproc_callback_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/inproc_callback_test: $(INPROC_CALLBACK_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libend2end_tests.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(INPROC_CALLBACK_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libend2end_tests.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/inproc_callback_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/end2end/inproc_callback_test.o: $(LIBDIR)/$(CONFIG)/libend2end_tests.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_inproc_callback_test: $(INPROC_CALLBACK_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(INPROC_CALLBACK_TEST_OBJS:.o=.dep) +endif +endif + + +INVALID_CALL_ARGUMENT_TEST_SRC = \ + test/core/end2end/cq_verifier.cc \ + test/core/end2end/invalid_call_argument_test.cc \ + +INVALID_CALL_ARGUMENT_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(INVALID_CALL_ARGUMENT_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/invalid_call_argument_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/invalid_call_argument_test: $(INVALID_CALL_ARGUMENT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(INVALID_CALL_ARGUMENT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/invalid_call_argument_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/end2end/cq_verifier.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/end2end/invalid_call_argument_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_invalid_call_argument_test: $(INVALID_CALL_ARGUMENT_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(INVALID_CALL_ARGUMENT_TEST_OBJS:.o=.dep) +endif +endif + + +JSON_TOKEN_TEST_SRC = \ + test/core/security/json_token_test.cc \ + +JSON_TOKEN_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(JSON_TOKEN_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/json_token_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/json_token_test: $(JSON_TOKEN_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(JSON_TOKEN_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/json_token_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/security/json_token_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_json_token_test: $(JSON_TOKEN_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(JSON_TOKEN_TEST_OBJS:.o=.dep) +endif +endif + + +JWT_VERIFIER_TEST_SRC = \ + test/core/security/jwt_verifier_test.cc \ + +JWT_VERIFIER_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(JWT_VERIFIER_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/jwt_verifier_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/jwt_verifier_test: $(JWT_VERIFIER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(JWT_VERIFIER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/jwt_verifier_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/security/jwt_verifier_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_jwt_verifier_test: $(JWT_VERIFIER_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(JWT_VERIFIER_TEST_OBJS:.o=.dep) +endif +endif + + +LAME_CLIENT_TEST_SRC = \ + test/core/end2end/cq_verifier.cc \ + test/core/surface/lame_client_test.cc \ + +LAME_CLIENT_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LAME_CLIENT_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/lame_client_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/lame_client_test: $(LAME_CLIENT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(LAME_CLIENT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/lame_client_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/end2end/cq_verifier.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/surface/lame_client_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_lame_client_test: $(LAME_CLIENT_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(LAME_CLIENT_TEST_OBJS:.o=.dep) +endif +endif + + +LOAD_FILE_TEST_SRC = \ + test/core/iomgr/load_file_test.cc \ + +LOAD_FILE_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LOAD_FILE_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/load_file_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/load_file_test: $(LOAD_FILE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(LOAD_FILE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/load_file_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/iomgr/load_file_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_load_file_test: $(LOAD_FILE_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(LOAD_FILE_TEST_OBJS:.o=.dep) +endif +endif + + +LOG_TEST_SRC = \ + test/core/gpr/log_test.cc \ + +LOG_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LOG_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/log_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/log_test: $(LOG_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(LOG_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/log_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/gpr/log_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_log_test: $(LOG_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(LOG_TEST_OBJS:.o=.dep) +endif +endif + + +MANUAL_CONSTRUCTOR_TEST_SRC = \ + test/core/gprpp/manual_constructor_test.cc \ + +MANUAL_CONSTRUCTOR_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(MANUAL_CONSTRUCTOR_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/manual_constructor_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/manual_constructor_test: $(MANUAL_CONSTRUCTOR_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(MANUAL_CONSTRUCTOR_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/manual_constructor_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/gprpp/manual_constructor_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_manual_constructor_test: $(MANUAL_CONSTRUCTOR_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(MANUAL_CONSTRUCTOR_TEST_OBJS:.o=.dep) +endif +endif + + +MESSAGE_COMPRESS_TEST_SRC = \ + test/core/compression/message_compress_test.cc \ + +MESSAGE_COMPRESS_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(MESSAGE_COMPRESS_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/message_compress_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/message_compress_test: $(MESSAGE_COMPRESS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(MESSAGE_COMPRESS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/message_compress_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/compression/message_compress_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_message_compress_test: $(MESSAGE_COMPRESS_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(MESSAGE_COMPRESS_TEST_OBJS:.o=.dep) +endif +endif + + +METADATA_TEST_SRC = \ + test/core/transport/metadata_test.cc \ + +METADATA_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(METADATA_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/metadata_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/metadata_test: $(METADATA_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(METADATA_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/metadata_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/transport/metadata_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_metadata_test: $(METADATA_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(METADATA_TEST_OBJS:.o=.dep) +endif +endif + + +MINIMAL_STACK_IS_MINIMAL_TEST_SRC = \ + test/core/channel/minimal_stack_is_minimal_test.cc \ + +MINIMAL_STACK_IS_MINIMAL_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(MINIMAL_STACK_IS_MINIMAL_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/minimal_stack_is_minimal_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/minimal_stack_is_minimal_test: $(MINIMAL_STACK_IS_MINIMAL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(MINIMAL_STACK_IS_MINIMAL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/minimal_stack_is_minimal_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/channel/minimal_stack_is_minimal_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_minimal_stack_is_minimal_test: $(MINIMAL_STACK_IS_MINIMAL_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(MINIMAL_STACK_IS_MINIMAL_TEST_OBJS:.o=.dep) +endif +endif + + +MPMCQUEUE_TEST_SRC = \ + test/core/iomgr/mpmcqueue_test.cc \ + +MPMCQUEUE_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(MPMCQUEUE_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/mpmcqueue_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/mpmcqueue_test: $(MPMCQUEUE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(MPMCQUEUE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/mpmcqueue_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/iomgr/mpmcqueue_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_mpmcqueue_test: $(MPMCQUEUE_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(MPMCQUEUE_TEST_OBJS:.o=.dep) +endif +endif + + +MPSCQ_TEST_SRC = \ + test/core/gprpp/mpscq_test.cc \ + +MPSCQ_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(MPSCQ_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/mpscq_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/mpscq_test: $(MPSCQ_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(MPSCQ_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/mpscq_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/gprpp/mpscq_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_mpscq_test: $(MPSCQ_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(MPSCQ_TEST_OBJS:.o=.dep) +endif +endif + + +MULTIPLE_SERVER_QUEUES_TEST_SRC = \ + test/core/end2end/cq_verifier.cc \ + test/core/end2end/multiple_server_queues_test.cc \ + +MULTIPLE_SERVER_QUEUES_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(MULTIPLE_SERVER_QUEUES_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/multiple_server_queues_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/multiple_server_queues_test: $(MULTIPLE_SERVER_QUEUES_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(MULTIPLE_SERVER_QUEUES_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/multiple_server_queues_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/end2end/cq_verifier.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/end2end/multiple_server_queues_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_multiple_server_queues_test: $(MULTIPLE_SERVER_QUEUES_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(MULTIPLE_SERVER_QUEUES_TEST_OBJS:.o=.dep) +endif +endif + + +MURMUR_HASH_TEST_SRC = \ + test/core/gpr/murmur_hash_test.cc \ + +MURMUR_HASH_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(MURMUR_HASH_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/murmur_hash_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/murmur_hash_test: $(MURMUR_HASH_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(MURMUR_HASH_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/murmur_hash_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/gpr/murmur_hash_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_murmur_hash_test: $(MURMUR_HASH_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(MURMUR_HASH_TEST_OBJS:.o=.dep) +endif +endif + + +NO_SERVER_TEST_SRC = \ + test/core/end2end/cq_verifier.cc \ + test/core/end2end/no_server_test.cc \ + +NO_SERVER_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(NO_SERVER_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/no_server_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/no_server_test: $(NO_SERVER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(NO_SERVER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/no_server_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/end2end/cq_verifier.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/end2end/no_server_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_no_server_test: $(NO_SERVER_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(NO_SERVER_TEST_OBJS:.o=.dep) +endif +endif + + +NUM_EXTERNAL_CONNECTIVITY_WATCHERS_TEST_SRC = \ + test/core/surface/num_external_connectivity_watchers_test.cc \ + +NUM_EXTERNAL_CONNECTIVITY_WATCHERS_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(NUM_EXTERNAL_CONNECTIVITY_WATCHERS_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/num_external_connectivity_watchers_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/num_external_connectivity_watchers_test: $(NUM_EXTERNAL_CONNECTIVITY_WATCHERS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(NUM_EXTERNAL_CONNECTIVITY_WATCHERS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/num_external_connectivity_watchers_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/surface/num_external_connectivity_watchers_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_num_external_connectivity_watchers_test: $(NUM_EXTERNAL_CONNECTIVITY_WATCHERS_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(NUM_EXTERNAL_CONNECTIVITY_WATCHERS_TEST_OBJS:.o=.dep) +endif +endif + + +PARSE_ADDRESS_TEST_SRC = \ + test/core/client_channel/parse_address_test.cc \ + +PARSE_ADDRESS_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(PARSE_ADDRESS_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/parse_address_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/parse_address_test: $(PARSE_ADDRESS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(PARSE_ADDRESS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/parse_address_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/client_channel/parse_address_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_parse_address_test: $(PARSE_ADDRESS_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(PARSE_ADDRESS_TEST_OBJS:.o=.dep) +endif +endif + + +PARSE_ADDRESS_WITH_NAMED_SCOPE_ID_TEST_SRC = \ + test/core/client_channel/parse_address_with_named_scope_id_test.cc \ + +PARSE_ADDRESS_WITH_NAMED_SCOPE_ID_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(PARSE_ADDRESS_WITH_NAMED_SCOPE_ID_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/parse_address_with_named_scope_id_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/parse_address_with_named_scope_id_test: $(PARSE_ADDRESS_WITH_NAMED_SCOPE_ID_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(PARSE_ADDRESS_WITH_NAMED_SCOPE_ID_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/parse_address_with_named_scope_id_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/client_channel/parse_address_with_named_scope_id_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_parse_address_with_named_scope_id_test: $(PARSE_ADDRESS_WITH_NAMED_SCOPE_ID_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(PARSE_ADDRESS_WITH_NAMED_SCOPE_ID_TEST_OBJS:.o=.dep) +endif +endif + + +PARSER_TEST_SRC = \ + test/core/end2end/data/client_certs.cc \ + test/core/end2end/data/server1_cert.cc \ + test/core/end2end/data/server1_key.cc \ + test/core/end2end/data/test_root_cert.cc \ + test/core/http/parser_test.cc \ + +PARSER_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(PARSER_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/parser_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/parser_test: $(PARSER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(PARSER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/parser_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/end2end/data/client_certs.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/end2end/data/server1_cert.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/end2end/data/server1_key.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/end2end/data/test_root_cert.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/http/parser_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_parser_test: $(PARSER_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(PARSER_TEST_OBJS:.o=.dep) +endif +endif + + +PERCENT_ENCODING_TEST_SRC = \ + test/core/slice/percent_encoding_test.cc \ + +PERCENT_ENCODING_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(PERCENT_ENCODING_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/percent_encoding_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/percent_encoding_test: $(PERCENT_ENCODING_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(PERCENT_ENCODING_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/percent_encoding_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/slice/percent_encoding_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_percent_encoding_test: $(PERCENT_ENCODING_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(PERCENT_ENCODING_TEST_OBJS:.o=.dep) +endif +endif + + +PUBLIC_HEADERS_MUST_BE_C89_SRC = \ + test/core/surface/public_headers_must_be_c89.c \ + +PUBLIC_HEADERS_MUST_BE_C89_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(PUBLIC_HEADERS_MUST_BE_C89_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/public_headers_must_be_c89: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/public_headers_must_be_c89: $(PUBLIC_HEADERS_MUST_BE_C89_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(PUBLIC_HEADERS_MUST_BE_C89_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/public_headers_must_be_c89 + +endif + +$(OBJDIR)/$(CONFIG)/test/core/surface/public_headers_must_be_c89.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_public_headers_must_be_c89: $(PUBLIC_HEADERS_MUST_BE_C89_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(PUBLIC_HEADERS_MUST_BE_C89_OBJS:.o=.dep) +endif +endif + + +RESOLVE_ADDRESS_USING_ARES_RESOLVER_POSIX_TEST_SRC = \ + test/core/iomgr/resolve_address_posix_test.cc \ + +RESOLVE_ADDRESS_USING_ARES_RESOLVER_POSIX_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(RESOLVE_ADDRESS_USING_ARES_RESOLVER_POSIX_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/resolve_address_using_ares_resolver_posix_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/resolve_address_using_ares_resolver_posix_test: $(RESOLVE_ADDRESS_USING_ARES_RESOLVER_POSIX_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(RESOLVE_ADDRESS_USING_ARES_RESOLVER_POSIX_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/resolve_address_using_ares_resolver_posix_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/iomgr/resolve_address_posix_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_resolve_address_using_ares_resolver_posix_test: $(RESOLVE_ADDRESS_USING_ARES_RESOLVER_POSIX_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(RESOLVE_ADDRESS_USING_ARES_RESOLVER_POSIX_TEST_OBJS:.o=.dep) +endif +endif + + +RESOLVE_ADDRESS_USING_ARES_RESOLVER_TEST_SRC = \ + test/core/iomgr/resolve_address_test.cc \ + +RESOLVE_ADDRESS_USING_ARES_RESOLVER_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(RESOLVE_ADDRESS_USING_ARES_RESOLVER_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/resolve_address_using_ares_resolver_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/resolve_address_using_ares_resolver_test: $(RESOLVE_ADDRESS_USING_ARES_RESOLVER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(RESOLVE_ADDRESS_USING_ARES_RESOLVER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/resolve_address_using_ares_resolver_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/iomgr/resolve_address_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_resolve_address_using_ares_resolver_test: $(RESOLVE_ADDRESS_USING_ARES_RESOLVER_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(RESOLVE_ADDRESS_USING_ARES_RESOLVER_TEST_OBJS:.o=.dep) +endif +endif + + +RESOLVE_ADDRESS_USING_NATIVE_RESOLVER_POSIX_TEST_SRC = \ + test/core/iomgr/resolve_address_posix_test.cc \ + +RESOLVE_ADDRESS_USING_NATIVE_RESOLVER_POSIX_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(RESOLVE_ADDRESS_USING_NATIVE_RESOLVER_POSIX_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/resolve_address_using_native_resolver_posix_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/resolve_address_using_native_resolver_posix_test: $(RESOLVE_ADDRESS_USING_NATIVE_RESOLVER_POSIX_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(RESOLVE_ADDRESS_USING_NATIVE_RESOLVER_POSIX_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/resolve_address_using_native_resolver_posix_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/iomgr/resolve_address_posix_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_resolve_address_using_native_resolver_posix_test: $(RESOLVE_ADDRESS_USING_NATIVE_RESOLVER_POSIX_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(RESOLVE_ADDRESS_USING_NATIVE_RESOLVER_POSIX_TEST_OBJS:.o=.dep) +endif +endif + + +RESOLVE_ADDRESS_USING_NATIVE_RESOLVER_TEST_SRC = \ + test/core/iomgr/resolve_address_test.cc \ + +RESOLVE_ADDRESS_USING_NATIVE_RESOLVER_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(RESOLVE_ADDRESS_USING_NATIVE_RESOLVER_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/resolve_address_using_native_resolver_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/resolve_address_using_native_resolver_test: $(RESOLVE_ADDRESS_USING_NATIVE_RESOLVER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(RESOLVE_ADDRESS_USING_NATIVE_RESOLVER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/resolve_address_using_native_resolver_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/iomgr/resolve_address_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_resolve_address_using_native_resolver_test: $(RESOLVE_ADDRESS_USING_NATIVE_RESOLVER_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(RESOLVE_ADDRESS_USING_NATIVE_RESOLVER_TEST_OBJS:.o=.dep) +endif +endif + + +RESOURCE_QUOTA_TEST_SRC = \ + test/core/iomgr/resource_quota_test.cc \ + +RESOURCE_QUOTA_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(RESOURCE_QUOTA_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/resource_quota_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/resource_quota_test: $(RESOURCE_QUOTA_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(RESOURCE_QUOTA_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/resource_quota_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/iomgr/resource_quota_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_resource_quota_test: $(RESOURCE_QUOTA_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(RESOURCE_QUOTA_TEST_OBJS:.o=.dep) +endif +endif + + +SECURE_CHANNEL_CREATE_TEST_SRC = \ + test/core/surface/secure_channel_create_test.cc \ + +SECURE_CHANNEL_CREATE_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(SECURE_CHANNEL_CREATE_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/secure_channel_create_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/secure_channel_create_test: $(SECURE_CHANNEL_CREATE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(SECURE_CHANNEL_CREATE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/secure_channel_create_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/surface/secure_channel_create_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_secure_channel_create_test: $(SECURE_CHANNEL_CREATE_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(SECURE_CHANNEL_CREATE_TEST_OBJS:.o=.dep) +endif +endif + + +SECURE_ENDPOINT_TEST_SRC = \ + test/core/iomgr/endpoint_tests.cc \ + test/core/security/secure_endpoint_test.cc \ + +SECURE_ENDPOINT_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(SECURE_ENDPOINT_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/secure_endpoint_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/secure_endpoint_test: $(SECURE_ENDPOINT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(SECURE_ENDPOINT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/secure_endpoint_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/iomgr/endpoint_tests.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/security/secure_endpoint_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_secure_endpoint_test: $(SECURE_ENDPOINT_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(SECURE_ENDPOINT_TEST_OBJS:.o=.dep) +endif +endif + + +SECURITY_CONNECTOR_TEST_SRC = \ + test/core/security/security_connector_test.cc \ + +SECURITY_CONNECTOR_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(SECURITY_CONNECTOR_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/security_connector_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/security_connector_test: $(SECURITY_CONNECTOR_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(SECURITY_CONNECTOR_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/security_connector_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/security/security_connector_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_security_connector_test: $(SECURITY_CONNECTOR_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(SECURITY_CONNECTOR_TEST_OBJS:.o=.dep) +endif +endif + + +SEQUENTIAL_CONNECTIVITY_TEST_SRC = \ + test/core/surface/sequential_connectivity_test.cc \ + +SEQUENTIAL_CONNECTIVITY_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(SEQUENTIAL_CONNECTIVITY_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/sequential_connectivity_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/sequential_connectivity_test: $(SEQUENTIAL_CONNECTIVITY_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(SEQUENTIAL_CONNECTIVITY_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/sequential_connectivity_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/surface/sequential_connectivity_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_sequential_connectivity_test: $(SEQUENTIAL_CONNECTIVITY_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(SEQUENTIAL_CONNECTIVITY_TEST_OBJS:.o=.dep) +endif +endif + + +SERVER_CHTTP2_TEST_SRC = \ + test/core/surface/server_chttp2_test.cc \ + +SERVER_CHTTP2_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(SERVER_CHTTP2_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/server_chttp2_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/server_chttp2_test: $(SERVER_CHTTP2_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(SERVER_CHTTP2_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/server_chttp2_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/surface/server_chttp2_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_server_chttp2_test: $(SERVER_CHTTP2_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(SERVER_CHTTP2_TEST_OBJS:.o=.dep) +endif +endif + + +SERVER_SSL_TEST_SRC = \ + test/core/handshake/server_ssl.cc \ + test/core/handshake/server_ssl_common.cc \ + +SERVER_SSL_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(SERVER_SSL_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/server_ssl_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/server_ssl_test: $(SERVER_SSL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(SERVER_SSL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/server_ssl_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/handshake/server_ssl.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/handshake/server_ssl_common.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_server_ssl_test: $(SERVER_SSL_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(SERVER_SSL_TEST_OBJS:.o=.dep) +endif +endif + + +SERVER_TEST_SRC = \ + test/core/surface/server_test.cc \ + +SERVER_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(SERVER_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/server_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/server_test: $(SERVER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(SERVER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/server_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/surface/server_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_server_test: $(SERVER_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(SERVER_TEST_OBJS:.o=.dep) +endif +endif + + +SLICE_BUFFER_TEST_SRC = \ + test/core/slice/slice_buffer_test.cc \ + +SLICE_BUFFER_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(SLICE_BUFFER_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/slice_buffer_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/slice_buffer_test: $(SLICE_BUFFER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(SLICE_BUFFER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/slice_buffer_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/slice/slice_buffer_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_slice_buffer_test: $(SLICE_BUFFER_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(SLICE_BUFFER_TEST_OBJS:.o=.dep) +endif +endif + + +SLICE_STRING_HELPERS_TEST_SRC = \ + test/core/slice/slice_string_helpers_test.cc \ + +SLICE_STRING_HELPERS_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(SLICE_STRING_HELPERS_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/slice_string_helpers_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/slice_string_helpers_test: $(SLICE_STRING_HELPERS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(SLICE_STRING_HELPERS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/slice_string_helpers_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/slice/slice_string_helpers_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_slice_string_helpers_test: $(SLICE_STRING_HELPERS_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(SLICE_STRING_HELPERS_TEST_OBJS:.o=.dep) +endif +endif + + +SOCKADDR_RESOLVER_TEST_SRC = \ + test/core/client_channel/resolvers/sockaddr_resolver_test.cc \ + +SOCKADDR_RESOLVER_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(SOCKADDR_RESOLVER_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/sockaddr_resolver_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/sockaddr_resolver_test: $(SOCKADDR_RESOLVER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(SOCKADDR_RESOLVER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/sockaddr_resolver_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/client_channel/resolvers/sockaddr_resolver_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_sockaddr_resolver_test: $(SOCKADDR_RESOLVER_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(SOCKADDR_RESOLVER_TEST_OBJS:.o=.dep) +endif +endif + + +SOCKADDR_UTILS_TEST_SRC = \ + test/core/iomgr/sockaddr_utils_test.cc \ + +SOCKADDR_UTILS_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(SOCKADDR_UTILS_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/sockaddr_utils_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/sockaddr_utils_test: $(SOCKADDR_UTILS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(SOCKADDR_UTILS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/sockaddr_utils_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/iomgr/sockaddr_utils_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_sockaddr_utils_test: $(SOCKADDR_UTILS_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(SOCKADDR_UTILS_TEST_OBJS:.o=.dep) +endif +endif + + +SOCKET_UTILS_TEST_SRC = \ + test/core/iomgr/socket_utils_test.cc \ + +SOCKET_UTILS_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(SOCKET_UTILS_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/socket_utils_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/socket_utils_test: $(SOCKET_UTILS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(SOCKET_UTILS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/socket_utils_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/iomgr/socket_utils_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_socket_utils_test: $(SOCKET_UTILS_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(SOCKET_UTILS_TEST_OBJS:.o=.dep) +endif +endif + + +SPINLOCK_TEST_SRC = \ + test/core/gpr/spinlock_test.cc \ + +SPINLOCK_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(SPINLOCK_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/spinlock_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/spinlock_test: $(SPINLOCK_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(SPINLOCK_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/spinlock_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/gpr/spinlock_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_spinlock_test: $(SPINLOCK_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(SPINLOCK_TEST_OBJS:.o=.dep) +endif +endif + + +SSL_CREDENTIALS_TEST_SRC = \ + test/core/security/ssl_credentials_test.cc \ + +SSL_CREDENTIALS_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(SSL_CREDENTIALS_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/ssl_credentials_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/ssl_credentials_test: $(SSL_CREDENTIALS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(SSL_CREDENTIALS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/ssl_credentials_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/security/ssl_credentials_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_ssl_credentials_test: $(SSL_CREDENTIALS_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(SSL_CREDENTIALS_TEST_OBJS:.o=.dep) +endif +endif + + +SSL_TRANSPORT_SECURITY_TEST_SRC = \ + test/core/tsi/ssl_transport_security_test.cc \ + test/core/tsi/transport_security_test_lib.cc \ + +SSL_TRANSPORT_SECURITY_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(SSL_TRANSPORT_SECURITY_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/ssl_transport_security_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/ssl_transport_security_test: $(SSL_TRANSPORT_SECURITY_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(SSL_TRANSPORT_SECURITY_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/ssl_transport_security_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/tsi/ssl_transport_security_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/tsi/transport_security_test_lib.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_ssl_transport_security_test: $(SSL_TRANSPORT_SECURITY_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(SSL_TRANSPORT_SECURITY_TEST_OBJS:.o=.dep) +endif +endif + + +STATUS_CONVERSION_TEST_SRC = \ + test/core/transport/status_conversion_test.cc \ + +STATUS_CONVERSION_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(STATUS_CONVERSION_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/status_conversion_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/status_conversion_test: $(STATUS_CONVERSION_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(STATUS_CONVERSION_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/status_conversion_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/transport/status_conversion_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_status_conversion_test: $(STATUS_CONVERSION_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(STATUS_CONVERSION_TEST_OBJS:.o=.dep) +endif +endif + + +STREAM_COMPRESSION_TEST_SRC = \ + test/core/compression/stream_compression_test.cc \ + +STREAM_COMPRESSION_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(STREAM_COMPRESSION_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/stream_compression_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/stream_compression_test: $(STREAM_COMPRESSION_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(STREAM_COMPRESSION_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/stream_compression_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/compression/stream_compression_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_stream_compression_test: $(STREAM_COMPRESSION_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(STREAM_COMPRESSION_TEST_OBJS:.o=.dep) +endif +endif + + +STREAM_MAP_TEST_SRC = \ + test/core/transport/chttp2/stream_map_test.cc \ + +STREAM_MAP_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(STREAM_MAP_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/stream_map_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/stream_map_test: $(STREAM_MAP_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(STREAM_MAP_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/stream_map_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/transport/chttp2/stream_map_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_stream_map_test: $(STREAM_MAP_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(STREAM_MAP_TEST_OBJS:.o=.dep) +endif +endif + + +STREAM_OWNED_SLICE_TEST_SRC = \ + test/core/transport/stream_owned_slice_test.cc \ + +STREAM_OWNED_SLICE_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(STREAM_OWNED_SLICE_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/stream_owned_slice_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/stream_owned_slice_test: $(STREAM_OWNED_SLICE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(STREAM_OWNED_SLICE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/stream_owned_slice_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/transport/stream_owned_slice_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_stream_owned_slice_test: $(STREAM_OWNED_SLICE_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(STREAM_OWNED_SLICE_TEST_OBJS:.o=.dep) +endif +endif + + +STRING_TEST_SRC = \ + test/core/gpr/string_test.cc \ + +STRING_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(STRING_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/string_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/string_test: $(STRING_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(STRING_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/string_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/gpr/string_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_string_test: $(STRING_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(STRING_TEST_OBJS:.o=.dep) +endif +endif + + +SYNC_TEST_SRC = \ + test/core/gpr/sync_test.cc \ + +SYNC_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(SYNC_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/sync_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/sync_test: $(SYNC_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(SYNC_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/sync_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/gpr/sync_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_sync_test: $(SYNC_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(SYNC_TEST_OBJS:.o=.dep) +endif +endif + + +TCP_CLIENT_POSIX_TEST_SRC = \ + test/core/iomgr/tcp_client_posix_test.cc \ + +TCP_CLIENT_POSIX_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(TCP_CLIENT_POSIX_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/tcp_client_posix_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/tcp_client_posix_test: $(TCP_CLIENT_POSIX_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(TCP_CLIENT_POSIX_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/tcp_client_posix_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/iomgr/tcp_client_posix_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_tcp_client_posix_test: $(TCP_CLIENT_POSIX_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(TCP_CLIENT_POSIX_TEST_OBJS:.o=.dep) +endif +endif + + +TCP_POSIX_TEST_SRC = \ + test/core/iomgr/endpoint_tests.cc \ + test/core/iomgr/tcp_posix_test.cc \ + +TCP_POSIX_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(TCP_POSIX_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/tcp_posix_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/tcp_posix_test: $(TCP_POSIX_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(TCP_POSIX_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/tcp_posix_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/iomgr/endpoint_tests.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/iomgr/tcp_posix_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_tcp_posix_test: $(TCP_POSIX_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(TCP_POSIX_TEST_OBJS:.o=.dep) +endif +endif + + +TCP_SERVER_POSIX_TEST_SRC = \ + test/core/iomgr/tcp_server_posix_test.cc \ + +TCP_SERVER_POSIX_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(TCP_SERVER_POSIX_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/tcp_server_posix_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/tcp_server_posix_test: $(TCP_SERVER_POSIX_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(TCP_SERVER_POSIX_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/tcp_server_posix_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/iomgr/tcp_server_posix_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_tcp_server_posix_test: $(TCP_SERVER_POSIX_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(TCP_SERVER_POSIX_TEST_OBJS:.o=.dep) +endif +endif + + +TEST_CORE_GPR_TIME_TEST_SRC = \ + test/core/gpr/time_test.cc \ + +TEST_CORE_GPR_TIME_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(TEST_CORE_GPR_TIME_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/test_core_gpr_time_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/test_core_gpr_time_test: $(TEST_CORE_GPR_TIME_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(TEST_CORE_GPR_TIME_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/test_core_gpr_time_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/gpr/time_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_test_core_gpr_time_test: $(TEST_CORE_GPR_TIME_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(TEST_CORE_GPR_TIME_TEST_OBJS:.o=.dep) +endif +endif + + +TEST_CORE_SECURITY_CREDENTIALS_TEST_SRC = \ + test/core/security/credentials_test.cc \ + +TEST_CORE_SECURITY_CREDENTIALS_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(TEST_CORE_SECURITY_CREDENTIALS_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/test_core_security_credentials_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/test_core_security_credentials_test: $(TEST_CORE_SECURITY_CREDENTIALS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(TEST_CORE_SECURITY_CREDENTIALS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/test_core_security_credentials_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/security/credentials_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_test_core_security_credentials_test: $(TEST_CORE_SECURITY_CREDENTIALS_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(TEST_CORE_SECURITY_CREDENTIALS_TEST_OBJS:.o=.dep) +endif +endif + + +TEST_CORE_SLICE_SLICE_TEST_SRC = \ + test/core/slice/slice_test.cc \ + +TEST_CORE_SLICE_SLICE_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(TEST_CORE_SLICE_SLICE_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/test_core_slice_slice_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/test_core_slice_slice_test: $(TEST_CORE_SLICE_SLICE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(TEST_CORE_SLICE_SLICE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/test_core_slice_slice_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/slice/slice_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_test_core_slice_slice_test: $(TEST_CORE_SLICE_SLICE_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(TEST_CORE_SLICE_SLICE_TEST_OBJS:.o=.dep) +endif +endif + + +THD_TEST_SRC = \ + test/core/gprpp/thd_test.cc \ + +THD_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(THD_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/thd_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/thd_test: $(THD_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(THD_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/thd_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/gprpp/thd_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_thd_test: $(THD_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(THD_TEST_OBJS:.o=.dep) +endif +endif + + +THREADPOOL_TEST_SRC = \ + test/core/iomgr/threadpool_test.cc \ + +THREADPOOL_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(THREADPOOL_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/threadpool_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/threadpool_test: $(THREADPOOL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(THREADPOOL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/threadpool_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/iomgr/threadpool_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_threadpool_test: $(THREADPOOL_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(THREADPOOL_TEST_OBJS:.o=.dep) +endif +endif + + +TIME_AVERAGED_STATS_TEST_SRC = \ + test/core/iomgr/time_averaged_stats_test.cc \ + +TIME_AVERAGED_STATS_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(TIME_AVERAGED_STATS_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/time_averaged_stats_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/time_averaged_stats_test: $(TIME_AVERAGED_STATS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(TIME_AVERAGED_STATS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/time_averaged_stats_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/iomgr/time_averaged_stats_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_time_averaged_stats_test: $(TIME_AVERAGED_STATS_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(TIME_AVERAGED_STATS_TEST_OBJS:.o=.dep) +endif +endif + + +TIMEOUT_ENCODING_TEST_SRC = \ + test/core/transport/timeout_encoding_test.cc \ + +TIMEOUT_ENCODING_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(TIMEOUT_ENCODING_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/timeout_encoding_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/timeout_encoding_test: $(TIMEOUT_ENCODING_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(TIMEOUT_ENCODING_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/timeout_encoding_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/transport/timeout_encoding_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_timeout_encoding_test: $(TIMEOUT_ENCODING_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(TIMEOUT_ENCODING_TEST_OBJS:.o=.dep) +endif +endif + + +TIMER_HEAP_TEST_SRC = \ + test/core/iomgr/timer_heap_test.cc \ + +TIMER_HEAP_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(TIMER_HEAP_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/timer_heap_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/timer_heap_test: $(TIMER_HEAP_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(TIMER_HEAP_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/timer_heap_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/iomgr/timer_heap_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_timer_heap_test: $(TIMER_HEAP_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(TIMER_HEAP_TEST_OBJS:.o=.dep) +endif +endif + + +TIMER_LIST_TEST_SRC = \ + test/core/iomgr/timer_list_test.cc \ + +TIMER_LIST_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(TIMER_LIST_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/timer_list_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/timer_list_test: $(TIMER_LIST_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(TIMER_LIST_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/timer_list_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/iomgr/timer_list_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_timer_list_test: $(TIMER_LIST_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(TIMER_LIST_TEST_OBJS:.o=.dep) +endif +endif + + +TLS_TEST_SRC = \ + test/core/gpr/tls_test.cc \ + +TLS_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(TLS_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/tls_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/tls_test: $(TLS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(TLS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/tls_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/gpr/tls_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_tls_test: $(TLS_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(TLS_TEST_OBJS:.o=.dep) +endif +endif + + +TRANSPORT_SECURITY_COMMON_API_TEST_SRC = \ + test/core/tsi/alts/handshaker/transport_security_common_api_test.cc \ + +TRANSPORT_SECURITY_COMMON_API_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(TRANSPORT_SECURITY_COMMON_API_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/transport_security_common_api_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/transport_security_common_api_test: $(TRANSPORT_SECURITY_COMMON_API_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(TRANSPORT_SECURITY_COMMON_API_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/transport_security_common_api_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/tsi/alts/handshaker/transport_security_common_api_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_transport_security_common_api_test: $(TRANSPORT_SECURITY_COMMON_API_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(TRANSPORT_SECURITY_COMMON_API_TEST_OBJS:.o=.dep) +endif +endif + + +TRANSPORT_SECURITY_TEST_SRC = \ + test/core/tsi/transport_security_test.cc \ + +TRANSPORT_SECURITY_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(TRANSPORT_SECURITY_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/transport_security_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/transport_security_test: $(TRANSPORT_SECURITY_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(TRANSPORT_SECURITY_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/transport_security_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/tsi/transport_security_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_transport_security_test: $(TRANSPORT_SECURITY_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(TRANSPORT_SECURITY_TEST_OBJS:.o=.dep) +endif +endif + + +UDP_SERVER_TEST_SRC = \ + test/core/iomgr/udp_server_test.cc \ + +UDP_SERVER_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(UDP_SERVER_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/udp_server_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/udp_server_test: $(UDP_SERVER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(UDP_SERVER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/udp_server_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/iomgr/udp_server_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_udp_server_test: $(UDP_SERVER_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(UDP_SERVER_TEST_OBJS:.o=.dep) +endif +endif + + +URI_PARSER_TEST_SRC = \ + test/core/client_channel/uri_parser_test.cc \ + +URI_PARSER_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(URI_PARSER_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/uri_parser_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/uri_parser_test: $(URI_PARSER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(URI_PARSER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/uri_parser_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/client_channel/uri_parser_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_uri_parser_test: $(URI_PARSER_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(URI_PARSER_TEST_OBJS:.o=.dep) +endif +endif + + +USEFUL_TEST_SRC = \ + test/core/gpr/useful_test.cc \ + +USEFUL_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(USEFUL_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/useful_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/useful_test: $(USEFUL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(USEFUL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/useful_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/gpr/useful_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_useful_test: $(USEFUL_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(USEFUL_TEST_OBJS:.o=.dep) +endif +endif + + +VARINT_TEST_SRC = \ + test/core/transport/chttp2/varint_test.cc \ + +VARINT_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(VARINT_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/varint_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/varint_test: $(VARINT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(VARINT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/varint_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/transport/chttp2/varint_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_varint_test: $(VARINT_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(VARINT_TEST_OBJS:.o=.dep) +endif +endif + + +ADDRESS_SORTING_TEST_SRC = \ + test/cpp/naming/address_sorting_test.cc \ + +ADDRESS_SORTING_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(ADDRESS_SORTING_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/address_sorting_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/address_sorting_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/address_sorting_test: $(PROTOBUF_DEP) $(ADDRESS_SORTING_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(ADDRESS_SORTING_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/address_sorting_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/cpp/naming/address_sorting_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_address_sorting_test: $(ADDRESS_SORTING_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(ADDRESS_SORTING_TEST_OBJS:.o=.dep) +endif +endif + + +ADDRESS_SORTING_TEST_UNSECURE_SRC = \ + test/cpp/naming/address_sorting_test.cc \ + test/cpp/util/byte_buffer_proto_helper.cc \ + test/cpp/util/string_ref_helper.cc \ + test/cpp/util/subprocess.cc \ + +ADDRESS_SORTING_TEST_UNSECURE_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(ADDRESS_SORTING_TEST_UNSECURE_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/address_sorting_test_unsecure: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/address_sorting_test_unsecure: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/address_sorting_test_unsecure: $(PROTOBUF_DEP) $(ADDRESS_SORTING_TEST_UNSECURE_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(ADDRESS_SORTING_TEST_UNSECURE_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/address_sorting_test_unsecure + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/cpp/naming/address_sorting_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/util/byte_buffer_proto_helper.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/util/string_ref_helper.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/util/subprocess.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_address_sorting_test_unsecure: $(ADDRESS_SORTING_TEST_UNSECURE_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(ADDRESS_SORTING_TEST_UNSECURE_OBJS:.o=.dep) +endif +endif + + +ALARM_TEST_SRC = \ + test/cpp/common/alarm_test.cc \ + +ALARM_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(ALARM_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/alarm_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/alarm_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/alarm_test: $(PROTOBUF_DEP) $(ALARM_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(ALARM_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/alarm_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/cpp/common/alarm_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_alarm_test: $(ALARM_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(ALARM_TEST_OBJS:.o=.dep) +endif +endif + + +ALTS_CONCURRENT_CONNECTIVITY_TEST_SRC = \ + $(GENDIR)/test/core/tsi/alts/fake_handshaker/handshaker.pb.cc $(GENDIR)/test/core/tsi/alts/fake_handshaker/handshaker.grpc.pb.cc \ + $(GENDIR)/test/core/tsi/alts/fake_handshaker/transport_security_common.pb.cc $(GENDIR)/test/core/tsi/alts/fake_handshaker/transport_security_common.grpc.pb.cc \ + test/core/end2end/cq_verifier.cc \ + test/core/tsi/alts/fake_handshaker/fake_handshaker_server.cc \ + test/core/tsi/alts/handshaker/alts_concurrent_connectivity_test.cc \ + +ALTS_CONCURRENT_CONNECTIVITY_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(ALTS_CONCURRENT_CONNECTIVITY_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/alts_concurrent_connectivity_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/alts_concurrent_connectivity_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/alts_concurrent_connectivity_test: $(PROTOBUF_DEP) $(ALTS_CONCURRENT_CONNECTIVITY_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(ALTS_CONCURRENT_CONNECTIVITY_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/alts_concurrent_connectivity_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/tsi/alts/fake_handshaker/handshaker.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/tsi/alts/fake_handshaker/transport_security_common.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/end2end/cq_verifier.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/tsi/alts/fake_handshaker/fake_handshaker_server.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/tsi/alts/handshaker/alts_concurrent_connectivity_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_alts_concurrent_connectivity_test: $(ALTS_CONCURRENT_CONNECTIVITY_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(ALTS_CONCURRENT_CONNECTIVITY_TEST_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/core/end2end/cq_verifier.o: $(GENDIR)/test/core/tsi/alts/fake_handshaker/handshaker.pb.cc $(GENDIR)/test/core/tsi/alts/fake_handshaker/handshaker.grpc.pb.cc $(GENDIR)/test/core/tsi/alts/fake_handshaker/transport_security_common.pb.cc $(GENDIR)/test/core/tsi/alts/fake_handshaker/transport_security_common.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/core/tsi/alts/fake_handshaker/fake_handshaker_server.o: $(GENDIR)/test/core/tsi/alts/fake_handshaker/handshaker.pb.cc $(GENDIR)/test/core/tsi/alts/fake_handshaker/handshaker.grpc.pb.cc $(GENDIR)/test/core/tsi/alts/fake_handshaker/transport_security_common.pb.cc $(GENDIR)/test/core/tsi/alts/fake_handshaker/transport_security_common.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/core/tsi/alts/handshaker/alts_concurrent_connectivity_test.o: $(GENDIR)/test/core/tsi/alts/fake_handshaker/handshaker.pb.cc $(GENDIR)/test/core/tsi/alts/fake_handshaker/handshaker.grpc.pb.cc $(GENDIR)/test/core/tsi/alts/fake_handshaker/transport_security_common.pb.cc $(GENDIR)/test/core/tsi/alts/fake_handshaker/transport_security_common.grpc.pb.cc + + +ALTS_CREDENTIALS_FUZZER_SRC = \ + test/core/security/alts_credentials_fuzzer.cc \ + test/core/util/fuzzer_corpus_test.cc \ + +ALTS_CREDENTIALS_FUZZER_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(ALTS_CREDENTIALS_FUZZER_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/alts_credentials_fuzzer: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/alts_credentials_fuzzer: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/alts_credentials_fuzzer: $(PROTOBUF_DEP) $(ALTS_CREDENTIALS_FUZZER_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(ALTS_CREDENTIALS_FUZZER_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) -lFuzzer -o $(BINDIR)/$(CONFIG)/alts_credentials_fuzzer + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/security/alts_credentials_fuzzer.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/fuzzer_corpus_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_alts_credentials_fuzzer: $(ALTS_CREDENTIALS_FUZZER_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(ALTS_CREDENTIALS_FUZZER_OBJS:.o=.dep) +endif +endif + + +ALTS_UTIL_TEST_SRC = \ + test/cpp/common/alts_util_test.cc \ + +ALTS_UTIL_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(ALTS_UTIL_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/alts_util_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/alts_util_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/alts_util_test: $(PROTOBUF_DEP) $(ALTS_UTIL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_alts.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(ALTS_UTIL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_alts.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/alts_util_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/cpp/common/alts_util_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_alts.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_alts_util_test: $(ALTS_UTIL_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(ALTS_UTIL_TEST_OBJS:.o=.dep) +endif +endif + + +ASYNC_END2END_TEST_SRC = \ + $(GENDIR)/src/proto/grpc/health/v1/health.pb.cc $(GENDIR)/src/proto/grpc/health/v1/health.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc \ + test/cpp/end2end/async_end2end_test.cc \ + +ASYNC_END2END_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(ASYNC_END2END_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/async_end2end_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/async_end2end_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/async_end2end_test: $(PROTOBUF_DEP) $(ASYNC_END2END_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(ASYNC_END2END_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/async_end2end_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/health/v1/health.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/duplicate/echo_duplicate.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/simple_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/async_end2end_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_async_end2end_test: $(ASYNC_END2END_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(ASYNC_END2END_TEST_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/async_end2end_test.o: $(GENDIR)/src/proto/grpc/health/v1/health.pb.cc $(GENDIR)/src/proto/grpc/health/v1/health.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc + + +AUTH_PROPERTY_ITERATOR_TEST_SRC = \ + test/cpp/common/auth_property_iterator_test.cc \ + +AUTH_PROPERTY_ITERATOR_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(AUTH_PROPERTY_ITERATOR_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/auth_property_iterator_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/auth_property_iterator_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/auth_property_iterator_test: $(PROTOBUF_DEP) $(AUTH_PROPERTY_ITERATOR_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(AUTH_PROPERTY_ITERATOR_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/auth_property_iterator_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/cpp/common/auth_property_iterator_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_auth_property_iterator_test: $(AUTH_PROPERTY_ITERATOR_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(AUTH_PROPERTY_ITERATOR_TEST_OBJS:.o=.dep) +endif +endif + + +BACKOFF_TEST_SRC = \ + test/core/backoff/backoff_test.cc \ + +BACKOFF_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BACKOFF_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/backoff_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/backoff_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/backoff_test: $(PROTOBUF_DEP) $(BACKOFF_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(BACKOFF_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/backoff_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/backoff/backoff_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_backoff_test: $(BACKOFF_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(BACKOFF_TEST_OBJS:.o=.dep) +endif +endif + + +BAD_STREAMING_ID_BAD_CLIENT_TEST_SRC = \ + test/core/bad_client/bad_client.cc \ + test/core/bad_client/tests/bad_streaming_id.cc \ + test/core/end2end/cq_verifier.cc \ + +BAD_STREAMING_ID_BAD_CLIENT_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BAD_STREAMING_ID_BAD_CLIENT_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/bad_streaming_id_bad_client_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/bad_streaming_id_bad_client_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/bad_streaming_id_bad_client_test: $(PROTOBUF_DEP) $(BAD_STREAMING_ID_BAD_CLIENT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(BAD_STREAMING_ID_BAD_CLIENT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/bad_streaming_id_bad_client_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/bad_client/bad_client.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/bad_client/tests/bad_streaming_id.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/end2end/cq_verifier.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_bad_streaming_id_bad_client_test: $(BAD_STREAMING_ID_BAD_CLIENT_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(BAD_STREAMING_ID_BAD_CLIENT_TEST_OBJS:.o=.dep) +endif +endif + + +BADREQ_BAD_CLIENT_TEST_SRC = \ + test/core/bad_client/bad_client.cc \ + test/core/bad_client/tests/badreq.cc \ + test/core/end2end/cq_verifier.cc \ + +BADREQ_BAD_CLIENT_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BADREQ_BAD_CLIENT_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/badreq_bad_client_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/badreq_bad_client_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/badreq_bad_client_test: $(PROTOBUF_DEP) $(BADREQ_BAD_CLIENT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(BADREQ_BAD_CLIENT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/badreq_bad_client_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/bad_client/bad_client.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/bad_client/tests/badreq.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/end2end/cq_verifier.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_badreq_bad_client_test: $(BADREQ_BAD_CLIENT_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(BADREQ_BAD_CLIENT_TEST_OBJS:.o=.dep) +endif +endif + + +BDP_ESTIMATOR_TEST_SRC = \ + test/core/transport/bdp_estimator_test.cc \ + +BDP_ESTIMATOR_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BDP_ESTIMATOR_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/bdp_estimator_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/bdp_estimator_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/bdp_estimator_test: $(PROTOBUF_DEP) $(BDP_ESTIMATOR_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(BDP_ESTIMATOR_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/bdp_estimator_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/transport/bdp_estimator_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_bdp_estimator_test: $(BDP_ESTIMATOR_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(BDP_ESTIMATOR_TEST_OBJS:.o=.dep) +endif +endif + + +BM_ALARM_SRC = \ + test/cpp/microbenchmarks/bm_alarm.cc \ + +BM_ALARM_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BM_ALARM_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/bm_alarm: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/bm_alarm: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/bm_alarm: $(PROTOBUF_DEP) $(BM_ALARM_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(BM_ALARM_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/bm_alarm + +endif + +endif + +$(BM_ALARM_OBJS): CPPFLAGS += -Ithird_party/benchmark/include -DHAVE_POSIX_REGEX +$(OBJDIR)/$(CONFIG)/test/cpp/microbenchmarks/bm_alarm.o: $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + +deps_bm_alarm: $(BM_ALARM_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(BM_ALARM_OBJS:.o=.dep) +endif +endif + + +BM_ARENA_SRC = \ + test/cpp/microbenchmarks/bm_arena.cc \ + +BM_ARENA_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BM_ARENA_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/bm_arena: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/bm_arena: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/bm_arena: $(PROTOBUF_DEP) $(BM_ARENA_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(BM_ARENA_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/bm_arena + +endif + +endif + +$(BM_ARENA_OBJS): CPPFLAGS += -Ithird_party/benchmark/include -DHAVE_POSIX_REGEX +$(OBJDIR)/$(CONFIG)/test/cpp/microbenchmarks/bm_arena.o: $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + +deps_bm_arena: $(BM_ARENA_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(BM_ARENA_OBJS:.o=.dep) +endif +endif + + +BM_BYTE_BUFFER_SRC = \ + test/cpp/microbenchmarks/bm_byte_buffer.cc \ + +BM_BYTE_BUFFER_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BM_BYTE_BUFFER_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/bm_byte_buffer: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/bm_byte_buffer: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/bm_byte_buffer: $(PROTOBUF_DEP) $(BM_BYTE_BUFFER_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(BM_BYTE_BUFFER_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/bm_byte_buffer + +endif + +endif + +$(BM_BYTE_BUFFER_OBJS): CPPFLAGS += -Ithird_party/benchmark/include -DHAVE_POSIX_REGEX +$(OBJDIR)/$(CONFIG)/test/cpp/microbenchmarks/bm_byte_buffer.o: $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + +deps_bm_byte_buffer: $(BM_BYTE_BUFFER_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(BM_BYTE_BUFFER_OBJS:.o=.dep) +endif +endif + + +BM_CALL_CREATE_SRC = \ + test/cpp/microbenchmarks/bm_call_create.cc \ + +BM_CALL_CREATE_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BM_CALL_CREATE_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/bm_call_create: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/bm_call_create: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/bm_call_create: $(PROTOBUF_DEP) $(BM_CALL_CREATE_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(BM_CALL_CREATE_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/bm_call_create + +endif + +endif + +$(BM_CALL_CREATE_OBJS): CPPFLAGS += -Ithird_party/benchmark/include -DHAVE_POSIX_REGEX +$(OBJDIR)/$(CONFIG)/test/cpp/microbenchmarks/bm_call_create.o: $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + +deps_bm_call_create: $(BM_CALL_CREATE_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(BM_CALL_CREATE_OBJS:.o=.dep) +endif +endif + + +BM_CALLBACK_STREAMING_PING_PONG_SRC = \ + test/cpp/microbenchmarks/bm_callback_streaming_ping_pong.cc \ + test/cpp/microbenchmarks/callback_test_service.cc \ + test/cpp/util/byte_buffer_proto_helper.cc \ + test/cpp/util/string_ref_helper.cc \ + test/cpp/util/subprocess.cc \ + +BM_CALLBACK_STREAMING_PING_PONG_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BM_CALLBACK_STREAMING_PING_PONG_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/bm_callback_streaming_ping_pong: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/bm_callback_streaming_ping_pong: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/bm_callback_streaming_ping_pong: $(PROTOBUF_DEP) $(BM_CALLBACK_STREAMING_PING_PONG_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(BM_CALLBACK_STREAMING_PING_PONG_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/bm_callback_streaming_ping_pong + +endif + +endif + +$(BM_CALLBACK_STREAMING_PING_PONG_OBJS): CPPFLAGS += -Ithird_party/benchmark/include -DHAVE_POSIX_REGEX +$(OBJDIR)/$(CONFIG)/test/cpp/microbenchmarks/bm_callback_streaming_ping_pong.o: $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + +$(OBJDIR)/$(CONFIG)/test/cpp/microbenchmarks/callback_test_service.o: $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + +$(OBJDIR)/$(CONFIG)/test/cpp/util/byte_buffer_proto_helper.o: $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + +$(OBJDIR)/$(CONFIG)/test/cpp/util/string_ref_helper.o: $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + +$(OBJDIR)/$(CONFIG)/test/cpp/util/subprocess.o: $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + +deps_bm_callback_streaming_ping_pong: $(BM_CALLBACK_STREAMING_PING_PONG_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(BM_CALLBACK_STREAMING_PING_PONG_OBJS:.o=.dep) +endif +endif + + +BM_CALLBACK_UNARY_PING_PONG_SRC = \ + test/cpp/microbenchmarks/bm_callback_unary_ping_pong.cc \ + test/cpp/microbenchmarks/callback_test_service.cc \ + test/cpp/util/byte_buffer_proto_helper.cc \ + test/cpp/util/string_ref_helper.cc \ + test/cpp/util/subprocess.cc \ + +BM_CALLBACK_UNARY_PING_PONG_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BM_CALLBACK_UNARY_PING_PONG_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/bm_callback_unary_ping_pong: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/bm_callback_unary_ping_pong: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/bm_callback_unary_ping_pong: $(PROTOBUF_DEP) $(BM_CALLBACK_UNARY_PING_PONG_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(BM_CALLBACK_UNARY_PING_PONG_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/bm_callback_unary_ping_pong + +endif + +endif + +$(BM_CALLBACK_UNARY_PING_PONG_OBJS): CPPFLAGS += -Ithird_party/benchmark/include -DHAVE_POSIX_REGEX +$(OBJDIR)/$(CONFIG)/test/cpp/microbenchmarks/bm_callback_unary_ping_pong.o: $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + +$(OBJDIR)/$(CONFIG)/test/cpp/microbenchmarks/callback_test_service.o: $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + +$(OBJDIR)/$(CONFIG)/test/cpp/util/byte_buffer_proto_helper.o: $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + +$(OBJDIR)/$(CONFIG)/test/cpp/util/string_ref_helper.o: $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + +$(OBJDIR)/$(CONFIG)/test/cpp/util/subprocess.o: $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + +deps_bm_callback_unary_ping_pong: $(BM_CALLBACK_UNARY_PING_PONG_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(BM_CALLBACK_UNARY_PING_PONG_OBJS:.o=.dep) +endif +endif + + +BM_CHANNEL_SRC = \ + test/cpp/microbenchmarks/bm_channel.cc \ + +BM_CHANNEL_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BM_CHANNEL_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/bm_channel: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/bm_channel: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/bm_channel: $(PROTOBUF_DEP) $(BM_CHANNEL_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(BM_CHANNEL_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/bm_channel + +endif + +endif + +$(BM_CHANNEL_OBJS): CPPFLAGS += -Ithird_party/benchmark/include -DHAVE_POSIX_REGEX +$(OBJDIR)/$(CONFIG)/test/cpp/microbenchmarks/bm_channel.o: $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + +deps_bm_channel: $(BM_CHANNEL_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(BM_CHANNEL_OBJS:.o=.dep) +endif +endif + + +BM_CHTTP2_HPACK_SRC = \ + test/cpp/microbenchmarks/bm_chttp2_hpack.cc \ + +BM_CHTTP2_HPACK_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BM_CHTTP2_HPACK_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/bm_chttp2_hpack: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/bm_chttp2_hpack: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/bm_chttp2_hpack: $(PROTOBUF_DEP) $(BM_CHTTP2_HPACK_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(BM_CHTTP2_HPACK_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/bm_chttp2_hpack + +endif + +endif + +$(BM_CHTTP2_HPACK_OBJS): CPPFLAGS += -Ithird_party/benchmark/include -DHAVE_POSIX_REGEX +$(OBJDIR)/$(CONFIG)/test/cpp/microbenchmarks/bm_chttp2_hpack.o: $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + +deps_bm_chttp2_hpack: $(BM_CHTTP2_HPACK_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(BM_CHTTP2_HPACK_OBJS:.o=.dep) +endif +endif + + +BM_CHTTP2_TRANSPORT_SRC = \ + test/cpp/microbenchmarks/bm_chttp2_transport.cc \ + +BM_CHTTP2_TRANSPORT_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BM_CHTTP2_TRANSPORT_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/bm_chttp2_transport: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/bm_chttp2_transport: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/bm_chttp2_transport: $(PROTOBUF_DEP) $(BM_CHTTP2_TRANSPORT_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(BM_CHTTP2_TRANSPORT_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/bm_chttp2_transport + +endif + +endif + +$(BM_CHTTP2_TRANSPORT_OBJS): CPPFLAGS += -Ithird_party/benchmark/include -DHAVE_POSIX_REGEX +$(OBJDIR)/$(CONFIG)/test/cpp/microbenchmarks/bm_chttp2_transport.o: $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + +deps_bm_chttp2_transport: $(BM_CHTTP2_TRANSPORT_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(BM_CHTTP2_TRANSPORT_OBJS:.o=.dep) +endif +endif + + +BM_CLOSURE_SRC = \ + test/cpp/microbenchmarks/bm_closure.cc \ + +BM_CLOSURE_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BM_CLOSURE_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/bm_closure: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/bm_closure: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/bm_closure: $(PROTOBUF_DEP) $(BM_CLOSURE_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(BM_CLOSURE_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/bm_closure + +endif + +endif + +$(BM_CLOSURE_OBJS): CPPFLAGS += -Ithird_party/benchmark/include -DHAVE_POSIX_REGEX +$(OBJDIR)/$(CONFIG)/test/cpp/microbenchmarks/bm_closure.o: $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + +deps_bm_closure: $(BM_CLOSURE_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(BM_CLOSURE_OBJS:.o=.dep) +endif +endif + + +BM_CQ_SRC = \ + test/cpp/microbenchmarks/bm_cq.cc \ + +BM_CQ_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BM_CQ_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/bm_cq: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/bm_cq: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/bm_cq: $(PROTOBUF_DEP) $(BM_CQ_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(BM_CQ_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/bm_cq + +endif + +endif + +$(BM_CQ_OBJS): CPPFLAGS += -Ithird_party/benchmark/include -DHAVE_POSIX_REGEX +$(OBJDIR)/$(CONFIG)/test/cpp/microbenchmarks/bm_cq.o: $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + +deps_bm_cq: $(BM_CQ_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(BM_CQ_OBJS:.o=.dep) +endif +endif + + +BM_CQ_MULTIPLE_THREADS_SRC = \ + test/cpp/microbenchmarks/bm_cq_multiple_threads.cc \ + +BM_CQ_MULTIPLE_THREADS_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BM_CQ_MULTIPLE_THREADS_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/bm_cq_multiple_threads: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/bm_cq_multiple_threads: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/bm_cq_multiple_threads: $(PROTOBUF_DEP) $(BM_CQ_MULTIPLE_THREADS_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(BM_CQ_MULTIPLE_THREADS_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/bm_cq_multiple_threads + +endif + +endif + +$(BM_CQ_MULTIPLE_THREADS_OBJS): CPPFLAGS += -Ithird_party/benchmark/include -DHAVE_POSIX_REGEX +$(OBJDIR)/$(CONFIG)/test/cpp/microbenchmarks/bm_cq_multiple_threads.o: $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + +deps_bm_cq_multiple_threads: $(BM_CQ_MULTIPLE_THREADS_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(BM_CQ_MULTIPLE_THREADS_OBJS:.o=.dep) +endif +endif + + +BM_ERROR_SRC = \ + test/cpp/microbenchmarks/bm_error.cc \ + +BM_ERROR_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BM_ERROR_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/bm_error: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/bm_error: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/bm_error: $(PROTOBUF_DEP) $(BM_ERROR_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(BM_ERROR_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/bm_error + +endif + +endif + +$(BM_ERROR_OBJS): CPPFLAGS += -Ithird_party/benchmark/include -DHAVE_POSIX_REGEX +$(OBJDIR)/$(CONFIG)/test/cpp/microbenchmarks/bm_error.o: $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + +deps_bm_error: $(BM_ERROR_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(BM_ERROR_OBJS:.o=.dep) +endif +endif + + +BM_FULLSTACK_STREAMING_PING_PONG_SRC = \ + test/cpp/microbenchmarks/bm_fullstack_streaming_ping_pong.cc \ + +BM_FULLSTACK_STREAMING_PING_PONG_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BM_FULLSTACK_STREAMING_PING_PONG_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/bm_fullstack_streaming_ping_pong: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/bm_fullstack_streaming_ping_pong: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/bm_fullstack_streaming_ping_pong: $(PROTOBUF_DEP) $(BM_FULLSTACK_STREAMING_PING_PONG_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(BM_FULLSTACK_STREAMING_PING_PONG_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/bm_fullstack_streaming_ping_pong + +endif + +endif + +$(BM_FULLSTACK_STREAMING_PING_PONG_OBJS): CPPFLAGS += -Ithird_party/benchmark/include -DHAVE_POSIX_REGEX +$(OBJDIR)/$(CONFIG)/test/cpp/microbenchmarks/bm_fullstack_streaming_ping_pong.o: $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + +deps_bm_fullstack_streaming_ping_pong: $(BM_FULLSTACK_STREAMING_PING_PONG_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(BM_FULLSTACK_STREAMING_PING_PONG_OBJS:.o=.dep) +endif +endif + + +BM_FULLSTACK_STREAMING_PUMP_SRC = \ + test/cpp/microbenchmarks/bm_fullstack_streaming_pump.cc \ + +BM_FULLSTACK_STREAMING_PUMP_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BM_FULLSTACK_STREAMING_PUMP_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/bm_fullstack_streaming_pump: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/bm_fullstack_streaming_pump: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/bm_fullstack_streaming_pump: $(PROTOBUF_DEP) $(BM_FULLSTACK_STREAMING_PUMP_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(BM_FULLSTACK_STREAMING_PUMP_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/bm_fullstack_streaming_pump + +endif + +endif + +$(BM_FULLSTACK_STREAMING_PUMP_OBJS): CPPFLAGS += -Ithird_party/benchmark/include -DHAVE_POSIX_REGEX +$(OBJDIR)/$(CONFIG)/test/cpp/microbenchmarks/bm_fullstack_streaming_pump.o: $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + +deps_bm_fullstack_streaming_pump: $(BM_FULLSTACK_STREAMING_PUMP_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(BM_FULLSTACK_STREAMING_PUMP_OBJS:.o=.dep) +endif +endif + + +BM_FULLSTACK_TRICKLE_SRC = \ + test/cpp/microbenchmarks/bm_fullstack_trickle.cc \ + +BM_FULLSTACK_TRICKLE_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BM_FULLSTACK_TRICKLE_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/bm_fullstack_trickle: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/bm_fullstack_trickle: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/bm_fullstack_trickle: $(PROTOBUF_DEP) $(BM_FULLSTACK_TRICKLE_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(BM_FULLSTACK_TRICKLE_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/bm_fullstack_trickle + +endif + +endif + +$(BM_FULLSTACK_TRICKLE_OBJS): CPPFLAGS += -Ithird_party/benchmark/include -DHAVE_POSIX_REGEX +$(OBJDIR)/$(CONFIG)/test/cpp/microbenchmarks/bm_fullstack_trickle.o: $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + +deps_bm_fullstack_trickle: $(BM_FULLSTACK_TRICKLE_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(BM_FULLSTACK_TRICKLE_OBJS:.o=.dep) +endif +endif + + +BM_FULLSTACK_UNARY_PING_PONG_SRC = \ + test/cpp/microbenchmarks/bm_fullstack_unary_ping_pong.cc \ + +BM_FULLSTACK_UNARY_PING_PONG_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BM_FULLSTACK_UNARY_PING_PONG_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/bm_fullstack_unary_ping_pong: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/bm_fullstack_unary_ping_pong: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/bm_fullstack_unary_ping_pong: $(PROTOBUF_DEP) $(BM_FULLSTACK_UNARY_PING_PONG_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(BM_FULLSTACK_UNARY_PING_PONG_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/bm_fullstack_unary_ping_pong + +endif + +endif + +$(BM_FULLSTACK_UNARY_PING_PONG_OBJS): CPPFLAGS += -Ithird_party/benchmark/include -DHAVE_POSIX_REGEX +$(OBJDIR)/$(CONFIG)/test/cpp/microbenchmarks/bm_fullstack_unary_ping_pong.o: $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + +deps_bm_fullstack_unary_ping_pong: $(BM_FULLSTACK_UNARY_PING_PONG_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(BM_FULLSTACK_UNARY_PING_PONG_OBJS:.o=.dep) +endif +endif + + +BM_METADATA_SRC = \ + test/cpp/microbenchmarks/bm_metadata.cc \ + +BM_METADATA_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BM_METADATA_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/bm_metadata: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/bm_metadata: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/bm_metadata: $(PROTOBUF_DEP) $(BM_METADATA_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(BM_METADATA_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/bm_metadata + +endif + +endif + +$(BM_METADATA_OBJS): CPPFLAGS += -Ithird_party/benchmark/include -DHAVE_POSIX_REGEX +$(OBJDIR)/$(CONFIG)/test/cpp/microbenchmarks/bm_metadata.o: $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + +deps_bm_metadata: $(BM_METADATA_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(BM_METADATA_OBJS:.o=.dep) +endif +endif + + +BM_POLLSET_SRC = \ + test/cpp/microbenchmarks/bm_pollset.cc \ + +BM_POLLSET_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BM_POLLSET_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/bm_pollset: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/bm_pollset: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/bm_pollset: $(PROTOBUF_DEP) $(BM_POLLSET_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(BM_POLLSET_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/bm_pollset + +endif + +endif + +$(BM_POLLSET_OBJS): CPPFLAGS += -Ithird_party/benchmark/include -DHAVE_POSIX_REGEX +$(OBJDIR)/$(CONFIG)/test/cpp/microbenchmarks/bm_pollset.o: $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + +deps_bm_pollset: $(BM_POLLSET_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(BM_POLLSET_OBJS:.o=.dep) +endif +endif + + +BM_THREADPOOL_SRC = \ + test/cpp/microbenchmarks/bm_threadpool.cc \ + +BM_THREADPOOL_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BM_THREADPOOL_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/bm_threadpool: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/bm_threadpool: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/bm_threadpool: $(PROTOBUF_DEP) $(BM_THREADPOOL_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(BM_THREADPOOL_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/bm_threadpool + +endif + +endif + +$(BM_THREADPOOL_OBJS): CPPFLAGS += -Ithird_party/benchmark/include -DHAVE_POSIX_REGEX +$(OBJDIR)/$(CONFIG)/test/cpp/microbenchmarks/bm_threadpool.o: $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + +deps_bm_threadpool: $(BM_THREADPOOL_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(BM_THREADPOOL_OBJS:.o=.dep) +endif +endif + + +BM_TIMER_SRC = \ + test/cpp/microbenchmarks/bm_timer.cc \ + +BM_TIMER_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BM_TIMER_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/bm_timer: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/bm_timer: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/bm_timer: $(PROTOBUF_DEP) $(BM_TIMER_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(BM_TIMER_OBJS) $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/bm_timer + +endif + +endif + +$(BM_TIMER_OBJS): CPPFLAGS += -Ithird_party/benchmark/include -DHAVE_POSIX_REGEX +$(OBJDIR)/$(CONFIG)/test/cpp/microbenchmarks/bm_timer.o: $(LIBDIR)/$(CONFIG)/libbenchmark_helpers.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + +deps_bm_timer: $(BM_TIMER_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(BM_TIMER_OBJS:.o=.dep) +endif +endif + + +BYTE_BUFFER_TEST_SRC = \ + test/cpp/util/byte_buffer_test.cc \ + +BYTE_BUFFER_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BYTE_BUFFER_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/byte_buffer_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/byte_buffer_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/byte_buffer_test: $(PROTOBUF_DEP) $(BYTE_BUFFER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(BYTE_BUFFER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/byte_buffer_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/cpp/util/byte_buffer_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_byte_buffer_test: $(BYTE_BUFFER_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(BYTE_BUFFER_TEST_OBJS:.o=.dep) +endif +endif + + +BYTE_STREAM_TEST_SRC = \ + test/core/transport/byte_stream_test.cc \ + +BYTE_STREAM_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BYTE_STREAM_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/byte_stream_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/byte_stream_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/byte_stream_test: $(PROTOBUF_DEP) $(BYTE_STREAM_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(BYTE_STREAM_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/byte_stream_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/transport/byte_stream_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_byte_stream_test: $(BYTE_STREAM_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(BYTE_STREAM_TEST_OBJS:.o=.dep) +endif +endif + + +CANCEL_ARES_QUERY_TEST_SRC = \ + test/core/end2end/cq_verifier.cc \ + test/cpp/naming/cancel_ares_query_test.cc \ + test/cpp/naming/dns_test_util.cc \ + +CANCEL_ARES_QUERY_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CANCEL_ARES_QUERY_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/cancel_ares_query_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/cancel_ares_query_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/cancel_ares_query_test: $(PROTOBUF_DEP) $(CANCEL_ARES_QUERY_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(CANCEL_ARES_QUERY_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/cancel_ares_query_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/end2end/cq_verifier.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/naming/cancel_ares_query_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/naming/dns_test_util.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_cancel_ares_query_test: $(CANCEL_ARES_QUERY_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(CANCEL_ARES_QUERY_TEST_OBJS:.o=.dep) +endif +endif + + +CFSTREAM_TEST_SRC = \ + $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc \ + test/cpp/end2end/cfstream_test.cc \ + test/cpp/end2end/test_service_impl.cc \ + +CFSTREAM_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CFSTREAM_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/cfstream_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/cfstream_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/cfstream_test: $(PROTOBUF_DEP) $(CFSTREAM_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(CFSTREAM_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/cfstream_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/simple_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/cfstream_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_cfstream_test: $(CFSTREAM_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(CFSTREAM_TEST_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/cfstream_test.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc + + +CHANNEL_ARGUMENTS_TEST_SRC = \ + test/cpp/common/channel_arguments_test.cc \ + +CHANNEL_ARGUMENTS_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CHANNEL_ARGUMENTS_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/channel_arguments_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/channel_arguments_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/channel_arguments_test: $(PROTOBUF_DEP) $(CHANNEL_ARGUMENTS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(CHANNEL_ARGUMENTS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/channel_arguments_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/cpp/common/channel_arguments_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_channel_arguments_test: $(CHANNEL_ARGUMENTS_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(CHANNEL_ARGUMENTS_TEST_OBJS:.o=.dep) +endif +endif + + +CHANNEL_FILTER_TEST_SRC = \ + test/cpp/common/channel_filter_test.cc \ + +CHANNEL_FILTER_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CHANNEL_FILTER_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/channel_filter_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/channel_filter_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/channel_filter_test: $(PROTOBUF_DEP) $(CHANNEL_FILTER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(CHANNEL_FILTER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/channel_filter_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/cpp/common/channel_filter_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_channel_filter_test: $(CHANNEL_FILTER_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(CHANNEL_FILTER_TEST_OBJS:.o=.dep) +endif +endif + + +CHANNEL_TRACE_TEST_SRC = \ + $(GENDIR)/src/proto/grpc/channelz/channelz.pb.cc $(GENDIR)/src/proto/grpc/channelz/channelz.grpc.pb.cc \ + test/core/channel/channel_trace_test.cc \ + test/cpp/util/channel_trace_proto_helper.cc \ + +CHANNEL_TRACE_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CHANNEL_TRACE_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/channel_trace_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/channel_trace_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/channel_trace_test: $(PROTOBUF_DEP) $(CHANNEL_TRACE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(CHANNEL_TRACE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/channel_trace_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/channelz/channelz.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/channel/channel_trace_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/util/channel_trace_proto_helper.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_channel_trace_test: $(CHANNEL_TRACE_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(CHANNEL_TRACE_TEST_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/core/channel/channel_trace_test.o: $(GENDIR)/src/proto/grpc/channelz/channelz.pb.cc $(GENDIR)/src/proto/grpc/channelz/channelz.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/util/channel_trace_proto_helper.o: $(GENDIR)/src/proto/grpc/channelz/channelz.pb.cc $(GENDIR)/src/proto/grpc/channelz/channelz.grpc.pb.cc + + +CHANNELZ_REGISTRY_TEST_SRC = \ + test/core/channel/channelz_registry_test.cc \ + +CHANNELZ_REGISTRY_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CHANNELZ_REGISTRY_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/channelz_registry_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/channelz_registry_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/channelz_registry_test: $(PROTOBUF_DEP) $(CHANNELZ_REGISTRY_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(CHANNELZ_REGISTRY_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/channelz_registry_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/channel/channelz_registry_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_channelz_registry_test: $(CHANNELZ_REGISTRY_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(CHANNELZ_REGISTRY_TEST_OBJS:.o=.dep) +endif +endif + + +CHANNELZ_SERVICE_TEST_SRC = \ + $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc \ + test/cpp/end2end/channelz_service_test.cc \ + test/cpp/end2end/test_service_impl.cc \ + +CHANNELZ_SERVICE_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CHANNELZ_SERVICE_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/channelz_service_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/channelz_service_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/channelz_service_test: $(PROTOBUF_DEP) $(CHANNELZ_SERVICE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpcpp_channelz.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(CHANNELZ_SERVICE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpcpp_channelz.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/channelz_service_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo.o: $(LIBDIR)/$(CONFIG)/libgrpcpp_channelz.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo_messages.o: $(LIBDIR)/$(CONFIG)/libgrpcpp_channelz.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/simple_messages.o: $(LIBDIR)/$(CONFIG)/libgrpcpp_channelz.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/channelz_service_test.o: $(LIBDIR)/$(CONFIG)/libgrpcpp_channelz.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(LIBDIR)/$(CONFIG)/libgrpcpp_channelz.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_channelz_service_test: $(CHANNELZ_SERVICE_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(CHANNELZ_SERVICE_TEST_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/channelz_service_test.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc + + +CHANNELZ_TEST_SRC = \ + $(GENDIR)/src/proto/grpc/channelz/channelz.pb.cc $(GENDIR)/src/proto/grpc/channelz/channelz.grpc.pb.cc \ + test/core/channel/channelz_test.cc \ + test/cpp/util/channel_trace_proto_helper.cc \ + +CHANNELZ_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CHANNELZ_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/channelz_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/channelz_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/channelz_test: $(PROTOBUF_DEP) $(CHANNELZ_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(CHANNELZ_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/channelz_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/channelz/channelz.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/channel/channelz_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/util/channel_trace_proto_helper.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_channelz_test: $(CHANNELZ_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(CHANNELZ_TEST_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/core/channel/channelz_test.o: $(GENDIR)/src/proto/grpc/channelz/channelz.pb.cc $(GENDIR)/src/proto/grpc/channelz/channelz.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/util/channel_trace_proto_helper.o: $(GENDIR)/src/proto/grpc/channelz/channelz.pb.cc $(GENDIR)/src/proto/grpc/channelz/channelz.grpc.pb.cc + + +CLI_CALL_TEST_SRC = \ + $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.pb.cc $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc \ + test/cpp/util/cli_call.cc \ + test/cpp/util/cli_call_test.cc \ + test/cpp/util/cli_credentials.cc \ + test/cpp/util/grpc_tool.cc \ + test/cpp/util/proto_file_parser.cc \ + test/cpp/util/proto_reflection_descriptor_database.cc \ + test/cpp/util/service_describer.cc \ + +CLI_CALL_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CLI_CALL_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/cli_call_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/cli_call_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/cli_call_test: $(PROTOBUF_DEP) $(CLI_CALL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(CLI_CALL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/cli_call_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/reflection/v1alpha/reflection.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/simple_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/util/cli_call.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/util/cli_call_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/util/cli_credentials.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/util/grpc_tool.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/util/proto_file_parser.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/util/proto_reflection_descriptor_database.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/util/service_describer.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_cli_call_test: $(CLI_CALL_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(CLI_CALL_TEST_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/cpp/util/cli_call.o: $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.pb.cc $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/util/cli_call_test.o: $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.pb.cc $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/util/cli_credentials.o: $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.pb.cc $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/util/grpc_tool.o: $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.pb.cc $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/util/proto_file_parser.o: $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.pb.cc $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/util/proto_reflection_descriptor_database.o: $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.pb.cc $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/util/service_describer.o: $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.pb.cc $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc + + +CLIENT_CALLBACK_END2END_TEST_SRC = \ + $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc \ + test/cpp/end2end/client_callback_end2end_test.cc \ + test/cpp/end2end/interceptors_util.cc \ + test/cpp/end2end/test_service_impl.cc \ + +CLIENT_CALLBACK_END2END_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CLIENT_CALLBACK_END2END_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/client_callback_end2end_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/client_callback_end2end_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/client_callback_end2end_test: $(PROTOBUF_DEP) $(CLIENT_CALLBACK_END2END_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(CLIENT_CALLBACK_END2END_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/client_callback_end2end_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/simple_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/client_callback_end2end_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/interceptors_util.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_client_callback_end2end_test: $(CLIENT_CALLBACK_END2END_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(CLIENT_CALLBACK_END2END_TEST_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/client_callback_end2end_test.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/interceptors_util.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc + + +CLIENT_CHANNEL_STRESS_TEST_SRC = \ + $(GENDIR)/src/proto/grpc/lb/v1/load_balancer.pb.cc $(GENDIR)/src/proto/grpc/lb/v1/load_balancer.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc \ + test/cpp/client/client_channel_stress_test.cc \ + test/cpp/end2end/test_service_impl.cc \ + +CLIENT_CHANNEL_STRESS_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CLIENT_CHANNEL_STRESS_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/client_channel_stress_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/client_channel_stress_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/client_channel_stress_test: $(PROTOBUF_DEP) $(CLIENT_CHANNEL_STRESS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(CLIENT_CHANNEL_STRESS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/client_channel_stress_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/lb/v1/load_balancer.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/duplicate/echo_duplicate.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/simple_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/client/client_channel_stress_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_client_channel_stress_test: $(CLIENT_CHANNEL_STRESS_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(CLIENT_CHANNEL_STRESS_TEST_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/cpp/client/client_channel_stress_test.o: $(GENDIR)/src/proto/grpc/lb/v1/load_balancer.pb.cc $(GENDIR)/src/proto/grpc/lb/v1/load_balancer.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(GENDIR)/src/proto/grpc/lb/v1/load_balancer.pb.cc $(GENDIR)/src/proto/grpc/lb/v1/load_balancer.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc + + +CLIENT_FUZZER_SRC = \ + test/core/end2end/fuzzers/client_fuzzer.cc \ + test/core/util/fuzzer_corpus_test.cc \ + +CLIENT_FUZZER_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CLIENT_FUZZER_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/client_fuzzer: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/client_fuzzer: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/client_fuzzer: $(PROTOBUF_DEP) $(CLIENT_FUZZER_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(CLIENT_FUZZER_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) -lFuzzer -o $(BINDIR)/$(CONFIG)/client_fuzzer + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/end2end/fuzzers/client_fuzzer.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/fuzzer_corpus_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_client_fuzzer: $(CLIENT_FUZZER_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(CLIENT_FUZZER_OBJS:.o=.dep) +endif +endif + + +CLIENT_INTERCEPTORS_END2END_TEST_SRC = \ + $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc \ + test/cpp/end2end/client_interceptors_end2end_test.cc \ + test/cpp/end2end/interceptors_util.cc \ + test/cpp/end2end/test_service_impl.cc \ + +CLIENT_INTERCEPTORS_END2END_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CLIENT_INTERCEPTORS_END2END_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/client_interceptors_end2end_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/client_interceptors_end2end_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/client_interceptors_end2end_test: $(PROTOBUF_DEP) $(CLIENT_INTERCEPTORS_END2END_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(CLIENT_INTERCEPTORS_END2END_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/client_interceptors_end2end_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/simple_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/client_interceptors_end2end_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/interceptors_util.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_client_interceptors_end2end_test: $(CLIENT_INTERCEPTORS_END2END_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(CLIENT_INTERCEPTORS_END2END_TEST_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/client_interceptors_end2end_test.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/interceptors_util.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc + + +CLIENT_LB_END2END_TEST_SRC = \ + $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/xds/orca_load_report_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/orca_load_report_for_test.grpc.pb.cc \ + test/core/util/test_lb_policies.cc \ + test/cpp/end2end/client_lb_end2end_test.cc \ + test/cpp/end2end/test_service_impl.cc \ + +CLIENT_LB_END2END_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CLIENT_LB_END2END_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/client_lb_end2end_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/client_lb_end2end_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/client_lb_end2end_test: $(PROTOBUF_DEP) $(CLIENT_LB_END2END_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(CLIENT_LB_END2END_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/client_lb_end2end_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/duplicate/echo_duplicate.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/simple_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/xds/orca_load_report_for_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/test_lb_policies.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/client_lb_end2end_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_client_lb_end2end_test: $(CLIENT_LB_END2END_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(CLIENT_LB_END2END_TEST_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/core/util/test_lb_policies.o: $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/orca_load_report_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/orca_load_report_for_test.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/client_lb_end2end_test.o: $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/orca_load_report_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/orca_load_report_for_test.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/orca_load_report_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/orca_load_report_for_test.grpc.pb.cc + + +CODEGEN_TEST_FULL_SRC = \ + test/cpp/codegen/codegen_test_full.cc \ + +CODEGEN_TEST_FULL_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CODEGEN_TEST_FULL_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/codegen_test_full: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/codegen_test_full: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/codegen_test_full: $(PROTOBUF_DEP) $(CODEGEN_TEST_FULL_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(CODEGEN_TEST_FULL_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/codegen_test_full + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/cpp/codegen/codegen_test_full.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_codegen_test_full: $(CODEGEN_TEST_FULL_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(CODEGEN_TEST_FULL_OBJS:.o=.dep) +endif +endif + + +CODEGEN_TEST_MINIMAL_SRC = \ + test/cpp/codegen/codegen_test_minimal.cc \ + +CODEGEN_TEST_MINIMAL_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CODEGEN_TEST_MINIMAL_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/codegen_test_minimal: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/codegen_test_minimal: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/codegen_test_minimal: $(PROTOBUF_DEP) $(CODEGEN_TEST_MINIMAL_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(CODEGEN_TEST_MINIMAL_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/codegen_test_minimal + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/cpp/codegen/codegen_test_minimal.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_codegen_test_minimal: $(CODEGEN_TEST_MINIMAL_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(CODEGEN_TEST_MINIMAL_OBJS:.o=.dep) +endif +endif + + +CONNECTION_PREFIX_BAD_CLIENT_TEST_SRC = \ + test/core/bad_client/bad_client.cc \ + test/core/bad_client/tests/connection_prefix.cc \ + test/core/end2end/cq_verifier.cc \ + +CONNECTION_PREFIX_BAD_CLIENT_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CONNECTION_PREFIX_BAD_CLIENT_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/connection_prefix_bad_client_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/connection_prefix_bad_client_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/connection_prefix_bad_client_test: $(PROTOBUF_DEP) $(CONNECTION_PREFIX_BAD_CLIENT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(CONNECTION_PREFIX_BAD_CLIENT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/connection_prefix_bad_client_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/bad_client/bad_client.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/bad_client/tests/connection_prefix.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/end2end/cq_verifier.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_connection_prefix_bad_client_test: $(CONNECTION_PREFIX_BAD_CLIENT_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(CONNECTION_PREFIX_BAD_CLIENT_TEST_OBJS:.o=.dep) +endif +endif + + +CONNECTIVITY_STATE_TEST_SRC = \ + test/core/transport/connectivity_state_test.cc \ + +CONNECTIVITY_STATE_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CONNECTIVITY_STATE_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/connectivity_state_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/connectivity_state_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/connectivity_state_test: $(PROTOBUF_DEP) $(CONNECTIVITY_STATE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(CONNECTIVITY_STATE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/connectivity_state_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/transport/connectivity_state_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_connectivity_state_test: $(CONNECTIVITY_STATE_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(CONNECTIVITY_STATE_TEST_OBJS:.o=.dep) +endif +endif + + +CONTEXT_LIST_TEST_SRC = \ + test/core/transport/chttp2/context_list_test.cc \ + +CONTEXT_LIST_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CONTEXT_LIST_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/context_list_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/context_list_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/context_list_test: $(PROTOBUF_DEP) $(CONTEXT_LIST_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(CONTEXT_LIST_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/context_list_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/transport/chttp2/context_list_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_context_list_test: $(CONTEXT_LIST_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(CONTEXT_LIST_TEST_OBJS:.o=.dep) +endif +endif + + +DELEGATING_CHANNEL_TEST_SRC = \ + $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc \ + test/cpp/end2end/delegating_channel_test.cc \ + test/cpp/end2end/test_service_impl.cc \ + +DELEGATING_CHANNEL_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(DELEGATING_CHANNEL_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/delegating_channel_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/delegating_channel_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/delegating_channel_test: $(PROTOBUF_DEP) $(DELEGATING_CHANNEL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(DELEGATING_CHANNEL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/delegating_channel_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/simple_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/delegating_channel_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_delegating_channel_test: $(DELEGATING_CHANNEL_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(DELEGATING_CHANNEL_TEST_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/delegating_channel_test.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc + + +DESTROY_GRPCLB_CHANNEL_WITH_ACTIVE_CONNECT_STRESS_TEST_SRC = \ + test/cpp/client/destroy_grpclb_channel_with_active_connect_stress_test.cc \ + +DESTROY_GRPCLB_CHANNEL_WITH_ACTIVE_CONNECT_STRESS_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(DESTROY_GRPCLB_CHANNEL_WITH_ACTIVE_CONNECT_STRESS_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/destroy_grpclb_channel_with_active_connect_stress_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/destroy_grpclb_channel_with_active_connect_stress_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/destroy_grpclb_channel_with_active_connect_stress_test: $(PROTOBUF_DEP) $(DESTROY_GRPCLB_CHANNEL_WITH_ACTIVE_CONNECT_STRESS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(DESTROY_GRPCLB_CHANNEL_WITH_ACTIVE_CONNECT_STRESS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/destroy_grpclb_channel_with_active_connect_stress_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/cpp/client/destroy_grpclb_channel_with_active_connect_stress_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_destroy_grpclb_channel_with_active_connect_stress_test: $(DESTROY_GRPCLB_CHANNEL_WITH_ACTIVE_CONNECT_STRESS_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(DESTROY_GRPCLB_CHANNEL_WITH_ACTIVE_CONNECT_STRESS_TEST_OBJS:.o=.dep) +endif +endif + + +DUPLICATE_HEADER_BAD_CLIENT_TEST_SRC = \ + test/core/bad_client/bad_client.cc \ + test/core/bad_client/tests/duplicate_header.cc \ + test/core/end2end/cq_verifier.cc \ + +DUPLICATE_HEADER_BAD_CLIENT_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(DUPLICATE_HEADER_BAD_CLIENT_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/duplicate_header_bad_client_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/duplicate_header_bad_client_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/duplicate_header_bad_client_test: $(PROTOBUF_DEP) $(DUPLICATE_HEADER_BAD_CLIENT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(DUPLICATE_HEADER_BAD_CLIENT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/duplicate_header_bad_client_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/bad_client/bad_client.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/bad_client/tests/duplicate_header.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/end2end/cq_verifier.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_duplicate_header_bad_client_test: $(DUPLICATE_HEADER_BAD_CLIENT_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(DUPLICATE_HEADER_BAD_CLIENT_TEST_OBJS:.o=.dep) +endif +endif + + +END2END_TEST_SRC = \ + $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc \ + test/cpp/end2end/end2end_test.cc \ + test/cpp/end2end/interceptors_util.cc \ + test/cpp/end2end/test_service_impl.cc \ + +END2END_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(END2END_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/end2end_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/end2end_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/end2end_test: $(PROTOBUF_DEP) $(END2END_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(END2END_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/end2end_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/duplicate/echo_duplicate.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/simple_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/end2end_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/interceptors_util.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_end2end_test: $(END2END_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(END2END_TEST_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/end2end_test.o: $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/interceptors_util.o: $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc + + +ERROR_DETAILS_TEST_SRC = \ + $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc \ + test/cpp/util/error_details_test.cc \ + +ERROR_DETAILS_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(ERROR_DETAILS_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/error_details_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/error_details_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/error_details_test: $(PROTOBUF_DEP) $(ERROR_DETAILS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_error_details.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(ERROR_DETAILS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_error_details.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/error_details_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_error_details.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/util/error_details_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_error_details.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_error_details_test: $(ERROR_DETAILS_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(ERROR_DETAILS_TEST_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/cpp/util/error_details_test.o: $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc + + +EVENTMANAGER_LIBUV_TEST_SRC = \ + test/core/iomgr/poller/eventmanager_libuv_test.cc \ + +EVENTMANAGER_LIBUV_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(EVENTMANAGER_LIBUV_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/eventmanager_libuv_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/eventmanager_libuv_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/eventmanager_libuv_test: $(PROTOBUF_DEP) $(EVENTMANAGER_LIBUV_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(EVENTMANAGER_LIBUV_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/eventmanager_libuv_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/iomgr/poller/eventmanager_libuv_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_eventmanager_libuv_test: $(EVENTMANAGER_LIBUV_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(EVENTMANAGER_LIBUV_TEST_OBJS:.o=.dep) +endif +endif + + +EXCEPTION_TEST_SRC = \ + $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc \ + test/cpp/end2end/exception_test.cc \ + +EXCEPTION_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(EXCEPTION_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/exception_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/exception_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/exception_test: $(PROTOBUF_DEP) $(EXCEPTION_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(EXCEPTION_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/exception_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/simple_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/exception_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_exception_test: $(EXCEPTION_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(EXCEPTION_TEST_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/exception_test.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc + + +FILTER_END2END_TEST_SRC = \ + $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc \ + test/cpp/end2end/filter_end2end_test.cc \ + +FILTER_END2END_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(FILTER_END2END_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/filter_end2end_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/filter_end2end_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/filter_end2end_test: $(PROTOBUF_DEP) $(FILTER_END2END_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(FILTER_END2END_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/filter_end2end_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/duplicate/echo_duplicate.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/simple_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/filter_end2end_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_filter_end2end_test: $(FILTER_END2END_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(FILTER_END2END_TEST_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/filter_end2end_test.o: $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc + + +FLAKY_NETWORK_TEST_SRC = \ + $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc \ + test/cpp/end2end/flaky_network_test.cc \ + test/cpp/end2end/test_service_impl.cc \ + +FLAKY_NETWORK_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(FLAKY_NETWORK_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/flaky_network_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/flaky_network_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/flaky_network_test: $(PROTOBUF_DEP) $(FLAKY_NETWORK_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(FLAKY_NETWORK_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/flaky_network_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/simple_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/flaky_network_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_flaky_network_test: $(FLAKY_NETWORK_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(FLAKY_NETWORK_TEST_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/flaky_network_test.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc + + +GENERIC_END2END_TEST_SRC = \ + $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc \ + test/cpp/end2end/generic_end2end_test.cc \ + +GENERIC_END2END_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GENERIC_END2END_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/generic_end2end_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/generic_end2end_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/generic_end2end_test: $(PROTOBUF_DEP) $(GENERIC_END2END_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(GENERIC_END2END_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/generic_end2end_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/duplicate/echo_duplicate.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/simple_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/generic_end2end_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_generic_end2end_test: $(GENERIC_END2END_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(GENERIC_END2END_TEST_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/generic_end2end_test.o: $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc + + +GLOBAL_CONFIG_ENV_TEST_SRC = \ + test/core/gprpp/global_config_env_test.cc \ + +GLOBAL_CONFIG_ENV_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GLOBAL_CONFIG_ENV_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/global_config_env_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/global_config_env_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/global_config_env_test: $(PROTOBUF_DEP) $(GLOBAL_CONFIG_ENV_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(GLOBAL_CONFIG_ENV_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/global_config_env_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/gprpp/global_config_env_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_global_config_env_test: $(GLOBAL_CONFIG_ENV_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(GLOBAL_CONFIG_ENV_TEST_OBJS:.o=.dep) +endif +endif + + +GLOBAL_CONFIG_TEST_SRC = \ + test/core/gprpp/global_config_test.cc \ + +GLOBAL_CONFIG_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GLOBAL_CONFIG_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/global_config_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/global_config_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/global_config_test: $(PROTOBUF_DEP) $(GLOBAL_CONFIG_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(GLOBAL_CONFIG_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/global_config_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/gprpp/global_config_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_global_config_test: $(GLOBAL_CONFIG_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(GLOBAL_CONFIG_TEST_OBJS:.o=.dep) +endif +endif + + +GRPC_CLI_SRC = \ + $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.pb.cc $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.cc \ + test/cpp/util/cli_call.cc \ + test/cpp/util/cli_credentials.cc \ + test/cpp/util/grpc_cli.cc \ + test/cpp/util/grpc_tool.cc \ + test/cpp/util/proto_file_parser.cc \ + test/cpp/util/proto_reflection_descriptor_database.cc \ + test/cpp/util/service_describer.cc \ + +GRPC_CLI_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GRPC_CLI_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/grpc_cli: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/grpc_cli: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/grpc_cli: $(PROTOBUF_DEP) $(GRPC_CLI_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(GRPC_CLI_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/grpc_cli + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/reflection/v1alpha/reflection.o: $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/util/cli_call.o: $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/util/cli_credentials.o: $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/util/grpc_cli.o: $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/util/grpc_tool.o: $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/util/proto_file_parser.o: $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/util/proto_reflection_descriptor_database.o: $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/util/service_describer.o: $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_grpc_cli: $(GRPC_CLI_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(GRPC_CLI_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/cpp/util/cli_call.o: $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.pb.cc $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/util/cli_credentials.o: $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.pb.cc $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/util/grpc_cli.o: $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.pb.cc $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/util/grpc_tool.o: $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.pb.cc $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/util/proto_file_parser.o: $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.pb.cc $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/util/proto_reflection_descriptor_database.o: $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.pb.cc $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/util/service_describer.o: $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.pb.cc $(GENDIR)/src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.cc + + +GRPC_CPP_PLUGIN_SRC = \ + src/compiler/cpp_plugin.cc \ + +GRPC_CPP_PLUGIN_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GRPC_CPP_PLUGIN_SRC)))) + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/grpc_cpp_plugin: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/grpc_cpp_plugin: $(PROTOBUF_DEP) $(GRPC_CPP_PLUGIN_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_plugin_support.a + $(E) "[HOSTLD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(HOST_LDXX) $(HOST_LDFLAGS) $(GRPC_CPP_PLUGIN_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_plugin_support.a $(HOST_LDLIBSXX) $(HOST_LDLIBS_PROTOC) $(HOST_LDLIBS) $(HOST_LDLIBS_PROTOC) -o $(BINDIR)/$(CONFIG)/grpc_cpp_plugin + +endif + +$(OBJDIR)/$(CONFIG)/src/compiler/cpp_plugin.o: $(LIBDIR)/$(CONFIG)/libgrpc_plugin_support.a + +deps_grpc_cpp_plugin: $(GRPC_CPP_PLUGIN_OBJS:.o=.dep) + +ifneq ($(NO_DEPS),true) +-include $(GRPC_CPP_PLUGIN_OBJS:.o=.dep) +endif + + +GRPC_CSHARP_PLUGIN_SRC = \ + src/compiler/csharp_plugin.cc \ + +GRPC_CSHARP_PLUGIN_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GRPC_CSHARP_PLUGIN_SRC)))) + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/grpc_csharp_plugin: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/grpc_csharp_plugin: $(PROTOBUF_DEP) $(GRPC_CSHARP_PLUGIN_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_plugin_support.a + $(E) "[HOSTLD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(HOST_LDXX) $(HOST_LDFLAGS) $(GRPC_CSHARP_PLUGIN_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_plugin_support.a $(HOST_LDLIBSXX) $(HOST_LDLIBS_PROTOC) $(HOST_LDLIBS) $(HOST_LDLIBS_PROTOC) -o $(BINDIR)/$(CONFIG)/grpc_csharp_plugin + +endif + +$(OBJDIR)/$(CONFIG)/src/compiler/csharp_plugin.o: $(LIBDIR)/$(CONFIG)/libgrpc_plugin_support.a + +deps_grpc_csharp_plugin: $(GRPC_CSHARP_PLUGIN_OBJS:.o=.dep) + +ifneq ($(NO_DEPS),true) +-include $(GRPC_CSHARP_PLUGIN_OBJS:.o=.dep) +endif + + +GRPC_NODE_PLUGIN_SRC = \ + src/compiler/node_plugin.cc \ + +GRPC_NODE_PLUGIN_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GRPC_NODE_PLUGIN_SRC)))) + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/grpc_node_plugin: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/grpc_node_plugin: $(PROTOBUF_DEP) $(GRPC_NODE_PLUGIN_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_plugin_support.a + $(E) "[HOSTLD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(HOST_LDXX) $(HOST_LDFLAGS) $(GRPC_NODE_PLUGIN_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_plugin_support.a $(HOST_LDLIBSXX) $(HOST_LDLIBS_PROTOC) $(HOST_LDLIBS) $(HOST_LDLIBS_PROTOC) -o $(BINDIR)/$(CONFIG)/grpc_node_plugin + +endif + +$(OBJDIR)/$(CONFIG)/src/compiler/node_plugin.o: $(LIBDIR)/$(CONFIG)/libgrpc_plugin_support.a + +deps_grpc_node_plugin: $(GRPC_NODE_PLUGIN_OBJS:.o=.dep) + +ifneq ($(NO_DEPS),true) +-include $(GRPC_NODE_PLUGIN_OBJS:.o=.dep) +endif + + +GRPC_OBJECTIVE_C_PLUGIN_SRC = \ + src/compiler/objective_c_plugin.cc \ + +GRPC_OBJECTIVE_C_PLUGIN_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GRPC_OBJECTIVE_C_PLUGIN_SRC)))) + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/grpc_objective_c_plugin: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/grpc_objective_c_plugin: $(PROTOBUF_DEP) $(GRPC_OBJECTIVE_C_PLUGIN_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_plugin_support.a + $(E) "[HOSTLD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(HOST_LDXX) $(HOST_LDFLAGS) $(GRPC_OBJECTIVE_C_PLUGIN_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_plugin_support.a $(HOST_LDLIBSXX) $(HOST_LDLIBS_PROTOC) $(HOST_LDLIBS) $(HOST_LDLIBS_PROTOC) -o $(BINDIR)/$(CONFIG)/grpc_objective_c_plugin + +endif + +$(OBJDIR)/$(CONFIG)/src/compiler/objective_c_plugin.o: $(LIBDIR)/$(CONFIG)/libgrpc_plugin_support.a + +deps_grpc_objective_c_plugin: $(GRPC_OBJECTIVE_C_PLUGIN_OBJS:.o=.dep) + +ifneq ($(NO_DEPS),true) +-include $(GRPC_OBJECTIVE_C_PLUGIN_OBJS:.o=.dep) +endif + + +GRPC_PHP_PLUGIN_SRC = \ + src/compiler/php_plugin.cc \ + +GRPC_PHP_PLUGIN_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GRPC_PHP_PLUGIN_SRC)))) + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/grpc_php_plugin: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/grpc_php_plugin: $(PROTOBUF_DEP) $(GRPC_PHP_PLUGIN_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_plugin_support.a + $(E) "[HOSTLD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(HOST_LDXX) $(HOST_LDFLAGS) $(GRPC_PHP_PLUGIN_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_plugin_support.a $(HOST_LDLIBSXX) $(HOST_LDLIBS_PROTOC) $(HOST_LDLIBS) $(HOST_LDLIBS_PROTOC) -o $(BINDIR)/$(CONFIG)/grpc_php_plugin + +endif + +$(OBJDIR)/$(CONFIG)/src/compiler/php_plugin.o: $(LIBDIR)/$(CONFIG)/libgrpc_plugin_support.a + +deps_grpc_php_plugin: $(GRPC_PHP_PLUGIN_OBJS:.o=.dep) + +ifneq ($(NO_DEPS),true) +-include $(GRPC_PHP_PLUGIN_OBJS:.o=.dep) +endif + + +GRPC_PYTHON_PLUGIN_SRC = \ + src/compiler/python_plugin.cc \ + +GRPC_PYTHON_PLUGIN_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GRPC_PYTHON_PLUGIN_SRC)))) + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/grpc_python_plugin: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/grpc_python_plugin: $(PROTOBUF_DEP) $(GRPC_PYTHON_PLUGIN_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_plugin_support.a + $(E) "[HOSTLD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(HOST_LDXX) $(HOST_LDFLAGS) $(GRPC_PYTHON_PLUGIN_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_plugin_support.a $(HOST_LDLIBSXX) $(HOST_LDLIBS_PROTOC) $(HOST_LDLIBS) $(HOST_LDLIBS_PROTOC) -o $(BINDIR)/$(CONFIG)/grpc_python_plugin + +endif + +$(OBJDIR)/$(CONFIG)/src/compiler/python_plugin.o: $(LIBDIR)/$(CONFIG)/libgrpc_plugin_support.a + +deps_grpc_python_plugin: $(GRPC_PYTHON_PLUGIN_OBJS:.o=.dep) + +ifneq ($(NO_DEPS),true) +-include $(GRPC_PYTHON_PLUGIN_OBJS:.o=.dep) +endif + + +GRPC_RUBY_PLUGIN_SRC = \ + src/compiler/ruby_plugin.cc \ + +GRPC_RUBY_PLUGIN_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GRPC_RUBY_PLUGIN_SRC)))) + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/grpc_ruby_plugin: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/grpc_ruby_plugin: $(PROTOBUF_DEP) $(GRPC_RUBY_PLUGIN_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_plugin_support.a + $(E) "[HOSTLD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(HOST_LDXX) $(HOST_LDFLAGS) $(GRPC_RUBY_PLUGIN_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_plugin_support.a $(HOST_LDLIBSXX) $(HOST_LDLIBS_PROTOC) $(HOST_LDLIBS) $(HOST_LDLIBS_PROTOC) -o $(BINDIR)/$(CONFIG)/grpc_ruby_plugin + +endif + +$(OBJDIR)/$(CONFIG)/src/compiler/ruby_plugin.o: $(LIBDIR)/$(CONFIG)/libgrpc_plugin_support.a + +deps_grpc_ruby_plugin: $(GRPC_RUBY_PLUGIN_OBJS:.o=.dep) + +ifneq ($(NO_DEPS),true) +-include $(GRPC_RUBY_PLUGIN_OBJS:.o=.dep) +endif + + +GRPC_TLS_CREDENTIALS_OPTIONS_TEST_SRC = \ + test/core/security/grpc_tls_credentials_options_test.cc \ + +GRPC_TLS_CREDENTIALS_OPTIONS_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GRPC_TLS_CREDENTIALS_OPTIONS_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/grpc_tls_credentials_options_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/grpc_tls_credentials_options_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/grpc_tls_credentials_options_test: $(PROTOBUF_DEP) $(GRPC_TLS_CREDENTIALS_OPTIONS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(GRPC_TLS_CREDENTIALS_OPTIONS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/grpc_tls_credentials_options_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/security/grpc_tls_credentials_options_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_grpc_tls_credentials_options_test: $(GRPC_TLS_CREDENTIALS_OPTIONS_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(GRPC_TLS_CREDENTIALS_OPTIONS_TEST_OBJS:.o=.dep) +endif +endif + + +GRPC_TOOL_TEST_SRC = \ + $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc \ + test/cpp/util/cli_call.cc \ + test/cpp/util/cli_credentials.cc \ + test/cpp/util/grpc_tool.cc \ + test/cpp/util/grpc_tool_test.cc \ + test/cpp/util/proto_file_parser.cc \ + test/cpp/util/proto_reflection_descriptor_database.cc \ + test/cpp/util/service_describer.cc \ + +GRPC_TOOL_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GRPC_TOOL_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/grpc_tool_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/grpc_tool_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/grpc_tool_test: $(PROTOBUF_DEP) $(GRPC_TOOL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_reflection.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(GRPC_TOOL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_reflection.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/grpc_tool_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_reflection.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_reflection.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/simple_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_reflection.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/util/cli_call.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_reflection.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/util/cli_credentials.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_reflection.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/util/grpc_tool.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_reflection.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/util/grpc_tool_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_reflection.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/util/proto_file_parser.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_reflection.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/util/proto_reflection_descriptor_database.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_reflection.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/util/service_describer.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_reflection.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_grpc_tool_test: $(GRPC_TOOL_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(GRPC_TOOL_TEST_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/cpp/util/cli_call.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/util/cli_credentials.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/util/grpc_tool.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/util/grpc_tool_test.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/util/proto_file_parser.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/util/proto_reflection_descriptor_database.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/util/service_describer.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc + + +GRPCLB_API_TEST_SRC = \ + $(GENDIR)/src/proto/grpc/lb/v1/load_balancer.pb.cc $(GENDIR)/src/proto/grpc/lb/v1/load_balancer.grpc.pb.cc \ + test/cpp/grpclb/grpclb_api_test.cc \ + +GRPCLB_API_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GRPCLB_API_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/grpclb_api_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/grpclb_api_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/grpclb_api_test: $(PROTOBUF_DEP) $(GRPCLB_API_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(GRPCLB_API_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/grpclb_api_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/lb/v1/load_balancer.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/grpclb/grpclb_api_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_grpclb_api_test: $(GRPCLB_API_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(GRPCLB_API_TEST_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/cpp/grpclb/grpclb_api_test.o: $(GENDIR)/src/proto/grpc/lb/v1/load_balancer.pb.cc $(GENDIR)/src/proto/grpc/lb/v1/load_balancer.grpc.pb.cc + + +GRPCLB_END2END_TEST_SRC = \ + $(GENDIR)/src/proto/grpc/lb/v1/load_balancer.pb.cc $(GENDIR)/src/proto/grpc/lb/v1/load_balancer.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc \ + test/cpp/end2end/grpclb_end2end_test.cc \ + test/cpp/end2end/test_service_impl.cc \ + +GRPCLB_END2END_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GRPCLB_END2END_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/grpclb_end2end_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/grpclb_end2end_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/grpclb_end2end_test: $(PROTOBUF_DEP) $(GRPCLB_END2END_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(GRPCLB_END2END_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/grpclb_end2end_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/lb/v1/load_balancer.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/duplicate/echo_duplicate.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/simple_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/grpclb_end2end_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_grpclb_end2end_test: $(GRPCLB_END2END_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(GRPCLB_END2END_TEST_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/grpclb_end2end_test.o: $(GENDIR)/src/proto/grpc/lb/v1/load_balancer.pb.cc $(GENDIR)/src/proto/grpc/lb/v1/load_balancer.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(GENDIR)/src/proto/grpc/lb/v1/load_balancer.pb.cc $(GENDIR)/src/proto/grpc/lb/v1/load_balancer.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc + + +H2_SSL_SESSION_REUSE_TEST_SRC = \ + test/core/end2end/h2_ssl_session_reuse_test.cc \ + +H2_SSL_SESSION_REUSE_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(H2_SSL_SESSION_REUSE_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/h2_ssl_session_reuse_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/h2_ssl_session_reuse_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/h2_ssl_session_reuse_test: $(PROTOBUF_DEP) $(H2_SSL_SESSION_REUSE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libend2end_tests.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(H2_SSL_SESSION_REUSE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libend2end_tests.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/h2_ssl_session_reuse_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/end2end/h2_ssl_session_reuse_test.o: $(LIBDIR)/$(CONFIG)/libend2end_tests.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_h2_ssl_session_reuse_test: $(H2_SSL_SESSION_REUSE_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(H2_SSL_SESSION_REUSE_TEST_OBJS:.o=.dep) +endif +endif + + +HEAD_OF_LINE_BLOCKING_BAD_CLIENT_TEST_SRC = \ + test/core/bad_client/bad_client.cc \ + test/core/bad_client/tests/head_of_line_blocking.cc \ + test/core/end2end/cq_verifier.cc \ + +HEAD_OF_LINE_BLOCKING_BAD_CLIENT_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(HEAD_OF_LINE_BLOCKING_BAD_CLIENT_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/head_of_line_blocking_bad_client_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/head_of_line_blocking_bad_client_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/head_of_line_blocking_bad_client_test: $(PROTOBUF_DEP) $(HEAD_OF_LINE_BLOCKING_BAD_CLIENT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(HEAD_OF_LINE_BLOCKING_BAD_CLIENT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/head_of_line_blocking_bad_client_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/bad_client/bad_client.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/bad_client/tests/head_of_line_blocking.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/end2end/cq_verifier.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_head_of_line_blocking_bad_client_test: $(HEAD_OF_LINE_BLOCKING_BAD_CLIENT_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(HEAD_OF_LINE_BLOCKING_BAD_CLIENT_TEST_OBJS:.o=.dep) +endif +endif + + +HEADERS_BAD_CLIENT_TEST_SRC = \ + test/core/bad_client/bad_client.cc \ + test/core/bad_client/tests/headers.cc \ + test/core/end2end/cq_verifier.cc \ + +HEADERS_BAD_CLIENT_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(HEADERS_BAD_CLIENT_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/headers_bad_client_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/headers_bad_client_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/headers_bad_client_test: $(PROTOBUF_DEP) $(HEADERS_BAD_CLIENT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(HEADERS_BAD_CLIENT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/headers_bad_client_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/bad_client/bad_client.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/bad_client/tests/headers.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/end2end/cq_verifier.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_headers_bad_client_test: $(HEADERS_BAD_CLIENT_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(HEADERS_BAD_CLIENT_TEST_OBJS:.o=.dep) +endif +endif + + +HEALTH_SERVICE_END2END_TEST_SRC = \ + $(GENDIR)/src/proto/grpc/health/v1/health.pb.cc $(GENDIR)/src/proto/grpc/health/v1/health.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc \ + test/cpp/end2end/health_service_end2end_test.cc \ + test/cpp/end2end/test_health_check_service_impl.cc \ + test/cpp/end2end/test_service_impl.cc \ + +HEALTH_SERVICE_END2END_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(HEALTH_SERVICE_END2END_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/health_service_end2end_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/health_service_end2end_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/health_service_end2end_test: $(PROTOBUF_DEP) $(HEALTH_SERVICE_END2END_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(HEALTH_SERVICE_END2END_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/health_service_end2end_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/health/v1/health.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/duplicate/echo_duplicate.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/simple_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/health_service_end2end_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_health_check_service_impl.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_health_service_end2end_test: $(HEALTH_SERVICE_END2END_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(HEALTH_SERVICE_END2END_TEST_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/health_service_end2end_test.o: $(GENDIR)/src/proto/grpc/health/v1/health.pb.cc $(GENDIR)/src/proto/grpc/health/v1/health.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_health_check_service_impl.o: $(GENDIR)/src/proto/grpc/health/v1/health.pb.cc $(GENDIR)/src/proto/grpc/health/v1/health.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(GENDIR)/src/proto/grpc/health/v1/health.pb.cc $(GENDIR)/src/proto/grpc/health/v1/health.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc + + +HPACK_PARSER_FUZZER_TEST_SRC = \ + test/core/transport/chttp2/hpack_parser_fuzzer_test.cc \ + test/core/util/fuzzer_corpus_test.cc \ + +HPACK_PARSER_FUZZER_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(HPACK_PARSER_FUZZER_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/hpack_parser_fuzzer_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/hpack_parser_fuzzer_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/hpack_parser_fuzzer_test: $(PROTOBUF_DEP) $(HPACK_PARSER_FUZZER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(HPACK_PARSER_FUZZER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) -lFuzzer -o $(BINDIR)/$(CONFIG)/hpack_parser_fuzzer_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/transport/chttp2/hpack_parser_fuzzer_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/fuzzer_corpus_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_hpack_parser_fuzzer_test: $(HPACK_PARSER_FUZZER_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(HPACK_PARSER_FUZZER_TEST_OBJS:.o=.dep) +endif +endif + + +HTTP2_CLIENT_SRC = \ + $(GENDIR)/src/proto/grpc/testing/empty.pb.cc $(GENDIR)/src/proto/grpc/testing/empty.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/test.pb.cc $(GENDIR)/src/proto/grpc/testing/test.grpc.pb.cc \ + test/cpp/interop/http2_client.cc \ + +HTTP2_CLIENT_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(HTTP2_CLIENT_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/http2_client: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/http2_client: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/http2_client: $(PROTOBUF_DEP) $(HTTP2_CLIENT_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(HTTP2_CLIENT_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/http2_client + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/empty.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/interop/http2_client.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_http2_client: $(HTTP2_CLIENT_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(HTTP2_CLIENT_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/cpp/interop/http2_client.o: $(GENDIR)/src/proto/grpc/testing/empty.pb.cc $(GENDIR)/src/proto/grpc/testing/empty.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/test.pb.cc $(GENDIR)/src/proto/grpc/testing/test.grpc.pb.cc + + +HTTP_REQUEST_FUZZER_TEST_SRC = \ + test/core/http/request_fuzzer.cc \ + test/core/util/fuzzer_corpus_test.cc \ + +HTTP_REQUEST_FUZZER_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(HTTP_REQUEST_FUZZER_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/http_request_fuzzer_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/http_request_fuzzer_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/http_request_fuzzer_test: $(PROTOBUF_DEP) $(HTTP_REQUEST_FUZZER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(HTTP_REQUEST_FUZZER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) -lFuzzer -o $(BINDIR)/$(CONFIG)/http_request_fuzzer_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/http/request_fuzzer.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/fuzzer_corpus_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_http_request_fuzzer_test: $(HTTP_REQUEST_FUZZER_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(HTTP_REQUEST_FUZZER_TEST_OBJS:.o=.dep) +endif +endif + + +HTTP_RESPONSE_FUZZER_TEST_SRC = \ + test/core/http/response_fuzzer.cc \ + test/core/util/fuzzer_corpus_test.cc \ + +HTTP_RESPONSE_FUZZER_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(HTTP_RESPONSE_FUZZER_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/http_response_fuzzer_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/http_response_fuzzer_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/http_response_fuzzer_test: $(PROTOBUF_DEP) $(HTTP_RESPONSE_FUZZER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(HTTP_RESPONSE_FUZZER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) -lFuzzer -o $(BINDIR)/$(CONFIG)/http_response_fuzzer_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/http/response_fuzzer.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/fuzzer_corpus_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_http_response_fuzzer_test: $(HTTP_RESPONSE_FUZZER_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(HTTP_RESPONSE_FUZZER_TEST_OBJS:.o=.dep) +endif +endif + + +HYBRID_END2END_TEST_SRC = \ + $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc \ + test/cpp/end2end/hybrid_end2end_test.cc \ + test/cpp/end2end/test_service_impl.cc \ + +HYBRID_END2END_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(HYBRID_END2END_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/hybrid_end2end_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/hybrid_end2end_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/hybrid_end2end_test: $(PROTOBUF_DEP) $(HYBRID_END2END_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(HYBRID_END2END_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/hybrid_end2end_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/duplicate/echo_duplicate.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/simple_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/hybrid_end2end_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_hybrid_end2end_test: $(HYBRID_END2END_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(HYBRID_END2END_TEST_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/hybrid_end2end_test.o: $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc + + +INITIAL_SETTINGS_FRAME_BAD_CLIENT_TEST_SRC = \ + test/core/bad_client/bad_client.cc \ + test/core/bad_client/tests/initial_settings_frame.cc \ + test/core/end2end/cq_verifier.cc \ + +INITIAL_SETTINGS_FRAME_BAD_CLIENT_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(INITIAL_SETTINGS_FRAME_BAD_CLIENT_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/initial_settings_frame_bad_client_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/initial_settings_frame_bad_client_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/initial_settings_frame_bad_client_test: $(PROTOBUF_DEP) $(INITIAL_SETTINGS_FRAME_BAD_CLIENT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(INITIAL_SETTINGS_FRAME_BAD_CLIENT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/initial_settings_frame_bad_client_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/bad_client/bad_client.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/bad_client/tests/initial_settings_frame.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/end2end/cq_verifier.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_initial_settings_frame_bad_client_test: $(INITIAL_SETTINGS_FRAME_BAD_CLIENT_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(INITIAL_SETTINGS_FRAME_BAD_CLIENT_TEST_OBJS:.o=.dep) +endif +endif + + +INTEROP_CLIENT_SRC = \ + $(GENDIR)/src/proto/grpc/testing/empty.pb.cc $(GENDIR)/src/proto/grpc/testing/empty.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/test.pb.cc $(GENDIR)/src/proto/grpc/testing/test.grpc.pb.cc \ + test/core/security/oauth2_utils.cc \ + test/cpp/interop/client.cc \ + test/cpp/interop/client_helper.cc \ + test/cpp/interop/interop_client.cc \ + +INTEROP_CLIENT_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(INTEROP_CLIENT_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/interop_client: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/interop_client: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/interop_client: $(PROTOBUF_DEP) $(INTEROP_CLIENT_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(INTEROP_CLIENT_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/interop_client + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/empty.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/security/oauth2_utils.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/interop/client.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/interop/client_helper.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/interop/interop_client.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_interop_client: $(INTEROP_CLIENT_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(INTEROP_CLIENT_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/core/security/oauth2_utils.o: $(GENDIR)/src/proto/grpc/testing/empty.pb.cc $(GENDIR)/src/proto/grpc/testing/empty.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/test.pb.cc $(GENDIR)/src/proto/grpc/testing/test.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/interop/client.o: $(GENDIR)/src/proto/grpc/testing/empty.pb.cc $(GENDIR)/src/proto/grpc/testing/empty.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/test.pb.cc $(GENDIR)/src/proto/grpc/testing/test.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/interop/client_helper.o: $(GENDIR)/src/proto/grpc/testing/empty.pb.cc $(GENDIR)/src/proto/grpc/testing/empty.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/test.pb.cc $(GENDIR)/src/proto/grpc/testing/test.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/interop/interop_client.o: $(GENDIR)/src/proto/grpc/testing/empty.pb.cc $(GENDIR)/src/proto/grpc/testing/empty.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/test.pb.cc $(GENDIR)/src/proto/grpc/testing/test.grpc.pb.cc + + +INTEROP_SERVER_SRC = \ + $(GENDIR)/src/proto/grpc/testing/empty.pb.cc $(GENDIR)/src/proto/grpc/testing/empty.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/test.pb.cc $(GENDIR)/src/proto/grpc/testing/test.grpc.pb.cc \ + test/cpp/interop/interop_server.cc \ + test/cpp/interop/interop_server_bootstrap.cc \ + test/cpp/interop/server_helper.cc \ + +INTEROP_SERVER_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(INTEROP_SERVER_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/interop_server: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/interop_server: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/interop_server: $(PROTOBUF_DEP) $(INTEROP_SERVER_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(INTEROP_SERVER_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/interop_server + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/empty.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/interop/interop_server.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/interop/interop_server_bootstrap.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/interop/server_helper.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_interop_server: $(INTEROP_SERVER_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(INTEROP_SERVER_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/cpp/interop/interop_server.o: $(GENDIR)/src/proto/grpc/testing/empty.pb.cc $(GENDIR)/src/proto/grpc/testing/empty.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/test.pb.cc $(GENDIR)/src/proto/grpc/testing/test.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/interop/interop_server_bootstrap.o: $(GENDIR)/src/proto/grpc/testing/empty.pb.cc $(GENDIR)/src/proto/grpc/testing/empty.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/test.pb.cc $(GENDIR)/src/proto/grpc/testing/test.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/interop/server_helper.o: $(GENDIR)/src/proto/grpc/testing/empty.pb.cc $(GENDIR)/src/proto/grpc/testing/empty.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/test.pb.cc $(GENDIR)/src/proto/grpc/testing/test.grpc.pb.cc + + +INTEROP_TEST_SRC = \ + test/cpp/interop/interop_test.cc \ + +INTEROP_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(INTEROP_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/interop_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/interop_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/interop_test: $(PROTOBUF_DEP) $(INTEROP_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(INTEROP_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/interop_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/cpp/interop/interop_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_interop_test: $(INTEROP_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(INTEROP_TEST_OBJS:.o=.dep) +endif +endif + + +JSON_FUZZER_TEST_SRC = \ + test/core/json/fuzzer.cc \ + test/core/util/fuzzer_corpus_test.cc \ + +JSON_FUZZER_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(JSON_FUZZER_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/json_fuzzer_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/json_fuzzer_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/json_fuzzer_test: $(PROTOBUF_DEP) $(JSON_FUZZER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(JSON_FUZZER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) -lFuzzer -o $(BINDIR)/$(CONFIG)/json_fuzzer_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/json/fuzzer.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/fuzzer_corpus_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_json_fuzzer_test: $(JSON_FUZZER_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(JSON_FUZZER_TEST_OBJS:.o=.dep) +endif +endif + + +JSON_TEST_SRC = \ + test/core/json/json_test.cc \ + +JSON_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(JSON_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/json_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/json_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/json_test: $(PROTOBUF_DEP) $(JSON_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(JSON_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/json_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/json/json_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_json_test: $(JSON_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(JSON_TEST_OBJS:.o=.dep) +endif +endif + + +LARGE_METADATA_BAD_CLIENT_TEST_SRC = \ + test/core/bad_client/bad_client.cc \ + test/core/bad_client/tests/large_metadata.cc \ + test/core/end2end/cq_verifier.cc \ + +LARGE_METADATA_BAD_CLIENT_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LARGE_METADATA_BAD_CLIENT_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/large_metadata_bad_client_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/large_metadata_bad_client_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/large_metadata_bad_client_test: $(PROTOBUF_DEP) $(LARGE_METADATA_BAD_CLIENT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(LARGE_METADATA_BAD_CLIENT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/large_metadata_bad_client_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/bad_client/bad_client.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/bad_client/tests/large_metadata.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/end2end/cq_verifier.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_large_metadata_bad_client_test: $(LARGE_METADATA_BAD_CLIENT_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(LARGE_METADATA_BAD_CLIENT_TEST_OBJS:.o=.dep) +endif +endif + + +LB_GET_CPU_STATS_TEST_SRC = \ + src/cpp/server/load_reporter/get_cpu_stats_linux.cc \ + src/cpp/server/load_reporter/get_cpu_stats_macos.cc \ + src/cpp/server/load_reporter/get_cpu_stats_unsupported.cc \ + src/cpp/server/load_reporter/get_cpu_stats_windows.cc \ + test/cpp/server/load_reporter/get_cpu_stats_test.cc \ + +LB_GET_CPU_STATS_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LB_GET_CPU_STATS_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/lb_get_cpu_stats_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/lb_get_cpu_stats_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/lb_get_cpu_stats_test: $(PROTOBUF_DEP) $(LB_GET_CPU_STATS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(LB_GET_CPU_STATS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/lb_get_cpu_stats_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/cpp/server/load_reporter/get_cpu_stats_linux.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/cpp/server/load_reporter/get_cpu_stats_macos.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/cpp/server/load_reporter/get_cpu_stats_unsupported.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/cpp/server/load_reporter/get_cpu_stats_windows.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/server/load_reporter/get_cpu_stats_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_lb_get_cpu_stats_test: $(LB_GET_CPU_STATS_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(LB_GET_CPU_STATS_TEST_OBJS:.o=.dep) +endif +endif + + +LB_LOAD_DATA_STORE_TEST_SRC = \ + src/cpp/server/load_reporter/load_data_store.cc \ + test/cpp/server/load_reporter/load_data_store_test.cc \ + +LB_LOAD_DATA_STORE_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LB_LOAD_DATA_STORE_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/lb_load_data_store_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/lb_load_data_store_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/lb_load_data_store_test: $(PROTOBUF_DEP) $(LB_LOAD_DATA_STORE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(LB_LOAD_DATA_STORE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/lb_load_data_store_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/cpp/server/load_reporter/load_data_store.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/server/load_reporter/load_data_store_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_lb_load_data_store_test: $(LB_LOAD_DATA_STORE_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(LB_LOAD_DATA_STORE_TEST_OBJS:.o=.dep) +endif +endif + + +LINUX_SYSTEM_ROOTS_TEST_SRC = \ + test/core/security/linux_system_roots_test.cc \ + +LINUX_SYSTEM_ROOTS_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LINUX_SYSTEM_ROOTS_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/linux_system_roots_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/linux_system_roots_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/linux_system_roots_test: $(PROTOBUF_DEP) $(LINUX_SYSTEM_ROOTS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(LINUX_SYSTEM_ROOTS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/linux_system_roots_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/security/linux_system_roots_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_linux_system_roots_test: $(LINUX_SYSTEM_ROOTS_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(LINUX_SYSTEM_ROOTS_TEST_OBJS:.o=.dep) +endif +endif + + +MESSAGE_ALLOCATOR_END2END_TEST_SRC = \ + $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc \ + test/cpp/end2end/message_allocator_end2end_test.cc \ + test/cpp/end2end/test_service_impl.cc \ + +MESSAGE_ALLOCATOR_END2END_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(MESSAGE_ALLOCATOR_END2END_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/message_allocator_end2end_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/message_allocator_end2end_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/message_allocator_end2end_test: $(PROTOBUF_DEP) $(MESSAGE_ALLOCATOR_END2END_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(MESSAGE_ALLOCATOR_END2END_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/message_allocator_end2end_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/simple_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/message_allocator_end2end_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_message_allocator_end2end_test: $(MESSAGE_ALLOCATOR_END2END_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(MESSAGE_ALLOCATOR_END2END_TEST_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/message_allocator_end2end_test.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc + + +MOCK_TEST_SRC = \ + $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc \ + test/cpp/end2end/mock_test.cc \ + +MOCK_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(MOCK_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/mock_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/mock_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/mock_test: $(PROTOBUF_DEP) $(MOCK_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(MOCK_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/mock_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/duplicate/echo_duplicate.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/simple_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/mock_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_mock_test: $(MOCK_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(MOCK_TEST_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/mock_test.o: $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc + + +NANOPB_FUZZER_RESPONSE_TEST_SRC = \ + test/core/nanopb/fuzzer_response.cc \ + test/core/util/fuzzer_corpus_test.cc \ + +NANOPB_FUZZER_RESPONSE_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(NANOPB_FUZZER_RESPONSE_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/nanopb_fuzzer_response_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/nanopb_fuzzer_response_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/nanopb_fuzzer_response_test: $(PROTOBUF_DEP) $(NANOPB_FUZZER_RESPONSE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(NANOPB_FUZZER_RESPONSE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) -lFuzzer -o $(BINDIR)/$(CONFIG)/nanopb_fuzzer_response_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/nanopb/fuzzer_response.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/fuzzer_corpus_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_nanopb_fuzzer_response_test: $(NANOPB_FUZZER_RESPONSE_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(NANOPB_FUZZER_RESPONSE_TEST_OBJS:.o=.dep) +endif +endif + + +NANOPB_FUZZER_SERVERLIST_TEST_SRC = \ + test/core/nanopb/fuzzer_serverlist.cc \ + test/core/util/fuzzer_corpus_test.cc \ + +NANOPB_FUZZER_SERVERLIST_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(NANOPB_FUZZER_SERVERLIST_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/nanopb_fuzzer_serverlist_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/nanopb_fuzzer_serverlist_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/nanopb_fuzzer_serverlist_test: $(PROTOBUF_DEP) $(NANOPB_FUZZER_SERVERLIST_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(NANOPB_FUZZER_SERVERLIST_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) -lFuzzer -o $(BINDIR)/$(CONFIG)/nanopb_fuzzer_serverlist_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/nanopb/fuzzer_serverlist.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/fuzzer_corpus_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_nanopb_fuzzer_serverlist_test: $(NANOPB_FUZZER_SERVERLIST_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(NANOPB_FUZZER_SERVERLIST_TEST_OBJS:.o=.dep) +endif +endif + + +NONBLOCKING_TEST_SRC = \ + $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc \ + test/cpp/end2end/nonblocking_test.cc \ + +NONBLOCKING_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(NONBLOCKING_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/nonblocking_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/nonblocking_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/nonblocking_test: $(PROTOBUF_DEP) $(NONBLOCKING_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(NONBLOCKING_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/nonblocking_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/simple_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/nonblocking_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_nonblocking_test: $(NONBLOCKING_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(NONBLOCKING_TEST_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/nonblocking_test.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc + + +NOOP-BENCHMARK_SRC = \ + test/cpp/microbenchmarks/noop-benchmark.cc \ + +NOOP-BENCHMARK_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(NOOP-BENCHMARK_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/noop-benchmark: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/noop-benchmark: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/noop-benchmark: $(PROTOBUF_DEP) $(NOOP-BENCHMARK_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(NOOP-BENCHMARK_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/noop-benchmark + +endif + +endif + +$(NOOP-BENCHMARK_OBJS): CPPFLAGS += -Ithird_party/benchmark/include -DHAVE_POSIX_REGEX +$(OBJDIR)/$(CONFIG)/test/cpp/microbenchmarks/noop-benchmark.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LIBDIR)/$(CONFIG)/libbenchmark.a + +deps_noop-benchmark: $(NOOP-BENCHMARK_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(NOOP-BENCHMARK_OBJS:.o=.dep) +endif +endif + + +ORPHANABLE_TEST_SRC = \ + test/core/gprpp/orphanable_test.cc \ + +ORPHANABLE_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(ORPHANABLE_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/orphanable_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/orphanable_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/orphanable_test: $(PROTOBUF_DEP) $(ORPHANABLE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(ORPHANABLE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/orphanable_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/gprpp/orphanable_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_orphanable_test: $(ORPHANABLE_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(ORPHANABLE_TEST_OBJS:.o=.dep) +endif +endif + + +OUT_OF_BOUNDS_BAD_CLIENT_TEST_SRC = \ + test/core/bad_client/bad_client.cc \ + test/core/bad_client/tests/out_of_bounds.cc \ + test/core/end2end/cq_verifier.cc \ + +OUT_OF_BOUNDS_BAD_CLIENT_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(OUT_OF_BOUNDS_BAD_CLIENT_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/out_of_bounds_bad_client_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/out_of_bounds_bad_client_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/out_of_bounds_bad_client_test: $(PROTOBUF_DEP) $(OUT_OF_BOUNDS_BAD_CLIENT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(OUT_OF_BOUNDS_BAD_CLIENT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/out_of_bounds_bad_client_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/bad_client/bad_client.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/bad_client/tests/out_of_bounds.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/end2end/cq_verifier.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_out_of_bounds_bad_client_test: $(OUT_OF_BOUNDS_BAD_CLIENT_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(OUT_OF_BOUNDS_BAD_CLIENT_TEST_OBJS:.o=.dep) +endif +endif + + +PERCENT_DECODE_FUZZER_SRC = \ + test/core/slice/percent_decode_fuzzer.cc \ + test/core/util/fuzzer_corpus_test.cc \ + +PERCENT_DECODE_FUZZER_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(PERCENT_DECODE_FUZZER_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/percent_decode_fuzzer: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/percent_decode_fuzzer: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/percent_decode_fuzzer: $(PROTOBUF_DEP) $(PERCENT_DECODE_FUZZER_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(PERCENT_DECODE_FUZZER_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) -lFuzzer -o $(BINDIR)/$(CONFIG)/percent_decode_fuzzer + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/slice/percent_decode_fuzzer.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/fuzzer_corpus_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_percent_decode_fuzzer: $(PERCENT_DECODE_FUZZER_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(PERCENT_DECODE_FUZZER_OBJS:.o=.dep) +endif +endif + + +PERCENT_ENCODE_FUZZER_SRC = \ + test/core/slice/percent_encode_fuzzer.cc \ + test/core/util/fuzzer_corpus_test.cc \ + +PERCENT_ENCODE_FUZZER_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(PERCENT_ENCODE_FUZZER_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/percent_encode_fuzzer: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/percent_encode_fuzzer: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/percent_encode_fuzzer: $(PROTOBUF_DEP) $(PERCENT_ENCODE_FUZZER_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(PERCENT_ENCODE_FUZZER_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) -lFuzzer -o $(BINDIR)/$(CONFIG)/percent_encode_fuzzer + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/slice/percent_encode_fuzzer.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/fuzzer_corpus_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_percent_encode_fuzzer: $(PERCENT_ENCODE_FUZZER_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(PERCENT_ENCODE_FUZZER_OBJS:.o=.dep) +endif +endif + + +PID_CONTROLLER_TEST_SRC = \ + test/core/transport/pid_controller_test.cc \ + +PID_CONTROLLER_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(PID_CONTROLLER_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/pid_controller_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/pid_controller_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/pid_controller_test: $(PROTOBUF_DEP) $(PID_CONTROLLER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(PID_CONTROLLER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/pid_controller_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/transport/pid_controller_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_pid_controller_test: $(PID_CONTROLLER_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(PID_CONTROLLER_TEST_OBJS:.o=.dep) +endif +endif + + +PORT_SHARING_END2END_TEST_SRC = \ + $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc \ + test/cpp/end2end/port_sharing_end2end_test.cc \ + test/cpp/end2end/test_service_impl.cc \ + +PORT_SHARING_END2END_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(PORT_SHARING_END2END_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/port_sharing_end2end_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/port_sharing_end2end_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/port_sharing_end2end_test: $(PROTOBUF_DEP) $(PORT_SHARING_END2END_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(PORT_SHARING_END2END_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/port_sharing_end2end_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/simple_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/port_sharing_end2end_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_port_sharing_end2end_test: $(PORT_SHARING_END2END_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(PORT_SHARING_END2END_TEST_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/port_sharing_end2end_test.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc + + +PROTO_SERVER_REFLECTION_TEST_SRC = \ + $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc \ + test/cpp/end2end/proto_server_reflection_test.cc \ + test/cpp/end2end/test_service_impl.cc \ + test/cpp/util/proto_reflection_descriptor_database.cc \ + +PROTO_SERVER_REFLECTION_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(PROTO_SERVER_REFLECTION_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/proto_server_reflection_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/proto_server_reflection_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/proto_server_reflection_test: $(PROTOBUF_DEP) $(PROTO_SERVER_REFLECTION_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_reflection.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(PROTO_SERVER_REFLECTION_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_reflection.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/proto_server_reflection_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/duplicate/echo_duplicate.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_reflection.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_reflection.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_reflection.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/simple_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_reflection.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/proto_server_reflection_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_reflection.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_reflection.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/util/proto_reflection_descriptor_database.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_reflection.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_proto_server_reflection_test: $(PROTO_SERVER_REFLECTION_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(PROTO_SERVER_REFLECTION_TEST_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/proto_server_reflection_test.o: $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/util/proto_reflection_descriptor_database.o: $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc + + +PROTO_UTILS_TEST_SRC = \ + test/cpp/codegen/proto_utils_test.cc \ + +PROTO_UTILS_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(PROTO_UTILS_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/proto_utils_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/proto_utils_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/proto_utils_test: $(PROTOBUF_DEP) $(PROTO_UTILS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(PROTO_UTILS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/proto_utils_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/cpp/codegen/proto_utils_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_proto_utils_test: $(PROTO_UTILS_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(PROTO_UTILS_TEST_OBJS:.o=.dep) +endif +endif + + +QPS_JSON_DRIVER_SRC = \ + $(GENDIR)/src/proto/grpc/core/stats.pb.cc $(GENDIR)/src/proto/grpc/core/stats.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/benchmark_service.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/control.pb.cc $(GENDIR)/src/proto/grpc/testing/control.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/payloads.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/report_qps_scenario_service.pb.cc $(GENDIR)/src/proto/grpc/testing/report_qps_scenario_service.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/stats.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/worker_service.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.grpc.pb.cc \ + src/cpp/util/core_stats.cc \ + test/cpp/qps/benchmark_config.cc \ + test/cpp/qps/client_async.cc \ + test/cpp/qps/client_callback.cc \ + test/cpp/qps/client_sync.cc \ + test/cpp/qps/driver.cc \ + test/cpp/qps/parse_json.cc \ + test/cpp/qps/qps_json_driver.cc \ + test/cpp/qps/qps_server_builder.cc \ + test/cpp/qps/qps_worker.cc \ + test/cpp/qps/report.cc \ + test/cpp/qps/server_async.cc \ + test/cpp/qps/server_callback.cc \ + test/cpp/qps/server_sync.cc \ + test/cpp/qps/usage_timer.cc \ + +QPS_JSON_DRIVER_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(QPS_JSON_DRIVER_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/qps_json_driver: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/qps_json_driver: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/qps_json_driver: $(PROTOBUF_DEP) $(QPS_JSON_DRIVER_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(QPS_JSON_DRIVER_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/qps_json_driver + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/core/stats.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/benchmark_service.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/control.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/payloads.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/report_qps_scenario_service.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/stats.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/worker_service.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/cpp/util/core_stats.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/qps/benchmark_config.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/qps/client_async.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/qps/client_callback.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/qps/client_sync.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/qps/driver.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/qps/parse_json.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/qps/qps_json_driver.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/qps/qps_server_builder.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/qps/qps_worker.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/qps/report.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/qps/server_async.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/qps/server_callback.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/qps/server_sync.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/qps/usage_timer.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_qps_json_driver: $(QPS_JSON_DRIVER_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(QPS_JSON_DRIVER_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/src/cpp/util/core_stats.o: $(GENDIR)/src/proto/grpc/core/stats.pb.cc $(GENDIR)/src/proto/grpc/core/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/control.pb.cc $(GENDIR)/src/proto/grpc/testing/control.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/report_qps_scenario_service.pb.cc $(GENDIR)/src/proto/grpc/testing/report_qps_scenario_service.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/qps/benchmark_config.o: $(GENDIR)/src/proto/grpc/core/stats.pb.cc $(GENDIR)/src/proto/grpc/core/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/control.pb.cc $(GENDIR)/src/proto/grpc/testing/control.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/report_qps_scenario_service.pb.cc $(GENDIR)/src/proto/grpc/testing/report_qps_scenario_service.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/qps/client_async.o: $(GENDIR)/src/proto/grpc/core/stats.pb.cc $(GENDIR)/src/proto/grpc/core/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/control.pb.cc $(GENDIR)/src/proto/grpc/testing/control.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/report_qps_scenario_service.pb.cc $(GENDIR)/src/proto/grpc/testing/report_qps_scenario_service.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/qps/client_callback.o: $(GENDIR)/src/proto/grpc/core/stats.pb.cc $(GENDIR)/src/proto/grpc/core/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/control.pb.cc $(GENDIR)/src/proto/grpc/testing/control.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/report_qps_scenario_service.pb.cc $(GENDIR)/src/proto/grpc/testing/report_qps_scenario_service.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/qps/client_sync.o: $(GENDIR)/src/proto/grpc/core/stats.pb.cc $(GENDIR)/src/proto/grpc/core/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/control.pb.cc $(GENDIR)/src/proto/grpc/testing/control.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/report_qps_scenario_service.pb.cc $(GENDIR)/src/proto/grpc/testing/report_qps_scenario_service.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/qps/driver.o: $(GENDIR)/src/proto/grpc/core/stats.pb.cc $(GENDIR)/src/proto/grpc/core/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/control.pb.cc $(GENDIR)/src/proto/grpc/testing/control.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/report_qps_scenario_service.pb.cc $(GENDIR)/src/proto/grpc/testing/report_qps_scenario_service.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/qps/parse_json.o: $(GENDIR)/src/proto/grpc/core/stats.pb.cc $(GENDIR)/src/proto/grpc/core/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/control.pb.cc $(GENDIR)/src/proto/grpc/testing/control.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/report_qps_scenario_service.pb.cc $(GENDIR)/src/proto/grpc/testing/report_qps_scenario_service.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/qps/qps_json_driver.o: $(GENDIR)/src/proto/grpc/core/stats.pb.cc $(GENDIR)/src/proto/grpc/core/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/control.pb.cc $(GENDIR)/src/proto/grpc/testing/control.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/report_qps_scenario_service.pb.cc $(GENDIR)/src/proto/grpc/testing/report_qps_scenario_service.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/qps/qps_server_builder.o: $(GENDIR)/src/proto/grpc/core/stats.pb.cc $(GENDIR)/src/proto/grpc/core/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/control.pb.cc $(GENDIR)/src/proto/grpc/testing/control.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/report_qps_scenario_service.pb.cc $(GENDIR)/src/proto/grpc/testing/report_qps_scenario_service.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/qps/qps_worker.o: $(GENDIR)/src/proto/grpc/core/stats.pb.cc $(GENDIR)/src/proto/grpc/core/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/control.pb.cc $(GENDIR)/src/proto/grpc/testing/control.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/report_qps_scenario_service.pb.cc $(GENDIR)/src/proto/grpc/testing/report_qps_scenario_service.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/qps/report.o: $(GENDIR)/src/proto/grpc/core/stats.pb.cc $(GENDIR)/src/proto/grpc/core/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/control.pb.cc $(GENDIR)/src/proto/grpc/testing/control.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/report_qps_scenario_service.pb.cc $(GENDIR)/src/proto/grpc/testing/report_qps_scenario_service.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/qps/server_async.o: $(GENDIR)/src/proto/grpc/core/stats.pb.cc $(GENDIR)/src/proto/grpc/core/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/control.pb.cc $(GENDIR)/src/proto/grpc/testing/control.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/report_qps_scenario_service.pb.cc $(GENDIR)/src/proto/grpc/testing/report_qps_scenario_service.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/qps/server_callback.o: $(GENDIR)/src/proto/grpc/core/stats.pb.cc $(GENDIR)/src/proto/grpc/core/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/control.pb.cc $(GENDIR)/src/proto/grpc/testing/control.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/report_qps_scenario_service.pb.cc $(GENDIR)/src/proto/grpc/testing/report_qps_scenario_service.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/qps/server_sync.o: $(GENDIR)/src/proto/grpc/core/stats.pb.cc $(GENDIR)/src/proto/grpc/core/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/control.pb.cc $(GENDIR)/src/proto/grpc/testing/control.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/report_qps_scenario_service.pb.cc $(GENDIR)/src/proto/grpc/testing/report_qps_scenario_service.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/qps/usage_timer.o: $(GENDIR)/src/proto/grpc/core/stats.pb.cc $(GENDIR)/src/proto/grpc/core/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/control.pb.cc $(GENDIR)/src/proto/grpc/testing/control.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/report_qps_scenario_service.pb.cc $(GENDIR)/src/proto/grpc/testing/report_qps_scenario_service.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.grpc.pb.cc + + +QPS_WORKER_SRC = \ + $(GENDIR)/src/proto/grpc/core/stats.pb.cc $(GENDIR)/src/proto/grpc/core/stats.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/benchmark_service.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/control.pb.cc $(GENDIR)/src/proto/grpc/testing/control.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/payloads.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/stats.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/worker_service.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.grpc.pb.cc \ + src/cpp/util/core_stats.cc \ + test/cpp/qps/client_async.cc \ + test/cpp/qps/client_callback.cc \ + test/cpp/qps/client_sync.cc \ + test/cpp/qps/qps_server_builder.cc \ + test/cpp/qps/qps_worker.cc \ + test/cpp/qps/server_async.cc \ + test/cpp/qps/server_callback.cc \ + test/cpp/qps/server_sync.cc \ + test/cpp/qps/usage_timer.cc \ + test/cpp/qps/worker.cc \ + +QPS_WORKER_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(QPS_WORKER_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/qps_worker: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/qps_worker: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/qps_worker: $(PROTOBUF_DEP) $(QPS_WORKER_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(QPS_WORKER_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/qps_worker + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/core/stats.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/benchmark_service.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/control.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/payloads.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/stats.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/worker_service.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/cpp/util/core_stats.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/qps/client_async.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/qps/client_callback.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/qps/client_sync.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/qps/qps_server_builder.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/qps/qps_worker.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/qps/server_async.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/qps/server_callback.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/qps/server_sync.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/qps/usage_timer.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/qps/worker.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_qps_worker: $(QPS_WORKER_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(QPS_WORKER_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/src/cpp/util/core_stats.o: $(GENDIR)/src/proto/grpc/core/stats.pb.cc $(GENDIR)/src/proto/grpc/core/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/control.pb.cc $(GENDIR)/src/proto/grpc/testing/control.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/qps/client_async.o: $(GENDIR)/src/proto/grpc/core/stats.pb.cc $(GENDIR)/src/proto/grpc/core/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/control.pb.cc $(GENDIR)/src/proto/grpc/testing/control.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/qps/client_callback.o: $(GENDIR)/src/proto/grpc/core/stats.pb.cc $(GENDIR)/src/proto/grpc/core/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/control.pb.cc $(GENDIR)/src/proto/grpc/testing/control.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/qps/client_sync.o: $(GENDIR)/src/proto/grpc/core/stats.pb.cc $(GENDIR)/src/proto/grpc/core/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/control.pb.cc $(GENDIR)/src/proto/grpc/testing/control.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/qps/qps_server_builder.o: $(GENDIR)/src/proto/grpc/core/stats.pb.cc $(GENDIR)/src/proto/grpc/core/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/control.pb.cc $(GENDIR)/src/proto/grpc/testing/control.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/qps/qps_worker.o: $(GENDIR)/src/proto/grpc/core/stats.pb.cc $(GENDIR)/src/proto/grpc/core/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/control.pb.cc $(GENDIR)/src/proto/grpc/testing/control.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/qps/server_async.o: $(GENDIR)/src/proto/grpc/core/stats.pb.cc $(GENDIR)/src/proto/grpc/core/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/control.pb.cc $(GENDIR)/src/proto/grpc/testing/control.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/qps/server_callback.o: $(GENDIR)/src/proto/grpc/core/stats.pb.cc $(GENDIR)/src/proto/grpc/core/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/control.pb.cc $(GENDIR)/src/proto/grpc/testing/control.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/qps/server_sync.o: $(GENDIR)/src/proto/grpc/core/stats.pb.cc $(GENDIR)/src/proto/grpc/core/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/control.pb.cc $(GENDIR)/src/proto/grpc/testing/control.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/qps/usage_timer.o: $(GENDIR)/src/proto/grpc/core/stats.pb.cc $(GENDIR)/src/proto/grpc/core/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/control.pb.cc $(GENDIR)/src/proto/grpc/testing/control.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/qps/worker.o: $(GENDIR)/src/proto/grpc/core/stats.pb.cc $(GENDIR)/src/proto/grpc/core/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.pb.cc $(GENDIR)/src/proto/grpc/testing/benchmark_service.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/control.pb.cc $(GENDIR)/src/proto/grpc/testing/control.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.pb.cc $(GENDIR)/src/proto/grpc/testing/payloads.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.pb.cc $(GENDIR)/src/proto/grpc/testing/stats.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.pb.cc $(GENDIR)/src/proto/grpc/testing/worker_service.grpc.pb.cc + + +RAW_END2END_TEST_SRC = \ + $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc \ + test/cpp/end2end/raw_end2end_test.cc \ + test/cpp/end2end/test_service_impl.cc \ + +RAW_END2END_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(RAW_END2END_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/raw_end2end_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/raw_end2end_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/raw_end2end_test: $(PROTOBUF_DEP) $(RAW_END2END_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(RAW_END2END_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/raw_end2end_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/duplicate/echo_duplicate.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/simple_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/raw_end2end_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_raw_end2end_test: $(RAW_END2END_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(RAW_END2END_TEST_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/raw_end2end_test.o: $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc + + +REF_COUNTED_PTR_TEST_SRC = \ + test/core/gprpp/ref_counted_ptr_test.cc \ + +REF_COUNTED_PTR_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(REF_COUNTED_PTR_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/ref_counted_ptr_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/ref_counted_ptr_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/ref_counted_ptr_test: $(PROTOBUF_DEP) $(REF_COUNTED_PTR_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(REF_COUNTED_PTR_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/ref_counted_ptr_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/gprpp/ref_counted_ptr_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_ref_counted_ptr_test: $(REF_COUNTED_PTR_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(REF_COUNTED_PTR_TEST_OBJS:.o=.dep) +endif +endif + + +REF_COUNTED_TEST_SRC = \ + test/core/gprpp/ref_counted_test.cc \ + +REF_COUNTED_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(REF_COUNTED_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/ref_counted_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/ref_counted_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/ref_counted_test: $(PROTOBUF_DEP) $(REF_COUNTED_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(REF_COUNTED_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/ref_counted_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/gprpp/ref_counted_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_ref_counted_test: $(REF_COUNTED_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(REF_COUNTED_TEST_OBJS:.o=.dep) +endif +endif + + +RETRY_THROTTLE_TEST_SRC = \ + test/core/client_channel/retry_throttle_test.cc \ + +RETRY_THROTTLE_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(RETRY_THROTTLE_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/retry_throttle_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/retry_throttle_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/retry_throttle_test: $(PROTOBUF_DEP) $(RETRY_THROTTLE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(RETRY_THROTTLE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/retry_throttle_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/client_channel/retry_throttle_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_retry_throttle_test: $(RETRY_THROTTLE_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(RETRY_THROTTLE_TEST_OBJS:.o=.dep) +endif +endif + + +SECURE_AUTH_CONTEXT_TEST_SRC = \ + test/cpp/common/secure_auth_context_test.cc \ + +SECURE_AUTH_CONTEXT_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(SECURE_AUTH_CONTEXT_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/secure_auth_context_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/secure_auth_context_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/secure_auth_context_test: $(PROTOBUF_DEP) $(SECURE_AUTH_CONTEXT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(SECURE_AUTH_CONTEXT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/secure_auth_context_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/cpp/common/secure_auth_context_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_secure_auth_context_test: $(SECURE_AUTH_CONTEXT_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(SECURE_AUTH_CONTEXT_TEST_OBJS:.o=.dep) +endif +endif + + +SERVER_BUILDER_PLUGIN_TEST_SRC = \ + $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc \ + test/cpp/end2end/server_builder_plugin_test.cc \ + test/cpp/end2end/test_service_impl.cc \ + +SERVER_BUILDER_PLUGIN_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(SERVER_BUILDER_PLUGIN_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/server_builder_plugin_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/server_builder_plugin_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/server_builder_plugin_test: $(PROTOBUF_DEP) $(SERVER_BUILDER_PLUGIN_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(SERVER_BUILDER_PLUGIN_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/server_builder_plugin_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/duplicate/echo_duplicate.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/simple_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/server_builder_plugin_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_server_builder_plugin_test: $(SERVER_BUILDER_PLUGIN_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(SERVER_BUILDER_PLUGIN_TEST_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/server_builder_plugin_test.o: $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc + + +SERVER_BUILDER_TEST_SRC = \ + $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc \ + test/cpp/server/server_builder_test.cc \ + +SERVER_BUILDER_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(SERVER_BUILDER_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/server_builder_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/server_builder_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/server_builder_test: $(PROTOBUF_DEP) $(SERVER_BUILDER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(SERVER_BUILDER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/server_builder_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/simple_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/server/server_builder_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_server_builder_test: $(SERVER_BUILDER_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(SERVER_BUILDER_TEST_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/cpp/server/server_builder_test.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc + + +SERVER_BUILDER_WITH_SOCKET_MUTATOR_TEST_SRC = \ + $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc \ + test/cpp/server/server_builder_with_socket_mutator_test.cc \ + +SERVER_BUILDER_WITH_SOCKET_MUTATOR_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(SERVER_BUILDER_WITH_SOCKET_MUTATOR_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/server_builder_with_socket_mutator_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/server_builder_with_socket_mutator_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/server_builder_with_socket_mutator_test: $(PROTOBUF_DEP) $(SERVER_BUILDER_WITH_SOCKET_MUTATOR_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(SERVER_BUILDER_WITH_SOCKET_MUTATOR_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/server_builder_with_socket_mutator_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/simple_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/server/server_builder_with_socket_mutator_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_server_builder_with_socket_mutator_test: $(SERVER_BUILDER_WITH_SOCKET_MUTATOR_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(SERVER_BUILDER_WITH_SOCKET_MUTATOR_TEST_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/cpp/server/server_builder_with_socket_mutator_test.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc + + +SERVER_CONTEXT_TEST_SPOUSE_TEST_SRC = \ + test/cpp/test/server_context_test_spouse_test.cc \ + +SERVER_CONTEXT_TEST_SPOUSE_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(SERVER_CONTEXT_TEST_SPOUSE_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/server_context_test_spouse_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/server_context_test_spouse_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/server_context_test_spouse_test: $(PROTOBUF_DEP) $(SERVER_CONTEXT_TEST_SPOUSE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(SERVER_CONTEXT_TEST_SPOUSE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/server_context_test_spouse_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/cpp/test/server_context_test_spouse_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_server_context_test_spouse_test: $(SERVER_CONTEXT_TEST_SPOUSE_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(SERVER_CONTEXT_TEST_SPOUSE_TEST_OBJS:.o=.dep) +endif +endif + + +SERVER_EARLY_RETURN_TEST_SRC = \ + $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc \ + test/cpp/end2end/server_early_return_test.cc \ + +SERVER_EARLY_RETURN_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(SERVER_EARLY_RETURN_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/server_early_return_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/server_early_return_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/server_early_return_test: $(PROTOBUF_DEP) $(SERVER_EARLY_RETURN_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(SERVER_EARLY_RETURN_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/server_early_return_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/simple_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/server_early_return_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_server_early_return_test: $(SERVER_EARLY_RETURN_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(SERVER_EARLY_RETURN_TEST_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/server_early_return_test.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc + + +SERVER_FUZZER_SRC = \ + test/core/end2end/fuzzers/server_fuzzer.cc \ + test/core/util/fuzzer_corpus_test.cc \ + +SERVER_FUZZER_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(SERVER_FUZZER_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/server_fuzzer: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/server_fuzzer: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/server_fuzzer: $(PROTOBUF_DEP) $(SERVER_FUZZER_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(SERVER_FUZZER_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) -lFuzzer -o $(BINDIR)/$(CONFIG)/server_fuzzer + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/end2end/fuzzers/server_fuzzer.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/fuzzer_corpus_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_server_fuzzer: $(SERVER_FUZZER_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(SERVER_FUZZER_OBJS:.o=.dep) +endif +endif + + +SERVER_INTERCEPTORS_END2END_TEST_SRC = \ + $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc \ + test/cpp/end2end/interceptors_util.cc \ + test/cpp/end2end/server_interceptors_end2end_test.cc \ + test/cpp/end2end/test_service_impl.cc \ + +SERVER_INTERCEPTORS_END2END_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(SERVER_INTERCEPTORS_END2END_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/server_interceptors_end2end_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/server_interceptors_end2end_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/server_interceptors_end2end_test: $(PROTOBUF_DEP) $(SERVER_INTERCEPTORS_END2END_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(SERVER_INTERCEPTORS_END2END_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/server_interceptors_end2end_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/simple_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/interceptors_util.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/server_interceptors_end2end_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_server_interceptors_end2end_test: $(SERVER_INTERCEPTORS_END2END_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(SERVER_INTERCEPTORS_END2END_TEST_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/interceptors_util.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/server_interceptors_end2end_test.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc + + +SERVER_REGISTERED_METHOD_BAD_CLIENT_TEST_SRC = \ + test/core/bad_client/bad_client.cc \ + test/core/bad_client/tests/server_registered_method.cc \ + test/core/end2end/cq_verifier.cc \ + +SERVER_REGISTERED_METHOD_BAD_CLIENT_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(SERVER_REGISTERED_METHOD_BAD_CLIENT_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/server_registered_method_bad_client_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/server_registered_method_bad_client_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/server_registered_method_bad_client_test: $(PROTOBUF_DEP) $(SERVER_REGISTERED_METHOD_BAD_CLIENT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(SERVER_REGISTERED_METHOD_BAD_CLIENT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/server_registered_method_bad_client_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/bad_client/bad_client.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/bad_client/tests/server_registered_method.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/end2end/cq_verifier.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_server_registered_method_bad_client_test: $(SERVER_REGISTERED_METHOD_BAD_CLIENT_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(SERVER_REGISTERED_METHOD_BAD_CLIENT_TEST_OBJS:.o=.dep) +endif +endif + + +SERVER_REQUEST_CALL_TEST_SRC = \ + $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc \ + test/cpp/server/server_request_call_test.cc \ + +SERVER_REQUEST_CALL_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(SERVER_REQUEST_CALL_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/server_request_call_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/server_request_call_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/server_request_call_test: $(PROTOBUF_DEP) $(SERVER_REQUEST_CALL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(SERVER_REQUEST_CALL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/server_request_call_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/simple_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/server/server_request_call_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_server_request_call_test: $(SERVER_REQUEST_CALL_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(SERVER_REQUEST_CALL_TEST_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/cpp/server/server_request_call_test.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc + + +SERVICE_CONFIG_END2END_TEST_SRC = \ + $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc \ + test/cpp/end2end/service_config_end2end_test.cc \ + test/cpp/end2end/test_service_impl.cc \ + +SERVICE_CONFIG_END2END_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(SERVICE_CONFIG_END2END_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/service_config_end2end_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/service_config_end2end_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/service_config_end2end_test: $(PROTOBUF_DEP) $(SERVICE_CONFIG_END2END_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(SERVICE_CONFIG_END2END_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/service_config_end2end_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/duplicate/echo_duplicate.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/simple_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/service_config_end2end_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_service_config_end2end_test: $(SERVICE_CONFIG_END2END_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(SERVICE_CONFIG_END2END_TEST_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/service_config_end2end_test.o: $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc + + +SERVICE_CONFIG_TEST_SRC = \ + test/core/client_channel/service_config_test.cc \ + +SERVICE_CONFIG_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(SERVICE_CONFIG_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/service_config_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/service_config_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/service_config_test: $(PROTOBUF_DEP) $(SERVICE_CONFIG_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(SERVICE_CONFIG_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/service_config_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/client_channel/service_config_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_service_config_test: $(SERVICE_CONFIG_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(SERVICE_CONFIG_TEST_OBJS:.o=.dep) +endif +endif + + +SETTINGS_TIMEOUT_TEST_SRC = \ + test/core/transport/chttp2/settings_timeout_test.cc \ + +SETTINGS_TIMEOUT_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(SETTINGS_TIMEOUT_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/settings_timeout_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/settings_timeout_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/settings_timeout_test: $(PROTOBUF_DEP) $(SETTINGS_TIMEOUT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(SETTINGS_TIMEOUT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/settings_timeout_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/transport/chttp2/settings_timeout_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_settings_timeout_test: $(SETTINGS_TIMEOUT_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(SETTINGS_TIMEOUT_TEST_OBJS:.o=.dep) +endif +endif + + +SHUTDOWN_TEST_SRC = \ + $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc \ + test/cpp/end2end/shutdown_test.cc \ + +SHUTDOWN_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(SHUTDOWN_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/shutdown_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/shutdown_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/shutdown_test: $(PROTOBUF_DEP) $(SHUTDOWN_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(SHUTDOWN_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/shutdown_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/duplicate/echo_duplicate.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/simple_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/shutdown_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_shutdown_test: $(SHUTDOWN_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(SHUTDOWN_TEST_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/shutdown_test.o: $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc + + +SIMPLE_REQUEST_BAD_CLIENT_TEST_SRC = \ + test/core/bad_client/bad_client.cc \ + test/core/bad_client/tests/simple_request.cc \ + test/core/end2end/cq_verifier.cc \ + +SIMPLE_REQUEST_BAD_CLIENT_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(SIMPLE_REQUEST_BAD_CLIENT_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/simple_request_bad_client_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/simple_request_bad_client_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/simple_request_bad_client_test: $(PROTOBUF_DEP) $(SIMPLE_REQUEST_BAD_CLIENT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(SIMPLE_REQUEST_BAD_CLIENT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/simple_request_bad_client_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/bad_client/bad_client.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/bad_client/tests/simple_request.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/end2end/cq_verifier.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_simple_request_bad_client_test: $(SIMPLE_REQUEST_BAD_CLIENT_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(SIMPLE_REQUEST_BAD_CLIENT_TEST_OBJS:.o=.dep) +endif +endif + + +SLICE_HASH_TABLE_TEST_SRC = \ + test/core/slice/slice_hash_table_test.cc \ + +SLICE_HASH_TABLE_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(SLICE_HASH_TABLE_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/slice_hash_table_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/slice_hash_table_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/slice_hash_table_test: $(PROTOBUF_DEP) $(SLICE_HASH_TABLE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(SLICE_HASH_TABLE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/slice_hash_table_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/slice/slice_hash_table_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_slice_hash_table_test: $(SLICE_HASH_TABLE_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(SLICE_HASH_TABLE_TEST_OBJS:.o=.dep) +endif +endif + + +SLICE_WEAK_HASH_TABLE_TEST_SRC = \ + test/core/slice/slice_weak_hash_table_test.cc \ + +SLICE_WEAK_HASH_TABLE_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(SLICE_WEAK_HASH_TABLE_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/slice_weak_hash_table_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/slice_weak_hash_table_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/slice_weak_hash_table_test: $(PROTOBUF_DEP) $(SLICE_WEAK_HASH_TABLE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(SLICE_WEAK_HASH_TABLE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/slice_weak_hash_table_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/slice/slice_weak_hash_table_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_slice_weak_hash_table_test: $(SLICE_WEAK_HASH_TABLE_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(SLICE_WEAK_HASH_TABLE_TEST_OBJS:.o=.dep) +endif +endif + + +SSL_SERVER_FUZZER_SRC = \ + test/core/security/ssl_server_fuzzer.cc \ + test/core/util/fuzzer_corpus_test.cc \ + +SSL_SERVER_FUZZER_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(SSL_SERVER_FUZZER_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/ssl_server_fuzzer: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/ssl_server_fuzzer: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/ssl_server_fuzzer: $(PROTOBUF_DEP) $(SSL_SERVER_FUZZER_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(SSL_SERVER_FUZZER_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) -lFuzzer -o $(BINDIR)/$(CONFIG)/ssl_server_fuzzer + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/security/ssl_server_fuzzer.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/fuzzer_corpus_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_ssl_server_fuzzer: $(SSL_SERVER_FUZZER_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(SSL_SERVER_FUZZER_OBJS:.o=.dep) +endif +endif + + +STATIC_METADATA_TEST_SRC = \ + test/core/transport/static_metadata_test.cc \ + +STATIC_METADATA_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(STATIC_METADATA_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/static_metadata_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/static_metadata_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/static_metadata_test: $(PROTOBUF_DEP) $(STATIC_METADATA_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(STATIC_METADATA_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/static_metadata_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/transport/static_metadata_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_static_metadata_test: $(STATIC_METADATA_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(STATIC_METADATA_TEST_OBJS:.o=.dep) +endif +endif + + +STATS_TEST_SRC = \ + test/core/debug/stats_test.cc \ + +STATS_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(STATS_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/stats_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/stats_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/stats_test: $(PROTOBUF_DEP) $(STATS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(STATS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/stats_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/debug/stats_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_stats_test: $(STATS_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(STATS_TEST_OBJS:.o=.dep) +endif +endif + + +STATUS_METADATA_TEST_SRC = \ + test/core/transport/status_metadata_test.cc \ + +STATUS_METADATA_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(STATUS_METADATA_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/status_metadata_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/status_metadata_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/status_metadata_test: $(PROTOBUF_DEP) $(STATUS_METADATA_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(STATUS_METADATA_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/status_metadata_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/transport/status_metadata_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_status_metadata_test: $(STATUS_METADATA_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(STATUS_METADATA_TEST_OBJS:.o=.dep) +endif +endif + + +STATUS_UTIL_TEST_SRC = \ + test/core/channel/status_util_test.cc \ + +STATUS_UTIL_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(STATUS_UTIL_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/status_util_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/status_util_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/status_util_test: $(PROTOBUF_DEP) $(STATUS_UTIL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(STATUS_UTIL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/status_util_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/channel/status_util_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_status_util_test: $(STATUS_UTIL_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(STATUS_UTIL_TEST_OBJS:.o=.dep) +endif +endif + + +STREAMING_THROUGHPUT_TEST_SRC = \ + $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc \ + test/cpp/end2end/streaming_throughput_test.cc \ + +STREAMING_THROUGHPUT_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(STREAMING_THROUGHPUT_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/streaming_throughput_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/streaming_throughput_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/streaming_throughput_test: $(PROTOBUF_DEP) $(STREAMING_THROUGHPUT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(STREAMING_THROUGHPUT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/streaming_throughput_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/duplicate/echo_duplicate.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/simple_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/streaming_throughput_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_streaming_throughput_test: $(STREAMING_THROUGHPUT_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(STREAMING_THROUGHPUT_TEST_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/streaming_throughput_test.o: $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc + + +STRING_REF_TEST_SRC = \ + test/cpp/util/string_ref_test.cc \ + +STRING_REF_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(STRING_REF_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/string_ref_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/string_ref_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/string_ref_test: $(PROTOBUF_DEP) $(STRING_REF_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(STRING_REF_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/string_ref_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/cpp/util/string_ref_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_string_ref_test: $(STRING_REF_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(STRING_REF_TEST_OBJS:.o=.dep) +endif +endif + + +TEST_CPP_CLIENT_CREDENTIALS_TEST_SRC = \ + test/cpp/client/credentials_test.cc \ + +TEST_CPP_CLIENT_CREDENTIALS_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(TEST_CPP_CLIENT_CREDENTIALS_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/test_cpp_client_credentials_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/test_cpp_client_credentials_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/test_cpp_client_credentials_test: $(PROTOBUF_DEP) $(TEST_CPP_CLIENT_CREDENTIALS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(TEST_CPP_CLIENT_CREDENTIALS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/test_cpp_client_credentials_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/cpp/client/credentials_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_test_cpp_client_credentials_test: $(TEST_CPP_CLIENT_CREDENTIALS_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(TEST_CPP_CLIENT_CREDENTIALS_TEST_OBJS:.o=.dep) +endif +endif + + +TEST_CPP_UTIL_SLICE_TEST_SRC = \ + test/cpp/util/slice_test.cc \ + +TEST_CPP_UTIL_SLICE_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(TEST_CPP_UTIL_SLICE_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/test_cpp_util_slice_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/test_cpp_util_slice_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/test_cpp_util_slice_test: $(PROTOBUF_DEP) $(TEST_CPP_UTIL_SLICE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(TEST_CPP_UTIL_SLICE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/test_cpp_util_slice_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/cpp/util/slice_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_test_cpp_util_slice_test: $(TEST_CPP_UTIL_SLICE_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(TEST_CPP_UTIL_SLICE_TEST_OBJS:.o=.dep) +endif +endif + + +TEST_CPP_UTIL_TIME_TEST_SRC = \ + test/cpp/util/time_test.cc \ + +TEST_CPP_UTIL_TIME_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(TEST_CPP_UTIL_TIME_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/test_cpp_util_time_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/test_cpp_util_time_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/test_cpp_util_time_test: $(PROTOBUF_DEP) $(TEST_CPP_UTIL_TIME_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(TEST_CPP_UTIL_TIME_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/test_cpp_util_time_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/cpp/util/time_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_test_cpp_util_time_test: $(TEST_CPP_UTIL_TIME_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(TEST_CPP_UTIL_TIME_TEST_OBJS:.o=.dep) +endif +endif + + +THREAD_MANAGER_TEST_SRC = \ + test/cpp/thread_manager/thread_manager_test.cc \ + +THREAD_MANAGER_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(THREAD_MANAGER_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/thread_manager_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/thread_manager_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/thread_manager_test: $(PROTOBUF_DEP) $(THREAD_MANAGER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(THREAD_MANAGER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/thread_manager_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/cpp/thread_manager/thread_manager_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_thread_manager_test: $(THREAD_MANAGER_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(THREAD_MANAGER_TEST_OBJS:.o=.dep) +endif +endif + + +THREAD_STRESS_TEST_SRC = \ + $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc \ + test/cpp/end2end/thread_stress_test.cc \ + +THREAD_STRESS_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(THREAD_STRESS_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/thread_stress_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/thread_stress_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/thread_stress_test: $(PROTOBUF_DEP) $(THREAD_STRESS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(THREAD_STRESS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/thread_stress_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/duplicate/echo_duplicate.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/simple_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/thread_stress_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_thread_stress_test: $(THREAD_STRESS_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(THREAD_STRESS_TEST_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/thread_stress_test.o: $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc + + +TIME_JUMP_TEST_SRC = \ + test/cpp/common/time_jump_test.cc \ + +TIME_JUMP_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(TIME_JUMP_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/time_jump_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/time_jump_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/time_jump_test: $(PROTOBUF_DEP) $(TIME_JUMP_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(TIME_JUMP_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/time_jump_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/cpp/common/time_jump_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_time_jump_test: $(TIME_JUMP_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(TIME_JUMP_TEST_OBJS:.o=.dep) +endif +endif + + +TIMER_TEST_SRC = \ + test/cpp/common/timer_test.cc \ + +TIMER_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(TIMER_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/timer_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/timer_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/timer_test: $(PROTOBUF_DEP) $(TIMER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(TIMER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/timer_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/cpp/common/timer_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_timer_test: $(TIMER_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(TIMER_TEST_OBJS:.o=.dep) +endif +endif + + +TLS_SECURITY_CONNECTOR_TEST_SRC = \ + test/core/security/tls_security_connector_test.cc \ + +TLS_SECURITY_CONNECTOR_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(TLS_SECURITY_CONNECTOR_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/tls_security_connector_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/tls_security_connector_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/tls_security_connector_test: $(PROTOBUF_DEP) $(TLS_SECURITY_CONNECTOR_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(TLS_SECURITY_CONNECTOR_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/tls_security_connector_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/security/tls_security_connector_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_tls_security_connector_test: $(TLS_SECURITY_CONNECTOR_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(TLS_SECURITY_CONNECTOR_TEST_OBJS:.o=.dep) +endif +endif + + +UNKNOWN_FRAME_BAD_CLIENT_TEST_SRC = \ + test/core/bad_client/bad_client.cc \ + test/core/bad_client/tests/unknown_frame.cc \ + test/core/end2end/cq_verifier.cc \ + +UNKNOWN_FRAME_BAD_CLIENT_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(UNKNOWN_FRAME_BAD_CLIENT_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/unknown_frame_bad_client_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/unknown_frame_bad_client_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/unknown_frame_bad_client_test: $(PROTOBUF_DEP) $(UNKNOWN_FRAME_BAD_CLIENT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(UNKNOWN_FRAME_BAD_CLIENT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/unknown_frame_bad_client_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/bad_client/bad_client.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/bad_client/tests/unknown_frame.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/end2end/cq_verifier.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_unknown_frame_bad_client_test: $(UNKNOWN_FRAME_BAD_CLIENT_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(UNKNOWN_FRAME_BAD_CLIENT_TEST_OBJS:.o=.dep) +endif +endif + + +URI_FUZZER_TEST_SRC = \ + test/core/client_channel/uri_fuzzer_test.cc \ + test/core/util/fuzzer_corpus_test.cc \ + +URI_FUZZER_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(URI_FUZZER_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/uri_fuzzer_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/uri_fuzzer_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/uri_fuzzer_test: $(PROTOBUF_DEP) $(URI_FUZZER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(URI_FUZZER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) -lFuzzer -o $(BINDIR)/$(CONFIG)/uri_fuzzer_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/client_channel/uri_fuzzer_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/fuzzer_corpus_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_uri_fuzzer_test: $(URI_FUZZER_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(URI_FUZZER_TEST_OBJS:.o=.dep) +endif +endif + + +WINDOW_OVERFLOW_BAD_CLIENT_TEST_SRC = \ + test/core/bad_client/bad_client.cc \ + test/core/bad_client/tests/window_overflow.cc \ + test/core/end2end/cq_verifier.cc \ + +WINDOW_OVERFLOW_BAD_CLIENT_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(WINDOW_OVERFLOW_BAD_CLIENT_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/window_overflow_bad_client_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/window_overflow_bad_client_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/window_overflow_bad_client_test: $(PROTOBUF_DEP) $(WINDOW_OVERFLOW_BAD_CLIENT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(WINDOW_OVERFLOW_BAD_CLIENT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/window_overflow_bad_client_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/bad_client/bad_client.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/bad_client/tests/window_overflow.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/end2end/cq_verifier.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_window_overflow_bad_client_test: $(WINDOW_OVERFLOW_BAD_CLIENT_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(WINDOW_OVERFLOW_BAD_CLIENT_TEST_OBJS:.o=.dep) +endif +endif + + +WORK_SERIALIZER_TEST_SRC = \ + test/core/iomgr/work_serializer_test.cc \ + +WORK_SERIALIZER_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(WORK_SERIALIZER_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/work_serializer_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/work_serializer_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/work_serializer_test: $(PROTOBUF_DEP) $(WORK_SERIALIZER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(WORK_SERIALIZER_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/work_serializer_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/iomgr/work_serializer_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_work_serializer_test: $(WORK_SERIALIZER_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(WORK_SERIALIZER_TEST_OBJS:.o=.dep) +endif +endif + + +WRITES_PER_RPC_TEST_SRC = \ + $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc \ + test/core/util/cmdline.cc \ + test/core/util/debugger_macros.cc \ + test/core/util/fuzzer_util.cc \ + test/core/util/grpc_profiler.cc \ + test/core/util/histogram.cc \ + test/core/util/memory_counters.cc \ + test/core/util/mock_endpoint.cc \ + test/core/util/parse_hexstring.cc \ + test/core/util/passthru_endpoint.cc \ + test/core/util/port.cc \ + test/core/util/port_isolated_runtime_environment.cc \ + test/core/util/port_server_client.cc \ + test/core/util/reconnect_server.cc \ + test/core/util/slice_splitter.cc \ + test/core/util/subprocess_posix.cc \ + test/core/util/subprocess_windows.cc \ + test/core/util/test_config.cc \ + test/core/util/test_tcp_server.cc \ + test/core/util/tracer_util.cc \ + test/core/util/trickle_endpoint.cc \ + test/cpp/performance/writes_per_rpc_test.cc \ + +WRITES_PER_RPC_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(WRITES_PER_RPC_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/writes_per_rpc_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/writes_per_rpc_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/writes_per_rpc_test: $(PROTOBUF_DEP) $(WRITES_PER_RPC_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(WRITES_PER_RPC_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/writes_per_rpc_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo.o: $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/simple_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/cmdline.o: $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/debugger_macros.o: $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/fuzzer_util.o: $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/grpc_profiler.o: $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/histogram.o: $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/memory_counters.o: $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/mock_endpoint.o: $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/parse_hexstring.o: $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/passthru_endpoint.o: $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/port.o: $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/port_isolated_runtime_environment.o: $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/port_server_client.o: $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/reconnect_server.o: $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/slice_splitter.o: $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/subprocess_posix.o: $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/subprocess_windows.o: $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/test_config.o: $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/test_tcp_server.o: $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/tracer_util.o: $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/trickle_endpoint.o: $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/performance/writes_per_rpc_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_writes_per_rpc_test: $(WRITES_PER_RPC_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(WRITES_PER_RPC_TEST_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/core/util/cmdline.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/core/util/debugger_macros.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/core/util/fuzzer_util.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/core/util/grpc_profiler.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/core/util/histogram.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/core/util/memory_counters.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/core/util/mock_endpoint.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/core/util/parse_hexstring.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/core/util/passthru_endpoint.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/core/util/port.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/core/util/port_isolated_runtime_environment.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/core/util/port_server_client.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/core/util/reconnect_server.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/core/util/slice_splitter.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/core/util/subprocess_posix.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/core/util/subprocess_windows.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/core/util/test_config.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/core/util/test_tcp_server.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/core/util/tracer_util.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/core/util/trickle_endpoint.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/performance/writes_per_rpc_test.o: $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc + + +XDS_BOOTSTRAP_TEST_SRC = \ + test/core/client_channel/xds_bootstrap_test.cc \ + +XDS_BOOTSTRAP_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(XDS_BOOTSTRAP_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/xds_bootstrap_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/xds_bootstrap_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/xds_bootstrap_test: $(PROTOBUF_DEP) $(XDS_BOOTSTRAP_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(XDS_BOOTSTRAP_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/xds_bootstrap_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/client_channel/xds_bootstrap_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_xds_bootstrap_test: $(XDS_BOOTSTRAP_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(XDS_BOOTSTRAP_TEST_OBJS:.o=.dep) +endif +endif + + +XDS_END2END_TEST_SRC = \ + $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/xds/ads_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/ads_for_test.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/xds/cds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/cds_for_test.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/xds/eds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/eds_for_test.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/xds/lds_rds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lds_rds_for_test.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/xds/lrs_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lrs_for_test.grpc.pb.cc \ + test/cpp/end2end/test_service_impl.cc \ + test/cpp/end2end/xds_end2end_test.cc \ + +XDS_END2END_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(XDS_END2END_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/xds_end2end_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/xds_end2end_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/xds_end2end_test: $(PROTOBUF_DEP) $(XDS_END2END_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(XDS_END2END_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/xds_end2end_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/duplicate/echo_duplicate.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/echo_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/simple_messages.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/xds/ads_for_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/xds/cds_for_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/xds/eds_for_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/xds/lds_rds_for_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/xds/lrs_for_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/xds_end2end_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_xds_end2end_test: $(XDS_END2END_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(XDS_END2END_TEST_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/ads_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/ads_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/cds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/cds_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/eds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/eds_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lds_rds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lds_rds_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lrs_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lrs_for_test.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/xds_end2end_test.o: $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/ads_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/ads_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/cds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/cds_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/eds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/eds_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lds_rds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lds_rds_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lrs_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lrs_for_test.grpc.pb.cc + + +XDS_INTEROP_CLIENT_SRC = \ + $(GENDIR)/src/proto/grpc/testing/empty.pb.cc $(GENDIR)/src/proto/grpc/testing/empty.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/test.pb.cc $(GENDIR)/src/proto/grpc/testing/test.grpc.pb.cc \ + test/cpp/interop/xds_interop_client.cc \ + +XDS_INTEROP_CLIENT_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(XDS_INTEROP_CLIENT_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/xds_interop_client: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/xds_interop_client: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/xds_interop_client: $(PROTOBUF_DEP) $(XDS_INTEROP_CLIENT_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(XDS_INTEROP_CLIENT_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/xds_interop_client + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/empty.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/messages.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/interop/xds_interop_client.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_xds_interop_client: $(XDS_INTEROP_CLIENT_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(XDS_INTEROP_CLIENT_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/cpp/interop/xds_interop_client.o: $(GENDIR)/src/proto/grpc/testing/empty.pb.cc $(GENDIR)/src/proto/grpc/testing/empty.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/test.pb.cc $(GENDIR)/src/proto/grpc/testing/test.grpc.pb.cc + + +XDS_INTEROP_SERVER_SRC = \ + $(GENDIR)/src/proto/grpc/testing/empty.pb.cc $(GENDIR)/src/proto/grpc/testing/empty.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc \ + $(GENDIR)/src/proto/grpc/testing/test.pb.cc $(GENDIR)/src/proto/grpc/testing/test.grpc.pb.cc \ + test/cpp/interop/xds_interop_server.cc \ + +XDS_INTEROP_SERVER_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(XDS_INTEROP_SERVER_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/xds_interop_server: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/xds_interop_server: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/xds_interop_server: $(PROTOBUF_DEP) $(XDS_INTEROP_SERVER_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(XDS_INTEROP_SERVER_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/xds_interop_server + +endif + +endif + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/empty.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/messages.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/cpp/interop/xds_interop_server.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_xds_interop_server: $(XDS_INTEROP_SERVER_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(XDS_INTEROP_SERVER_OBJS:.o=.dep) +endif +endif +$(OBJDIR)/$(CONFIG)/test/cpp/interop/xds_interop_server.o: $(GENDIR)/src/proto/grpc/testing/empty.pb.cc $(GENDIR)/src/proto/grpc/testing/empty.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/test.pb.cc $(GENDIR)/src/proto/grpc/testing/test.grpc.pb.cc + + +BORINGSSL_SSL_TEST_SRC = \ + third_party/boringssl-with-bazel/src/crypto/test/abi_test.cc \ + third_party/boringssl-with-bazel/src/crypto/test/gtest_main.cc \ + third_party/boringssl-with-bazel/src/ssl/span_test.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_c_test.c \ + third_party/boringssl-with-bazel/src/ssl/ssl_test.cc \ + +BORINGSSL_SSL_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BORINGSSL_SSL_TEST_SRC)))) + +# boringssl needs an override to ensure that it does not include +# system openssl headers regardless of other configuration +# we do so here with a target specific variable assignment +$(BORINGSSL_SSL_TEST_OBJS): CFLAGS := -Ithird_party/boringssl-with-bazel/src/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI) +$(BORINGSSL_SSL_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl-with-bazel/src/include $(CXXFLAGS) +$(BORINGSSL_SSL_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/boringssl_ssl_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/boringssl_ssl_test: $(PROTOBUF_DEP) $(BORINGSSL_SSL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(BORINGSSL_SSL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/boringssl_ssl_test + +endif + +$(BORINGSSL_SSL_TEST_OBJS): CPPFLAGS += -Ithird_party/boringssl-with-bazel/src/include -fvisibility=hidden -DOPENSSL_NO_ASM -D_GNU_SOURCE -DWIN32_LEAN_AND_MEAN -D_HAS_EXCEPTIONS=0 -DNOMINMAX +$(BORINGSSL_SSL_TEST_OBJS): CXXFLAGS += -fno-exceptions +$(BORINGSSL_SSL_TEST_OBJS): CFLAGS += -g +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/test/abi_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/test/gtest_main.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/ssl/span_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/ssl/ssl_c_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/ssl/ssl_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +deps_boringssl_ssl_test: $(BORINGSSL_SSL_TEST_OBJS:.o=.dep) + +ifneq ($(NO_DEPS),true) +-include $(BORINGSSL_SSL_TEST_OBJS:.o=.dep) +endif + + +BORINGSSL_CRYPTO_TEST_SRC = \ + third_party/boringssl-with-bazel/crypto_test_data.cc \ + third_party/boringssl-with-bazel/src/crypto/abi_self_test.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/asn1_test.cc \ + third_party/boringssl-with-bazel/src/crypto/base64/base64_test.cc \ + third_party/boringssl-with-bazel/src/crypto/bio/bio_test.cc \ + third_party/boringssl-with-bazel/src/crypto/buf/buf_test.cc \ + third_party/boringssl-with-bazel/src/crypto/bytestring/bytestring_test.cc \ + third_party/boringssl-with-bazel/src/crypto/chacha/chacha_test.cc \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/aead_test.cc \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_test.cc \ + third_party/boringssl-with-bazel/src/crypto/cmac/cmac_test.cc \ + third_party/boringssl-with-bazel/src/crypto/compiler_test.cc \ + third_party/boringssl-with-bazel/src/crypto/constant_time_test.cc \ + third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux_test.cc \ + third_party/boringssl-with-bazel/src/crypto/curve25519/ed25519_test.cc \ + third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519_test.cc \ + third_party/boringssl-with-bazel/src/crypto/curve25519/x25519_test.cc \ + third_party/boringssl-with-bazel/src/crypto/dh/dh_test.cc \ + third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_test.cc \ + third_party/boringssl-with-bazel/src/crypto/dsa/dsa_test.cc \ + third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_test.cc \ + third_party/boringssl-with-bazel/src/crypto/err/err_test.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/evp_extra_test.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/evp_test.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/pbkdf_test.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/scrypt_test.cc \ + third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes_test.cc \ + third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bn_test.cc \ + third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_test.cc \ + third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64_test.cc \ + third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa_test.cc \ + third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5_test.cc \ + third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm_test.cc \ + third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/ctrdrbg_test.cc \ + third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect_test.cc \ + third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha_test.cc \ + third_party/boringssl-with-bazel/src/crypto/hkdf/hkdf_test.cc \ + third_party/boringssl-with-bazel/src/crypto/hmac_extra/hmac_test.cc \ + third_party/boringssl-with-bazel/src/crypto/hrss/hrss_test.cc \ + third_party/boringssl-with-bazel/src/crypto/impl_dispatch_test.cc \ + third_party/boringssl-with-bazel/src/crypto/lhash/lhash_test.cc \ + third_party/boringssl-with-bazel/src/crypto/obj/obj_test.cc \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_test.cc \ + third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_test.cc \ + third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs12_test.cc \ + third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_test.cc \ + third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_test.cc \ + third_party/boringssl-with-bazel/src/crypto/pool/pool_test.cc \ + third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_test.cc \ + third_party/boringssl-with-bazel/src/crypto/refcount_test.cc \ + third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_test.cc \ + third_party/boringssl-with-bazel/src/crypto/self_test.cc \ + third_party/boringssl-with-bazel/src/crypto/siphash/siphash_test.cc \ + third_party/boringssl-with-bazel/src/crypto/stack/stack_test.cc \ + third_party/boringssl-with-bazel/src/crypto/test/abi_test.cc \ + third_party/boringssl-with-bazel/src/crypto/test/file_test_gtest.cc \ + third_party/boringssl-with-bazel/src/crypto/test/gtest_main.cc \ + third_party/boringssl-with-bazel/src/crypto/thread_test.cc \ + third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token_test.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_test.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_time_test.cc \ + third_party/boringssl-with-bazel/src/crypto/x509v3/tab_test.cc \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3name_test.cc \ + +BORINGSSL_CRYPTO_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BORINGSSL_CRYPTO_TEST_SRC)))) + +# boringssl needs an override to ensure that it does not include +# system openssl headers regardless of other configuration +# we do so here with a target specific variable assignment +$(BORINGSSL_CRYPTO_TEST_OBJS): CFLAGS := -Ithird_party/boringssl-with-bazel/src/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI) +$(BORINGSSL_CRYPTO_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl-with-bazel/src/include $(CXXFLAGS) +$(BORINGSSL_CRYPTO_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/boringssl_crypto_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/boringssl_crypto_test: $(PROTOBUF_DEP) $(BORINGSSL_CRYPTO_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(BORINGSSL_CRYPTO_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/boringssl_crypto_test + +endif + +$(BORINGSSL_CRYPTO_TEST_OBJS): CPPFLAGS += -Ithird_party/boringssl-with-bazel/src/include -fvisibility=hidden -DOPENSSL_NO_ASM -D_GNU_SOURCE -DWIN32_LEAN_AND_MEAN -D_HAS_EXCEPTIONS=0 -DNOMINMAX +$(BORINGSSL_CRYPTO_TEST_OBJS): CXXFLAGS += -fno-exceptions +$(BORINGSSL_CRYPTO_TEST_OBJS): CFLAGS += -g +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/crypto_test_data.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/abi_self_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/base64/base64_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/bio/bio_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/buf/buf_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/bytestring/bytestring_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/chacha/chacha_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/cipher_extra/aead_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/cmac/cmac_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/compiler_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/constant_time_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/curve25519/ed25519_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/curve25519/x25519_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/dh/dh_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/dsa/dsa_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/err/err_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/evp/evp_extra_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/evp/evp_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/evp/pbkdf_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/evp/scrypt_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bn_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/ctrdrbg_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/hkdf/hkdf_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/hmac_extra/hmac_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/hrss/hrss_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/impl_dispatch_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/lhash/lhash_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/obj/obj_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/pem/pem_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs12_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/pool/pool_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/refcount_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/self_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/siphash/siphash_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/stack/stack_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/test/abi_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/test/file_test_gtest.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/test/gtest_main.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/thread_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/x509/x509_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/x509/x509_time_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/x509v3/tab_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/x509v3/v3name_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +deps_boringssl_crypto_test: $(BORINGSSL_CRYPTO_TEST_OBJS:.o=.dep) + +ifneq ($(NO_DEPS),true) +-include $(BORINGSSL_CRYPTO_TEST_OBJS:.o=.dep) +endif + + +ALTS_CREDENTIALS_FUZZER_ONE_ENTRY_SRC = \ + test/core/security/alts_credentials_fuzzer.cc \ + test/core/util/one_corpus_entry_fuzzer.cc \ + +ALTS_CREDENTIALS_FUZZER_ONE_ENTRY_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(ALTS_CREDENTIALS_FUZZER_ONE_ENTRY_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/alts_credentials_fuzzer_one_entry: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/alts_credentials_fuzzer_one_entry: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/alts_credentials_fuzzer_one_entry: $(PROTOBUF_DEP) $(ALTS_CREDENTIALS_FUZZER_ONE_ENTRY_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(ALTS_CREDENTIALS_FUZZER_ONE_ENTRY_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/alts_credentials_fuzzer_one_entry + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/security/alts_credentials_fuzzer.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/one_corpus_entry_fuzzer.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_alts_credentials_fuzzer_one_entry: $(ALTS_CREDENTIALS_FUZZER_ONE_ENTRY_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(ALTS_CREDENTIALS_FUZZER_ONE_ENTRY_OBJS:.o=.dep) +endif +endif + + +CLIENT_FUZZER_ONE_ENTRY_SRC = \ + test/core/end2end/fuzzers/client_fuzzer.cc \ + test/core/util/one_corpus_entry_fuzzer.cc \ + +CLIENT_FUZZER_ONE_ENTRY_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CLIENT_FUZZER_ONE_ENTRY_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/client_fuzzer_one_entry: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/client_fuzzer_one_entry: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/client_fuzzer_one_entry: $(PROTOBUF_DEP) $(CLIENT_FUZZER_ONE_ENTRY_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(CLIENT_FUZZER_ONE_ENTRY_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/client_fuzzer_one_entry + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/end2end/fuzzers/client_fuzzer.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/one_corpus_entry_fuzzer.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_client_fuzzer_one_entry: $(CLIENT_FUZZER_ONE_ENTRY_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(CLIENT_FUZZER_ONE_ENTRY_OBJS:.o=.dep) +endif +endif + + +HPACK_PARSER_FUZZER_TEST_ONE_ENTRY_SRC = \ + test/core/transport/chttp2/hpack_parser_fuzzer_test.cc \ + test/core/util/one_corpus_entry_fuzzer.cc \ + +HPACK_PARSER_FUZZER_TEST_ONE_ENTRY_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(HPACK_PARSER_FUZZER_TEST_ONE_ENTRY_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/hpack_parser_fuzzer_test_one_entry: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/hpack_parser_fuzzer_test_one_entry: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/hpack_parser_fuzzer_test_one_entry: $(PROTOBUF_DEP) $(HPACK_PARSER_FUZZER_TEST_ONE_ENTRY_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(HPACK_PARSER_FUZZER_TEST_ONE_ENTRY_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/hpack_parser_fuzzer_test_one_entry + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/transport/chttp2/hpack_parser_fuzzer_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/one_corpus_entry_fuzzer.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_hpack_parser_fuzzer_test_one_entry: $(HPACK_PARSER_FUZZER_TEST_ONE_ENTRY_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(HPACK_PARSER_FUZZER_TEST_ONE_ENTRY_OBJS:.o=.dep) +endif +endif + + +HTTP_REQUEST_FUZZER_TEST_ONE_ENTRY_SRC = \ + test/core/http/request_fuzzer.cc \ + test/core/util/one_corpus_entry_fuzzer.cc \ + +HTTP_REQUEST_FUZZER_TEST_ONE_ENTRY_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(HTTP_REQUEST_FUZZER_TEST_ONE_ENTRY_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/http_request_fuzzer_test_one_entry: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/http_request_fuzzer_test_one_entry: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/http_request_fuzzer_test_one_entry: $(PROTOBUF_DEP) $(HTTP_REQUEST_FUZZER_TEST_ONE_ENTRY_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(HTTP_REQUEST_FUZZER_TEST_ONE_ENTRY_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/http_request_fuzzer_test_one_entry + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/http/request_fuzzer.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/one_corpus_entry_fuzzer.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_http_request_fuzzer_test_one_entry: $(HTTP_REQUEST_FUZZER_TEST_ONE_ENTRY_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(HTTP_REQUEST_FUZZER_TEST_ONE_ENTRY_OBJS:.o=.dep) +endif +endif + + +HTTP_RESPONSE_FUZZER_TEST_ONE_ENTRY_SRC = \ + test/core/http/response_fuzzer.cc \ + test/core/util/one_corpus_entry_fuzzer.cc \ + +HTTP_RESPONSE_FUZZER_TEST_ONE_ENTRY_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(HTTP_RESPONSE_FUZZER_TEST_ONE_ENTRY_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/http_response_fuzzer_test_one_entry: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/http_response_fuzzer_test_one_entry: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/http_response_fuzzer_test_one_entry: $(PROTOBUF_DEP) $(HTTP_RESPONSE_FUZZER_TEST_ONE_ENTRY_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(HTTP_RESPONSE_FUZZER_TEST_ONE_ENTRY_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/http_response_fuzzer_test_one_entry + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/http/response_fuzzer.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/one_corpus_entry_fuzzer.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_http_response_fuzzer_test_one_entry: $(HTTP_RESPONSE_FUZZER_TEST_ONE_ENTRY_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(HTTP_RESPONSE_FUZZER_TEST_ONE_ENTRY_OBJS:.o=.dep) +endif +endif + + +JSON_FUZZER_TEST_ONE_ENTRY_SRC = \ + test/core/json/fuzzer.cc \ + test/core/util/one_corpus_entry_fuzzer.cc \ + +JSON_FUZZER_TEST_ONE_ENTRY_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(JSON_FUZZER_TEST_ONE_ENTRY_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/json_fuzzer_test_one_entry: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/json_fuzzer_test_one_entry: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/json_fuzzer_test_one_entry: $(PROTOBUF_DEP) $(JSON_FUZZER_TEST_ONE_ENTRY_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(JSON_FUZZER_TEST_ONE_ENTRY_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/json_fuzzer_test_one_entry + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/json/fuzzer.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/one_corpus_entry_fuzzer.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_json_fuzzer_test_one_entry: $(JSON_FUZZER_TEST_ONE_ENTRY_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(JSON_FUZZER_TEST_ONE_ENTRY_OBJS:.o=.dep) +endif +endif + + +NANOPB_FUZZER_RESPONSE_TEST_ONE_ENTRY_SRC = \ + test/core/nanopb/fuzzer_response.cc \ + test/core/util/one_corpus_entry_fuzzer.cc \ + +NANOPB_FUZZER_RESPONSE_TEST_ONE_ENTRY_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(NANOPB_FUZZER_RESPONSE_TEST_ONE_ENTRY_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/nanopb_fuzzer_response_test_one_entry: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/nanopb_fuzzer_response_test_one_entry: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/nanopb_fuzzer_response_test_one_entry: $(PROTOBUF_DEP) $(NANOPB_FUZZER_RESPONSE_TEST_ONE_ENTRY_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(NANOPB_FUZZER_RESPONSE_TEST_ONE_ENTRY_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/nanopb_fuzzer_response_test_one_entry + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/nanopb/fuzzer_response.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/one_corpus_entry_fuzzer.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_nanopb_fuzzer_response_test_one_entry: $(NANOPB_FUZZER_RESPONSE_TEST_ONE_ENTRY_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(NANOPB_FUZZER_RESPONSE_TEST_ONE_ENTRY_OBJS:.o=.dep) +endif +endif + + +NANOPB_FUZZER_SERVERLIST_TEST_ONE_ENTRY_SRC = \ + test/core/nanopb/fuzzer_serverlist.cc \ + test/core/util/one_corpus_entry_fuzzer.cc \ + +NANOPB_FUZZER_SERVERLIST_TEST_ONE_ENTRY_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(NANOPB_FUZZER_SERVERLIST_TEST_ONE_ENTRY_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/nanopb_fuzzer_serverlist_test_one_entry: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/nanopb_fuzzer_serverlist_test_one_entry: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/nanopb_fuzzer_serverlist_test_one_entry: $(PROTOBUF_DEP) $(NANOPB_FUZZER_SERVERLIST_TEST_ONE_ENTRY_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(NANOPB_FUZZER_SERVERLIST_TEST_ONE_ENTRY_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/nanopb_fuzzer_serverlist_test_one_entry + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/nanopb/fuzzer_serverlist.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/one_corpus_entry_fuzzer.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_nanopb_fuzzer_serverlist_test_one_entry: $(NANOPB_FUZZER_SERVERLIST_TEST_ONE_ENTRY_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(NANOPB_FUZZER_SERVERLIST_TEST_ONE_ENTRY_OBJS:.o=.dep) +endif +endif + + +PERCENT_DECODE_FUZZER_ONE_ENTRY_SRC = \ + test/core/slice/percent_decode_fuzzer.cc \ + test/core/util/one_corpus_entry_fuzzer.cc \ + +PERCENT_DECODE_FUZZER_ONE_ENTRY_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(PERCENT_DECODE_FUZZER_ONE_ENTRY_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/percent_decode_fuzzer_one_entry: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/percent_decode_fuzzer_one_entry: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/percent_decode_fuzzer_one_entry: $(PROTOBUF_DEP) $(PERCENT_DECODE_FUZZER_ONE_ENTRY_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(PERCENT_DECODE_FUZZER_ONE_ENTRY_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/percent_decode_fuzzer_one_entry + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/slice/percent_decode_fuzzer.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/one_corpus_entry_fuzzer.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_percent_decode_fuzzer_one_entry: $(PERCENT_DECODE_FUZZER_ONE_ENTRY_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(PERCENT_DECODE_FUZZER_ONE_ENTRY_OBJS:.o=.dep) +endif +endif + + +PERCENT_ENCODE_FUZZER_ONE_ENTRY_SRC = \ + test/core/slice/percent_encode_fuzzer.cc \ + test/core/util/one_corpus_entry_fuzzer.cc \ + +PERCENT_ENCODE_FUZZER_ONE_ENTRY_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(PERCENT_ENCODE_FUZZER_ONE_ENTRY_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/percent_encode_fuzzer_one_entry: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/percent_encode_fuzzer_one_entry: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/percent_encode_fuzzer_one_entry: $(PROTOBUF_DEP) $(PERCENT_ENCODE_FUZZER_ONE_ENTRY_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(PERCENT_ENCODE_FUZZER_ONE_ENTRY_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/percent_encode_fuzzer_one_entry + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/slice/percent_encode_fuzzer.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/one_corpus_entry_fuzzer.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_percent_encode_fuzzer_one_entry: $(PERCENT_ENCODE_FUZZER_ONE_ENTRY_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(PERCENT_ENCODE_FUZZER_ONE_ENTRY_OBJS:.o=.dep) +endif +endif + + +SERVER_FUZZER_ONE_ENTRY_SRC = \ + test/core/end2end/fuzzers/server_fuzzer.cc \ + test/core/util/one_corpus_entry_fuzzer.cc \ + +SERVER_FUZZER_ONE_ENTRY_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(SERVER_FUZZER_ONE_ENTRY_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/server_fuzzer_one_entry: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/server_fuzzer_one_entry: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/server_fuzzer_one_entry: $(PROTOBUF_DEP) $(SERVER_FUZZER_ONE_ENTRY_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(SERVER_FUZZER_ONE_ENTRY_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/server_fuzzer_one_entry + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/end2end/fuzzers/server_fuzzer.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/one_corpus_entry_fuzzer.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_server_fuzzer_one_entry: $(SERVER_FUZZER_ONE_ENTRY_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(SERVER_FUZZER_ONE_ENTRY_OBJS:.o=.dep) +endif +endif + + +SSL_SERVER_FUZZER_ONE_ENTRY_SRC = \ + test/core/security/ssl_server_fuzzer.cc \ + test/core/util/one_corpus_entry_fuzzer.cc \ + +SSL_SERVER_FUZZER_ONE_ENTRY_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(SSL_SERVER_FUZZER_ONE_ENTRY_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/ssl_server_fuzzer_one_entry: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/ssl_server_fuzzer_one_entry: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/ssl_server_fuzzer_one_entry: $(PROTOBUF_DEP) $(SSL_SERVER_FUZZER_ONE_ENTRY_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(SSL_SERVER_FUZZER_ONE_ENTRY_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/ssl_server_fuzzer_one_entry + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/security/ssl_server_fuzzer.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/one_corpus_entry_fuzzer.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_ssl_server_fuzzer_one_entry: $(SSL_SERVER_FUZZER_ONE_ENTRY_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(SSL_SERVER_FUZZER_ONE_ENTRY_OBJS:.o=.dep) +endif +endif + + +URI_FUZZER_TEST_ONE_ENTRY_SRC = \ + test/core/client_channel/uri_fuzzer_test.cc \ + test/core/util/one_corpus_entry_fuzzer.cc \ + +URI_FUZZER_TEST_ONE_ENTRY_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(URI_FUZZER_TEST_ONE_ENTRY_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/uri_fuzzer_test_one_entry: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/uri_fuzzer_test_one_entry: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/uri_fuzzer_test_one_entry: $(PROTOBUF_DEP) $(URI_FUZZER_TEST_ONE_ENTRY_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(URI_FUZZER_TEST_ONE_ENTRY_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/uri_fuzzer_test_one_entry + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/client_channel/uri_fuzzer_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +$(OBJDIR)/$(CONFIG)/test/core/util/one_corpus_entry_fuzzer.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + +deps_uri_fuzzer_test_one_entry: $(URI_FUZZER_TEST_ONE_ENTRY_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(URI_FUZZER_TEST_ONE_ENTRY_OBJS:.o=.dep) +endif +endif + + + + + + +ifneq ($(OPENSSL_DEP),) +# This is to ensure the embedded OpenSSL is built beforehand, properly +# installing headers to their final destination on the drive. We need this +# otherwise parallel compilation will fail if a source is compiled first. +src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc: $(OPENSSL_DEP) +src/core/ext/filters/client_channel/xds/xds_channel_secure.cc: $(OPENSSL_DEP) +src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc: $(OPENSSL_DEP) +src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc: $(OPENSSL_DEP) +src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c: $(OPENSSL_DEP) +src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c: $(OPENSSL_DEP) +src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c: $(OPENSSL_DEP) +src/core/lib/http/httpcli_security_connector.cc: $(OPENSSL_DEP) +src/core/lib/security/context/security_context.cc: $(OPENSSL_DEP) +src/core/lib/security/credentials/alts/alts_credentials.cc: $(OPENSSL_DEP) +src/core/lib/security/credentials/alts/check_gcp_environment.cc: $(OPENSSL_DEP) +src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc: $(OPENSSL_DEP) +src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc: $(OPENSSL_DEP) +src/core/lib/security/credentials/alts/check_gcp_environment_windows.cc: $(OPENSSL_DEP) +src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc: $(OPENSSL_DEP) +src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc: $(OPENSSL_DEP) +src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc: $(OPENSSL_DEP) +src/core/lib/security/credentials/composite/composite_credentials.cc: $(OPENSSL_DEP) +src/core/lib/security/credentials/credentials.cc: $(OPENSSL_DEP) +src/core/lib/security/credentials/credentials_metadata.cc: $(OPENSSL_DEP) +src/core/lib/security/credentials/fake/fake_credentials.cc: $(OPENSSL_DEP) +src/core/lib/security/credentials/google_default/credentials_generic.cc: $(OPENSSL_DEP) +src/core/lib/security/credentials/google_default/google_default_credentials.cc: $(OPENSSL_DEP) +src/core/lib/security/credentials/iam/iam_credentials.cc: $(OPENSSL_DEP) +src/core/lib/security/credentials/jwt/json_token.cc: $(OPENSSL_DEP) +src/core/lib/security/credentials/jwt/jwt_credentials.cc: $(OPENSSL_DEP) +src/core/lib/security/credentials/jwt/jwt_verifier.cc: $(OPENSSL_DEP) +src/core/lib/security/credentials/local/local_credentials.cc: $(OPENSSL_DEP) +src/core/lib/security/credentials/oauth2/oauth2_credentials.cc: $(OPENSSL_DEP) +src/core/lib/security/credentials/plugin/plugin_credentials.cc: $(OPENSSL_DEP) +src/core/lib/security/credentials/ssl/ssl_credentials.cc: $(OPENSSL_DEP) +src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc: $(OPENSSL_DEP) +src/core/lib/security/credentials/tls/tls_credentials.cc: $(OPENSSL_DEP) +src/core/lib/security/security_connector/alts/alts_security_connector.cc: $(OPENSSL_DEP) +src/core/lib/security/security_connector/fake/fake_security_connector.cc: $(OPENSSL_DEP) +src/core/lib/security/security_connector/load_system_roots_fallback.cc: $(OPENSSL_DEP) +src/core/lib/security/security_connector/load_system_roots_linux.cc: $(OPENSSL_DEP) +src/core/lib/security/security_connector/local/local_security_connector.cc: $(OPENSSL_DEP) +src/core/lib/security/security_connector/security_connector.cc: $(OPENSSL_DEP) +src/core/lib/security/security_connector/ssl/ssl_security_connector.cc: $(OPENSSL_DEP) +src/core/lib/security/security_connector/ssl_utils.cc: $(OPENSSL_DEP) +src/core/lib/security/security_connector/ssl_utils_config.cc: $(OPENSSL_DEP) +src/core/lib/security/security_connector/tls/tls_security_connector.cc: $(OPENSSL_DEP) +src/core/lib/security/transport/client_auth_filter.cc: $(OPENSSL_DEP) +src/core/lib/security/transport/secure_endpoint.cc: $(OPENSSL_DEP) +src/core/lib/security/transport/security_handshaker.cc: $(OPENSSL_DEP) +src/core/lib/security/transport/server_auth_filter.cc: $(OPENSSL_DEP) +src/core/lib/security/transport/target_authority_table.cc: $(OPENSSL_DEP) +src/core/lib/security/transport/tsi_error.cc: $(OPENSSL_DEP) +src/core/lib/security/util/json_util.cc: $(OPENSSL_DEP) +src/core/lib/surface/init_secure.cc: $(OPENSSL_DEP) +src/core/plugin_registry/grpc_plugin_registry.cc: $(OPENSSL_DEP) +src/core/tsi/alts/crypt/aes_gcm.cc: $(OPENSSL_DEP) +src/core/tsi/alts/crypt/gsec.cc: $(OPENSSL_DEP) +src/core/tsi/alts/frame_protector/alts_counter.cc: $(OPENSSL_DEP) +src/core/tsi/alts/frame_protector/alts_crypter.cc: $(OPENSSL_DEP) +src/core/tsi/alts/frame_protector/alts_frame_protector.cc: $(OPENSSL_DEP) +src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.cc: $(OPENSSL_DEP) +src/core/tsi/alts/frame_protector/alts_seal_privacy_integrity_crypter.cc: $(OPENSSL_DEP) +src/core/tsi/alts/frame_protector/alts_unseal_privacy_integrity_crypter.cc: $(OPENSSL_DEP) +src/core/tsi/alts/frame_protector/frame_handler.cc: $(OPENSSL_DEP) +src/core/tsi/alts/handshaker/alts_handshaker_client.cc: $(OPENSSL_DEP) +src/core/tsi/alts/handshaker/alts_shared_resource.cc: $(OPENSSL_DEP) +src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc: $(OPENSSL_DEP) +src/core/tsi/alts/handshaker/alts_tsi_utils.cc: $(OPENSSL_DEP) +src/core/tsi/alts/handshaker/transport_security_common_api.cc: $(OPENSSL_DEP) +src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc: $(OPENSSL_DEP) +src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc: $(OPENSSL_DEP) +src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc: $(OPENSSL_DEP) +src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc: $(OPENSSL_DEP) +src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc: $(OPENSSL_DEP) +src/core/tsi/fake_transport_security.cc: $(OPENSSL_DEP) +src/core/tsi/local_transport_security.cc: $(OPENSSL_DEP) +src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc: $(OPENSSL_DEP) +src/core/tsi/ssl/session_cache/ssl_session_cache.cc: $(OPENSSL_DEP) +src/core/tsi/ssl/session_cache/ssl_session_openssl.cc: $(OPENSSL_DEP) +src/core/tsi/ssl_transport_security.cc: $(OPENSSL_DEP) +src/core/tsi/transport_security.cc: $(OPENSSL_DEP) +src/core/tsi/transport_security_grpc.cc: $(OPENSSL_DEP) +src/cpp/client/channel_test_peer.cc: $(OPENSSL_DEP) +src/cpp/client/secure_credentials.cc: $(OPENSSL_DEP) +src/cpp/common/alts_context.cc: $(OPENSSL_DEP) +src/cpp/common/alts_util.cc: $(OPENSSL_DEP) +src/cpp/common/auth_property_iterator.cc: $(OPENSSL_DEP) +src/cpp/common/secure_auth_context.cc: $(OPENSSL_DEP) +src/cpp/common/secure_channel_arguments.cc: $(OPENSSL_DEP) +src/cpp/common/secure_create_auth_context.cc: $(OPENSSL_DEP) +src/cpp/common/tls_credentials_options.cc: $(OPENSSL_DEP) +src/cpp/common/tls_credentials_options_util.cc: $(OPENSSL_DEP) +src/cpp/ext/proto_server_reflection.cc: $(OPENSSL_DEP) +src/cpp/ext/proto_server_reflection_plugin.cc: $(OPENSSL_DEP) +src/cpp/server/channelz/channelz_service.cc: $(OPENSSL_DEP) +src/cpp/server/channelz/channelz_service_plugin.cc: $(OPENSSL_DEP) +src/cpp/server/secure_server_credentials.cc: $(OPENSSL_DEP) +src/cpp/util/error_details.cc: $(OPENSSL_DEP) +src/csharp/ext/grpc_csharp_ext.c: $(OPENSSL_DEP) +test/core/end2end/end2end_tests.cc: $(OPENSSL_DEP) +test/core/end2end/tests/call_creds.cc: $(OPENSSL_DEP) +test/cpp/microbenchmarks/helpers.cc: $(OPENSSL_DEP) +test/cpp/util/byte_buffer_proto_helper.cc: $(OPENSSL_DEP) +test/cpp/util/create_test_channel.cc: $(OPENSSL_DEP) +test/cpp/util/string_ref_helper.cc: $(OPENSSL_DEP) +test/cpp/util/subprocess.cc: $(OPENSSL_DEP) +test/cpp/util/test_config_cc.cc: $(OPENSSL_DEP) +test/cpp/util/test_credentials_provider.cc: $(OPENSSL_DEP) +endif + +.PHONY: all strip tools dep_error openssl_dep_error openssl_dep_message git_update stop buildtests buildtests_c buildtests_cxx test test_c test_cxx install install_c install_cxx install-headers install-headers_c install-headers_cxx install-shared install-shared_c install-shared_cxx install-static install-static_c install-static_cxx strip strip-shared strip-static strip_c strip-shared_c strip-static_c strip_cxx strip-shared_cxx strip-static_cxx dep_c dep_cxx bins_dep_c bins_dep_cxx clean + +.PHONY: printvars +printvars: + @$(foreach V,$(sort $(.VARIABLES)), $(if $(filter-out environment% default automatic, $(origin $V)),$(warning $V=$($V) ($(value $V))))) diff --git a/NOTICE.txt b/NOTICE.txt new file mode 100644 index 00000000..53019774 --- /dev/null +++ b/NOTICE.txt @@ -0,0 +1,13 @@ +Copyright 2014 gRPC authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/OWNERS b/OWNERS new file mode 100644 index 00000000..9d1f63f8 --- /dev/null +++ b/OWNERS @@ -0,0 +1,5 @@ +# Top level ownership +@markdroth **/OWNERS +@nicolasnoble **/OWNERS +@a11r **/OWNERS + diff --git a/PYTHON-MANIFEST.in b/PYTHON-MANIFEST.in new file mode 100644 index 00000000..b63748b1 --- /dev/null +++ b/PYTHON-MANIFEST.in @@ -0,0 +1,24 @@ +recursive-include src/python/grpcio/grpc *.c *.h *.inc *.py *.pyx *.pxd *.pxi *.python *.pem +recursive-exclude src/python/grpcio/grpc/_cython *.so *.pyd +graft src/python/grpcio/grpcio.egg-info +graft src/core +graft src/boringssl +graft include/grpc +graft third_party/abseil-cpp/absl +graft third_party/address_sorting +graft third_party/boringssl-with-bazel +graft third_party/cares +graft third_party/upb +graft third_party/zlib +include src/python/grpcio/_parallel_compile_patch.py +include src/python/grpcio/_spawn_patch.py +include src/python/grpcio/commands.py +include src/python/grpcio/grpc_version.py +include src/python/grpcio/grpc_core_dependencies.py +include src/python/grpcio/precompiled.py +include src/python/grpcio/support.py +include src/python/grpcio/README.rst +include requirements.txt +include etc/roots.pem +include Makefile +include LICENSE diff --git a/README.md b/README.md new file mode 100644 index 00000000..a392de0e --- /dev/null +++ b/README.md @@ -0,0 +1,87 @@ +gRPC - An RPC library and framework +=================================== + +gRPC is a modern, open source, high-performance remote procedure call (RPC) framework that can run anywhere. gRPC enables client and server applications to communicate transparently, and simplifies the building of connected systems. + + + + + + + + + + +
Homepage:grpc.io
Mailing List:grpc-io@googlegroups.com
+ +[![Join the chat at https://gitter.im/grpc/grpc](https://badges.gitter.im/grpc/grpc.svg)](https://gitter.im/grpc/grpc?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) + +# To start using gRPC + +To maximize usability, gRPC supports the standard method for adding dependencies to a user's chosen language (if there is one). +In most languages, the gRPC runtime comes as a package available in a user's language package manager. + +For instructions on how to use the language-specific gRPC runtime for a project, please refer to these documents + + * [C++](src/cpp): follow the instructions under the `src/cpp` directory + * [C#](src/csharp): NuGet package `Grpc` + * [Dart](https://github.com/grpc/grpc-dart): pub package `grpc` + * [Go](https://github.com/grpc/grpc-go): `go get google.golang.org/grpc` + * [Java](https://github.com/grpc/grpc-java): Use JARs from Maven Central Repository + * [Kotlin](https://github.com/grpc/grpc-kotlin): Use JARs from Maven Central Repository + * [Node](https://github.com/grpc/grpc-node): `npm install grpc` + * [Objective-C](src/objective-c): Add `gRPC-ProtoRPC` dependency to podspec + * [PHP](src/php): `pecl install grpc` + * [Python](src/python/grpcio): `pip install grpcio` + * [Ruby](src/ruby): `gem install grpc` + * [WebJS](https://github.com/grpc/grpc-web): follow the grpc-web instructions + +Per-language quickstart guides and tutorials can be found in the [documentation section on the grpc.io website](https://grpc.io/docs/). Code examples are available in the [examples](examples) directory. + +Precompiled bleeding-edge package builds of gRPC `master` branch's `HEAD` are uploaded daily to [packages.grpc.io](https://packages.grpc.io). + +# To start developing gRPC + +Contributions are welcome! + +Please read [How to contribute](CONTRIBUTING.md) which will guide you through the entire workflow of how to build the source code, how to run the tests, and how to contribute changes to +the gRPC codebase. +The "How to contribute" document also contains info on how the contribution process works and contains best practices for creating contributions. + +# Troubleshooting + +Sometimes things go wrong. Please check out the [Troubleshooting guide](TROUBLESHOOTING.md) if you are experiencing issues with gRPC. + +# Performance + +See the [Performance dashboard](https://performance-dot-grpc-testing.appspot.com/explore?dashboard=5652536396611584) for performance numbers of master branch daily builds. + +# Concepts + +See [gRPC Concepts](CONCEPTS.md) + +# About This Repository + +This repository contains source code for gRPC libraries implemented in multiple languages written on top of a shared C core library [src/core](src/core). + +Libraries in different languages may be in various states of development. We are seeking contributions for all of these libraries: + +| Language | Source | +|-------------------------|-------------------------------------| +| Shared C [core library] | [src/core](src/core) | +| C++ | [src/cpp](src/cpp) | +| Ruby | [src/ruby](src/ruby) | +| Python | [src/python](src/python) | +| PHP | [src/php](src/php) | +| C# (core library based) | [src/csharp](src/csharp) | +| Objective-C | [src/objective-c](src/objective-c) | + +| Language | Source repo | +|-------------------------|------------------------------------------------------| +| Java | [grpc-java](https://github.com/grpc/grpc-java) | +| Kotlin | [grpc-kotlin](https://github.com/grpc/grpc-kotlin) | +| Go | [grpc-go](https://github.com/grpc/grpc-go) | +| NodeJS | [grpc-node](https://github.com/grpc/grpc-node) | +| WebJS | [grpc-web](https://github.com/grpc/grpc-web) | +| Dart | [grpc-dart](https://github.com/grpc/grpc-dart) | +| .NET (pure C# impl.) | [grpc-dotnet](https://github.com/grpc/grpc-dotnet) | diff --git a/Rakefile b/Rakefile new file mode 100755 index 00000000..a488eb03 --- /dev/null +++ b/Rakefile @@ -0,0 +1,163 @@ +# -*- ruby -*- +require 'rake/extensiontask' +require 'rspec/core/rake_task' +require 'rubocop/rake_task' +require 'bundler/gem_tasks' +require 'fileutils' + +require_relative 'build_config.rb' + +# Add rubocop style checking tasks +RuboCop::RakeTask.new(:rubocop) do |task| + task.options = ['-c', 'src/ruby/.rubocop.yml'] + # add end2end tests to formatter but don't add generated proto _pb.rb's + task.patterns = ['src/ruby/{lib,spec}/**/*.rb', 'src/ruby/end2end/*.rb'] +end + +spec = Gem::Specification.load('grpc.gemspec') + +Gem::PackageTask.new(spec) do |pkg| +end + +# Add the extension compiler task +Rake::ExtensionTask.new('grpc_c', spec) do |ext| + unless RUBY_PLATFORM =~ /darwin/ + # TODO: also set "no_native to true" for mac if possible. As is, + # "no_native" can only be set if the RUBY_PLATFORM doing + # cross-compilation is contained in the "ext.cross_platform" array. + ext.no_native = true + end + ext.source_pattern = '**/*.{c,h}' + ext.ext_dir = File.join('src', 'ruby', 'ext', 'grpc') + ext.lib_dir = File.join('src', 'ruby', 'lib', 'grpc') + ext.cross_compile = true + ext.cross_platform = [ + 'x86-mingw32', 'x64-mingw32', + 'x86_64-linux', 'x86-linux', + 'universal-darwin' + ] + ext.cross_compiling do |spec| + spec.files = %w( etc/roots.pem grpc_c.32.ruby grpc_c.64.ruby ) + spec.files += Dir.glob('src/ruby/bin/**/*') + spec.files += Dir.glob('src/ruby/ext/**/*') + spec.files += Dir.glob('src/ruby/lib/**/*') + spec.files += Dir.glob('src/ruby/pb/**/*') + end +end + +# Define the test suites +SPEC_SUITES = [ + { id: :wrapper, title: 'wrapper layer', files: %w(src/ruby/spec/*.rb) }, + { id: :idiomatic, title: 'idiomatic layer', dir: %w(src/ruby/spec/generic), + tags: ['~bidi', '~server'] }, + { id: :bidi, title: 'bidi tests', dir: %w(src/ruby/spec/generic), + tag: 'bidi' }, + { id: :server, title: 'rpc server thread tests', dir: %w(src/ruby/spec/generic), + tag: 'server' }, + { id: :pb, title: 'protobuf service tests', dir: %w(src/ruby/spec/pb) } +] +namespace :suite do + SPEC_SUITES.each do |suite| + desc "Run all specs in the #{suite[:title]} spec suite" + RSpec::Core::RakeTask.new(suite[:id]) do |t| + ENV['COVERAGE_NAME'] = suite[:id].to_s + spec_files = [] + suite[:files].each { |f| spec_files += Dir[f] } if suite[:files] + + if suite[:dir] + suite[:dir].each { |f| spec_files += Dir["#{f}/**/*_spec.rb"] } + end + helper = 'src/ruby/spec/spec_helper.rb' + spec_files << helper unless spec_files.include?(helper) + + t.pattern = spec_files + t.rspec_opts = "--tag #{suite[:tag]}" if suite[:tag] + if suite[:tags] + t.rspec_opts = suite[:tags].map { |x| "--tag #{x}" }.join(' ') + end + end + end +end + +desc 'Build the Windows gRPC DLLs for Ruby' +task 'dlls' do + require 'rake_compiler_dock' + + grpc_config = ENV['GRPC_CONFIG'] || 'opt' + verbose = ENV['V'] || '0' + + env = 'CPPFLAGS="-D_WIN32_WINNT=0x600 -DNTDDI_VERSION=0x06000000 -DUNICODE -D_UNICODE -Wno-unused-variable -Wno-unused-result -DCARES_STATICLIB -Wno-error=conversion -Wno-sign-compare -Wno-parentheses -Wno-format -DWIN32_LEAN_AND_MEAN" ' + env += 'CFLAGS="-Wno-incompatible-pointer-types" ' + env += 'CXXFLAGS="-std=c++11 -fno-exceptions" ' + env += 'LDFLAGS=-static ' + env += 'SYSTEM=MINGW32 ' + env += 'EMBED_ZLIB=true ' + env += 'EMBED_OPENSSL=true ' + env += 'EMBED_CARES=true ' + env += 'BUILDDIR=/tmp ' + env += "V=#{verbose} " + out = GrpcBuildConfig::CORE_WINDOWS_DLL + + w64 = { cross: 'x86_64-w64-mingw32', out: 'grpc_c.64.ruby', platform: 'x64-mingw32' } + w32 = { cross: 'i686-w64-mingw32', out: 'grpc_c.32.ruby', platform: 'x86-mingw32' } + + [ w64, w32 ].each do |opt| + env_comp = "CC=#{opt[:cross]}-gcc " + env_comp += "CXX=#{opt[:cross]}-g++ " + env_comp += "LD=#{opt[:cross]}-gcc " + env_comp += "LDXX=#{opt[:cross]}-g++ " + RakeCompilerDock.sh <<-EOT, platform: opt[:platform] + gem update --system --no-document && \ + #{env} #{env_comp} make -j`nproc` #{out} && \ + #{opt[:cross]}-strip -x -S #{out} && \ + cp #{out} #{opt[:out]} + EOT + end + +end + +desc 'Build the native gem file under rake_compiler_dock' +task 'gem:native' do + verbose = ENV['V'] || '0' + + grpc_config = ENV['GRPC_CONFIG'] || 'opt' + + if RUBY_PLATFORM =~ /darwin/ + FileUtils.touch 'grpc_c.32.ruby' + FileUtils.touch 'grpc_c.64.ruby' + unless '2.5' == /(\d+\.\d+)/.match(RUBY_VERSION).to_s + fail "rake gem:native (the rake task to build the binary packages) is being " \ + "invoked on macos with ruby #{RUBY_VERSION}. The ruby macos artifact " \ + "build should be running on ruby 2.5." + end + system "rake cross native gem RUBY_CC_VERSION=2.7.0:2.6.0:2.5.0:2.4.0:2.3.0 V=#{verbose} GRPC_CONFIG=#{grpc_config}" + else + require 'rake_compiler_dock' + + Rake::Task['dlls'].execute + ['x86-mingw32', 'x64-mingw32', 'x86_64-linux', 'x86-linux'].each do |plat| + RakeCompilerDock.sh <<-EOT, platform: plat + # Avoid conflicting declarations of gettimeofday: https://github.com/rake-compiler/rake-compiler-dock/issues/32 + find /usr/local/rake-compiler -name win32.h | while read f ; do sudo sed -i 's/gettimeofday/rb_gettimeofday/' $f ; done && \ + + gem update --system --no-document && \ + bundle && \ + rake native:#{plat} pkg/#{spec.full_name}-#{plat}.gem pkg/#{spec.full_name}.gem \ + RUBY_CC_VERSION=2.7.0:2.6.0:2.5.0:2.4.0:2.3.0 \ + V=#{verbose} \ + GRPC_CONFIG=#{grpc_config} + EOT + end + end +end + +# Define dependencies between the suites. +task 'suite:wrapper' => [:compile, :rubocop] +task 'suite:idiomatic' => 'suite:wrapper' +task 'suite:bidi' => 'suite:wrapper' +task 'suite:server' => 'suite:wrapper' +task 'suite:pb' => 'suite:server' + +desc 'Compiles the gRPC extension then runs all the tests' +task all: ['suite:idiomatic', 'suite:bidi', 'suite:pb', 'suite:server'] +task default: :all diff --git a/TROUBLESHOOTING.md b/TROUBLESHOOTING.md new file mode 100644 index 00000000..6ef48015 --- /dev/null +++ b/TROUBLESHOOTING.md @@ -0,0 +1,43 @@ +# Troubleshooting gRPC + +This guide is for troubleshooting gRPC implementations based on C core library (sources for most of them are living in the `grpc/grpc` repository). + +## Enabling extra logging and tracing + +Extra logging can be very useful for diagnosing problems. All gRPC implementations based on C core library support +the `GRPC_VERBOSITY` and `GRPC_TRACE` environment variables that can be used to increase the amount of information +that gets printed to stderr. + +## GRPC_VERBOSITY + +`GRPC_VERBOSITY` is used to set the minimum level of log messages printed by gRPC (supported values are `DEBUG`, `INFO` and `ERROR`). If this environment variable is unset, only `ERROR` logs will be printed. + +## GRPC_TRACE + +`GRPC_TRACE` can be used to enable extra logging for some internal gRPC components. Enabling the right traces can be invaluable +for diagnosing for what is going wrong when things aren't working as intended. Possible values for `GRPC_TRACE` are listed in [Environment Variables Overview](doc/environment_variables.md). +Multiple traces can be enable at once (use comma as separator). + +``` +# Enable debug logs for an application +GRPC_VERBOSITY=debug ./helloworld_application_using_grpc +``` + +``` +# Print information about invocations of low-level C core API. +# Note that trace logs of log level DEBUG won't be displayed. +# Also note that most tracers user log level INFO, so without setting +# GPRC_VERBOSITY accordingly, no traces will be printed. +GRPC_VERBOSITY=info GRPC_TRACE=api ./helloworld_application_using_grpc +``` + +``` +# Print info from 3 different tracers, including tracing logs with log level DEBUG +GRPC_VERBOSITY=debug GRPC_TRACE=tcp,http,api ./helloworld_application_using_grpc +``` + +Known limitations: `GPRC_TRACE=tcp` is currently not implemented for Windows (you won't see any tcp traces). + +Please note that the `GRPC_TRACE` environment variable has nothing to do with gRPC's "tracing" feature (= tracing RPCs in +microservice environment to gain insight about how requests are processed by deployment), it is merely used to enable printing +of extra logs. diff --git a/WORKSPACE b/WORKSPACE new file mode 100644 index 00000000..c3aa3b2a --- /dev/null +++ b/WORKSPACE @@ -0,0 +1,77 @@ +workspace(name = "com_github_grpc_grpc") + +load("//bazel:grpc_deps.bzl", "grpc_deps", "grpc_test_only_deps") + +grpc_deps() + +grpc_test_only_deps() + +load("//bazel:grpc_extra_deps.bzl", "grpc_extra_deps") + +grpc_extra_deps() + +register_execution_platforms( + "//third_party/toolchains:rbe_windows", +) + +register_toolchains( + "//third_party/toolchains/bazel_0.26.0_rbe_windows:cc-toolchain-x64_windows", +) + +load("@bazel_toolchains//rules/exec_properties:exec_properties.bzl", "create_exec_properties_dict", "custom_exec_properties") + +custom_exec_properties( + name = "grpc_custom_exec_properties", + constants = { + "LARGE_MACHINE": create_exec_properties_dict(gce_machine_type = "n1-standard-8"), + }, +) + +load("@bazel_toolchains//rules:rbe_repo.bzl", "rbe_autoconfig") + +# Create toolchain configuration for remote execution. +rbe_autoconfig( + name = "rbe_default", + exec_properties = create_exec_properties_dict( + docker_add_capabilities = "SYS_PTRACE", + docker_privileged = True, + # n1-highmem-2 is the default (small machine) machine type. Targets + # that want to use other machines (such as LARGE_MACHINE) will override + # this value. + gce_machine_type = "n1-highmem-2", + # WARNING: the os_family constraint has only been introduced recently + # and older release branches select workers solely based on gce_machine_type. + # Worker pools needs to be configured with care to avoid accidentally running + # linux jobs on windows pool and vice versa (which would lead to a test breakage) + os_family = "Linux", + ), + # use exec_properties instead of deprecated remote_execution_properties + use_legacy_platform_definition = False, +) + +load("@bazel_toolchains//rules:environments.bzl", "clang_env") +load("@bazel_skylib//lib:dicts.bzl", "dicts") + +# Create msan toolchain configuration for remote execution. +rbe_autoconfig( + name = "rbe_msan", + env = dicts.add( + clang_env(), + { + "BAZEL_LINKOPTS": "-lc++:-lc++abi:-lm", + }, + ), +) + +load("@io_bazel_rules_python//python:pip.bzl", "pip_import", "pip_repositories") + +pip_import( + name = "grpc_python_dependencies", + requirements = "@com_github_grpc_grpc//:requirements.bazel.txt", +) + +load("@grpc_python_dependencies//:requirements.bzl", "pip_install") + +pip_repositories() + +pip_install() diff --git a/bazel/BUILD b/bazel/BUILD new file mode 100644 index 00000000..c3c82c9c --- /dev/null +++ b/bazel/BUILD @@ -0,0 +1,19 @@ +# Copyright 2017 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +licenses(["notice"]) # Apache v2 + +package(default_visibility = ["//:__subpackages__"]) + +load(":cc_grpc_library.bzl", "cc_grpc_library") diff --git a/bazel/OWNERS b/bazel/OWNERS new file mode 100644 index 00000000..b6e63d63 --- /dev/null +++ b/bazel/OWNERS @@ -0,0 +1,6 @@ +set noparent +@nicolasnoble +@jtattermusch +@veblush +@gnossen + diff --git a/bazel/cc_grpc_library.bzl b/bazel/cc_grpc_library.bzl new file mode 100644 index 00000000..7ec1a98e --- /dev/null +++ b/bazel/cc_grpc_library.bzl @@ -0,0 +1,105 @@ +"""Generates and compiles C++ grpc stubs from proto_library rules.""" + +load("@rules_proto//proto:defs.bzl", "proto_library") +load("//bazel:generate_cc.bzl", "generate_cc") +load("//bazel:protobuf.bzl", "well_known_proto_libs") + +def cc_grpc_library( + name, + srcs, + deps, + proto_only = False, + well_known_protos = False, + generate_mocks = False, + use_external = False, + grpc_only = False, + **kwargs): + """Generates C++ grpc classes for services defined in a proto file. + + If grpc_only is True, this rule is compatible with proto_library and + cc_proto_library native rules such that it expects proto_library target + as srcs argument and generates only grpc library classes, expecting + protobuf messages classes library (cc_proto_library target) to be passed in + deps argument. By default grpc_only is False which makes this rule to behave + in a backwards-compatible mode (trying to generate both proto and grpc + classes). + + Assumes the generated classes will be used in cc_api_version = 2. + + Args: + name (str): Name of rule. + srcs (list): A single .proto file which contains services definitions, + or if grpc_only parameter is True, a single proto_library which + contains services descriptors. + deps (list): A list of C++ proto_library (or cc_proto_library) which + provides the compiled code of any message that the services depend on. + proto_only (bool): If True, create only C++ proto classes library, + avoid creating C++ grpc classes library (expect it in deps). + Deprecated, use native cc_proto_library instead. False by default. + well_known_protos (bool): Should this library additionally depend on + well known protos. Deprecated, the well known protos should be + specified as explicit dependencies of the proto_library target + (passed in srcs parameter) instead. False by default. + generate_mocks (bool): when True, Google Mock code for client stub is + generated. False by default. + use_external (bool): Not used. + grpc_only (bool): if True, generate only grpc library, expecting + protobuf messages library (cc_proto_library target) to be passed as + deps. False by default (will become True by default eventually). + **kwargs: rest of arguments, e.g., compatible_with and visibility + """ + if len(srcs) > 1: + fail("Only one srcs value supported", "srcs") + if grpc_only and proto_only: + fail("A mutualy exclusive configuration is specified: grpc_only = True and proto_only = True") + + extra_deps = [] + proto_targets = [] + + if not grpc_only: + proto_target = "_" + name + "_only" + cc_proto_target = name if proto_only else "_" + name + "_cc_proto" + + proto_deps = ["_" + dep + "_only" for dep in deps if dep.find(":") == -1] + proto_deps += [dep.split(":")[0] + ":" + "_" + dep.split(":")[1] + "_only" for dep in deps if dep.find(":") != -1] + if well_known_protos: + proto_deps += well_known_proto_libs() + proto_library( + name = proto_target, + srcs = srcs, + deps = proto_deps, + **kwargs + ) + + native.cc_proto_library( + name = cc_proto_target, + deps = [":" + proto_target], + **kwargs + ) + extra_deps.append(":" + cc_proto_target) + proto_targets.append(proto_target) + else: + if not srcs: + fail("srcs cannot be empty", "srcs") + proto_targets += srcs + + if not proto_only: + codegen_grpc_target = "_" + name + "_grpc_codegen" + generate_cc( + name = codegen_grpc_target, + srcs = proto_targets, + plugin = "@com_github_grpc_grpc//src/compiler:grpc_cpp_plugin", + well_known_protos = well_known_protos, + generate_mocks = generate_mocks, + **kwargs + ) + + native.cc_library( + name = name, + srcs = [":" + codegen_grpc_target], + hdrs = [":" + codegen_grpc_target], + deps = deps + + extra_deps + + ["@com_github_grpc_grpc//:grpc++_codegen_proto"], + **kwargs + ) diff --git a/bazel/custom_exec_properties.bzl b/bazel/custom_exec_properties.bzl new file mode 100644 index 00000000..6605f5cc --- /dev/null +++ b/bazel/custom_exec_properties.bzl @@ -0,0 +1,17 @@ +# Copyright 2019 The gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("@grpc_custom_exec_properties//:constants.bzl", _LARGE_MACHINE = "LARGE_MACHINE") + +LARGE_MACHINE = _LARGE_MACHINE diff --git a/bazel/cython_library.bzl b/bazel/cython_library.bzl new file mode 100644 index 00000000..c9f86423 --- /dev/null +++ b/bazel/cython_library.bzl @@ -0,0 +1,77 @@ +"""Custom rules for gRPC Python""" + +# Adapted with modifications from +# tensorflow/tensorflow/core/platform/default/build_config.bzl +# Native Bazel rules don't exist yet to compile Cython code, but rules have +# been written at cython/cython and tensorflow/tensorflow. We branch from +# Tensorflow's version as it is more actively maintained and works for gRPC +# Python's needs. +def pyx_library(name, deps = [], py_deps = [], srcs = [], **kwargs): + """Compiles a group of .pyx / .pxd / .py files. + + First runs Cython to create .cpp files for each input .pyx or .py + .pxd + pair. Then builds a shared object for each, passing "deps" to each cc_binary + rule (includes Python headers by default). Finally, creates a py_library rule + with the shared objects and any pure Python "srcs", with py_deps as its + dependencies; the shared objects can be imported like normal Python files. + + Args: + name: Name for the rule. + deps: C/C++ dependencies of the Cython (e.g. Numpy headers). + py_deps: Pure Python dependencies of the final library. + srcs: .py, .pyx, or .pxd files to either compile or pass through. + **kwargs: Extra keyword arguments passed to the py_library. + """ + + # First filter out files that should be run compiled vs. passed through. + py_srcs = [] + pyx_srcs = [] + pxd_srcs = [] + for src in srcs: + if src.endswith(".pyx") or (src.endswith(".py") and + src[:-3] + ".pxd" in srcs): + pyx_srcs.append(src) + elif src.endswith(".py"): + py_srcs.append(src) + else: + pxd_srcs.append(src) + if src.endswith("__init__.py"): + pxd_srcs.append(src) + + # Invoke cython to produce the shared object libraries. + for filename in pyx_srcs: + native.genrule( + name = filename + "_cython_translation", + srcs = [filename], + outs = [filename.split(".")[0] + ".cpp"], + # Optionally use PYTHON_BIN_PATH on Linux platforms so that python 3 + # works. Windows has issues with cython_binary so skip PYTHON_BIN_PATH. + cmd = + "PYTHONHASHSEED=0 $(location @cython//:cython_binary) --cplus $(SRCS) --output-file $(OUTS)", + tools = ["@cython//:cython_binary"] + pxd_srcs, + ) + + shared_objects = [] + for src in pyx_srcs: + stem = src.split(".")[0] + shared_object_name = stem + ".so" + native.cc_binary( + name = shared_object_name, + srcs = [stem + ".cpp"], + deps = deps + ["@local_config_python//:python_headers"], + linkshared = 1, + ) + shared_objects.append(shared_object_name) + + data = shared_objects[:] + data += kwargs.pop("data", []) + + # Now create a py_library with these shared objects as data. + native.py_library( + name = name, + srcs = py_srcs, + deps = py_deps, + srcs_version = "PY2AND3", + data = data, + **kwargs + ) diff --git a/bazel/generate_cc.bzl b/bazel/generate_cc.bzl new file mode 100644 index 00000000..a1808630 --- /dev/null +++ b/bazel/generate_cc.bzl @@ -0,0 +1,187 @@ +"""Generates C++ grpc stubs from proto_library rules. + +This is an internal rule used by cc_grpc_library, and shouldn't be used +directly. +""" + +load("@rules_proto//proto:defs.bzl", "ProtoInfo") +load( + "//bazel:protobuf.bzl", + "get_include_directory", + "get_plugin_args", + "get_proto_root", + "proto_path_to_generated_filename", +) + +_GRPC_PROTO_HEADER_FMT = "{}.grpc.pb.h" +_GRPC_PROTO_SRC_FMT = "{}.grpc.pb.cc" +_GRPC_PROTO_MOCK_HEADER_FMT = "{}_mock.grpc.pb.h" +_PROTO_HEADER_FMT = "{}.pb.h" +_PROTO_SRC_FMT = "{}.pb.cc" + +def _strip_package_from_path(label_package, file): + prefix_len = 0 + if not file.is_source and file.path.startswith(file.root.path): + prefix_len = len(file.root.path) + 1 + + path = file.path + if len(label_package) == 0: + return path + if not path.startswith(label_package + "/", prefix_len): + fail("'{}' does not lie within '{}'.".format(path, label_package)) + return path[prefix_len + len(label_package + "/"):] + +def _get_srcs_file_path(file): + if not file.is_source and file.path.startswith(file.root.path): + return file.path[len(file.root.path) + 1:] + return file.path + +def _join_directories(directories): + massaged_directories = [directory for directory in directories if len(directory) != 0] + return "/".join(massaged_directories) + +def generate_cc_impl(ctx): + """Implementation of the generate_cc rule.""" + protos = [f for src in ctx.attr.srcs for f in src[ProtoInfo].check_deps_sources.to_list()] + includes = [ + f + for src in ctx.attr.srcs + for f in src[ProtoInfo].transitive_imports.to_list() + ] + outs = [] + proto_root = get_proto_root( + ctx.label.workspace_root, + ) + + label_package = _join_directories([ctx.label.workspace_root, ctx.label.package]) + if ctx.executable.plugin: + outs += [ + proto_path_to_generated_filename( + _strip_package_from_path(label_package, proto), + _GRPC_PROTO_HEADER_FMT, + ) + for proto in protos + ] + outs += [ + proto_path_to_generated_filename( + _strip_package_from_path(label_package, proto), + _GRPC_PROTO_SRC_FMT, + ) + for proto in protos + ] + if ctx.attr.generate_mocks: + outs += [ + proto_path_to_generated_filename( + _strip_package_from_path(label_package, proto), + _GRPC_PROTO_MOCK_HEADER_FMT, + ) + for proto in protos + ] + else: + outs += [ + proto_path_to_generated_filename( + _strip_package_from_path(label_package, proto), + _PROTO_HEADER_FMT, + ) + for proto in protos + ] + outs += [ + proto_path_to_generated_filename( + _strip_package_from_path(label_package, proto), + _PROTO_SRC_FMT, + ) + for proto in protos + ] + out_files = [ctx.actions.declare_file(out) for out in outs] + dir_out = str(ctx.genfiles_dir.path + proto_root) + + arguments = [] + if ctx.executable.plugin: + arguments += get_plugin_args( + ctx.executable.plugin, + ctx.attr.flags, + dir_out, + ctx.attr.generate_mocks, + ) + tools = [ctx.executable.plugin] + else: + arguments += ["--cpp_out=" + ",".join(ctx.attr.flags) + ":" + dir_out] + tools = [] + + arguments += [ + "--proto_path={}".format(get_include_directory(i)) + for i in includes + ] + + # Include the output directory so that protoc puts the generated code in the + # right directory. + arguments += ["--proto_path={0}{1}".format(dir_out, proto_root)] + arguments += [_get_srcs_file_path(proto) for proto in protos] + + # create a list of well known proto files if the argument is non-None + well_known_proto_files = [] + if ctx.attr.well_known_protos: + f = ctx.attr.well_known_protos.files.to_list()[0].dirname + if f != "external/com_google_protobuf/src/google/protobuf": + print( + "Error: Only @com_google_protobuf//:well_known_protos is supported", + ) + else: + # f points to "external/com_google_protobuf/src/google/protobuf" + # add -I argument to protoc so it knows where to look for the proto files. + arguments += ["-I{0}".format(f + "/../..")] + well_known_proto_files = [ + f + for f in ctx.attr.well_known_protos.files.to_list() + ] + + ctx.actions.run( + inputs = protos + includes + well_known_proto_files, + tools = tools, + outputs = out_files, + executable = ctx.executable._protoc, + arguments = arguments, + ) + + return struct(files = depset(out_files)) + +_generate_cc = rule( + attrs = { + "srcs": attr.label_list( + mandatory = True, + allow_empty = False, + providers = [ProtoInfo], + ), + "plugin": attr.label( + executable = True, + providers = ["files_to_run"], + cfg = "host", + ), + "flags": attr.string_list( + mandatory = False, + allow_empty = True, + ), + "well_known_protos": attr.label(mandatory = False), + "generate_mocks": attr.bool( + default = False, + mandatory = False, + ), + "_protoc": attr.label( + default = Label("//external:protocol_compiler"), + executable = True, + cfg = "host", + ), + }, + # We generate .h files, so we need to output to genfiles. + output_to_genfiles = True, + implementation = generate_cc_impl, +) + +def generate_cc(well_known_protos, **kwargs): + if well_known_protos: + _generate_cc( + well_known_protos = "@com_google_protobuf//:well_known_protos", + **kwargs + ) + else: + _generate_cc(**kwargs) diff --git a/bazel/generate_objc.bzl b/bazel/generate_objc.bzl new file mode 100644 index 00000000..cffe4043 --- /dev/null +++ b/bazel/generate_objc.bzl @@ -0,0 +1,224 @@ +load("@rules_proto//proto:defs.bzl", "ProtoInfo") +load( + "//bazel:protobuf.bzl", + "get_include_directory", + "get_plugin_args", + "proto_path_to_generated_filename", +) +load(":grpc_util.bzl", "to_upper_camel_with_extension") + +_GRPC_PROTO_HEADER_FMT = "{}.pbrpc.h" +_GRPC_PROTO_SRC_FMT = "{}.pbrpc.m" +_PROTO_HEADER_FMT = "{}.pbobjc.h" +_PROTO_SRC_FMT = "{}.pbobjc.m" +_GENERATED_PROTOS_DIR = "_generated_protos" + +_GENERATE_HDRS = 1 +_GENERATE_SRCS = 2 +_GENERATE_NON_ARC_SRCS = 3 + +def _generate_objc_impl(ctx): + """Implementation of the generate_objc rule.""" + protos = [ + f + for src in ctx.attr.deps + for f in src[ProtoInfo].transitive_imports.to_list() + ] + + target_package = _join_directories([ctx.label.workspace_root, ctx.label.package]) + + files_with_rpc = [_label_to_full_file_path(f, target_package) for f in ctx.attr.srcs] + + outs = [] + for proto in protos: + outs += [_get_output_file_name_from_proto(proto, _PROTO_HEADER_FMT)] + outs += [_get_output_file_name_from_proto(proto, _PROTO_SRC_FMT)] + + file_path = _get_full_path_from_file(proto) + if file_path in files_with_rpc: + outs += [_get_output_file_name_from_proto(proto, _GRPC_PROTO_HEADER_FMT)] + outs += [_get_output_file_name_from_proto(proto, _GRPC_PROTO_SRC_FMT)] + + out_files = [ctx.actions.declare_file(out) for out in outs] + dir_out = _join_directories([ + str(ctx.genfiles_dir.path), + target_package, + _GENERATED_PROTOS_DIR, + ]) + + arguments = [] + if ctx.executable.plugin: + arguments += get_plugin_args( + ctx.executable.plugin, + [], + dir_out, + False, + ) + tools = [ctx.executable.plugin] + arguments += ["--objc_out=" + dir_out] + + arguments += ["--proto_path=."] + arguments += [ + "--proto_path={}".format(get_include_directory(i)) + for i in protos + ] + + # Include the output directory so that protoc puts the generated code in the + # right directory. + arguments += ["--proto_path={}".format(dir_out)] + arguments += ["--proto_path={}".format(_get_directory_from_proto(proto)) for proto in protos] + arguments += [_get_full_path_from_file(proto) for proto in protos] + + # create a list of well known proto files if the argument is non-None + well_known_proto_files = [] + if ctx.attr.use_well_known_protos: + f = ctx.attr.well_known_protos.files.to_list()[0].dirname + + # go two levels up so that #import "google/protobuf/..." is correct + arguments += ["-I{0}".format(f + "/../..")] + well_known_proto_files = ctx.attr.well_known_protos.files.to_list() + ctx.actions.run( + inputs = protos + well_known_proto_files, + tools = tools, + outputs = out_files, + executable = ctx.executable._protoc, + arguments = arguments, + ) + + return struct(files = depset(out_files)) + +def _label_to_full_file_path(src, package): + if not src.startswith("//"): + # Relative from current package + if not src.startswith(":"): + # "a.proto" -> ":a.proto" + src = ":" + src + src = "//" + package + src + + # Converts //path/to/package:File.ext to path/to/package/File.ext. + src = src.replace("//", "") + src = src.replace(":", "/") + if src.startswith("/"): + # "//:a.proto" -> "/a.proto" so remove the initial slash + return src[1:] + else: + return src + +def _get_output_file_name_from_proto(proto, fmt): + return proto_path_to_generated_filename( + _GENERATED_PROTOS_DIR + "/" + + _get_directory_from_proto(proto) + _get_slash_or_null_from_proto(proto) + + to_upper_camel_with_extension(_get_file_name_from_proto(proto), "proto"), + fmt, + ) + +def _get_file_name_from_proto(proto): + return proto.path.rpartition("/")[2] + +def _get_slash_or_null_from_proto(proto): + """Potentially returns empty (if the file is in the root directory)""" + return proto.path.rpartition("/")[1] + +def _get_directory_from_proto(proto): + return proto.path.rpartition("/")[0] + +def _get_full_path_from_file(file): + gen_dir_length = 0 + + # if file is generated, then prepare to remote its root + # (including CPU architecture...) + if not file.is_source: + gen_dir_length = len(file.root.path) + 1 + + return file.path[gen_dir_length:] + +def _join_directories(directories): + massaged_directories = [directory for directory in directories if len(directory) != 0] + return "/".join(massaged_directories) + +generate_objc = rule( + attrs = { + "deps": attr.label_list( + mandatory = True, + allow_empty = False, + providers = [ProtoInfo], + ), + "plugin": attr.label( + default = "@com_github_grpc_grpc//src/compiler:grpc_objective_c_plugin", + executable = True, + providers = ["files_to_run"], + cfg = "host", + ), + "srcs": attr.string_list( + mandatory = False, + allow_empty = True, + ), + "use_well_known_protos": attr.bool( + mandatory = False, + default = False, + ), + "well_known_protos": attr.label( + default = "@com_google_protobuf//:well_known_protos", + ), + "_protoc": attr.label( + default = Label("//external:protocol_compiler"), + executable = True, + cfg = "host", + ), + }, + output_to_genfiles = True, + implementation = _generate_objc_impl, +) + +def _group_objc_files_impl(ctx): + suffix = "" + if ctx.attr.gen_mode == _GENERATE_HDRS: + suffix = "h" + elif ctx.attr.gen_mode == _GENERATE_SRCS: + suffix = "pbrpc.m" + elif ctx.attr.gen_mode == _GENERATE_NON_ARC_SRCS: + suffix = "pbobjc.m" + else: + fail("Undefined gen_mode") + out_files = [ + file + for file in ctx.attr.src.files.to_list() + if file.basename.endswith(suffix) + ] + return struct(files = depset(out_files)) + +generate_objc_hdrs = rule( + attrs = { + "src": attr.label( + mandatory = True, + ), + "gen_mode": attr.int( + default = _GENERATE_HDRS, + ), + }, + implementation = _group_objc_files_impl, +) + +generate_objc_srcs = rule( + attrs = { + "src": attr.label( + mandatory = True, + ), + "gen_mode": attr.int( + default = _GENERATE_SRCS, + ), + }, + implementation = _group_objc_files_impl, +) + +generate_objc_non_arc_srcs = rule( + attrs = { + "src": attr.label( + mandatory = True, + ), + "gen_mode": attr.int( + default = _GENERATE_NON_ARC_SRCS, + ), + }, + implementation = _group_objc_files_impl, +) diff --git a/bazel/grpc_build_system.bzl b/bazel/grpc_build_system.bzl new file mode 100644 index 00000000..56b57a1c --- /dev/null +++ b/bazel/grpc_build_system.bzl @@ -0,0 +1,353 @@ +# Copyright 2016 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# +# This is for the gRPC build system. This isn't intended to be used outsite of +# the BUILD file for gRPC. It contains the mapping for the template system we +# use to generate other platform's build system files. +# +# Please consider that there should be a high bar for additions and changes to +# this file. +# Each rule listed must be re-written for Google's internal build system, and +# each change must be ported from one to the other. +# + +load("//bazel:cc_grpc_library.bzl", "cc_grpc_library") +load("@upb//bazel:upb_proto_library.bzl", "upb_proto_library") +load("@build_bazel_rules_apple//apple:ios.bzl", "ios_unit_test") + +# The set of pollers to test against if a test exercises polling +POLLERS = ["epollex", "epoll1", "poll"] + +def if_not_windows(a): + return select({ + "//:windows": [], + "//:windows_msvc": [], + "//conditions:default": a, + }) + +def if_mac(a): + return select({ + "//:mac_x86_64": a, + "//conditions:default": [], + }) + +def _get_external_deps(external_deps): + ret = [] + for dep in external_deps: + if dep == "address_sorting": + ret += ["//third_party/address_sorting"] + elif dep == "cares": + ret += select({ + "//:grpc_no_ares": [], + "//conditions:default": ["//external:cares"], + }) + elif dep == "cronet_c_for_grpc": + ret += ["//third_party/objective_c/Cronet:cronet_c_for_grpc"] + elif dep.startswith("absl/"): + ret += ["@com_google_absl//" + dep] + else: + ret += ["//external:" + dep] + return ret + +def grpc_cc_library( + name, + srcs = [], + public_hdrs = [], + hdrs = [], + external_deps = [], + deps = [], + standalone = False, + language = "C++", + testonly = False, + visibility = None, + alwayslink = 0, + data = [], + use_cfstream = False, + tags = []): + copts = [] + if use_cfstream: + copts = if_mac(["-DGRPC_CFSTREAM"]) + if language.upper() == "C": + copts = copts + if_not_windows(["-std=c99"]) + linkopts = if_not_windows(["-pthread"]) + if use_cfstream: + linkopts = linkopts + if_mac(["-framework CoreFoundation"]) + + native.cc_library( + name = name, + srcs = srcs, + defines = select({ + "//:grpc_no_ares": ["GRPC_ARES=0"], + "//conditions:default": [], + }) + + select({ + "//:remote_execution": ["GRPC_PORT_ISOLATED_RUNTIME=1"], + "//conditions:default": [], + }) + + select({ + "//:grpc_allow_exceptions": ["GRPC_ALLOW_EXCEPTIONS=1"], + "//:grpc_disallow_exceptions": ["GRPC_ALLOW_EXCEPTIONS=0"], + "//conditions:default": [], + }), + hdrs = hdrs + public_hdrs, + deps = deps + _get_external_deps(external_deps), + copts = copts, + visibility = visibility, + testonly = testonly, + linkopts = linkopts, + includes = [ + "include", + "src/core/ext/upb-generated", # Once upb code-gen issue is resolved, remove this. + ], + alwayslink = alwayslink, + data = data, + tags = tags, + ) + +def grpc_proto_plugin(name, srcs = [], deps = []): + native.cc_binary( + name = name, + srcs = srcs, + deps = deps, + ) + +def grpc_proto_library( + name, + srcs = [], + deps = [], + well_known_protos = False, + has_services = True, + use_external = False, + generate_mocks = False): + cc_grpc_library( + name = name, + srcs = srcs, + deps = deps, + well_known_protos = well_known_protos, + proto_only = not has_services, + use_external = use_external, + generate_mocks = generate_mocks, + ) + +def ios_cc_test( + name, + tags = [], + **kwargs): + ios_test_adapter = "//third_party/objective_c/google_toolbox_for_mac:GTM_GoogleTestRunner_GTM_USING_XCTEST" + + test_lib_ios = name + "_test_lib_ios" + ios_tags = tags + ["manual", "ios_cc_test"] + if not any([t for t in tags if t.startswith("no_test_ios")]): + native.objc_library( + name = test_lib_ios, + srcs = kwargs.get("srcs"), + deps = kwargs.get("deps"), + copts = kwargs.get("copts"), + tags = ios_tags, + alwayslink = 1, + testonly = 1, + ) + ios_test_deps = [ios_test_adapter, ":" + test_lib_ios] + ios_unit_test( + name = name + "_on_ios", + size = kwargs.get("size"), + tags = ios_tags, + minimum_os_version = "9.0", + deps = ios_test_deps, + ) + +def grpc_cc_test(name, srcs = [], deps = [], external_deps = [], args = [], data = [], uses_polling = True, language = "C++", size = "medium", timeout = None, tags = [], exec_compatible_with = [], exec_properties = {}, shard_count = None, flaky = None): + copts = if_mac(["-DGRPC_CFSTREAM"]) + if language.upper() == "C": + copts = copts + if_not_windows(["-std=c99"]) + + # NOTE: these attributes won't be used for the poller-specific versions of a test + # automatically, you need to set them explicitly (if applicable) + args = { + "srcs": srcs, + "args": args, + "data": data, + "deps": deps + _get_external_deps(external_deps), + "copts": copts, + "linkopts": if_not_windows(["-pthread"]), + "size": size, + "timeout": timeout, + "exec_compatible_with": exec_compatible_with, + "exec_properties": exec_properties, + "shard_count": shard_count, + "flaky": flaky, + } + if uses_polling: + # the vanilla version of the test should run on platforms that only + # support a single poller + native.cc_test( + name = name, + testonly = True, + tags = (tags + [ + "no_linux", # linux supports multiple pollers + ]), + **args + ) + + # on linux we run the same test multiple times, once for each poller + for poller in POLLERS: + native.sh_test( + name = name + "@poller=" + poller, + data = [name] + data, + srcs = [ + "//test/core/util:run_with_poller_sh", + ], + size = size, + timeout = timeout, + args = [ + poller, + "$(location %s)" % name, + ] + args["args"], + tags = (tags + ["no_windows", "no_mac"]), + exec_compatible_with = exec_compatible_with, + exec_properties = exec_properties, + shard_count = shard_count, + flaky = flaky, + ) + else: + # the test behavior doesn't depend on polling, just generate the test + native.cc_test(name = name, tags = tags + ["no_uses_polling"], **args) + ios_cc_test( + name = name, + tags = tags, + **args + ) + +def grpc_cc_binary(name, srcs = [], deps = [], external_deps = [], args = [], data = [], language = "C++", testonly = False, linkshared = False, linkopts = [], tags = []): + copts = [] + if language.upper() == "C": + copts = ["-std=c99"] + native.cc_binary( + name = name, + srcs = srcs, + args = args, + data = data, + testonly = testonly, + linkshared = linkshared, + deps = deps + _get_external_deps(external_deps), + copts = copts, + linkopts = if_not_windows(["-pthread"]) + linkopts, + tags = tags, + ) + +def grpc_generate_one_off_targets(): + # In open-source, grpc_objc* libraries depend directly on //:grpc + native.alias( + name = "grpc_objc", + actual = "//:grpc", + ) + +def grpc_generate_objc_one_off_targets(): + pass + +def grpc_sh_test(name, srcs, args = [], data = []): + native.sh_test( + name = name, + srcs = srcs, + args = args, + data = data, + ) + +def grpc_sh_binary(name, srcs, data = []): + native.sh_binary( + name = name, + srcs = srcs, + data = data, + ) + +def grpc_py_binary( + name, + srcs, + data = [], + deps = [], + external_deps = [], + testonly = False, + python_version = "PY2", + **kwargs): + native.py_binary( + name = name, + srcs = srcs, + testonly = testonly, + data = data, + deps = deps + _get_external_deps(external_deps), + python_version = python_version, + **kwargs + ) + +def grpc_package(name, visibility = "private", features = []): + if visibility == "tests": + visibility = ["//test:__subpackages__"] + elif visibility == "public": + visibility = ["//visibility:public"] + elif visibility == "private": + visibility = [] + else: + fail("Unknown visibility " + visibility) + + if len(visibility) != 0: + native.package( + default_visibility = visibility, + features = features, + ) + +def grpc_objc_library( + name, + srcs = [], + hdrs = [], + textual_hdrs = [], + data = [], + deps = [], + defines = [], + includes = [], + visibility = ["//visibility:public"]): + """The grpc version of objc_library, only used for the Objective-C library compilation + + Args: + name: name of target + hdrs: public headers + srcs: all source files (.m) + textual_hdrs: private headers + data: any other bundle resources + defines: preprocessors + includes: added to search path, always [the path to objc directory] + deps: dependencies + visibility: visibility, default to public + """ + + native.objc_library( + name = name, + hdrs = hdrs, + srcs = srcs, + textual_hdrs = textual_hdrs, + data = data, + deps = deps, + defines = defines, + includes = includes, + visibility = visibility, + ) + +def grpc_upb_proto_library(name, deps): + upb_proto_library(name = name, deps = deps) + +def python_config_settings(): + native.config_setting( + name = "python3", + flag_values = {"@bazel_tools//tools/python:python_version": "PY3"}, + ) diff --git a/bazel/grpc_deps.bzl b/bazel/grpc_deps.bzl new file mode 100644 index 00000000..05c2cc22 --- /dev/null +++ b/bazel/grpc_deps.bzl @@ -0,0 +1,405 @@ +"""Load dependencies needed to compile and test the grpc library as a 3rd-party consumer.""" + +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") +load("@com_github_grpc_grpc//bazel:grpc_python_deps.bzl", "grpc_python_deps") + +def grpc_deps(): + """Loads dependencies need to compile and test the grpc library.""" + + native.bind( + name = "upb_lib", + actual = "@upb//:upb", + ) + + native.bind( + name = "absl", + actual = "@com_google_absl//absl", + ) + + native.bind( + name = "absl-base", + actual = "@com_google_absl//absl/base", + ) + + native.bind( + name = "absl-time", + actual = "@com_google_absl//absl/time:time", + ) + + native.bind( + name = "libssl", + actual = "@boringssl//:ssl", + ) + + native.bind( + name = "madler_zlib", + actual = "@zlib//:zlib", + ) + + native.bind( + name = "protobuf", + actual = "@com_google_protobuf//:protobuf", + ) + + native.bind( + name = "protobuf_clib", + actual = "@com_google_protobuf//:protoc_lib", + ) + + native.bind( + name = "protobuf_headers", + actual = "@com_google_protobuf//:protobuf_headers", + ) + + native.bind( + name = "protocol_compiler", + actual = "@com_google_protobuf//:protoc", + ) + + native.bind( + name = "cares", + actual = "@com_github_cares_cares//:ares", + ) + + native.bind( + name = "gtest", + actual = "@com_github_google_googletest//:gtest", + ) + + native.bind( + name = "benchmark", + actual = "@com_github_google_benchmark//:benchmark", + ) + + native.bind( + name = "gflags", + actual = "@com_github_gflags_gflags//:gflags", + ) + + native.bind( + name = "grpc_cpp_plugin", + actual = "@com_github_grpc_grpc//src/compiler:grpc_cpp_plugin", + ) + + native.bind( + name = "grpc++_codegen_proto", + actual = "@com_github_grpc_grpc//:grpc++_codegen_proto", + ) + + native.bind( + name = "opencensus-context", + actual = "@io_opencensus_cpp//opencensus/context:context", + ) + + native.bind( + name = "opencensus-trace", + actual = "@io_opencensus_cpp//opencensus/trace:trace", + ) + + native.bind( + name = "opencensus-trace-context_util", + actual = "@io_opencensus_cpp//opencensus/trace:context_util", + ) + + native.bind( + name = "opencensus-stats", + actual = "@io_opencensus_cpp//opencensus/stats:stats", + ) + + native.bind( + name = "opencensus-stats-test", + actual = "@io_opencensus_cpp//opencensus/stats:test_utils", + ) + + native.bind( + name = "opencensus-with-tag-map", + actual = "@io_opencensus_cpp//opencensus/tags:with_tag_map", + ) + + native.bind( + name = "opencensus-tags", + actual = "@io_opencensus_cpp//opencensus/tags:tags", + ) + + native.bind( + name = "libuv", + actual = "@libuv//:libuv", + ) + + if "boringssl" not in native.existing_rules(): + http_archive( + name = "boringssl", + # Use github mirror instead of https://boringssl.googlesource.com/boringssl + # to obtain a boringssl archive with consistent sha256 + sha256 = "3909329105e28cfeedcd8028865c92f1081ae2524a0ad6c09eba5d91d9ae3869", + strip_prefix = "boringssl-3ab047a8e377083a9b38dc908fe1612d5743a021", + urls = [ + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/google/boringssl/archive/3ab047a8e377083a9b38dc908fe1612d5743a021.tar.gz", + "https://github.com/google/boringssl/archive/3ab047a8e377083a9b38dc908fe1612d5743a021.tar.gz", + ], + ) + + if "zlib" not in native.existing_rules(): + http_archive( + name = "zlib", + build_file = "@com_github_grpc_grpc//third_party:zlib.BUILD", + sha256 = "6d4d6640ca3121620995ee255945161821218752b551a1a180f4215f7d124d45", + strip_prefix = "zlib-cacf7f1d4e3d44d871b605da3b647f07d718623f", + urls = [ + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/madler/zlib/archive/cacf7f1d4e3d44d871b605da3b647f07d718623f.tar.gz", + "https://github.com/madler/zlib/archive/cacf7f1d4e3d44d871b605da3b647f07d718623f.tar.gz", + ], + ) + + if "com_google_protobuf" not in native.existing_rules(): + http_archive( + name = "com_google_protobuf", + sha256 = "efaf69303e01caccc2447064fc1832dfd23c0c130df0dc5fc98a13185bb7d1a7", + strip_prefix = "protobuf-678da4f76eb9168c9965afc2149944a66cd48546", + urls = [ + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/google/protobuf/archive/678da4f76eb9168c9965afc2149944a66cd48546.tar.gz", + "https://github.com/google/protobuf/archive/678da4f76eb9168c9965afc2149944a66cd48546.tar.gz", + ], + ) + + if "com_github_google_googletest" not in native.existing_rules(): + http_archive( + name = "com_github_google_googletest", + sha256 = "443d383db648ebb8e391382c0ab63263b7091d03197f304390baac10f178a468", + strip_prefix = "googletest-c9ccac7cb7345901884aabf5d1a786cfa6e2f397", + urls = [ + # 2019-08-19 + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/google/googletest/archive/c9ccac7cb7345901884aabf5d1a786cfa6e2f397.tar.gz", + "https://github.com/google/googletest/archive/c9ccac7cb7345901884aabf5d1a786cfa6e2f397.tar.gz", + ], + ) + + if "rules_cc" not in native.existing_rules(): + http_archive( + name = "rules_cc", + sha256 = "35f2fb4ea0b3e61ad64a369de284e4fbbdcdba71836a5555abb5e194cf119509", + strip_prefix = "rules_cc-624b5d59dfb45672d4239422fa1e3de1822ee110", + urls = [ + #2019-08-15 + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/bazelbuild/rules_cc/archive/624b5d59dfb45672d4239422fa1e3de1822ee110.tar.gz", + "https://github.com/bazelbuild/rules_cc/archive/624b5d59dfb45672d4239422fa1e3de1822ee110.tar.gz", + ], + ) + + if "com_github_gflags_gflags" not in native.existing_rules(): + http_archive( + name = "com_github_gflags_gflags", + sha256 = "63ae70ea3e05780f7547d03503a53de3a7d2d83ad1caaa443a31cb20aea28654", + strip_prefix = "gflags-28f50e0fed19872e0fd50dd23ce2ee8cd759338e", + urls = [ + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/gflags/gflags/archive/28f50e0fed19872e0fd50dd23ce2ee8cd759338e.tar.gz", + "https://github.com/gflags/gflags/archive/28f50e0fed19872e0fd50dd23ce2ee8cd759338e.tar.gz", + ], + ) + + if "com_github_google_benchmark" not in native.existing_rules(): + http_archive( + name = "com_github_google_benchmark", + sha256 = "f68aec93154d010324c05bcd8c5cc53468b87af88d87acb5ddcfaa1bba044837", + strip_prefix = "benchmark-090faecb454fbd6e6e17a75ef8146acb037118d4", + urls = [ + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/google/benchmark/archive/090faecb454fbd6e6e17a75ef8146acb037118d4.tar.gz", + "https://github.com/google/benchmark/archive/090faecb454fbd6e6e17a75ef8146acb037118d4.tar.gz", + ], + ) + + if "com_github_cares_cares" not in native.existing_rules(): + http_archive( + name = "com_github_cares_cares", + build_file = "@com_github_grpc_grpc//third_party:cares/cares.BUILD", + sha256 = "e8c2751ddc70fed9dc6f999acd92e232d5846f009ee1674f8aee81f19b2b915a", + strip_prefix = "c-ares-e982924acee7f7313b4baa4ee5ec000c5e373c30", + urls = [ + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/c-ares/c-ares/archive/e982924acee7f7313b4baa4ee5ec000c5e373c30.tar.gz", + "https://github.com/c-ares/c-ares/archive/e982924acee7f7313b4baa4ee5ec000c5e373c30.tar.gz", + ], + ) + + if "com_google_absl" not in native.existing_rules(): + http_archive( + name = "com_google_absl", + sha256 = "f368a8476f4e2e0eccf8a7318b98dafbe30b2600f4e3cf52636e5eb145aba06a", + strip_prefix = "abseil-cpp-df3ea785d8c30a9503321a3d35ee7d35808f190d", + urls = [ + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/abseil/abseil-cpp/archive/df3ea785d8c30a9503321a3d35ee7d35808f190d.tar.gz", + "https://github.com/abseil/abseil-cpp/archive/df3ea785d8c30a9503321a3d35ee7d35808f190d.tar.gz", + ], + ) + + if "bazel_toolchains" not in native.existing_rules(): + # list of releases is at https://releases.bazel.build/bazel-toolchains.html + http_archive( + name = "bazel_toolchains", + sha256 = "0b36eef8a66f39c8dbae88e522d5bbbef49d5e66e834a982402c79962281be10", + strip_prefix = "bazel-toolchains-1.0.1", + urls = [ + "https://mirror.bazel.build/github.com/bazelbuild/bazel-toolchains/archive/1.0.1.tar.gz", + "https://github.com/bazelbuild/bazel-toolchains/releases/download/1.0.1/bazel-toolchains-1.0.1.tar.gz", + ], + ) + + if "bazel_skylib" not in native.existing_rules(): + http_archive( + name = "bazel_skylib", + urls = [ + "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.0.2/bazel-skylib-1.0.2.tar.gz", + "https://github.com/bazelbuild/bazel-skylib/releases/download/1.0.2/bazel-skylib-1.0.2.tar.gz", + ], + sha256 = "97e70364e9249702246c0e9444bccdc4b847bed1eb03c5a3ece4f83dfe6abc44", + ) + + if "io_opencensus_cpp" not in native.existing_rules(): + http_archive( + name = "io_opencensus_cpp", + sha256 = "90d6fafa8b1a2ea613bf662731d3086e1c2ed286f458a95c81744df2dbae41b1", + strip_prefix = "opencensus-cpp-c9a4da319bc669a772928ffc55af4a61be1a1176", + urls = [ + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/census-instrumentation/opencensus-cpp/archive/c9a4da319bc669a772928ffc55af4a61be1a1176.tar.gz", + "https://github.com/census-instrumentation/opencensus-cpp/archive/c9a4da319bc669a772928ffc55af4a61be1a1176.tar.gz", + ], + ) + if "upb" not in native.existing_rules(): + http_archive( + name = "upb", + sha256 = "e9c136e56b98c8eb48ad1c9f8df4a6348e99f9f336ee6199c4259a312c2e3598", + strip_prefix = "upb-d8f3d6f9d415b31f3ce56d46791706c38fa311bc", + urls = [ + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/protocolbuffers/upb/archive/d8f3d6f9d415b31f3ce56d46791706c38fa311bc.tar.gz", + "https://github.com/protocolbuffers/upb/archive/d8f3d6f9d415b31f3ce56d46791706c38fa311bc.tar.gz", + ], + ) + + if "envoy_api" not in native.existing_rules(): + http_archive( + name = "envoy_api", + sha256 = "9150f920abd3e710e0e58519cd769822f13d7a56988f2c34c2008815ec8d9c88", + strip_prefix = "data-plane-api-8dcc476be69437b505af181a6e8b167fdb101d7e", + urls = [ + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/envoyproxy/data-plane-api/archive/8dcc476be69437b505af181a6e8b167fdb101d7e.tar.gz", + "https://github.com/envoyproxy/data-plane-api/archive/8dcc476be69437b505af181a6e8b167fdb101d7e.tar.gz", + ], + ) + + if "io_bazel_rules_go" not in native.existing_rules(): + http_archive( + name = "io_bazel_rules_go", + sha256 = "a82a352bffae6bee4e95f68a8d80a70e87f42c4741e6a448bec11998fcc82329", + urls = [ + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/bazelbuild/rules_go/releases/download/0.18.5/rules_go-0.18.5.tar.gz", + "https://github.com/bazelbuild/rules_go/releases/download/0.18.5/rules_go-0.18.5.tar.gz", + ], + ) + + if "build_bazel_rules_apple" not in native.existing_rules(): + http_archive( + name = "build_bazel_rules_apple", + strip_prefix = "rules_apple-b869b0d3868d78a1d4ffd866ccb304fb68aa12c3", + sha256 = "bdc8e66e70b8a75da23b79f1f8c6207356df07d041d96d2189add7ee0780cf4e", + urls = [ + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/bazelbuild/rules_apple/archive/b869b0d3868d78a1d4ffd866ccb304fb68aa12c3.tar.gz", + "https://github.com/bazelbuild/rules_apple/archive/b869b0d3868d78a1d4ffd866ccb304fb68aa12c3.tar.gz", + ], + ) + + if "build_bazel_apple_support" not in native.existing_rules(): + http_archive( + name = "build_bazel_apple_support", + urls = [ + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/bazelbuild/apple_support/releases/download/0.7.1/apple_support.0.7.1.tar.gz", + "https://github.com/bazelbuild/apple_support/releases/download/0.7.1/apple_support.0.7.1.tar.gz", + ], + sha256 = "122ebf7fe7d1c8e938af6aeaee0efe788a3a2449ece5a8d6a428cb18d6f88033", + ) + + if "libuv" not in native.existing_rules(): + http_archive( + name = "libuv", + build_file = "@com_github_grpc_grpc//third_party:libuv.BUILD", + sha256 = "dfb4fe1ff0b47340978490a14bf253475159ecfcbad46ab2a350c78f9ce3360f", + strip_prefix = "libuv-15ae750151ac9341e5945eb38f8982d59fb99201", + urls = [ + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/libuv/libuv/archive/15ae750151ac9341e5945eb38f8982d59fb99201.tar.gz", + "https://github.com/libuv/libuv/archive/15ae750151ac9341e5945eb38f8982d59fb99201.tar.gz", + ], + ) + + grpc_python_deps() + +# TODO: move some dependencies from "grpc_deps" here? +def grpc_test_only_deps(): + """Internal, not intended for use by packages that are consuming grpc. + Loads dependencies that are only needed to run grpc library's tests.""" + native.bind( + name = "twisted", + actual = "@com_github_twisted_twisted//:twisted", + ) + + native.bind( + name = "yaml", + actual = "@com_github_yaml_pyyaml//:yaml", + ) + + if "com_github_twisted_twisted" not in native.existing_rules(): + http_archive( + name = "com_github_twisted_twisted", + sha256 = "ca17699d0d62eafc5c28daf2c7d0a18e62ae77b4137300b6c7d7868b39b06139", + strip_prefix = "twisted-twisted-17.5.0", + urls = [ + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/twisted/twisted/archive/twisted-17.5.0.zip", + "https://github.com/twisted/twisted/archive/twisted-17.5.0.zip", + ], + build_file = "@com_github_grpc_grpc//third_party:twisted.BUILD", + ) + + if "com_github_yaml_pyyaml" not in native.existing_rules(): + http_archive( + name = "com_github_yaml_pyyaml", + sha256 = "6b4314b1b2051ddb9d4fcd1634e1fa9c1bb4012954273c9ff3ef689f6ec6c93e", + strip_prefix = "pyyaml-3.12", + urls = [ + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/yaml/pyyaml/archive/3.12.zip", + "https://github.com/yaml/pyyaml/archive/3.12.zip", + ], + build_file = "@com_github_grpc_grpc//third_party:yaml.BUILD", + ) + + if "com_github_twisted_incremental" not in native.existing_rules(): + http_archive( + name = "com_github_twisted_incremental", + sha256 = "f0ca93359ee70243ff7fbf2d904a6291810bd88cb80ed4aca6fa77f318a41a36", + strip_prefix = "incremental-incremental-17.5.0", + urls = [ + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/twisted/incremental/archive/incremental-17.5.0.zip", + "https://github.com/twisted/incremental/archive/incremental-17.5.0.zip", + ], + build_file = "@com_github_grpc_grpc//third_party:incremental.BUILD", + ) + + if "com_github_zopefoundation_zope_interface" not in native.existing_rules(): + http_archive( + name = "com_github_zopefoundation_zope_interface", + sha256 = "e9579fc6149294339897be3aa9ecd8a29217c0b013fe6f44fcdae00e3204198a", + strip_prefix = "zope.interface-4.4.3", + urls = [ + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/zopefoundation/zope.interface/archive/4.4.3.zip", + "https://github.com/zopefoundation/zope.interface/archive/4.4.3.zip", + ], + build_file = "@com_github_grpc_grpc//third_party:zope_interface.BUILD", + ) + + if "com_github_twisted_constantly" not in native.existing_rules(): + http_archive( + name = "com_github_twisted_constantly", + sha256 = "2702cd322161a579d2c0dbf94af4e57712eedc7bd7bbbdc554a230544f7d346c", + strip_prefix = "constantly-15.1.0", + urls = [ + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/twisted/constantly/archive/15.1.0.zip", + "https://github.com/twisted/constantly/archive/15.1.0.zip", + ], + build_file = "@com_github_grpc_grpc//third_party:constantly.BUILD", + ) diff --git a/bazel/grpc_extra_deps.bzl b/bazel/grpc_extra_deps.bzl new file mode 100644 index 00000000..4c1dfad2 --- /dev/null +++ b/bazel/grpc_extra_deps.bzl @@ -0,0 +1,40 @@ +"""Loads the dependencies necessary for the external repositories defined in grpc_deps.bzl.""" + +load("@com_google_protobuf//:protobuf_deps.bzl", "protobuf_deps") +load("@upb//bazel:workspace_deps.bzl", "upb_deps") +load("@envoy_api//bazel:repositories.bzl", "api_dependencies") +load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies") +load("@build_bazel_rules_apple//apple:repositories.bzl", "apple_rules_dependencies") +load("@build_bazel_apple_support//lib:repositories.bzl", "apple_support_dependencies") + +def grpc_extra_deps(): + """Loads the extra dependencies. + + These are necessary for using the external repositories defined in + grpc_deps.bzl. Projects that depend on gRPC as an external repository need + to call both grpc_deps and grpc_extra_deps, if they have not already loaded + the extra dependencies. For example, they can do the following in their + WORKSPACE + ``` + load("@com_github_grpc_grpc//bazel:grpc_deps.bzl", "grpc_deps", "grpc_test_only_deps") + grpc_deps() + + grpc_test_only_deps() + + load("@com_github_grpc_grpc//bazel:grpc_extra_deps.bzl", "grpc_extra_deps") + + grpc_extra_deps() + ``` + """ + protobuf_deps() + + upb_deps() + + api_dependencies() + + go_rules_dependencies() + go_register_toolchains() + + apple_rules_dependencies() + + apple_support_dependencies() diff --git a/bazel/grpc_python_deps.bzl b/bazel/grpc_python_deps.bzl new file mode 100644 index 00000000..b26c4fb0 --- /dev/null +++ b/bazel/grpc_python_deps.bzl @@ -0,0 +1,67 @@ +"""Load dependencies needed to compile and test the grpc python library as a 3rd-party consumer.""" + +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") +load("@com_github_grpc_grpc//third_party/py:python_configure.bzl", "python_configure") + +def grpc_python_deps(): + # protobuf binds to the name "six", so we can't use it here. + # See https://github.com/bazelbuild/bazel/issues/1952 for why bind is + # horrible. + if "six" not in native.existing_rules(): + http_archive( + name = "six", + build_file = "@com_github_grpc_grpc//third_party:six.BUILD", + sha256 = "d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73", + urls = ["https://files.pythonhosted.org/packages/dd/bf/4138e7bfb757de47d1f4b6994648ec67a51efe58fa907c1e11e350cddfca/six-1.12.0.tar.gz"], + ) + + if "enum34" not in native.existing_rules(): + http_archive( + name = "enum34", + build_file = "@com_github_grpc_grpc//third_party:enum34.BUILD", + strip_prefix = "enum34-1.1.6", + sha256 = "8ad8c4783bf61ded74527bffb48ed9b54166685e4230386a9ed9b1279e2df5b1", + urls = ["https://files.pythonhosted.org/packages/bf/3e/31d502c25302814a7c2f1d3959d2a3b3f78e509002ba91aea64993936876/enum34-1.1.6.tar.gz"], + ) + + if "futures" not in native.existing_rules(): + http_archive( + name = "futures", + build_file = "@com_github_grpc_grpc//third_party:futures.BUILD", + strip_prefix = "futures-3.3.0", + sha256 = "7e033af76a5e35f58e56da7a91e687706faf4e7bdfb2cbc3f2cca6b9bcda9794", + urls = ["https://files.pythonhosted.org/packages/47/04/5fc6c74ad114032cd2c544c575bffc17582295e9cd6a851d6026ab4b2c00/futures-3.3.0.tar.gz"], + ) + + if "io_bazel_rules_python" not in native.existing_rules(): + http_archive( + name = "io_bazel_rules_python", + url = "https://github.com/bazelbuild/rules_python/releases/download/0.0.1/rules_python-0.0.1.tar.gz", + sha256 = "aa96a691d3a8177f3215b14b0edc9641787abaaa30363a080165d06ab65e1161", + ) + + if "rules_python" not in native.existing_rules(): + http_archive( + name = "rules_python", + url = "https://github.com/bazelbuild/rules_python/archive/9d68f24659e8ce8b736590ba1e4418af06ec2552.zip", + sha256 = "f7402f11691d657161f871e11968a984e5b48b023321935f5a55d7e56cf4758a", + strip_prefix = "rules_python-9d68f24659e8ce8b736590ba1e4418af06ec2552", + ) + + python_configure(name = "local_config_python") + + native.bind( + name = "python_headers", + actual = "@local_config_python//:python_headers", + ) + + if "cython" not in native.existing_rules(): + http_archive( + name = "cython", + build_file = "@com_github_grpc_grpc//third_party:cython.BUILD", + sha256 = "d68138a2381afbdd0876c3cb2a22389043fa01c4badede1228ee073032b07a27", + strip_prefix = "cython-c2b80d87658a8525ce091cbe146cb7eaa29fed5c", + urls = [ + "https://github.com/cython/cython/archive/c2b80d87658a8525ce091cbe146cb7eaa29fed5c.tar.gz", + ], + ) diff --git a/bazel/grpc_util.bzl b/bazel/grpc_util.bzl new file mode 100644 index 00000000..779747c8 --- /dev/null +++ b/bazel/grpc_util.bzl @@ -0,0 +1,46 @@ +# Follows convention set in objectivec_helpers.cc in the protobuf ObjC compiler. +_upper_segments_list = ["url", "http", "https"] + +def strip_extension(str): + return str.rpartition(".")[0] + +def capitalize(word): + if word in _upper_segments_list: + return word.upper() + else: + return word.capitalize() + +def lower_underscore_to_upper_camel(str): + str = strip_extension(str) + camel_case_str = "" + word = "" + for c in str.elems(): # NB: assumes ASCII! + if c.isalpha(): + word += c.lower() + else: + # Last word is finished. + if len(word): + camel_case_str += capitalize(word) + word = "" + if c.isdigit(): + camel_case_str += c + + # Otherwise, drop the character. See UnderscoresToCamelCase in: + # third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_helpers.cc + + if len(word): + camel_case_str += capitalize(word) + return camel_case_str + +def file_to_upper_camel(src): + elements = src.rpartition("/") + upper_camel = lower_underscore_to_upper_camel(elements[-1]) + return "".join(list(elements[:-1]) + [upper_camel]) + +def file_with_extension(src, ext): + elements = src.rpartition("/") + return "".join(list(elements[:-1]) + [elements[-1], "." + ext]) + +def to_upper_camel_with_extension(src, ext): + src = file_to_upper_camel(src) + return file_with_extension(src, ext) diff --git a/bazel/objc_grpc_library.bzl b/bazel/objc_grpc_library.bzl new file mode 100644 index 00000000..5b712568 --- /dev/null +++ b/bazel/objc_grpc_library.bzl @@ -0,0 +1,68 @@ +load( + "//bazel:generate_objc.bzl", + "generate_objc", + "generate_objc_hdrs", + "generate_objc_non_arc_srcs", + "generate_objc_srcs", +) +load("//bazel:protobuf.bzl", "well_known_proto_libs") + +def objc_grpc_library(name, deps, srcs = [], use_well_known_protos = False, **kwargs): + """Generates messages and/or service stubs for given proto_library and all transitively dependent proto files + + Args: + name: name of target + deps: a list of proto_library targets that needs to be compiled + srcs: a list of labels to proto files with service stubs to be generated, + labels specified must include service stubs; otherwise Bazel will complain about srcs being empty + use_well_known_protos: whether to use the well known protos defined in + @com_google_protobuf//src/google/protobuf, default to false + **kwargs: other arguments + """ + objc_grpc_library_name = "_" + name + "_objc_grpc_library" + + generate_objc( + name = objc_grpc_library_name, + srcs = srcs, + deps = deps, + use_well_known_protos = use_well_known_protos, + **kwargs + ) + + generate_objc_hdrs( + name = objc_grpc_library_name + "_hdrs", + src = ":" + objc_grpc_library_name, + ) + + generate_objc_non_arc_srcs( + name = objc_grpc_library_name + "_non_arc_srcs", + src = ":" + objc_grpc_library_name, + ) + + arc_srcs = None + if len(srcs) > 0: + generate_objc_srcs( + name = objc_grpc_library_name + "_srcs", + src = ":" + objc_grpc_library_name, + ) + arc_srcs = [":" + objc_grpc_library_name + "_srcs"] + + native.objc_library( + name = name, + hdrs = [":" + objc_grpc_library_name + "_hdrs"], + non_arc_srcs = [":" + objc_grpc_library_name + "_non_arc_srcs"], + srcs = arc_srcs, + defines = [ + "GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=0", + "GPB_GRPC_FORWARD_DECLARE_MESSAGE_PROTO=0", + ], + includes = [ + "_generated_protos", + "src/objective-c", + ], + deps = [ + "@com_github_grpc_grpc//src/objective-c:proto_objc_rpc", + "@com_google_protobuf//:protobuf_objc", + ], + **kwargs + ) diff --git a/bazel/protobuf.bzl b/bazel/protobuf.bzl new file mode 100644 index 00000000..330301e9 --- /dev/null +++ b/bazel/protobuf.bzl @@ -0,0 +1,248 @@ +"""Utility functions for generating protobuf code.""" + +load("@rules_proto//proto:defs.bzl", "ProtoInfo") + +_PROTO_EXTENSION = ".proto" +_VIRTUAL_IMPORTS = "/_virtual_imports/" + +def well_known_proto_libs(): + return [ + "@com_google_protobuf//:any_proto", + "@com_google_protobuf//:api_proto", + "@com_google_protobuf//:compiler_plugin_proto", + "@com_google_protobuf//:descriptor_proto", + "@com_google_protobuf//:duration_proto", + "@com_google_protobuf//:empty_proto", + "@com_google_protobuf//:field_mask_proto", + "@com_google_protobuf//:source_context_proto", + "@com_google_protobuf//:struct_proto", + "@com_google_protobuf//:timestamp_proto", + "@com_google_protobuf//:type_proto", + "@com_google_protobuf//:wrappers_proto", + ] + +def get_proto_root(workspace_root): + """Gets the root protobuf directory. + + Args: + workspace_root: context.label.workspace_root + + Returns: + The directory relative to which generated include paths should be. + """ + if workspace_root: + return "/{}".format(workspace_root) + else: + return "" + +def _strip_proto_extension(proto_filename): + if not proto_filename.endswith(_PROTO_EXTENSION): + fail('"{}" does not end with "{}"'.format( + proto_filename, + _PROTO_EXTENSION, + )) + return proto_filename[:-len(_PROTO_EXTENSION)] + +def proto_path_to_generated_filename(proto_path, fmt_str): + """Calculates the name of a generated file for a protobuf path. + + For example, "examples/protos/helloworld.proto" might map to + "helloworld.pb.h". + + Args: + proto_path: The path to the .proto file. + fmt_str: A format string used to calculate the generated filename. For + example, "{}.pb.h" might be used to calculate a C++ header filename. + + Returns: + The generated filename. + """ + return fmt_str.format(_strip_proto_extension(proto_path)) + +def get_include_directory(source_file): + """Returns the include directory path for the source_file. I.e. all of the + include statements within the given source_file are calculated relative to + the directory returned by this method. + + The returned directory path can be used as the "--proto_path=" argument + value. + + Args: + source_file: A proto file. + + Returns: + The include directory path for the source_file. + """ + directory = source_file.path + prefix_len = 0 + + if is_in_virtual_imports(source_file): + root, relative = source_file.path.split(_VIRTUAL_IMPORTS, 2) + result = root + _VIRTUAL_IMPORTS + relative.split("/", 1)[0] + return result + + if not source_file.is_source and directory.startswith(source_file.root.path): + prefix_len = len(source_file.root.path) + 1 + + if directory.startswith("external", prefix_len): + external_separator = directory.find("/", prefix_len) + repository_separator = directory.find("/", external_separator + 1) + return directory[:repository_separator] + else: + return source_file.root.path if source_file.root.path else "." + +def get_plugin_args( + plugin, + flags, + dir_out, + generate_mocks, + plugin_name = "PLUGIN"): + """Returns arguments configuring protoc to use a plugin for a language. + + Args: + plugin: An executable file to run as the protoc plugin. + flags: The plugin flags to be passed to protoc. + dir_out: The output directory for the plugin. + generate_mocks: A bool indicating whether to generate mocks. + plugin_name: A name of the plugin, it is required to be unique when there + are more than one plugin used in a single protoc command. + Returns: + A list of protoc arguments configuring the plugin. + """ + augmented_flags = list(flags) + if generate_mocks: + augmented_flags.append("generate_mock_code=true") + + augmented_dir_out = dir_out + if augmented_flags: + augmented_dir_out = ",".join(augmented_flags) + ":" + dir_out + + return [ + "--plugin=protoc-gen-{plugin_name}={plugin_path}".format( + plugin_name = plugin_name, + plugin_path = plugin.path, + ), + "--{plugin_name}_out={dir_out}".format( + plugin_name = plugin_name, + dir_out = augmented_dir_out, + ), + ] + +def _get_staged_proto_file(context, source_file): + if source_file.dirname == context.label.package or \ + is_in_virtual_imports(source_file): + # Current target and source_file are in same package + return source_file + else: + # Current target and source_file are in different packages (most + # probably even in different repositories) + copied_proto = context.actions.declare_file(source_file.basename) + context.actions.run_shell( + inputs = [source_file], + outputs = [copied_proto], + command = "cp {} {}".format(source_file.path, copied_proto.path), + mnemonic = "CopySourceProto", + ) + return copied_proto + +def protos_from_context(context): + """Copies proto files to the appropriate location. + + Args: + context: The ctx object for the rule. + + Returns: + A list of the protos. + """ + protos = [] + for src in context.attr.deps: + for file in src[ProtoInfo].direct_sources: + protos.append(_get_staged_proto_file(context, file)) + return protos + +def includes_from_deps(deps): + """Get includes from rule dependencies.""" + return [ + file + for src in deps + for file in src[ProtoInfo].transitive_imports.to_list() + ] + +def get_proto_arguments(protos, genfiles_dir_path): + """Get the protoc arguments specifying which protos to compile.""" + arguments = [] + for proto in protos: + strip_prefix_len = 0 + if is_in_virtual_imports(proto): + incl_directory = get_include_directory(proto) + if proto.path.startswith(incl_directory): + strip_prefix_len = len(incl_directory) + 1 + elif proto.path.startswith(genfiles_dir_path): + strip_prefix_len = len(genfiles_dir_path) + 1 + + arguments.append(proto.path[strip_prefix_len:]) + + return arguments + +def declare_out_files(protos, context, generated_file_format): + """Declares and returns the files to be generated.""" + + out_file_paths = [] + for proto in protos: + if not is_in_virtual_imports(proto): + out_file_paths.append(proto.basename) + else: + path = proto.path[proto.path.index(_VIRTUAL_IMPORTS) + 1:] + out_file_paths.append(path) + + return [ + context.actions.declare_file( + proto_path_to_generated_filename( + out_file_path, + generated_file_format, + ), + ) + for out_file_path in out_file_paths + ] + +def get_out_dir(protos, context): + """ Returns the calculated value for --_out= protoc argument based on + the input source proto files and current context. + + Args: + protos: A list of protos to be used as source files in protoc command + context: A ctx object for the rule. + Returns: + The value of --_out= argument. + """ + at_least_one_virtual = 0 + for proto in protos: + if is_in_virtual_imports(proto): + at_least_one_virtual = True + elif at_least_one_virtual: + fail("Proto sources must be either all virtual imports or all real") + if at_least_one_virtual: + out_dir = get_include_directory(protos[0]) + ws_root = protos[0].owner.workspace_root + if ws_root and out_dir.find(ws_root) >= 0: + out_dir = "".join(out_dir.rsplit(ws_root, 1)) + return struct( + path = out_dir, + import_path = out_dir[out_dir.find(_VIRTUAL_IMPORTS) + 1:], + ) + return struct(path = context.genfiles_dir.path, import_path = None) + +def is_in_virtual_imports(source_file, virtual_folder = _VIRTUAL_IMPORTS): + """Determines if source_file is virtual (is placed in _virtual_imports + subdirectory). The output of all proto_library targets which use + import_prefix and/or strip_import_prefix arguments is placed under + _virtual_imports directory. + + Args: + source_file: A proto file. + virtual_folder: The virtual folder name (is set to "_virtual_imports" + by default) + Returns: + True if source_file is located under _virtual_imports, False otherwise. + """ + return not source_file.is_source and virtual_folder in source_file.path diff --git a/bazel/python_rules.bzl b/bazel/python_rules.bzl new file mode 100644 index 00000000..39fee5d4 --- /dev/null +++ b/bazel/python_rules.bzl @@ -0,0 +1,293 @@ +"""Generates and compiles Python gRPC stubs from proto_library rules.""" + +load("@rules_proto//proto:defs.bzl", "ProtoInfo") +load( + "//bazel:protobuf.bzl", + "declare_out_files", + "get_include_directory", + "get_out_dir", + "get_plugin_args", + "get_proto_arguments", + "includes_from_deps", + "protos_from_context", +) + +_GENERATED_PROTO_FORMAT = "{}_pb2.py" +_GENERATED_GRPC_PROTO_FORMAT = "{}_pb2_grpc.py" + +def _generate_py_impl(context): + protos = protos_from_context(context) + includes = includes_from_deps(context.attr.deps) + out_files = declare_out_files(protos, context, _GENERATED_PROTO_FORMAT) + tools = [context.executable._protoc] + + out_dir = get_out_dir(protos, context) + arguments = ([ + "--python_out={}".format(out_dir.path), + ] + [ + "--proto_path={}".format(get_include_directory(i)) + for i in includes + ] + [ + "--proto_path={}".format(context.genfiles_dir.path), + ]) + if context.attr.plugin: + arguments += get_plugin_args( + context.executable.plugin, + [], + out_dir.path, + False, + context.attr.plugin.label.name, + ) + tools.append(context.executable.plugin) + + arguments += get_proto_arguments(protos, context.genfiles_dir.path) + + context.actions.run( + inputs = protos + includes, + tools = tools, + outputs = out_files, + executable = context.executable._protoc, + arguments = arguments, + mnemonic = "ProtocInvocation", + ) + + imports = [] + if out_dir.import_path: + imports.append("__main__/%s" % out_dir.import_path) + + return [ + DefaultInfo(files = depset(direct = out_files)), + PyInfo( + transitive_sources = depset(), + imports = depset(direct = imports), + ), + ] + +_generate_pb2_src = rule( + attrs = { + "deps": attr.label_list( + mandatory = True, + allow_empty = False, + providers = [ProtoInfo], + ), + "plugin": attr.label( + mandatory = False, + executable = True, + providers = ["files_to_run"], + cfg = "host", + ), + "_protoc": attr.label( + default = Label("//external:protocol_compiler"), + providers = ["files_to_run"], + executable = True, + cfg = "host", + ), + }, + implementation = _generate_py_impl, +) + +def py_proto_library( + name, + deps, + plugin = None, + **kwargs): + """Generate python code for a protobuf. + + Args: + name: The name of the target. + deps: A list of proto_library dependencies. Must contain a single element. + plugin: An optional custom protoc plugin to execute together with + generating the protobuf code. + **kwargs: Additional arguments to be supplied to the invocation of + py_library. + """ + codegen_target = "_{}_codegen".format(name) + if len(deps) != 1: + fail("Can only compile a single proto at a time.") + + _generate_pb2_src( + name = codegen_target, + deps = deps, + plugin = plugin, + **kwargs + ) + + native.py_library( + name = name, + srcs = [":{}".format(codegen_target)], + deps = [ + "@com_google_protobuf//:protobuf_python", + ":{}".format(codegen_target), + ], + **kwargs + ) + +def _generate_pb2_grpc_src_impl(context): + protos = protos_from_context(context) + includes = includes_from_deps(context.attr.deps) + out_files = declare_out_files(protos, context, _GENERATED_GRPC_PROTO_FORMAT) + + plugin_flags = ["grpc_2_0"] + context.attr.strip_prefixes + + arguments = [] + tools = [context.executable._protoc, context.executable._grpc_plugin] + out_dir = get_out_dir(protos, context) + arguments += get_plugin_args( + context.executable._grpc_plugin, + plugin_flags, + out_dir.path, + False, + ) + if context.attr.plugin: + arguments += get_plugin_args( + context.executable.plugin, + [], + out_dir.path, + False, + context.attr.plugin.label.name, + ) + tools.append(context.executable.plugin) + + arguments += [ + "--proto_path={}".format(get_include_directory(i)) + for i in includes + ] + arguments += ["--proto_path={}".format(context.genfiles_dir.path)] + arguments += get_proto_arguments(protos, context.genfiles_dir.path) + + context.actions.run( + inputs = protos + includes, + tools = tools, + outputs = out_files, + executable = context.executable._protoc, + arguments = arguments, + mnemonic = "ProtocInvocation", + ) + + imports = [] + if out_dir.import_path: + imports.append("__main__/%s" % out_dir.import_path) + + return [ + DefaultInfo(files = depset(direct = out_files)), + PyInfo( + transitive_sources = depset(), + imports = depset(direct = imports), + ), + ] + +_generate_pb2_grpc_src = rule( + attrs = { + "deps": attr.label_list( + mandatory = True, + allow_empty = False, + providers = [ProtoInfo], + ), + "strip_prefixes": attr.string_list(), + "plugin": attr.label( + mandatory = False, + executable = True, + providers = ["files_to_run"], + cfg = "host", + ), + "_grpc_plugin": attr.label( + executable = True, + providers = ["files_to_run"], + cfg = "host", + default = Label("//src/compiler:grpc_python_plugin"), + ), + "_protoc": attr.label( + executable = True, + providers = ["files_to_run"], + cfg = "host", + default = Label("//external:protocol_compiler"), + ), + }, + implementation = _generate_pb2_grpc_src_impl, +) + +def py_grpc_library( + name, + srcs, + deps, + plugin = None, + strip_prefixes = [], + **kwargs): + """Generate python code for gRPC services defined in a protobuf. + + Args: + name: The name of the target. + srcs: (List of `labels`) a single proto_library target containing the + schema of the service. + deps: (List of `labels`) a single py_proto_library target for the + proto_library in `srcs`. + strip_prefixes: (List of `strings`) If provided, this prefix will be + stripped from the beginning of foo_pb2 modules imported by the + generated stubs. This is useful in combination with the `imports` + attribute of the `py_library` rule. + plugin: An optional custom protoc plugin to execute together with + generating the gRPC code. + **kwargs: Additional arguments to be supplied to the invocation of + py_library. + """ + codegen_grpc_target = "_{}_grpc_codegen".format(name) + if len(srcs) != 1: + fail("Can only compile a single proto at a time.") + + if len(deps) != 1: + fail("Deps must have length 1.") + + _generate_pb2_grpc_src( + name = codegen_grpc_target, + deps = srcs, + strip_prefixes = strip_prefixes, + plugin = plugin, + **kwargs + ) + + native.py_library( + name = name, + srcs = [ + ":{}".format(codegen_grpc_target), + ], + deps = [ + Label("//src/python/grpcio/grpc:grpcio"), + ] + deps + [ + ":{}".format(codegen_grpc_target), + ], + **kwargs + ) + +def py2and3_test( + name, + py_test = native.py_test, + **kwargs): + """Runs a Python test under both Python 2 and Python 3. + + Args: + name: The name of the test. + py_test: The rule to use for each test. + **kwargs: Keyword arguments passed directly to the underlying py_test + rule. + """ + if "python_version" in kwargs: + fail("Cannot specify 'python_version' in py2and3_test.") + + names = [name + suffix for suffix in (".python2", ".python3")] + python_versions = ["PY2", "PY3"] + for case_name, python_version in zip(names, python_versions): + py_test( + name = case_name, + python_version = python_version, + **kwargs + ) + + suite_kwargs = {} + if "visibility" in kwargs: + suite_kwargs["visibility"] = kwargs["visibility"] + + native.test_suite( + name = name, + tests = names, + **suite_kwargs + ) diff --git a/bazel/test/python_test_repo/.gitignore b/bazel/test/python_test_repo/.gitignore new file mode 100644 index 00000000..7146a250 --- /dev/null +++ b/bazel/test/python_test_repo/.gitignore @@ -0,0 +1,2 @@ +bazel-* +tools/bazel-* diff --git a/bazel/test/python_test_repo/BUILD b/bazel/test/python_test_repo/BUILD new file mode 100644 index 00000000..fb23cf33 --- /dev/null +++ b/bazel/test/python_test_repo/BUILD @@ -0,0 +1,114 @@ +# gRPC Bazel BUILD file. +# +# Copyright 2019 The gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("@rules_proto//proto:defs.bzl", "proto_library") +load( + "@com_github_grpc_grpc//bazel:python_rules.bzl", + "py2and3_test", + "py_grpc_library", + "py_proto_library", +) + +package(default_testonly = 1) + +proto_library( + name = "helloworld_proto", + srcs = ["helloworld.proto"], + deps = [ + "@com_google_protobuf//:duration_proto", + "@com_google_protobuf//:timestamp_proto", + ], +) + +py_proto_library( + name = "helloworld_py_pb2", + deps = [":helloworld_proto"], +) + +py_grpc_library( + name = "helloworld_py_pb2_grpc", + srcs = [":helloworld_proto"], + deps = [":helloworld_py_pb2"], +) + +py_proto_library( + name = "duration_py_pb2", + deps = ["@com_google_protobuf//:duration_proto"], +) + +py_proto_library( + name = "timestamp_py_pb2", + deps = ["@com_google_protobuf//:timestamp_proto"], +) + +py2and3_test( + name = "import_test", + srcs = ["helloworld.py"], + main = "helloworld.py", + deps = [ + ":duration_py_pb2", + ":helloworld_py_pb2", + ":helloworld_py_pb2_grpc", + ":timestamp_py_pb2", + ], +) + +# Test compatibility of py_proto_library and py_grpc_library rules with +# proto_library targets as deps when the latter use import_prefix and/or +# strip_import_prefix arguments +proto_library( + name = "helloworld_moved_proto", + srcs = ["helloworld.proto"], + import_prefix = "google/cloud", + strip_import_prefix = "", + deps = [ + "@com_google_protobuf//:duration_proto", + "@com_google_protobuf//:timestamp_proto", + ], +) + +# Also test the custom plugin execution parameter +py_proto_library( + name = "helloworld_moved_py_pb2", + plugin = ":dummy_plugin", + deps = [":helloworld_moved_proto"], +) + +py_grpc_library( + name = "helloworld_moved_py_pb2_grpc", + srcs = [":helloworld_moved_proto"], + deps = [":helloworld_moved_py_pb2"], +) + +py2and3_test( + name = "import_moved_test", + srcs = ["helloworld_moved.py"], + main = "helloworld_moved.py", + deps = [ + ":duration_py_pb2", + ":helloworld_moved_py_pb2", + ":helloworld_moved_py_pb2_grpc", + ":timestamp_py_pb2", + ], +) + +py_binary( + name = "dummy_plugin", + srcs = [":dummy_plugin.py"], + deps = [ + "@com_google_protobuf//:protobuf_python", + ], +) diff --git a/bazel/test/python_test_repo/README.md b/bazel/test/python_test_repo/README.md new file mode 100644 index 00000000..d9dfd1d9 --- /dev/null +++ b/bazel/test/python_test_repo/README.md @@ -0,0 +1,5 @@ +## Bazel Workspace Test + +This directory houses a test ensuring that downstream projects can use +`@com_github_grpc_grpc//src/python/grpcio:grpcio`, `py_proto_library`, and +`py_grpc_library`. diff --git a/bazel/test/python_test_repo/WORKSPACE b/bazel/test/python_test_repo/WORKSPACE new file mode 100644 index 00000000..94e5c684 --- /dev/null +++ b/bazel/test/python_test_repo/WORKSPACE @@ -0,0 +1,12 @@ +local_repository( + name = "com_github_grpc_grpc", + path = "../../..", +) + +load("@com_github_grpc_grpc//bazel:grpc_deps.bzl", "grpc_deps") + +grpc_deps() + +load("@com_github_grpc_grpc//bazel:grpc_extra_deps.bzl", "grpc_extra_deps") + +grpc_extra_deps() diff --git a/bazel/test/python_test_repo/dummy_plugin.py b/bazel/test/python_test_repo/dummy_plugin.py new file mode 100644 index 00000000..a7e3a017 --- /dev/null +++ b/bazel/test/python_test_repo/dummy_plugin.py @@ -0,0 +1,37 @@ +# Copyright 2019 the gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""A dummy plugin for testing""" + +import sys + +from google.protobuf.compiler.plugin_pb2 import CodeGeneratorRequest +from google.protobuf.compiler.plugin_pb2 import CodeGeneratorResponse + + +def main(input_file=sys.stdin, output_file=sys.stdout): + request = CodeGeneratorRequest.FromString(input_file.buffer.read()) + answer = [] + for fname in request.file_to_generate: + answer.append(CodeGeneratorResponse.File( + name=fname.replace('.proto', '_pb2.py'), + insertion_point='module_scope', + content="# Hello {}, I'm a dummy plugin!".format(fname), + )) + + cgr = CodeGeneratorResponse(file=answer) + output_file.buffer.write(cgr.SerializeToString()) + + +if __name__ == '__main__': + main() diff --git a/bazel/test/python_test_repo/helloworld.proto b/bazel/test/python_test_repo/helloworld.proto new file mode 100644 index 00000000..b333a740 --- /dev/null +++ b/bazel/test/python_test_repo/helloworld.proto @@ -0,0 +1,43 @@ +// Copyright 2019 The gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +option java_multiple_files = true; +option java_package = "io.grpc.examples.helloworld"; +option java_outer_classname = "HelloWorldProto"; +option objc_class_prefix = "HLW"; + +package helloworld; + +import "google/protobuf/timestamp.proto"; +import "google/protobuf/duration.proto"; + +// The greeting service definition. +service Greeter { + // Sends a greeting + rpc SayHello (HelloRequest) returns (HelloReply) {} +} + +// The request message containing the user's name. +message HelloRequest { + string name = 1; + google.protobuf.Timestamp request_initiation = 2; +} + +// The response message containing the greetings +message HelloReply { + string message = 1; + google.protobuf.Duration request_duration = 2; +} diff --git a/bazel/test/python_test_repo/helloworld.py b/bazel/test/python_test_repo/helloworld.py new file mode 100644 index 00000000..3f87191e --- /dev/null +++ b/bazel/test/python_test_repo/helloworld.py @@ -0,0 +1,76 @@ +# Copyright 2019 the gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""The Python implementation of the GRPC helloworld.Greeter client.""" + +import contextlib +import datetime +import logging +import unittest + +import grpc + +from google.protobuf import duration_pb2 +from google.protobuf import timestamp_pb2 +from concurrent import futures +import helloworld_pb2 +import helloworld_pb2_grpc + +_HOST = 'localhost' +_SERVER_ADDRESS = '{}:0'.format(_HOST) + + +class Greeter(helloworld_pb2_grpc.GreeterServicer): + + def SayHello(self, request, context): + request_in_flight = datetime.datetime.now() - \ + request.request_initiation.ToDatetime() + request_duration = duration_pb2.Duration() + request_duration.FromTimedelta(request_in_flight) + return helloworld_pb2.HelloReply( + message='Hello, %s!' % request.name, + request_duration=request_duration, + ) + + +@contextlib.contextmanager +def _listening_server(): + server = grpc.server(futures.ThreadPoolExecutor()) + helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server) + port = server.add_insecure_port(_SERVER_ADDRESS) + server.start() + try: + yield port + finally: + server.stop(0) + + +class ImportTest(unittest.TestCase): + def test_import(self): + with _listening_server() as port: + with grpc.insecure_channel('{}:{}'.format(_HOST, port)) as channel: + stub = helloworld_pb2_grpc.GreeterStub(channel) + request_timestamp = timestamp_pb2.Timestamp() + request_timestamp.GetCurrentTime() + response = stub.SayHello(helloworld_pb2.HelloRequest( + name='you', + request_initiation=request_timestamp, + ), + wait_for_ready=True) + self.assertEqual(response.message, "Hello, you!") + self.assertGreater(response.request_duration.nanos, 0) + + +if __name__ == '__main__': + logging.basicConfig() + unittest.main() diff --git a/bazel/test/python_test_repo/helloworld_moved.py b/bazel/test/python_test_repo/helloworld_moved.py new file mode 100644 index 00000000..b32042cd --- /dev/null +++ b/bazel/test/python_test_repo/helloworld_moved.py @@ -0,0 +1,76 @@ +# Copyright 2019 the gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""The Python implementation of the GRPC helloworld.Greeter client.""" + +import contextlib +import datetime +import logging +import unittest + +import grpc + +from google.protobuf import duration_pb2 +from google.protobuf import timestamp_pb2 +from concurrent import futures +from google.cloud import helloworld_pb2 +from google.cloud import helloworld_pb2_grpc + +_HOST = 'localhost' +_SERVER_ADDRESS = '{}:0'.format(_HOST) + + +class Greeter(helloworld_pb2_grpc.GreeterServicer): + + def SayHello(self, request, context): + request_in_flight = datetime.datetime.now() - \ + request.request_initiation.ToDatetime() + request_duration = duration_pb2.Duration() + request_duration.FromTimedelta(request_in_flight) + return helloworld_pb2.HelloReply( + message='Hello, %s!' % request.name, + request_duration=request_duration, + ) + + +@contextlib.contextmanager +def _listening_server(): + server = grpc.server(futures.ThreadPoolExecutor()) + helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server) + port = server.add_insecure_port(_SERVER_ADDRESS) + server.start() + try: + yield port + finally: + server.stop(0) + + +class ImportTest(unittest.TestCase): + def test_import(self): + with _listening_server() as port: + with grpc.insecure_channel('{}:{}'.format(_HOST, port)) as channel: + stub = helloworld_pb2_grpc.GreeterStub(channel) + request_timestamp = timestamp_pb2.Timestamp() + request_timestamp.GetCurrentTime() + response = stub.SayHello(helloworld_pb2.HelloRequest( + name='you', + request_initiation=request_timestamp, + ), + wait_for_ready=True) + self.assertEqual(response.message, "Hello, you!") + self.assertGreater(response.request_duration.nanos, 0) + + +if __name__ == '__main__': + logging.basicConfig() + unittest.main() diff --git a/bazel/test/python_test_repo/tools/bazel b/bazel/test/python_test_repo/tools/bazel new file mode 120000 index 00000000..ad4a1267 --- /dev/null +++ b/bazel/test/python_test_repo/tools/bazel @@ -0,0 +1 @@ +../../../../tools/bazel \ No newline at end of file diff --git a/bazel/update_mirror.sh b/bazel/update_mirror.sh new file mode 100755 index 00000000..7c2fe465 --- /dev/null +++ b/bazel/update_mirror.sh @@ -0,0 +1,63 @@ +#!/bin/bash +# Copyright 2020 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Script to upload github archives for bazel dependencies to GCS, creating a reliable mirror link. +# Archives are copied to "grpc-bazel-mirror" GCS bucket (https://console.cloud.google.com/storage/browser/grpc-bazel-mirror?project=grpc-testing) +# and will by downloadable with the https://storage.googleapis.com/grpc-bazel-mirror/ prefix. +# +# This script should be run each time bazel dependencies are updated. + +set -e + +cd $(dirname $0)/.. + +# Create a temp directory to hold the versioned tarball, +# and clean it up when the script exits. +tmpdir="$(mktemp -d)" +function cleanup { + rm -rf "$tmpdir" +} +trap cleanup EXIT + +function upload { + local file="$1" + + echo "Downloading https://${file}" + curl -L --fail --output "${tmpdir}/archive" "https://${file}" + + echo "Uploading https://${file} to https://storage.googleapis.com/grpc-bazel-mirror/${file}" + gsutil cp -n "${tmpdir}/archive" "gs://grpc-bazel-mirror/${file}" # "-n" will skip existing files + + rm -rf "${tmpdir}/archive" +} + +# How to check that all mirror URLs work: +# 1. clean $HOME/.cache/bazel +# 2. bazel clean --expunge +# 3. bazel sync (failed downloads will print warnings) + +# A specific link can be upload manually by running e.g. +# upload "github.com/google/boringssl/archive/1c2769383f027befac5b75b6cedd25daf3bf4dcf.tar.gz" + +# bazel binaries used by the tools/bazel wrapper script +upload github.com/bazelbuild/bazel/releases/download/1.0.0/bazel-1.0.0-linux-x86_64 +upload github.com/bazelbuild/bazel/releases/download/1.0.0/bazel-1.0.0-darwin-x86_64 +upload github.com/bazelbuild/bazel/releases/download/1.0.0/bazel-1.0.0-windows-x86_64.exe + +# Collect the github archives to mirror from grpc_deps.bzl +grep -o '"https://github.com/[^"]*"' bazel/grpc_deps.bzl | sed 's/^"https:\/\///' | sed 's/"$//' | while read -r line ; do + echo "Updating mirror for ${line}" + upload "${line}" +done diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml new file mode 100644 index 00000000..2febe492 --- /dev/null +++ b/build_autogenerated.yaml @@ -0,0 +1,7607 @@ +filegroups: [] +libs: +- name: address_sorting + build: all + language: c + public_headers: [] + headers: + - third_party/address_sorting/address_sorting_internal.h + - third_party/address_sorting/include/address_sorting/address_sorting.h + src: + - third_party/address_sorting/address_sorting.c + - third_party/address_sorting/address_sorting_posix.c + - third_party/address_sorting/address_sorting_windows.c + deps: [] + secure: false +- name: end2end_nosec_tests + build: private + language: c + public_headers: [] + headers: + - test/core/end2end/cq_verifier.h + - test/core/end2end/data/ssl_test_data.h + - test/core/end2end/end2end_tests.h + - test/core/end2end/fixtures/http_proxy_fixture.h + - test/core/end2end/fixtures/local_util.h + - test/core/end2end/fixtures/proxy.h + - test/core/end2end/tests/cancel_test_helpers.h + src: + - test/core/end2end/cq_verifier.cc + - test/core/end2end/data/client_certs.cc + - test/core/end2end/data/server1_cert.cc + - test/core/end2end/data/server1_key.cc + - test/core/end2end/data/test_root_cert.cc + - test/core/end2end/end2end_nosec_tests.cc + - test/core/end2end/end2end_test_utils.cc + - test/core/end2end/fixtures/http_proxy_fixture.cc + - test/core/end2end/fixtures/local_util.cc + - test/core/end2end/fixtures/proxy.cc + - test/core/end2end/tests/authority_not_supported.cc + - test/core/end2end/tests/bad_hostname.cc + - test/core/end2end/tests/bad_ping.cc + - test/core/end2end/tests/binary_metadata.cc + - test/core/end2end/tests/call_host_override.cc + - test/core/end2end/tests/cancel_after_accept.cc + - test/core/end2end/tests/cancel_after_client_done.cc + - test/core/end2end/tests/cancel_after_invoke.cc + - test/core/end2end/tests/cancel_after_round_trip.cc + - test/core/end2end/tests/cancel_before_invoke.cc + - test/core/end2end/tests/cancel_in_a_vacuum.cc + - test/core/end2end/tests/cancel_with_status.cc + - test/core/end2end/tests/channelz.cc + - test/core/end2end/tests/client_streaming.cc + - test/core/end2end/tests/compressed_payload.cc + - test/core/end2end/tests/connectivity.cc + - test/core/end2end/tests/default_host.cc + - test/core/end2end/tests/disappearing_server.cc + - test/core/end2end/tests/empty_batch.cc + - test/core/end2end/tests/filter_call_init_fails.cc + - test/core/end2end/tests/filter_causes_close.cc + - test/core/end2end/tests/filter_context.cc + - test/core/end2end/tests/filter_latency.cc + - test/core/end2end/tests/filter_status_code.cc + - test/core/end2end/tests/graceful_server_shutdown.cc + - test/core/end2end/tests/high_initial_seqno.cc + - test/core/end2end/tests/hpack_size.cc + - test/core/end2end/tests/idempotent_request.cc + - test/core/end2end/tests/invoke_large_request.cc + - test/core/end2end/tests/keepalive_timeout.cc + - test/core/end2end/tests/large_metadata.cc + - test/core/end2end/tests/max_concurrent_streams.cc + - test/core/end2end/tests/max_connection_age.cc + - test/core/end2end/tests/max_connection_idle.cc + - test/core/end2end/tests/max_message_length.cc + - test/core/end2end/tests/negative_deadline.cc + - test/core/end2end/tests/no_error_on_hotpath.cc + - test/core/end2end/tests/no_logging.cc + - test/core/end2end/tests/no_op.cc + - test/core/end2end/tests/payload.cc + - test/core/end2end/tests/ping.cc + - test/core/end2end/tests/ping_pong_streaming.cc + - test/core/end2end/tests/proxy_auth.cc + - test/core/end2end/tests/registered_call.cc + - test/core/end2end/tests/request_with_flags.cc + - test/core/end2end/tests/request_with_payload.cc + - test/core/end2end/tests/resource_quota_server.cc + - test/core/end2end/tests/retry.cc + - test/core/end2end/tests/retry_cancellation.cc + - test/core/end2end/tests/retry_disabled.cc + - test/core/end2end/tests/retry_exceeds_buffer_size_in_initial_batch.cc + - test/core/end2end/tests/retry_exceeds_buffer_size_in_subsequent_batch.cc + - test/core/end2end/tests/retry_non_retriable_status.cc + - test/core/end2end/tests/retry_non_retriable_status_before_recv_trailing_metadata_started.cc + - test/core/end2end/tests/retry_recv_initial_metadata.cc + - test/core/end2end/tests/retry_recv_message.cc + - test/core/end2end/tests/retry_server_pushback_delay.cc + - test/core/end2end/tests/retry_server_pushback_disabled.cc + - test/core/end2end/tests/retry_streaming.cc + - test/core/end2end/tests/retry_streaming_after_commit.cc + - test/core/end2end/tests/retry_streaming_succeeds_before_replay_finished.cc + - test/core/end2end/tests/retry_throttled.cc + - test/core/end2end/tests/retry_too_many_attempts.cc + - test/core/end2end/tests/server_finishes_request.cc + - test/core/end2end/tests/shutdown_finishes_calls.cc + - test/core/end2end/tests/shutdown_finishes_tags.cc + - test/core/end2end/tests/simple_cacheable_request.cc + - test/core/end2end/tests/simple_delayed_request.cc + - test/core/end2end/tests/simple_metadata.cc + - test/core/end2end/tests/simple_request.cc + - test/core/end2end/tests/stream_compression_compressed_payload.cc + - test/core/end2end/tests/stream_compression_payload.cc + - test/core/end2end/tests/stream_compression_ping_pong_streaming.cc + - test/core/end2end/tests/streaming_error_response.cc + - test/core/end2end/tests/trailing_metadata.cc + - test/core/end2end/tests/workaround_cronet_compression.cc + - test/core/end2end/tests/write_buffering.cc + - test/core/end2end/tests/write_buffering_at_end.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + secure: false +- name: end2end_tests + build: private + language: c + public_headers: [] + headers: + - test/core/end2end/cq_verifier.h + - test/core/end2end/data/ssl_test_data.h + - test/core/end2end/end2end_tests.h + - test/core/end2end/fixtures/http_proxy_fixture.h + - test/core/end2end/fixtures/local_util.h + - test/core/end2end/fixtures/proxy.h + - test/core/end2end/tests/cancel_test_helpers.h + src: + - test/core/end2end/cq_verifier.cc + - test/core/end2end/data/client_certs.cc + - test/core/end2end/data/server1_cert.cc + - test/core/end2end/data/server1_key.cc + - test/core/end2end/data/test_root_cert.cc + - test/core/end2end/end2end_test_utils.cc + - test/core/end2end/end2end_tests.cc + - test/core/end2end/fixtures/http_proxy_fixture.cc + - test/core/end2end/fixtures/local_util.cc + - test/core/end2end/fixtures/proxy.cc + - test/core/end2end/tests/authority_not_supported.cc + - test/core/end2end/tests/bad_hostname.cc + - test/core/end2end/tests/bad_ping.cc + - test/core/end2end/tests/binary_metadata.cc + - test/core/end2end/tests/call_creds.cc + - test/core/end2end/tests/call_host_override.cc + - test/core/end2end/tests/cancel_after_accept.cc + - test/core/end2end/tests/cancel_after_client_done.cc + - test/core/end2end/tests/cancel_after_invoke.cc + - test/core/end2end/tests/cancel_after_round_trip.cc + - test/core/end2end/tests/cancel_before_invoke.cc + - test/core/end2end/tests/cancel_in_a_vacuum.cc + - test/core/end2end/tests/cancel_with_status.cc + - test/core/end2end/tests/channelz.cc + - test/core/end2end/tests/client_streaming.cc + - test/core/end2end/tests/compressed_payload.cc + - test/core/end2end/tests/connectivity.cc + - test/core/end2end/tests/default_host.cc + - test/core/end2end/tests/disappearing_server.cc + - test/core/end2end/tests/empty_batch.cc + - test/core/end2end/tests/filter_call_init_fails.cc + - test/core/end2end/tests/filter_causes_close.cc + - test/core/end2end/tests/filter_context.cc + - test/core/end2end/tests/filter_latency.cc + - test/core/end2end/tests/filter_status_code.cc + - test/core/end2end/tests/graceful_server_shutdown.cc + - test/core/end2end/tests/high_initial_seqno.cc + - test/core/end2end/tests/hpack_size.cc + - test/core/end2end/tests/idempotent_request.cc + - test/core/end2end/tests/invoke_large_request.cc + - test/core/end2end/tests/keepalive_timeout.cc + - test/core/end2end/tests/large_metadata.cc + - test/core/end2end/tests/max_concurrent_streams.cc + - test/core/end2end/tests/max_connection_age.cc + - test/core/end2end/tests/max_connection_idle.cc + - test/core/end2end/tests/max_message_length.cc + - test/core/end2end/tests/negative_deadline.cc + - test/core/end2end/tests/no_error_on_hotpath.cc + - test/core/end2end/tests/no_logging.cc + - test/core/end2end/tests/no_op.cc + - test/core/end2end/tests/payload.cc + - test/core/end2end/tests/ping.cc + - test/core/end2end/tests/ping_pong_streaming.cc + - test/core/end2end/tests/proxy_auth.cc + - test/core/end2end/tests/registered_call.cc + - test/core/end2end/tests/request_with_flags.cc + - test/core/end2end/tests/request_with_payload.cc + - test/core/end2end/tests/resource_quota_server.cc + - test/core/end2end/tests/retry.cc + - test/core/end2end/tests/retry_cancellation.cc + - test/core/end2end/tests/retry_disabled.cc + - test/core/end2end/tests/retry_exceeds_buffer_size_in_initial_batch.cc + - test/core/end2end/tests/retry_exceeds_buffer_size_in_subsequent_batch.cc + - test/core/end2end/tests/retry_non_retriable_status.cc + - test/core/end2end/tests/retry_non_retriable_status_before_recv_trailing_metadata_started.cc + - test/core/end2end/tests/retry_recv_initial_metadata.cc + - test/core/end2end/tests/retry_recv_message.cc + - test/core/end2end/tests/retry_server_pushback_delay.cc + - test/core/end2end/tests/retry_server_pushback_disabled.cc + - test/core/end2end/tests/retry_streaming.cc + - test/core/end2end/tests/retry_streaming_after_commit.cc + - test/core/end2end/tests/retry_streaming_succeeds_before_replay_finished.cc + - test/core/end2end/tests/retry_throttled.cc + - test/core/end2end/tests/retry_too_many_attempts.cc + - test/core/end2end/tests/server_finishes_request.cc + - test/core/end2end/tests/shutdown_finishes_calls.cc + - test/core/end2end/tests/shutdown_finishes_tags.cc + - test/core/end2end/tests/simple_cacheable_request.cc + - test/core/end2end/tests/simple_delayed_request.cc + - test/core/end2end/tests/simple_metadata.cc + - test/core/end2end/tests/simple_request.cc + - test/core/end2end/tests/stream_compression_compressed_payload.cc + - test/core/end2end/tests/stream_compression_payload.cc + - test/core/end2end/tests/stream_compression_ping_pong_streaming.cc + - test/core/end2end/tests/streaming_error_response.cc + - test/core/end2end/tests/trailing_metadata.cc + - test/core/end2end/tests/workaround_cronet_compression.cc + - test/core/end2end/tests/write_buffering.cc + - test/core/end2end/tests/write_buffering_at_end.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + secure: true +- name: gpr + build: all + language: c + public_headers: + - include/grpc/impl/codegen/atm.h + - include/grpc/impl/codegen/atm_gcc_atomic.h + - include/grpc/impl/codegen/atm_gcc_sync.h + - include/grpc/impl/codegen/atm_windows.h + - include/grpc/impl/codegen/byte_buffer.h + - include/grpc/impl/codegen/byte_buffer_reader.h + - include/grpc/impl/codegen/compression_types.h + - include/grpc/impl/codegen/connectivity_state.h + - include/grpc/impl/codegen/fork.h + - include/grpc/impl/codegen/gpr_slice.h + - include/grpc/impl/codegen/gpr_types.h + - include/grpc/impl/codegen/grpc_types.h + - include/grpc/impl/codegen/log.h + - include/grpc/impl/codegen/port_platform.h + - include/grpc/impl/codegen/propagation_bits.h + - include/grpc/impl/codegen/slice.h + - include/grpc/impl/codegen/status.h + - include/grpc/impl/codegen/sync.h + - include/grpc/impl/codegen/sync_abseil.h + - include/grpc/impl/codegen/sync_custom.h + - include/grpc/impl/codegen/sync_generic.h + - include/grpc/impl/codegen/sync_posix.h + - include/grpc/impl/codegen/sync_windows.h + - include/grpc/support/alloc.h + - include/grpc/support/atm.h + - include/grpc/support/atm_gcc_atomic.h + - include/grpc/support/atm_gcc_sync.h + - include/grpc/support/atm_windows.h + - include/grpc/support/cpu.h + - include/grpc/support/log.h + - include/grpc/support/log_windows.h + - include/grpc/support/port_platform.h + - include/grpc/support/string_util.h + - include/grpc/support/sync.h + - include/grpc/support/sync_abseil.h + - include/grpc/support/sync_custom.h + - include/grpc/support/sync_generic.h + - include/grpc/support/sync_posix.h + - include/grpc/support/sync_windows.h + - include/grpc/support/thd_id.h + - include/grpc/support/time.h + headers: + - src/core/lib/gpr/alloc.h + - src/core/lib/gpr/arena.h + - src/core/lib/gpr/env.h + - src/core/lib/gpr/murmur_hash.h + - src/core/lib/gpr/spinlock.h + - src/core/lib/gpr/string.h + - src/core/lib/gpr/string_windows.h + - src/core/lib/gpr/time_precise.h + - src/core/lib/gpr/tls.h + - src/core/lib/gpr/tls_gcc.h + - src/core/lib/gpr/tls_msvc.h + - src/core/lib/gpr/tls_pthread.h + - src/core/lib/gpr/tmpfile.h + - src/core/lib/gpr/useful.h + - src/core/lib/gprpp/arena.h + - src/core/lib/gprpp/atomic.h + - src/core/lib/gprpp/fork.h + - src/core/lib/gprpp/global_config.h + - src/core/lib/gprpp/global_config_custom.h + - src/core/lib/gprpp/global_config_env.h + - src/core/lib/gprpp/global_config_generic.h + - src/core/lib/gprpp/host_port.h + - src/core/lib/gprpp/manual_constructor.h + - src/core/lib/gprpp/map.h + - src/core/lib/gprpp/memory.h + - src/core/lib/gprpp/mpscq.h + - src/core/lib/gprpp/sync.h + - src/core/lib/gprpp/thd.h + - src/core/lib/profiling/timers.h + src: + - src/core/lib/gpr/alloc.cc + - src/core/lib/gpr/atm.cc + - src/core/lib/gpr/cpu_iphone.cc + - src/core/lib/gpr/cpu_linux.cc + - src/core/lib/gpr/cpu_posix.cc + - src/core/lib/gpr/cpu_windows.cc + - src/core/lib/gpr/env_linux.cc + - src/core/lib/gpr/env_posix.cc + - src/core/lib/gpr/env_windows.cc + - src/core/lib/gpr/log.cc + - src/core/lib/gpr/log_android.cc + - src/core/lib/gpr/log_linux.cc + - src/core/lib/gpr/log_posix.cc + - src/core/lib/gpr/log_windows.cc + - src/core/lib/gpr/murmur_hash.cc + - src/core/lib/gpr/string.cc + - src/core/lib/gpr/string_posix.cc + - src/core/lib/gpr/string_util_windows.cc + - src/core/lib/gpr/string_windows.cc + - src/core/lib/gpr/sync.cc + - src/core/lib/gpr/sync_abseil.cc + - src/core/lib/gpr/sync_posix.cc + - src/core/lib/gpr/sync_windows.cc + - src/core/lib/gpr/time.cc + - src/core/lib/gpr/time_posix.cc + - src/core/lib/gpr/time_precise.cc + - src/core/lib/gpr/time_windows.cc + - src/core/lib/gpr/tls_pthread.cc + - src/core/lib/gpr/tmpfile_msys.cc + - src/core/lib/gpr/tmpfile_posix.cc + - src/core/lib/gpr/tmpfile_windows.cc + - src/core/lib/gpr/wrap_memcpy.cc + - src/core/lib/gprpp/arena.cc + - src/core/lib/gprpp/fork.cc + - src/core/lib/gprpp/global_config_env.cc + - src/core/lib/gprpp/host_port.cc + - src/core/lib/gprpp/mpscq.cc + - src/core/lib/gprpp/thd_posix.cc + - src/core/lib/gprpp/thd_windows.cc + - src/core/lib/profiling/basic_timers.cc + - src/core/lib/profiling/stap_timers.cc + deps: + - absl/time:time + - absl/strings:strings + - absl/strings:str_format + - absl/memory:memory + secure: false +- name: grpc + build: all + language: c + public_headers: + - include/grpc/byte_buffer.h + - include/grpc/byte_buffer_reader.h + - include/grpc/census.h + - include/grpc/compression.h + - include/grpc/fork.h + - include/grpc/grpc.h + - include/grpc/grpc_posix.h + - include/grpc/grpc_security.h + - include/grpc/grpc_security_constants.h + - include/grpc/load_reporting.h + - include/grpc/slice.h + - include/grpc/slice_buffer.h + - include/grpc/status.h + - include/grpc/support/workaround_list.h + headers: + - src/core/ext/filters/client_channel/backend_metric.h + - src/core/ext/filters/client_channel/backup_poller.h + - src/core/ext/filters/client_channel/client_channel.h + - src/core/ext/filters/client_channel/client_channel_channelz.h + - src/core/ext/filters/client_channel/client_channel_factory.h + - src/core/ext/filters/client_channel/connector.h + - src/core/ext/filters/client_channel/global_subchannel_pool.h + - src/core/ext/filters/client_channel/health/health_check_client.h + - src/core/ext/filters/client_channel/http_connect_handshaker.h + - src/core/ext/filters/client_channel/http_proxy.h + - src/core/ext/filters/client_channel/lb_policy.h + - src/core/ext/filters/client_channel/lb_policy/address_filtering.h + - src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h + - src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h + - src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h + - src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h + - src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h + - src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h + - src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h + - src/core/ext/filters/client_channel/lb_policy/subchannel_list.h + - src/core/ext/filters/client_channel/lb_policy/xds/xds.h + - src/core/ext/filters/client_channel/lb_policy_factory.h + - src/core/ext/filters/client_channel/lb_policy_registry.h + - src/core/ext/filters/client_channel/local_subchannel_pool.h + - src/core/ext/filters/client_channel/parse_address.h + - src/core/ext/filters/client_channel/proxy_mapper.h + - src/core/ext/filters/client_channel/proxy_mapper_registry.h + - src/core/ext/filters/client_channel/resolver.h + - src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h + - src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h + - src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h + - src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h + - src/core/ext/filters/client_channel/resolver_factory.h + - src/core/ext/filters/client_channel/resolver_registry.h + - src/core/ext/filters/client_channel/resolver_result_parsing.h + - src/core/ext/filters/client_channel/resolving_lb_policy.h + - src/core/ext/filters/client_channel/retry_throttle.h + - src/core/ext/filters/client_channel/server_address.h + - src/core/ext/filters/client_channel/service_config.h + - src/core/ext/filters/client_channel/service_config_call_data.h + - src/core/ext/filters/client_channel/service_config_parser.h + - src/core/ext/filters/client_channel/subchannel.h + - src/core/ext/filters/client_channel/subchannel_interface.h + - src/core/ext/filters/client_channel/subchannel_pool_interface.h + - src/core/ext/filters/client_channel/xds/xds_api.h + - src/core/ext/filters/client_channel/xds/xds_bootstrap.h + - src/core/ext/filters/client_channel/xds/xds_channel.h + - src/core/ext/filters/client_channel/xds/xds_channel_args.h + - src/core/ext/filters/client_channel/xds/xds_client.h + - src/core/ext/filters/client_channel/xds/xds_client_stats.h + - src/core/ext/filters/deadline/deadline_filter.h + - src/core/ext/filters/http/client/http_client_filter.h + - src/core/ext/filters/http/client_authority_filter.h + - src/core/ext/filters/http/message_compress/message_compress_filter.h + - src/core/ext/filters/http/message_compress/message_decompress_filter.h + - src/core/ext/filters/http/server/http_server_filter.h + - src/core/ext/filters/max_age/max_age_filter.h + - src/core/ext/filters/message_size/message_size_filter.h + - src/core/ext/filters/workarounds/workaround_cronet_compression_filter.h + - src/core/ext/filters/workarounds/workaround_utils.h + - src/core/ext/transport/chttp2/alpn/alpn.h + - src/core/ext/transport/chttp2/client/authority.h + - src/core/ext/transport/chttp2/client/chttp2_connector.h + - src/core/ext/transport/chttp2/server/chttp2_server.h + - src/core/ext/transport/chttp2/transport/bin_decoder.h + - src/core/ext/transport/chttp2/transport/bin_encoder.h + - src/core/ext/transport/chttp2/transport/chttp2_transport.h + - src/core/ext/transport/chttp2/transport/context_list.h + - src/core/ext/transport/chttp2/transport/flow_control.h + - src/core/ext/transport/chttp2/transport/frame.h + - src/core/ext/transport/chttp2/transport/frame_data.h + - src/core/ext/transport/chttp2/transport/frame_goaway.h + - src/core/ext/transport/chttp2/transport/frame_ping.h + - src/core/ext/transport/chttp2/transport/frame_rst_stream.h + - src/core/ext/transport/chttp2/transport/frame_settings.h + - src/core/ext/transport/chttp2/transport/frame_window_update.h + - src/core/ext/transport/chttp2/transport/hpack_encoder.h + - src/core/ext/transport/chttp2/transport/hpack_parser.h + - src/core/ext/transport/chttp2/transport/hpack_table.h + - src/core/ext/transport/chttp2/transport/http2_settings.h + - src/core/ext/transport/chttp2/transport/huffsyms.h + - src/core/ext/transport/chttp2/transport/incoming_metadata.h + - src/core/ext/transport/chttp2/transport/internal.h + - src/core/ext/transport/chttp2/transport/stream_map.h + - src/core/ext/transport/chttp2/transport/varint.h + - src/core/ext/transport/inproc/inproc_transport.h + - src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h + - src/core/ext/upb-generated/envoy/annotations/resource.upb.h + - src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h + - src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h + - src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h + - src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h + - src/core/ext/upb-generated/envoy/api/v2/cds.upb.h + - src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h + - src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h + - src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h + - src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h + - src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h + - src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h + - src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h + - src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h + - src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h + - src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h + - src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h + - src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h + - src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h + - src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h + - src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h + - src/core/ext/upb-generated/envoy/api/v2/eds.upb.h + - src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h + - src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.h + - src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h + - src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.h + - src/core/ext/upb-generated/envoy/api/v2/lds.upb.h + - src/core/ext/upb-generated/envoy/api/v2/listener.upb.h + - src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.h + - src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.h + - src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.h + - src/core/ext/upb-generated/envoy/api/v2/rds.upb.h + - src/core/ext/upb-generated/envoy/api/v2/route.upb.h + - src/core/ext/upb-generated/envoy/api/v2/route/route.upb.h + - src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h + - src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.h + - src/core/ext/upb-generated/envoy/api/v2/srds.upb.h + - src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h + - src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h + - src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h + - src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h + - src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h + - src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h + - src/core/ext/upb-generated/envoy/type/http.upb.h + - src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h + - src/core/ext/upb-generated/envoy/type/matcher/string.upb.h + - src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.h + - src/core/ext/upb-generated/envoy/type/percent.upb.h + - src/core/ext/upb-generated/envoy/type/range.upb.h + - src/core/ext/upb-generated/envoy/type/semantic_version.upb.h + - src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.h + - src/core/ext/upb-generated/gogoproto/gogo.upb.h + - src/core/ext/upb-generated/google/api/annotations.upb.h + - src/core/ext/upb-generated/google/api/http.upb.h + - src/core/ext/upb-generated/google/protobuf/any.upb.h + - src/core/ext/upb-generated/google/protobuf/descriptor.upb.h + - src/core/ext/upb-generated/google/protobuf/duration.upb.h + - src/core/ext/upb-generated/google/protobuf/empty.upb.h + - src/core/ext/upb-generated/google/protobuf/struct.upb.h + - src/core/ext/upb-generated/google/protobuf/timestamp.upb.h + - src/core/ext/upb-generated/google/protobuf/wrappers.upb.h + - src/core/ext/upb-generated/google/rpc/status.upb.h + - src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h + - src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h + - src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h + - src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h + - src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h + - src/core/ext/upb-generated/udpa/annotations/migrate.upb.h + - src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h + - src/core/ext/upb-generated/udpa/annotations/status.upb.h + - src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h + - src/core/ext/upb-generated/validate/validate.upb.h + - src/core/lib/avl/avl.h + - src/core/lib/backoff/backoff.h + - src/core/lib/channel/channel_args.h + - src/core/lib/channel/channel_stack.h + - src/core/lib/channel/channel_stack_builder.h + - src/core/lib/channel/channel_trace.h + - src/core/lib/channel/channelz.h + - src/core/lib/channel/channelz_registry.h + - src/core/lib/channel/connected_channel.h + - src/core/lib/channel/context.h + - src/core/lib/channel/handshaker.h + - src/core/lib/channel/handshaker_factory.h + - src/core/lib/channel/handshaker_registry.h + - src/core/lib/channel/status_util.h + - src/core/lib/compression/algorithm_metadata.h + - src/core/lib/compression/compression_args.h + - src/core/lib/compression/compression_internal.h + - src/core/lib/compression/message_compress.h + - src/core/lib/compression/stream_compression.h + - src/core/lib/compression/stream_compression_gzip.h + - src/core/lib/compression/stream_compression_identity.h + - src/core/lib/debug/stats.h + - src/core/lib/debug/stats_data.h + - src/core/lib/debug/trace.h + - src/core/lib/gprpp/atomic.h + - src/core/lib/gprpp/debug_location.h + - src/core/lib/gprpp/orphanable.h + - src/core/lib/gprpp/ref_counted.h + - src/core/lib/gprpp/ref_counted_ptr.h + - src/core/lib/http/format_request.h + - src/core/lib/http/httpcli.h + - src/core/lib/http/parser.h + - src/core/lib/iomgr/block_annotate.h + - src/core/lib/iomgr/buffer_list.h + - src/core/lib/iomgr/call_combiner.h + - src/core/lib/iomgr/cfstream_handle.h + - src/core/lib/iomgr/closure.h + - src/core/lib/iomgr/combiner.h + - src/core/lib/iomgr/dynamic_annotations.h + - src/core/lib/iomgr/endpoint.h + - src/core/lib/iomgr/endpoint_cfstream.h + - src/core/lib/iomgr/endpoint_pair.h + - src/core/lib/iomgr/error.h + - src/core/lib/iomgr/error_cfstream.h + - src/core/lib/iomgr/error_internal.h + - src/core/lib/iomgr/ev_apple.h + - src/core/lib/iomgr/ev_epoll1_linux.h + - src/core/lib/iomgr/ev_epollex_linux.h + - src/core/lib/iomgr/ev_poll_posix.h + - src/core/lib/iomgr/ev_posix.h + - src/core/lib/iomgr/exec_ctx.h + - src/core/lib/iomgr/executor.h + - src/core/lib/iomgr/executor/mpmcqueue.h + - src/core/lib/iomgr/executor/threadpool.h + - src/core/lib/iomgr/gethostname.h + - src/core/lib/iomgr/grpc_if_nametoindex.h + - src/core/lib/iomgr/internal_errqueue.h + - src/core/lib/iomgr/iocp_windows.h + - src/core/lib/iomgr/iomgr.h + - src/core/lib/iomgr/iomgr_custom.h + - src/core/lib/iomgr/iomgr_internal.h + - src/core/lib/iomgr/iomgr_posix.h + - src/core/lib/iomgr/is_epollexclusive_available.h + - src/core/lib/iomgr/load_file.h + - src/core/lib/iomgr/lockfree_event.h + - src/core/lib/iomgr/nameser.h + - src/core/lib/iomgr/poller/eventmanager_libuv.h + - src/core/lib/iomgr/polling_entity.h + - src/core/lib/iomgr/pollset.h + - src/core/lib/iomgr/pollset_custom.h + - src/core/lib/iomgr/pollset_set.h + - src/core/lib/iomgr/pollset_set_custom.h + - src/core/lib/iomgr/pollset_set_windows.h + - src/core/lib/iomgr/pollset_uv.h + - src/core/lib/iomgr/pollset_windows.h + - src/core/lib/iomgr/port.h + - src/core/lib/iomgr/python_util.h + - src/core/lib/iomgr/resolve_address.h + - src/core/lib/iomgr/resolve_address_custom.h + - src/core/lib/iomgr/resource_quota.h + - src/core/lib/iomgr/sockaddr.h + - src/core/lib/iomgr/sockaddr_custom.h + - src/core/lib/iomgr/sockaddr_posix.h + - src/core/lib/iomgr/sockaddr_utils.h + - src/core/lib/iomgr/sockaddr_windows.h + - src/core/lib/iomgr/socket_factory_posix.h + - src/core/lib/iomgr/socket_mutator.h + - src/core/lib/iomgr/socket_utils.h + - src/core/lib/iomgr/socket_utils_posix.h + - src/core/lib/iomgr/socket_windows.h + - src/core/lib/iomgr/sys_epoll_wrapper.h + - src/core/lib/iomgr/tcp_client.h + - src/core/lib/iomgr/tcp_client_posix.h + - src/core/lib/iomgr/tcp_custom.h + - src/core/lib/iomgr/tcp_posix.h + - src/core/lib/iomgr/tcp_server.h + - src/core/lib/iomgr/tcp_server_utils_posix.h + - src/core/lib/iomgr/tcp_windows.h + - src/core/lib/iomgr/time_averaged_stats.h + - src/core/lib/iomgr/timer.h + - src/core/lib/iomgr/timer_custom.h + - src/core/lib/iomgr/timer_generic.h + - src/core/lib/iomgr/timer_heap.h + - src/core/lib/iomgr/timer_manager.h + - src/core/lib/iomgr/udp_server.h + - src/core/lib/iomgr/unix_sockets_posix.h + - src/core/lib/iomgr/wakeup_fd_pipe.h + - src/core/lib/iomgr/wakeup_fd_posix.h + - src/core/lib/iomgr/work_serializer.h + - src/core/lib/json/json.h + - src/core/lib/security/context/security_context.h + - src/core/lib/security/credentials/alts/alts_credentials.h + - src/core/lib/security/credentials/alts/check_gcp_environment.h + - src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h + - src/core/lib/security/credentials/composite/composite_credentials.h + - src/core/lib/security/credentials/credentials.h + - src/core/lib/security/credentials/fake/fake_credentials.h + - src/core/lib/security/credentials/google_default/google_default_credentials.h + - src/core/lib/security/credentials/iam/iam_credentials.h + - src/core/lib/security/credentials/jwt/json_token.h + - src/core/lib/security/credentials/jwt/jwt_credentials.h + - src/core/lib/security/credentials/jwt/jwt_verifier.h + - src/core/lib/security/credentials/local/local_credentials.h + - src/core/lib/security/credentials/oauth2/oauth2_credentials.h + - src/core/lib/security/credentials/plugin/plugin_credentials.h + - src/core/lib/security/credentials/ssl/ssl_credentials.h + - src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h + - src/core/lib/security/credentials/tls/tls_credentials.h + - src/core/lib/security/security_connector/alts/alts_security_connector.h + - src/core/lib/security/security_connector/fake/fake_security_connector.h + - src/core/lib/security/security_connector/load_system_roots.h + - src/core/lib/security/security_connector/load_system_roots_linux.h + - src/core/lib/security/security_connector/local/local_security_connector.h + - src/core/lib/security/security_connector/security_connector.h + - src/core/lib/security/security_connector/ssl/ssl_security_connector.h + - src/core/lib/security/security_connector/ssl_utils.h + - src/core/lib/security/security_connector/ssl_utils_config.h + - src/core/lib/security/security_connector/tls/tls_security_connector.h + - src/core/lib/security/transport/auth_filters.h + - src/core/lib/security/transport/secure_endpoint.h + - src/core/lib/security/transport/security_handshaker.h + - src/core/lib/security/transport/target_authority_table.h + - src/core/lib/security/transport/tsi_error.h + - src/core/lib/security/util/json_util.h + - src/core/lib/slice/b64.h + - src/core/lib/slice/percent_encoding.h + - src/core/lib/slice/slice_hash_table.h + - src/core/lib/slice/slice_internal.h + - src/core/lib/slice/slice_string_helpers.h + - src/core/lib/slice/slice_utils.h + - src/core/lib/slice/slice_weak_hash_table.h + - src/core/lib/surface/api_trace.h + - src/core/lib/surface/call.h + - src/core/lib/surface/call_test_only.h + - src/core/lib/surface/channel.h + - src/core/lib/surface/channel_init.h + - src/core/lib/surface/channel_stack_type.h + - src/core/lib/surface/completion_queue.h + - src/core/lib/surface/completion_queue_factory.h + - src/core/lib/surface/event_string.h + - src/core/lib/surface/init.h + - src/core/lib/surface/lame_client.h + - src/core/lib/surface/server.h + - src/core/lib/surface/validate_metadata.h + - src/core/lib/transport/bdp_estimator.h + - src/core/lib/transport/byte_stream.h + - src/core/lib/transport/connectivity_state.h + - src/core/lib/transport/error_utils.h + - src/core/lib/transport/http2_errors.h + - src/core/lib/transport/metadata.h + - src/core/lib/transport/metadata_batch.h + - src/core/lib/transport/pid_controller.h + - src/core/lib/transport/static_metadata.h + - src/core/lib/transport/status_conversion.h + - src/core/lib/transport/status_metadata.h + - src/core/lib/transport/timeout_encoding.h + - src/core/lib/transport/transport.h + - src/core/lib/transport/transport_impl.h + - src/core/lib/uri/uri_parser.h + - src/core/tsi/alts/crypt/gsec.h + - src/core/tsi/alts/frame_protector/alts_counter.h + - src/core/tsi/alts/frame_protector/alts_crypter.h + - src/core/tsi/alts/frame_protector/alts_frame_protector.h + - src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.h + - src/core/tsi/alts/frame_protector/frame_handler.h + - src/core/tsi/alts/handshaker/alts_handshaker_client.h + - src/core/tsi/alts/handshaker/alts_shared_resource.h + - src/core/tsi/alts/handshaker/alts_tsi_handshaker.h + - src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h + - src/core/tsi/alts/handshaker/alts_tsi_utils.h + - src/core/tsi/alts/handshaker/transport_security_common_api.h + - src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.h + - src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.h + - src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol.h + - src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h + - src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.h + - src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h + - src/core/tsi/fake_transport_security.h + - src/core/tsi/local_transport_security.h + - src/core/tsi/ssl/session_cache/ssl_session.h + - src/core/tsi/ssl/session_cache/ssl_session_cache.h + - src/core/tsi/ssl_transport_security.h + - src/core/tsi/ssl_types.h + - src/core/tsi/transport_security.h + - src/core/tsi/transport_security_grpc.h + - src/core/tsi/transport_security_interface.h + src: + - src/core/ext/filters/census/grpc_context.cc + - src/core/ext/filters/client_channel/backend_metric.cc + - src/core/ext/filters/client_channel/backup_poller.cc + - src/core/ext/filters/client_channel/channel_connectivity.cc + - src/core/ext/filters/client_channel/client_channel.cc + - src/core/ext/filters/client_channel/client_channel_channelz.cc + - src/core/ext/filters/client_channel/client_channel_factory.cc + - src/core/ext/filters/client_channel/client_channel_plugin.cc + - src/core/ext/filters/client_channel/global_subchannel_pool.cc + - src/core/ext/filters/client_channel/health/health_check_client.cc + - src/core/ext/filters/client_channel/http_connect_handshaker.cc + - src/core/ext/filters/client_channel/http_proxy.cc + - src/core/ext/filters/client_channel/lb_policy.cc + - src/core/ext/filters/client_channel/lb_policy/address_filtering.cc + - src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc + - src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc + - src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc + - src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc + - src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc + - src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc + - src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc + - src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc + - src/core/ext/filters/client_channel/lb_policy/priority/priority.cc + - src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc + - src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc + - src/core/ext/filters/client_channel/lb_policy/xds/cds.cc + - src/core/ext/filters/client_channel/lb_policy/xds/eds.cc + - src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc + - src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc + - src/core/ext/filters/client_channel/lb_policy_registry.cc + - src/core/ext/filters/client_channel/local_subchannel_pool.cc + - src/core/ext/filters/client_channel/parse_address.cc + - src/core/ext/filters/client_channel/proxy_mapper_registry.cc + - src/core/ext/filters/client_channel/resolver.cc + - src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc + - src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc + - src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc + - src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc + - src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc + - src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc + - src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc + - src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc + - src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc + - src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc + - src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc + - src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc + - src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc + - src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc + - src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc + - src/core/ext/filters/client_channel/resolver_registry.cc + - src/core/ext/filters/client_channel/resolver_result_parsing.cc + - src/core/ext/filters/client_channel/resolving_lb_policy.cc + - src/core/ext/filters/client_channel/retry_throttle.cc + - src/core/ext/filters/client_channel/server_address.cc + - src/core/ext/filters/client_channel/service_config.cc + - src/core/ext/filters/client_channel/service_config_parser.cc + - src/core/ext/filters/client_channel/subchannel.cc + - src/core/ext/filters/client_channel/subchannel_pool_interface.cc + - src/core/ext/filters/client_channel/xds/xds_api.cc + - src/core/ext/filters/client_channel/xds/xds_bootstrap.cc + - src/core/ext/filters/client_channel/xds/xds_channel_secure.cc + - src/core/ext/filters/client_channel/xds/xds_client.cc + - src/core/ext/filters/client_channel/xds/xds_client_stats.cc + - src/core/ext/filters/client_idle/client_idle_filter.cc + - src/core/ext/filters/deadline/deadline_filter.cc + - src/core/ext/filters/http/client/http_client_filter.cc + - src/core/ext/filters/http/client_authority_filter.cc + - src/core/ext/filters/http/http_filters_plugin.cc + - src/core/ext/filters/http/message_compress/message_compress_filter.cc + - src/core/ext/filters/http/message_compress/message_decompress_filter.cc + - src/core/ext/filters/http/server/http_server_filter.cc + - src/core/ext/filters/max_age/max_age_filter.cc + - src/core/ext/filters/message_size/message_size_filter.cc + - src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc + - src/core/ext/filters/workarounds/workaround_utils.cc + - src/core/ext/transport/chttp2/alpn/alpn.cc + - src/core/ext/transport/chttp2/client/authority.cc + - src/core/ext/transport/chttp2/client/chttp2_connector.cc + - src/core/ext/transport/chttp2/client/insecure/channel_create.cc + - src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc + - src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc + - src/core/ext/transport/chttp2/server/chttp2_server.cc + - src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc + - src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc + - src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc + - src/core/ext/transport/chttp2/transport/bin_decoder.cc + - src/core/ext/transport/chttp2/transport/bin_encoder.cc + - src/core/ext/transport/chttp2/transport/chttp2_plugin.cc + - src/core/ext/transport/chttp2/transport/chttp2_transport.cc + - src/core/ext/transport/chttp2/transport/context_list.cc + - src/core/ext/transport/chttp2/transport/flow_control.cc + - src/core/ext/transport/chttp2/transport/frame_data.cc + - src/core/ext/transport/chttp2/transport/frame_goaway.cc + - src/core/ext/transport/chttp2/transport/frame_ping.cc + - src/core/ext/transport/chttp2/transport/frame_rst_stream.cc + - src/core/ext/transport/chttp2/transport/frame_settings.cc + - src/core/ext/transport/chttp2/transport/frame_window_update.cc + - src/core/ext/transport/chttp2/transport/hpack_encoder.cc + - src/core/ext/transport/chttp2/transport/hpack_parser.cc + - src/core/ext/transport/chttp2/transport/hpack_table.cc + - src/core/ext/transport/chttp2/transport/http2_settings.cc + - src/core/ext/transport/chttp2/transport/huffsyms.cc + - src/core/ext/transport/chttp2/transport/incoming_metadata.cc + - src/core/ext/transport/chttp2/transport/parsing.cc + - src/core/ext/transport/chttp2/transport/stream_lists.cc + - src/core/ext/transport/chttp2/transport/stream_map.cc + - src/core/ext/transport/chttp2/transport/varint.cc + - src/core/ext/transport/chttp2/transport/writing.cc + - src/core/ext/transport/inproc/inproc_plugin.cc + - src/core/ext/transport/inproc/inproc_transport.cc + - src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c + - src/core/ext/upb-generated/envoy/annotations/resource.upb.c + - src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c + - src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c + - src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c + - src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c + - src/core/ext/upb-generated/envoy/api/v2/cds.upb.c + - src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c + - src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c + - src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c + - src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c + - src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c + - src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c + - src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c + - src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c + - src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c + - src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c + - src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c + - src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c + - src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c + - src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c + - src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c + - src/core/ext/upb-generated/envoy/api/v2/eds.upb.c + - src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c + - src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c + - src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c + - src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c + - src/core/ext/upb-generated/envoy/api/v2/lds.upb.c + - src/core/ext/upb-generated/envoy/api/v2/listener.upb.c + - src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c + - src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c + - src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c + - src/core/ext/upb-generated/envoy/api/v2/rds.upb.c + - src/core/ext/upb-generated/envoy/api/v2/route.upb.c + - src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c + - src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c + - src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c + - src/core/ext/upb-generated/envoy/api/v2/srds.upb.c + - src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c + - src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c + - src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c + - src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c + - src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c + - src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c + - src/core/ext/upb-generated/envoy/type/http.upb.c + - src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c + - src/core/ext/upb-generated/envoy/type/matcher/string.upb.c + - src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c + - src/core/ext/upb-generated/envoy/type/percent.upb.c + - src/core/ext/upb-generated/envoy/type/range.upb.c + - src/core/ext/upb-generated/envoy/type/semantic_version.upb.c + - src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c + - src/core/ext/upb-generated/gogoproto/gogo.upb.c + - src/core/ext/upb-generated/google/api/annotations.upb.c + - src/core/ext/upb-generated/google/api/http.upb.c + - src/core/ext/upb-generated/google/protobuf/any.upb.c + - src/core/ext/upb-generated/google/protobuf/descriptor.upb.c + - src/core/ext/upb-generated/google/protobuf/duration.upb.c + - src/core/ext/upb-generated/google/protobuf/empty.upb.c + - src/core/ext/upb-generated/google/protobuf/struct.upb.c + - src/core/ext/upb-generated/google/protobuf/timestamp.upb.c + - src/core/ext/upb-generated/google/protobuf/wrappers.upb.c + - src/core/ext/upb-generated/google/rpc/status.upb.c + - src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c + - src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c + - src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c + - src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c + - src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c + - src/core/ext/upb-generated/udpa/annotations/migrate.upb.c + - src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c + - src/core/ext/upb-generated/udpa/annotations/status.upb.c + - src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c + - src/core/ext/upb-generated/validate/validate.upb.c + - src/core/lib/avl/avl.cc + - src/core/lib/backoff/backoff.cc + - src/core/lib/channel/channel_args.cc + - src/core/lib/channel/channel_stack.cc + - src/core/lib/channel/channel_stack_builder.cc + - src/core/lib/channel/channel_trace.cc + - src/core/lib/channel/channelz.cc + - src/core/lib/channel/channelz_registry.cc + - src/core/lib/channel/connected_channel.cc + - src/core/lib/channel/handshaker.cc + - src/core/lib/channel/handshaker_registry.cc + - src/core/lib/channel/status_util.cc + - src/core/lib/compression/compression.cc + - src/core/lib/compression/compression_args.cc + - src/core/lib/compression/compression_internal.cc + - src/core/lib/compression/message_compress.cc + - src/core/lib/compression/stream_compression.cc + - src/core/lib/compression/stream_compression_gzip.cc + - src/core/lib/compression/stream_compression_identity.cc + - src/core/lib/debug/stats.cc + - src/core/lib/debug/stats_data.cc + - src/core/lib/debug/trace.cc + - src/core/lib/http/format_request.cc + - src/core/lib/http/httpcli.cc + - src/core/lib/http/httpcli_security_connector.cc + - src/core/lib/http/parser.cc + - src/core/lib/iomgr/buffer_list.cc + - src/core/lib/iomgr/call_combiner.cc + - src/core/lib/iomgr/cfstream_handle.cc + - src/core/lib/iomgr/combiner.cc + - src/core/lib/iomgr/dualstack_socket_posix.cc + - src/core/lib/iomgr/endpoint.cc + - src/core/lib/iomgr/endpoint_cfstream.cc + - src/core/lib/iomgr/endpoint_pair_posix.cc + - src/core/lib/iomgr/endpoint_pair_uv.cc + - src/core/lib/iomgr/endpoint_pair_windows.cc + - src/core/lib/iomgr/error.cc + - src/core/lib/iomgr/error_cfstream.cc + - src/core/lib/iomgr/ev_apple.cc + - src/core/lib/iomgr/ev_epoll1_linux.cc + - src/core/lib/iomgr/ev_epollex_linux.cc + - src/core/lib/iomgr/ev_poll_posix.cc + - src/core/lib/iomgr/ev_posix.cc + - src/core/lib/iomgr/ev_windows.cc + - src/core/lib/iomgr/exec_ctx.cc + - src/core/lib/iomgr/executor.cc + - src/core/lib/iomgr/executor/mpmcqueue.cc + - src/core/lib/iomgr/executor/threadpool.cc + - src/core/lib/iomgr/fork_posix.cc + - src/core/lib/iomgr/fork_windows.cc + - src/core/lib/iomgr/gethostname_fallback.cc + - src/core/lib/iomgr/gethostname_host_name_max.cc + - src/core/lib/iomgr/gethostname_sysconf.cc + - src/core/lib/iomgr/grpc_if_nametoindex_posix.cc + - src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc + - src/core/lib/iomgr/internal_errqueue.cc + - src/core/lib/iomgr/iocp_windows.cc + - src/core/lib/iomgr/iomgr.cc + - src/core/lib/iomgr/iomgr_custom.cc + - src/core/lib/iomgr/iomgr_internal.cc + - src/core/lib/iomgr/iomgr_posix.cc + - src/core/lib/iomgr/iomgr_posix_cfstream.cc + - src/core/lib/iomgr/iomgr_uv.cc + - src/core/lib/iomgr/iomgr_windows.cc + - src/core/lib/iomgr/is_epollexclusive_available.cc + - src/core/lib/iomgr/load_file.cc + - src/core/lib/iomgr/lockfree_event.cc + - src/core/lib/iomgr/poller/eventmanager_libuv.cc + - src/core/lib/iomgr/polling_entity.cc + - src/core/lib/iomgr/pollset.cc + - src/core/lib/iomgr/pollset_custom.cc + - src/core/lib/iomgr/pollset_set.cc + - src/core/lib/iomgr/pollset_set_custom.cc + - src/core/lib/iomgr/pollset_set_windows.cc + - src/core/lib/iomgr/pollset_uv.cc + - src/core/lib/iomgr/pollset_windows.cc + - src/core/lib/iomgr/resolve_address.cc + - src/core/lib/iomgr/resolve_address_custom.cc + - src/core/lib/iomgr/resolve_address_posix.cc + - src/core/lib/iomgr/resolve_address_windows.cc + - src/core/lib/iomgr/resource_quota.cc + - src/core/lib/iomgr/sockaddr_utils.cc + - src/core/lib/iomgr/socket_factory_posix.cc + - src/core/lib/iomgr/socket_mutator.cc + - src/core/lib/iomgr/socket_utils_common_posix.cc + - src/core/lib/iomgr/socket_utils_linux.cc + - src/core/lib/iomgr/socket_utils_posix.cc + - src/core/lib/iomgr/socket_utils_uv.cc + - src/core/lib/iomgr/socket_utils_windows.cc + - src/core/lib/iomgr/socket_windows.cc + - src/core/lib/iomgr/tcp_client.cc + - src/core/lib/iomgr/tcp_client_cfstream.cc + - src/core/lib/iomgr/tcp_client_custom.cc + - src/core/lib/iomgr/tcp_client_posix.cc + - src/core/lib/iomgr/tcp_client_windows.cc + - src/core/lib/iomgr/tcp_custom.cc + - src/core/lib/iomgr/tcp_posix.cc + - src/core/lib/iomgr/tcp_server.cc + - src/core/lib/iomgr/tcp_server_custom.cc + - src/core/lib/iomgr/tcp_server_posix.cc + - src/core/lib/iomgr/tcp_server_utils_posix_common.cc + - src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc + - src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc + - src/core/lib/iomgr/tcp_server_windows.cc + - src/core/lib/iomgr/tcp_uv.cc + - src/core/lib/iomgr/tcp_windows.cc + - src/core/lib/iomgr/time_averaged_stats.cc + - src/core/lib/iomgr/timer.cc + - src/core/lib/iomgr/timer_custom.cc + - src/core/lib/iomgr/timer_generic.cc + - src/core/lib/iomgr/timer_heap.cc + - src/core/lib/iomgr/timer_manager.cc + - src/core/lib/iomgr/timer_uv.cc + - src/core/lib/iomgr/udp_server.cc + - src/core/lib/iomgr/unix_sockets_posix.cc + - src/core/lib/iomgr/unix_sockets_posix_noop.cc + - src/core/lib/iomgr/wakeup_fd_eventfd.cc + - src/core/lib/iomgr/wakeup_fd_nospecial.cc + - src/core/lib/iomgr/wakeup_fd_pipe.cc + - src/core/lib/iomgr/wakeup_fd_posix.cc + - src/core/lib/iomgr/work_serializer.cc + - src/core/lib/json/json_reader.cc + - src/core/lib/json/json_writer.cc + - src/core/lib/security/context/security_context.cc + - src/core/lib/security/credentials/alts/alts_credentials.cc + - src/core/lib/security/credentials/alts/check_gcp_environment.cc + - src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc + - src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc + - src/core/lib/security/credentials/alts/check_gcp_environment_windows.cc + - src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc + - src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc + - src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc + - src/core/lib/security/credentials/composite/composite_credentials.cc + - src/core/lib/security/credentials/credentials.cc + - src/core/lib/security/credentials/credentials_metadata.cc + - src/core/lib/security/credentials/fake/fake_credentials.cc + - src/core/lib/security/credentials/google_default/credentials_generic.cc + - src/core/lib/security/credentials/google_default/google_default_credentials.cc + - src/core/lib/security/credentials/iam/iam_credentials.cc + - src/core/lib/security/credentials/jwt/json_token.cc + - src/core/lib/security/credentials/jwt/jwt_credentials.cc + - src/core/lib/security/credentials/jwt/jwt_verifier.cc + - src/core/lib/security/credentials/local/local_credentials.cc + - src/core/lib/security/credentials/oauth2/oauth2_credentials.cc + - src/core/lib/security/credentials/plugin/plugin_credentials.cc + - src/core/lib/security/credentials/ssl/ssl_credentials.cc + - src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc + - src/core/lib/security/credentials/tls/tls_credentials.cc + - src/core/lib/security/security_connector/alts/alts_security_connector.cc + - src/core/lib/security/security_connector/fake/fake_security_connector.cc + - src/core/lib/security/security_connector/load_system_roots_fallback.cc + - src/core/lib/security/security_connector/load_system_roots_linux.cc + - src/core/lib/security/security_connector/local/local_security_connector.cc + - src/core/lib/security/security_connector/security_connector.cc + - src/core/lib/security/security_connector/ssl/ssl_security_connector.cc + - src/core/lib/security/security_connector/ssl_utils.cc + - src/core/lib/security/security_connector/ssl_utils_config.cc + - src/core/lib/security/security_connector/tls/tls_security_connector.cc + - src/core/lib/security/transport/client_auth_filter.cc + - src/core/lib/security/transport/secure_endpoint.cc + - src/core/lib/security/transport/security_handshaker.cc + - src/core/lib/security/transport/server_auth_filter.cc + - src/core/lib/security/transport/target_authority_table.cc + - src/core/lib/security/transport/tsi_error.cc + - src/core/lib/security/util/json_util.cc + - src/core/lib/slice/b64.cc + - src/core/lib/slice/percent_encoding.cc + - src/core/lib/slice/slice.cc + - src/core/lib/slice/slice_buffer.cc + - src/core/lib/slice/slice_intern.cc + - src/core/lib/slice/slice_string_helpers.cc + - src/core/lib/surface/api_trace.cc + - src/core/lib/surface/byte_buffer.cc + - src/core/lib/surface/byte_buffer_reader.cc + - src/core/lib/surface/call.cc + - src/core/lib/surface/call_details.cc + - src/core/lib/surface/call_log_batch.cc + - src/core/lib/surface/channel.cc + - src/core/lib/surface/channel_init.cc + - src/core/lib/surface/channel_ping.cc + - src/core/lib/surface/channel_stack_type.cc + - src/core/lib/surface/completion_queue.cc + - src/core/lib/surface/completion_queue_factory.cc + - src/core/lib/surface/event_string.cc + - src/core/lib/surface/init.cc + - src/core/lib/surface/init_secure.cc + - src/core/lib/surface/lame_client.cc + - src/core/lib/surface/metadata_array.cc + - src/core/lib/surface/server.cc + - src/core/lib/surface/validate_metadata.cc + - src/core/lib/surface/version.cc + - src/core/lib/transport/bdp_estimator.cc + - src/core/lib/transport/byte_stream.cc + - src/core/lib/transport/connectivity_state.cc + - src/core/lib/transport/error_utils.cc + - src/core/lib/transport/metadata.cc + - src/core/lib/transport/metadata_batch.cc + - src/core/lib/transport/pid_controller.cc + - src/core/lib/transport/static_metadata.cc + - src/core/lib/transport/status_conversion.cc + - src/core/lib/transport/status_metadata.cc + - src/core/lib/transport/timeout_encoding.cc + - src/core/lib/transport/transport.cc + - src/core/lib/transport/transport_op_string.cc + - src/core/lib/uri/uri_parser.cc + - src/core/plugin_registry/grpc_plugin_registry.cc + - src/core/tsi/alts/crypt/aes_gcm.cc + - src/core/tsi/alts/crypt/gsec.cc + - src/core/tsi/alts/frame_protector/alts_counter.cc + - src/core/tsi/alts/frame_protector/alts_crypter.cc + - src/core/tsi/alts/frame_protector/alts_frame_protector.cc + - src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.cc + - src/core/tsi/alts/frame_protector/alts_seal_privacy_integrity_crypter.cc + - src/core/tsi/alts/frame_protector/alts_unseal_privacy_integrity_crypter.cc + - src/core/tsi/alts/frame_protector/frame_handler.cc + - src/core/tsi/alts/handshaker/alts_handshaker_client.cc + - src/core/tsi/alts/handshaker/alts_shared_resource.cc + - src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc + - src/core/tsi/alts/handshaker/alts_tsi_utils.cc + - src/core/tsi/alts/handshaker/transport_security_common_api.cc + - src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc + - src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc + - src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc + - src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc + - src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc + - src/core/tsi/fake_transport_security.cc + - src/core/tsi/local_transport_security.cc + - src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc + - src/core/tsi/ssl/session_cache/ssl_session_cache.cc + - src/core/tsi/ssl/session_cache/ssl_session_openssl.cc + - src/core/tsi/ssl_transport_security.cc + - src/core/tsi/transport_security.cc + - src/core/tsi/transport_security_grpc.cc + deps: + - gpr + - address_sorting + - upb + - absl/types:optional + - absl/strings:strings + - absl/container:inlined_vector + baselib: true + deps_linkage: static + dll: true + generate_plugin_registry: true + secure: true +- name: grpc_csharp_ext + build: all + language: c + public_headers: [] + headers: [] + src: + - src/csharp/ext/grpc_csharp_ext.c + deps: + - grpc + - gpr + - address_sorting + - upb + deps_linkage: static + dll: only +- name: grpc_test_util + build: private + language: c + public_headers: [] + headers: + - test/core/util/cmdline.h + - test/core/util/debugger_macros.h + - test/core/util/fuzzer_util.h + - test/core/util/grpc_profiler.h + - test/core/util/histogram.h + - test/core/util/memory_counters.h + - test/core/util/mock_endpoint.h + - test/core/util/parse_hexstring.h + - test/core/util/passthru_endpoint.h + - test/core/util/port.h + - test/core/util/port_server_client.h + - test/core/util/reconnect_server.h + - test/core/util/slice_splitter.h + - test/core/util/subprocess.h + - test/core/util/test_config.h + - test/core/util/test_tcp_server.h + - test/core/util/tracer_util.h + - test/core/util/trickle_endpoint.h + src: + - test/core/util/cmdline.cc + - test/core/util/debugger_macros.cc + - test/core/util/fuzzer_util.cc + - test/core/util/grpc_profiler.cc + - test/core/util/histogram.cc + - test/core/util/memory_counters.cc + - test/core/util/mock_endpoint.cc + - test/core/util/parse_hexstring.cc + - test/core/util/passthru_endpoint.cc + - test/core/util/port.cc + - test/core/util/port_isolated_runtime_environment.cc + - test/core/util/port_server_client.cc + - test/core/util/reconnect_server.cc + - test/core/util/slice_splitter.cc + - test/core/util/subprocess_posix.cc + - test/core/util/subprocess_windows.cc + - test/core/util/test_config.cc + - test/core/util/test_tcp_server.cc + - test/core/util/tracer_util.cc + - test/core/util/trickle_endpoint.cc + deps: + - grpc + - gpr + - address_sorting + - upb +- name: grpc_test_util_unsecure + build: private + language: c + public_headers: [] + headers: + - test/core/util/cmdline.h + - test/core/util/debugger_macros.h + - test/core/util/fuzzer_util.h + - test/core/util/grpc_profiler.h + - test/core/util/histogram.h + - test/core/util/memory_counters.h + - test/core/util/mock_endpoint.h + - test/core/util/parse_hexstring.h + - test/core/util/passthru_endpoint.h + - test/core/util/port.h + - test/core/util/port_server_client.h + - test/core/util/reconnect_server.h + - test/core/util/slice_splitter.h + - test/core/util/subprocess.h + - test/core/util/test_config.h + - test/core/util/test_tcp_server.h + - test/core/util/tracer_util.h + - test/core/util/trickle_endpoint.h + src: + - test/core/util/cmdline.cc + - test/core/util/debugger_macros.cc + - test/core/util/fuzzer_util.cc + - test/core/util/grpc_profiler.cc + - test/core/util/histogram.cc + - test/core/util/memory_counters.cc + - test/core/util/mock_endpoint.cc + - test/core/util/parse_hexstring.cc + - test/core/util/passthru_endpoint.cc + - test/core/util/port.cc + - test/core/util/port_isolated_runtime_environment.cc + - test/core/util/port_server_client.cc + - test/core/util/reconnect_server.cc + - test/core/util/slice_splitter.cc + - test/core/util/subprocess_posix.cc + - test/core/util/subprocess_windows.cc + - test/core/util/test_config.cc + - test/core/util/test_tcp_server.cc + - test/core/util/tracer_util.cc + - test/core/util/trickle_endpoint.cc + deps: + - grpc_unsecure + - gpr + - address_sorting + - upb + secure: false +- name: grpc_unsecure + build: all + language: c + public_headers: + - include/grpc/byte_buffer.h + - include/grpc/byte_buffer_reader.h + - include/grpc/census.h + - include/grpc/compression.h + - include/grpc/fork.h + - include/grpc/grpc.h + - include/grpc/grpc_posix.h + - include/grpc/grpc_security_constants.h + - include/grpc/load_reporting.h + - include/grpc/slice.h + - include/grpc/slice_buffer.h + - include/grpc/status.h + - include/grpc/support/workaround_list.h + headers: + - src/core/ext/filters/client_channel/backend_metric.h + - src/core/ext/filters/client_channel/backup_poller.h + - src/core/ext/filters/client_channel/client_channel.h + - src/core/ext/filters/client_channel/client_channel_channelz.h + - src/core/ext/filters/client_channel/client_channel_factory.h + - src/core/ext/filters/client_channel/connector.h + - src/core/ext/filters/client_channel/global_subchannel_pool.h + - src/core/ext/filters/client_channel/health/health_check_client.h + - src/core/ext/filters/client_channel/http_connect_handshaker.h + - src/core/ext/filters/client_channel/http_proxy.h + - src/core/ext/filters/client_channel/lb_policy.h + - src/core/ext/filters/client_channel/lb_policy/address_filtering.h + - src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h + - src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h + - src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h + - src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h + - src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h + - src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h + - src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h + - src/core/ext/filters/client_channel/lb_policy/subchannel_list.h + - src/core/ext/filters/client_channel/lb_policy/xds/xds.h + - src/core/ext/filters/client_channel/lb_policy_factory.h + - src/core/ext/filters/client_channel/lb_policy_registry.h + - src/core/ext/filters/client_channel/local_subchannel_pool.h + - src/core/ext/filters/client_channel/parse_address.h + - src/core/ext/filters/client_channel/proxy_mapper.h + - src/core/ext/filters/client_channel/proxy_mapper_registry.h + - src/core/ext/filters/client_channel/resolver.h + - src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h + - src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h + - src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h + - src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h + - src/core/ext/filters/client_channel/resolver_factory.h + - src/core/ext/filters/client_channel/resolver_registry.h + - src/core/ext/filters/client_channel/resolver_result_parsing.h + - src/core/ext/filters/client_channel/resolving_lb_policy.h + - src/core/ext/filters/client_channel/retry_throttle.h + - src/core/ext/filters/client_channel/server_address.h + - src/core/ext/filters/client_channel/service_config.h + - src/core/ext/filters/client_channel/service_config_call_data.h + - src/core/ext/filters/client_channel/service_config_parser.h + - src/core/ext/filters/client_channel/subchannel.h + - src/core/ext/filters/client_channel/subchannel_interface.h + - src/core/ext/filters/client_channel/subchannel_pool_interface.h + - src/core/ext/filters/client_channel/xds/xds_api.h + - src/core/ext/filters/client_channel/xds/xds_bootstrap.h + - src/core/ext/filters/client_channel/xds/xds_channel.h + - src/core/ext/filters/client_channel/xds/xds_channel_args.h + - src/core/ext/filters/client_channel/xds/xds_client.h + - src/core/ext/filters/client_channel/xds/xds_client_stats.h + - src/core/ext/filters/deadline/deadline_filter.h + - src/core/ext/filters/http/client/http_client_filter.h + - src/core/ext/filters/http/client_authority_filter.h + - src/core/ext/filters/http/message_compress/message_compress_filter.h + - src/core/ext/filters/http/message_compress/message_decompress_filter.h + - src/core/ext/filters/http/server/http_server_filter.h + - src/core/ext/filters/max_age/max_age_filter.h + - src/core/ext/filters/message_size/message_size_filter.h + - src/core/ext/filters/workarounds/workaround_cronet_compression_filter.h + - src/core/ext/filters/workarounds/workaround_utils.h + - src/core/ext/transport/chttp2/alpn/alpn.h + - src/core/ext/transport/chttp2/client/authority.h + - src/core/ext/transport/chttp2/client/chttp2_connector.h + - src/core/ext/transport/chttp2/server/chttp2_server.h + - src/core/ext/transport/chttp2/transport/bin_decoder.h + - src/core/ext/transport/chttp2/transport/bin_encoder.h + - src/core/ext/transport/chttp2/transport/chttp2_transport.h + - src/core/ext/transport/chttp2/transport/context_list.h + - src/core/ext/transport/chttp2/transport/flow_control.h + - src/core/ext/transport/chttp2/transport/frame.h + - src/core/ext/transport/chttp2/transport/frame_data.h + - src/core/ext/transport/chttp2/transport/frame_goaway.h + - src/core/ext/transport/chttp2/transport/frame_ping.h + - src/core/ext/transport/chttp2/transport/frame_rst_stream.h + - src/core/ext/transport/chttp2/transport/frame_settings.h + - src/core/ext/transport/chttp2/transport/frame_window_update.h + - src/core/ext/transport/chttp2/transport/hpack_encoder.h + - src/core/ext/transport/chttp2/transport/hpack_parser.h + - src/core/ext/transport/chttp2/transport/hpack_table.h + - src/core/ext/transport/chttp2/transport/http2_settings.h + - src/core/ext/transport/chttp2/transport/huffsyms.h + - src/core/ext/transport/chttp2/transport/incoming_metadata.h + - src/core/ext/transport/chttp2/transport/internal.h + - src/core/ext/transport/chttp2/transport/stream_map.h + - src/core/ext/transport/chttp2/transport/varint.h + - src/core/ext/transport/inproc/inproc_transport.h + - src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h + - src/core/ext/upb-generated/envoy/annotations/resource.upb.h + - src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h + - src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h + - src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h + - src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h + - src/core/ext/upb-generated/envoy/api/v2/cds.upb.h + - src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h + - src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h + - src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h + - src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h + - src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h + - src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h + - src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h + - src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h + - src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h + - src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h + - src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h + - src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h + - src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h + - src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h + - src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h + - src/core/ext/upb-generated/envoy/api/v2/eds.upb.h + - src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h + - src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.h + - src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h + - src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.h + - src/core/ext/upb-generated/envoy/api/v2/lds.upb.h + - src/core/ext/upb-generated/envoy/api/v2/listener.upb.h + - src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.h + - src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.h + - src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.h + - src/core/ext/upb-generated/envoy/api/v2/rds.upb.h + - src/core/ext/upb-generated/envoy/api/v2/route.upb.h + - src/core/ext/upb-generated/envoy/api/v2/route/route.upb.h + - src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h + - src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.h + - src/core/ext/upb-generated/envoy/api/v2/srds.upb.h + - src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h + - src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h + - src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h + - src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h + - src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h + - src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h + - src/core/ext/upb-generated/envoy/type/http.upb.h + - src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h + - src/core/ext/upb-generated/envoy/type/matcher/string.upb.h + - src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.h + - src/core/ext/upb-generated/envoy/type/percent.upb.h + - src/core/ext/upb-generated/envoy/type/range.upb.h + - src/core/ext/upb-generated/envoy/type/semantic_version.upb.h + - src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.h + - src/core/ext/upb-generated/gogoproto/gogo.upb.h + - src/core/ext/upb-generated/google/api/annotations.upb.h + - src/core/ext/upb-generated/google/api/http.upb.h + - src/core/ext/upb-generated/google/protobuf/any.upb.h + - src/core/ext/upb-generated/google/protobuf/descriptor.upb.h + - src/core/ext/upb-generated/google/protobuf/duration.upb.h + - src/core/ext/upb-generated/google/protobuf/empty.upb.h + - src/core/ext/upb-generated/google/protobuf/struct.upb.h + - src/core/ext/upb-generated/google/protobuf/timestamp.upb.h + - src/core/ext/upb-generated/google/protobuf/wrappers.upb.h + - src/core/ext/upb-generated/google/rpc/status.upb.h + - src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h + - src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h + - src/core/ext/upb-generated/udpa/annotations/migrate.upb.h + - src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h + - src/core/ext/upb-generated/udpa/annotations/status.upb.h + - src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h + - src/core/ext/upb-generated/validate/validate.upb.h + - src/core/lib/avl/avl.h + - src/core/lib/backoff/backoff.h + - src/core/lib/channel/channel_args.h + - src/core/lib/channel/channel_stack.h + - src/core/lib/channel/channel_stack_builder.h + - src/core/lib/channel/channel_trace.h + - src/core/lib/channel/channelz.h + - src/core/lib/channel/channelz_registry.h + - src/core/lib/channel/connected_channel.h + - src/core/lib/channel/context.h + - src/core/lib/channel/handshaker.h + - src/core/lib/channel/handshaker_factory.h + - src/core/lib/channel/handshaker_registry.h + - src/core/lib/channel/status_util.h + - src/core/lib/compression/algorithm_metadata.h + - src/core/lib/compression/compression_args.h + - src/core/lib/compression/compression_internal.h + - src/core/lib/compression/message_compress.h + - src/core/lib/compression/stream_compression.h + - src/core/lib/compression/stream_compression_gzip.h + - src/core/lib/compression/stream_compression_identity.h + - src/core/lib/debug/stats.h + - src/core/lib/debug/stats_data.h + - src/core/lib/debug/trace.h + - src/core/lib/gprpp/atomic.h + - src/core/lib/gprpp/debug_location.h + - src/core/lib/gprpp/orphanable.h + - src/core/lib/gprpp/ref_counted.h + - src/core/lib/gprpp/ref_counted_ptr.h + - src/core/lib/http/format_request.h + - src/core/lib/http/httpcli.h + - src/core/lib/http/parser.h + - src/core/lib/iomgr/block_annotate.h + - src/core/lib/iomgr/buffer_list.h + - src/core/lib/iomgr/call_combiner.h + - src/core/lib/iomgr/cfstream_handle.h + - src/core/lib/iomgr/closure.h + - src/core/lib/iomgr/combiner.h + - src/core/lib/iomgr/dynamic_annotations.h + - src/core/lib/iomgr/endpoint.h + - src/core/lib/iomgr/endpoint_cfstream.h + - src/core/lib/iomgr/endpoint_pair.h + - src/core/lib/iomgr/error.h + - src/core/lib/iomgr/error_cfstream.h + - src/core/lib/iomgr/error_internal.h + - src/core/lib/iomgr/ev_apple.h + - src/core/lib/iomgr/ev_epoll1_linux.h + - src/core/lib/iomgr/ev_epollex_linux.h + - src/core/lib/iomgr/ev_poll_posix.h + - src/core/lib/iomgr/ev_posix.h + - src/core/lib/iomgr/exec_ctx.h + - src/core/lib/iomgr/executor.h + - src/core/lib/iomgr/executor/mpmcqueue.h + - src/core/lib/iomgr/executor/threadpool.h + - src/core/lib/iomgr/gethostname.h + - src/core/lib/iomgr/grpc_if_nametoindex.h + - src/core/lib/iomgr/internal_errqueue.h + - src/core/lib/iomgr/iocp_windows.h + - src/core/lib/iomgr/iomgr.h + - src/core/lib/iomgr/iomgr_custom.h + - src/core/lib/iomgr/iomgr_internal.h + - src/core/lib/iomgr/iomgr_posix.h + - src/core/lib/iomgr/is_epollexclusive_available.h + - src/core/lib/iomgr/load_file.h + - src/core/lib/iomgr/lockfree_event.h + - src/core/lib/iomgr/nameser.h + - src/core/lib/iomgr/poller/eventmanager_libuv.h + - src/core/lib/iomgr/polling_entity.h + - src/core/lib/iomgr/pollset.h + - src/core/lib/iomgr/pollset_custom.h + - src/core/lib/iomgr/pollset_set.h + - src/core/lib/iomgr/pollset_set_custom.h + - src/core/lib/iomgr/pollset_set_windows.h + - src/core/lib/iomgr/pollset_uv.h + - src/core/lib/iomgr/pollset_windows.h + - src/core/lib/iomgr/port.h + - src/core/lib/iomgr/python_util.h + - src/core/lib/iomgr/resolve_address.h + - src/core/lib/iomgr/resolve_address_custom.h + - src/core/lib/iomgr/resource_quota.h + - src/core/lib/iomgr/sockaddr.h + - src/core/lib/iomgr/sockaddr_custom.h + - src/core/lib/iomgr/sockaddr_posix.h + - src/core/lib/iomgr/sockaddr_utils.h + - src/core/lib/iomgr/sockaddr_windows.h + - src/core/lib/iomgr/socket_factory_posix.h + - src/core/lib/iomgr/socket_mutator.h + - src/core/lib/iomgr/socket_utils.h + - src/core/lib/iomgr/socket_utils_posix.h + - src/core/lib/iomgr/socket_windows.h + - src/core/lib/iomgr/sys_epoll_wrapper.h + - src/core/lib/iomgr/tcp_client.h + - src/core/lib/iomgr/tcp_client_posix.h + - src/core/lib/iomgr/tcp_custom.h + - src/core/lib/iomgr/tcp_posix.h + - src/core/lib/iomgr/tcp_server.h + - src/core/lib/iomgr/tcp_server_utils_posix.h + - src/core/lib/iomgr/tcp_windows.h + - src/core/lib/iomgr/time_averaged_stats.h + - src/core/lib/iomgr/timer.h + - src/core/lib/iomgr/timer_custom.h + - src/core/lib/iomgr/timer_generic.h + - src/core/lib/iomgr/timer_heap.h + - src/core/lib/iomgr/timer_manager.h + - src/core/lib/iomgr/udp_server.h + - src/core/lib/iomgr/unix_sockets_posix.h + - src/core/lib/iomgr/wakeup_fd_pipe.h + - src/core/lib/iomgr/wakeup_fd_posix.h + - src/core/lib/iomgr/work_serializer.h + - src/core/lib/json/json.h + - src/core/lib/slice/b64.h + - src/core/lib/slice/percent_encoding.h + - src/core/lib/slice/slice_hash_table.h + - src/core/lib/slice/slice_internal.h + - src/core/lib/slice/slice_string_helpers.h + - src/core/lib/slice/slice_utils.h + - src/core/lib/slice/slice_weak_hash_table.h + - src/core/lib/surface/api_trace.h + - src/core/lib/surface/call.h + - src/core/lib/surface/call_test_only.h + - src/core/lib/surface/channel.h + - src/core/lib/surface/channel_init.h + - src/core/lib/surface/channel_stack_type.h + - src/core/lib/surface/completion_queue.h + - src/core/lib/surface/completion_queue_factory.h + - src/core/lib/surface/event_string.h + - src/core/lib/surface/init.h + - src/core/lib/surface/lame_client.h + - src/core/lib/surface/server.h + - src/core/lib/surface/validate_metadata.h + - src/core/lib/transport/bdp_estimator.h + - src/core/lib/transport/byte_stream.h + - src/core/lib/transport/connectivity_state.h + - src/core/lib/transport/error_utils.h + - src/core/lib/transport/http2_errors.h + - src/core/lib/transport/metadata.h + - src/core/lib/transport/metadata_batch.h + - src/core/lib/transport/pid_controller.h + - src/core/lib/transport/static_metadata.h + - src/core/lib/transport/status_conversion.h + - src/core/lib/transport/status_metadata.h + - src/core/lib/transport/timeout_encoding.h + - src/core/lib/transport/transport.h + - src/core/lib/transport/transport_impl.h + - src/core/lib/uri/uri_parser.h + src: + - src/core/ext/filters/census/grpc_context.cc + - src/core/ext/filters/client_channel/backend_metric.cc + - src/core/ext/filters/client_channel/backup_poller.cc + - src/core/ext/filters/client_channel/channel_connectivity.cc + - src/core/ext/filters/client_channel/client_channel.cc + - src/core/ext/filters/client_channel/client_channel_channelz.cc + - src/core/ext/filters/client_channel/client_channel_factory.cc + - src/core/ext/filters/client_channel/client_channel_plugin.cc + - src/core/ext/filters/client_channel/global_subchannel_pool.cc + - src/core/ext/filters/client_channel/health/health_check_client.cc + - src/core/ext/filters/client_channel/http_connect_handshaker.cc + - src/core/ext/filters/client_channel/http_proxy.cc + - src/core/ext/filters/client_channel/lb_policy.cc + - src/core/ext/filters/client_channel/lb_policy/address_filtering.cc + - src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc + - src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc + - src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc + - src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc + - src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.cc + - src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc + - src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc + - src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc + - src/core/ext/filters/client_channel/lb_policy/priority/priority.cc + - src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc + - src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc + - src/core/ext/filters/client_channel/lb_policy/xds/cds.cc + - src/core/ext/filters/client_channel/lb_policy/xds/eds.cc + - src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc + - src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc + - src/core/ext/filters/client_channel/lb_policy_registry.cc + - src/core/ext/filters/client_channel/local_subchannel_pool.cc + - src/core/ext/filters/client_channel/parse_address.cc + - src/core/ext/filters/client_channel/proxy_mapper_registry.cc + - src/core/ext/filters/client_channel/resolver.cc + - src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc + - src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc + - src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc + - src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc + - src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc + - src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc + - src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc + - src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc + - src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc + - src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc + - src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc + - src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc + - src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc + - src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc + - src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc + - src/core/ext/filters/client_channel/resolver_registry.cc + - src/core/ext/filters/client_channel/resolver_result_parsing.cc + - src/core/ext/filters/client_channel/resolving_lb_policy.cc + - src/core/ext/filters/client_channel/retry_throttle.cc + - src/core/ext/filters/client_channel/server_address.cc + - src/core/ext/filters/client_channel/service_config.cc + - src/core/ext/filters/client_channel/service_config_parser.cc + - src/core/ext/filters/client_channel/subchannel.cc + - src/core/ext/filters/client_channel/subchannel_pool_interface.cc + - src/core/ext/filters/client_channel/xds/xds_api.cc + - src/core/ext/filters/client_channel/xds/xds_bootstrap.cc + - src/core/ext/filters/client_channel/xds/xds_channel.cc + - src/core/ext/filters/client_channel/xds/xds_client.cc + - src/core/ext/filters/client_channel/xds/xds_client_stats.cc + - src/core/ext/filters/client_idle/client_idle_filter.cc + - src/core/ext/filters/deadline/deadline_filter.cc + - src/core/ext/filters/http/client/http_client_filter.cc + - src/core/ext/filters/http/client_authority_filter.cc + - src/core/ext/filters/http/http_filters_plugin.cc + - src/core/ext/filters/http/message_compress/message_compress_filter.cc + - src/core/ext/filters/http/message_compress/message_decompress_filter.cc + - src/core/ext/filters/http/server/http_server_filter.cc + - src/core/ext/filters/max_age/max_age_filter.cc + - src/core/ext/filters/message_size/message_size_filter.cc + - src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc + - src/core/ext/filters/workarounds/workaround_utils.cc + - src/core/ext/transport/chttp2/alpn/alpn.cc + - src/core/ext/transport/chttp2/client/authority.cc + - src/core/ext/transport/chttp2/client/chttp2_connector.cc + - src/core/ext/transport/chttp2/client/insecure/channel_create.cc + - src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc + - src/core/ext/transport/chttp2/server/chttp2_server.cc + - src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc + - src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc + - src/core/ext/transport/chttp2/transport/bin_decoder.cc + - src/core/ext/transport/chttp2/transport/bin_encoder.cc + - src/core/ext/transport/chttp2/transport/chttp2_plugin.cc + - src/core/ext/transport/chttp2/transport/chttp2_transport.cc + - src/core/ext/transport/chttp2/transport/context_list.cc + - src/core/ext/transport/chttp2/transport/flow_control.cc + - src/core/ext/transport/chttp2/transport/frame_data.cc + - src/core/ext/transport/chttp2/transport/frame_goaway.cc + - src/core/ext/transport/chttp2/transport/frame_ping.cc + - src/core/ext/transport/chttp2/transport/frame_rst_stream.cc + - src/core/ext/transport/chttp2/transport/frame_settings.cc + - src/core/ext/transport/chttp2/transport/frame_window_update.cc + - src/core/ext/transport/chttp2/transport/hpack_encoder.cc + - src/core/ext/transport/chttp2/transport/hpack_parser.cc + - src/core/ext/transport/chttp2/transport/hpack_table.cc + - src/core/ext/transport/chttp2/transport/http2_settings.cc + - src/core/ext/transport/chttp2/transport/huffsyms.cc + - src/core/ext/transport/chttp2/transport/incoming_metadata.cc + - src/core/ext/transport/chttp2/transport/parsing.cc + - src/core/ext/transport/chttp2/transport/stream_lists.cc + - src/core/ext/transport/chttp2/transport/stream_map.cc + - src/core/ext/transport/chttp2/transport/varint.cc + - src/core/ext/transport/chttp2/transport/writing.cc + - src/core/ext/transport/inproc/inproc_plugin.cc + - src/core/ext/transport/inproc/inproc_transport.cc + - src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c + - src/core/ext/upb-generated/envoy/annotations/resource.upb.c + - src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c + - src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c + - src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c + - src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c + - src/core/ext/upb-generated/envoy/api/v2/cds.upb.c + - src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c + - src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c + - src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c + - src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c + - src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c + - src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c + - src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c + - src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c + - src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c + - src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c + - src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c + - src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c + - src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c + - src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c + - src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c + - src/core/ext/upb-generated/envoy/api/v2/eds.upb.c + - src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c + - src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c + - src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c + - src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c + - src/core/ext/upb-generated/envoy/api/v2/lds.upb.c + - src/core/ext/upb-generated/envoy/api/v2/listener.upb.c + - src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c + - src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c + - src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c + - src/core/ext/upb-generated/envoy/api/v2/rds.upb.c + - src/core/ext/upb-generated/envoy/api/v2/route.upb.c + - src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c + - src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c + - src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c + - src/core/ext/upb-generated/envoy/api/v2/srds.upb.c + - src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c + - src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c + - src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c + - src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c + - src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c + - src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c + - src/core/ext/upb-generated/envoy/type/http.upb.c + - src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c + - src/core/ext/upb-generated/envoy/type/matcher/string.upb.c + - src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c + - src/core/ext/upb-generated/envoy/type/percent.upb.c + - src/core/ext/upb-generated/envoy/type/range.upb.c + - src/core/ext/upb-generated/envoy/type/semantic_version.upb.c + - src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c + - src/core/ext/upb-generated/gogoproto/gogo.upb.c + - src/core/ext/upb-generated/google/api/annotations.upb.c + - src/core/ext/upb-generated/google/api/http.upb.c + - src/core/ext/upb-generated/google/protobuf/any.upb.c + - src/core/ext/upb-generated/google/protobuf/descriptor.upb.c + - src/core/ext/upb-generated/google/protobuf/duration.upb.c + - src/core/ext/upb-generated/google/protobuf/empty.upb.c + - src/core/ext/upb-generated/google/protobuf/struct.upb.c + - src/core/ext/upb-generated/google/protobuf/timestamp.upb.c + - src/core/ext/upb-generated/google/protobuf/wrappers.upb.c + - src/core/ext/upb-generated/google/rpc/status.upb.c + - src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c + - src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c + - src/core/ext/upb-generated/udpa/annotations/migrate.upb.c + - src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c + - src/core/ext/upb-generated/udpa/annotations/status.upb.c + - src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c + - src/core/ext/upb-generated/validate/validate.upb.c + - src/core/lib/avl/avl.cc + - src/core/lib/backoff/backoff.cc + - src/core/lib/channel/channel_args.cc + - src/core/lib/channel/channel_stack.cc + - src/core/lib/channel/channel_stack_builder.cc + - src/core/lib/channel/channel_trace.cc + - src/core/lib/channel/channelz.cc + - src/core/lib/channel/channelz_registry.cc + - src/core/lib/channel/connected_channel.cc + - src/core/lib/channel/handshaker.cc + - src/core/lib/channel/handshaker_registry.cc + - src/core/lib/channel/status_util.cc + - src/core/lib/compression/compression.cc + - src/core/lib/compression/compression_args.cc + - src/core/lib/compression/compression_internal.cc + - src/core/lib/compression/message_compress.cc + - src/core/lib/compression/stream_compression.cc + - src/core/lib/compression/stream_compression_gzip.cc + - src/core/lib/compression/stream_compression_identity.cc + - src/core/lib/debug/stats.cc + - src/core/lib/debug/stats_data.cc + - src/core/lib/debug/trace.cc + - src/core/lib/http/format_request.cc + - src/core/lib/http/httpcli.cc + - src/core/lib/http/parser.cc + - src/core/lib/iomgr/buffer_list.cc + - src/core/lib/iomgr/call_combiner.cc + - src/core/lib/iomgr/cfstream_handle.cc + - src/core/lib/iomgr/combiner.cc + - src/core/lib/iomgr/dualstack_socket_posix.cc + - src/core/lib/iomgr/endpoint.cc + - src/core/lib/iomgr/endpoint_cfstream.cc + - src/core/lib/iomgr/endpoint_pair_posix.cc + - src/core/lib/iomgr/endpoint_pair_uv.cc + - src/core/lib/iomgr/endpoint_pair_windows.cc + - src/core/lib/iomgr/error.cc + - src/core/lib/iomgr/error_cfstream.cc + - src/core/lib/iomgr/ev_apple.cc + - src/core/lib/iomgr/ev_epoll1_linux.cc + - src/core/lib/iomgr/ev_epollex_linux.cc + - src/core/lib/iomgr/ev_poll_posix.cc + - src/core/lib/iomgr/ev_posix.cc + - src/core/lib/iomgr/ev_windows.cc + - src/core/lib/iomgr/exec_ctx.cc + - src/core/lib/iomgr/executor.cc + - src/core/lib/iomgr/executor/mpmcqueue.cc + - src/core/lib/iomgr/executor/threadpool.cc + - src/core/lib/iomgr/fork_posix.cc + - src/core/lib/iomgr/fork_windows.cc + - src/core/lib/iomgr/gethostname_fallback.cc + - src/core/lib/iomgr/gethostname_host_name_max.cc + - src/core/lib/iomgr/gethostname_sysconf.cc + - src/core/lib/iomgr/grpc_if_nametoindex_posix.cc + - src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc + - src/core/lib/iomgr/internal_errqueue.cc + - src/core/lib/iomgr/iocp_windows.cc + - src/core/lib/iomgr/iomgr.cc + - src/core/lib/iomgr/iomgr_custom.cc + - src/core/lib/iomgr/iomgr_internal.cc + - src/core/lib/iomgr/iomgr_posix.cc + - src/core/lib/iomgr/iomgr_posix_cfstream.cc + - src/core/lib/iomgr/iomgr_uv.cc + - src/core/lib/iomgr/iomgr_windows.cc + - src/core/lib/iomgr/is_epollexclusive_available.cc + - src/core/lib/iomgr/load_file.cc + - src/core/lib/iomgr/lockfree_event.cc + - src/core/lib/iomgr/poller/eventmanager_libuv.cc + - src/core/lib/iomgr/polling_entity.cc + - src/core/lib/iomgr/pollset.cc + - src/core/lib/iomgr/pollset_custom.cc + - src/core/lib/iomgr/pollset_set.cc + - src/core/lib/iomgr/pollset_set_custom.cc + - src/core/lib/iomgr/pollset_set_windows.cc + - src/core/lib/iomgr/pollset_uv.cc + - src/core/lib/iomgr/pollset_windows.cc + - src/core/lib/iomgr/resolve_address.cc + - src/core/lib/iomgr/resolve_address_custom.cc + - src/core/lib/iomgr/resolve_address_posix.cc + - src/core/lib/iomgr/resolve_address_windows.cc + - src/core/lib/iomgr/resource_quota.cc + - src/core/lib/iomgr/sockaddr_utils.cc + - src/core/lib/iomgr/socket_factory_posix.cc + - src/core/lib/iomgr/socket_mutator.cc + - src/core/lib/iomgr/socket_utils_common_posix.cc + - src/core/lib/iomgr/socket_utils_linux.cc + - src/core/lib/iomgr/socket_utils_posix.cc + - src/core/lib/iomgr/socket_utils_uv.cc + - src/core/lib/iomgr/socket_utils_windows.cc + - src/core/lib/iomgr/socket_windows.cc + - src/core/lib/iomgr/tcp_client.cc + - src/core/lib/iomgr/tcp_client_cfstream.cc + - src/core/lib/iomgr/tcp_client_custom.cc + - src/core/lib/iomgr/tcp_client_posix.cc + - src/core/lib/iomgr/tcp_client_windows.cc + - src/core/lib/iomgr/tcp_custom.cc + - src/core/lib/iomgr/tcp_posix.cc + - src/core/lib/iomgr/tcp_server.cc + - src/core/lib/iomgr/tcp_server_custom.cc + - src/core/lib/iomgr/tcp_server_posix.cc + - src/core/lib/iomgr/tcp_server_utils_posix_common.cc + - src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc + - src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc + - src/core/lib/iomgr/tcp_server_windows.cc + - src/core/lib/iomgr/tcp_uv.cc + - src/core/lib/iomgr/tcp_windows.cc + - src/core/lib/iomgr/time_averaged_stats.cc + - src/core/lib/iomgr/timer.cc + - src/core/lib/iomgr/timer_custom.cc + - src/core/lib/iomgr/timer_generic.cc + - src/core/lib/iomgr/timer_heap.cc + - src/core/lib/iomgr/timer_manager.cc + - src/core/lib/iomgr/timer_uv.cc + - src/core/lib/iomgr/udp_server.cc + - src/core/lib/iomgr/unix_sockets_posix.cc + - src/core/lib/iomgr/unix_sockets_posix_noop.cc + - src/core/lib/iomgr/wakeup_fd_eventfd.cc + - src/core/lib/iomgr/wakeup_fd_nospecial.cc + - src/core/lib/iomgr/wakeup_fd_pipe.cc + - src/core/lib/iomgr/wakeup_fd_posix.cc + - src/core/lib/iomgr/work_serializer.cc + - src/core/lib/json/json_reader.cc + - src/core/lib/json/json_writer.cc + - src/core/lib/slice/b64.cc + - src/core/lib/slice/percent_encoding.cc + - src/core/lib/slice/slice.cc + - src/core/lib/slice/slice_buffer.cc + - src/core/lib/slice/slice_intern.cc + - src/core/lib/slice/slice_string_helpers.cc + - src/core/lib/surface/api_trace.cc + - src/core/lib/surface/byte_buffer.cc + - src/core/lib/surface/byte_buffer_reader.cc + - src/core/lib/surface/call.cc + - src/core/lib/surface/call_details.cc + - src/core/lib/surface/call_log_batch.cc + - src/core/lib/surface/channel.cc + - src/core/lib/surface/channel_init.cc + - src/core/lib/surface/channel_ping.cc + - src/core/lib/surface/channel_stack_type.cc + - src/core/lib/surface/completion_queue.cc + - src/core/lib/surface/completion_queue_factory.cc + - src/core/lib/surface/event_string.cc + - src/core/lib/surface/init.cc + - src/core/lib/surface/init_unsecure.cc + - src/core/lib/surface/lame_client.cc + - src/core/lib/surface/metadata_array.cc + - src/core/lib/surface/server.cc + - src/core/lib/surface/validate_metadata.cc + - src/core/lib/surface/version.cc + - src/core/lib/transport/bdp_estimator.cc + - src/core/lib/transport/byte_stream.cc + - src/core/lib/transport/connectivity_state.cc + - src/core/lib/transport/error_utils.cc + - src/core/lib/transport/metadata.cc + - src/core/lib/transport/metadata_batch.cc + - src/core/lib/transport/pid_controller.cc + - src/core/lib/transport/static_metadata.cc + - src/core/lib/transport/status_conversion.cc + - src/core/lib/transport/status_metadata.cc + - src/core/lib/transport/timeout_encoding.cc + - src/core/lib/transport/transport.cc + - src/core/lib/transport/transport_op_string.cc + - src/core/lib/uri/uri_parser.cc + - src/core/plugin_registry/grpc_unsecure_plugin_registry.cc + deps: + - gpr + - address_sorting + - upb + - absl/types:optional + - absl/strings:strings + - absl/container:inlined_vector + baselib: true + deps_linkage: static + dll: true + generate_plugin_registry: true + secure: false +- name: benchmark_helpers + build: test + language: c++ + public_headers: [] + headers: + - test/cpp/microbenchmarks/fullstack_context_mutators.h + - test/cpp/microbenchmarks/fullstack_fixtures.h + - test/cpp/microbenchmarks/helpers.h + src: + - src/proto/grpc/testing/echo.proto + - src/proto/grpc/testing/echo_messages.proto + - src/proto/grpc/testing/simple_messages.proto + - test/cpp/microbenchmarks/helpers.cc + deps: + - grpc_test_util_unsecure + - grpc++_unsecure + - grpc_unsecure + - grpc++_test_config + - gpr + - address_sorting + - upb + - benchmark + defaults: benchmark +- name: grpc++ + build: all + language: c++ + public_headers: + - include/grpc++/alarm.h + - include/grpc++/channel.h + - include/grpc++/client_context.h + - include/grpc++/completion_queue.h + - include/grpc++/create_channel.h + - include/grpc++/create_channel_posix.h + - include/grpc++/ext/health_check_service_server_builder_option.h + - include/grpc++/generic/async_generic_service.h + - include/grpc++/generic/generic_stub.h + - include/grpc++/grpc++.h + - include/grpc++/health_check_service_interface.h + - include/grpc++/impl/call.h + - include/grpc++/impl/channel_argument_option.h + - include/grpc++/impl/client_unary_call.h + - include/grpc++/impl/codegen/async_stream.h + - include/grpc++/impl/codegen/async_unary_call.h + - include/grpc++/impl/codegen/byte_buffer.h + - include/grpc++/impl/codegen/call.h + - include/grpc++/impl/codegen/call_hook.h + - include/grpc++/impl/codegen/channel_interface.h + - include/grpc++/impl/codegen/client_context.h + - include/grpc++/impl/codegen/client_unary_call.h + - include/grpc++/impl/codegen/completion_queue.h + - include/grpc++/impl/codegen/completion_queue_tag.h + - include/grpc++/impl/codegen/config.h + - include/grpc++/impl/codegen/config_protobuf.h + - include/grpc++/impl/codegen/core_codegen.h + - include/grpc++/impl/codegen/core_codegen_interface.h + - include/grpc++/impl/codegen/create_auth_context.h + - include/grpc++/impl/codegen/grpc_library.h + - include/grpc++/impl/codegen/metadata_map.h + - include/grpc++/impl/codegen/method_handler_impl.h + - include/grpc++/impl/codegen/proto_utils.h + - include/grpc++/impl/codegen/rpc_method.h + - include/grpc++/impl/codegen/rpc_service_method.h + - include/grpc++/impl/codegen/security/auth_context.h + - include/grpc++/impl/codegen/serialization_traits.h + - include/grpc++/impl/codegen/server_context.h + - include/grpc++/impl/codegen/server_interface.h + - include/grpc++/impl/codegen/service_type.h + - include/grpc++/impl/codegen/slice.h + - include/grpc++/impl/codegen/status.h + - include/grpc++/impl/codegen/status_code_enum.h + - include/grpc++/impl/codegen/string_ref.h + - include/grpc++/impl/codegen/stub_options.h + - include/grpc++/impl/codegen/sync_stream.h + - include/grpc++/impl/codegen/time.h + - include/grpc++/impl/grpc_library.h + - include/grpc++/impl/method_handler_impl.h + - include/grpc++/impl/rpc_method.h + - include/grpc++/impl/rpc_service_method.h + - include/grpc++/impl/serialization_traits.h + - include/grpc++/impl/server_builder_option.h + - include/grpc++/impl/server_builder_plugin.h + - include/grpc++/impl/server_initializer.h + - include/grpc++/impl/service_type.h + - include/grpc++/resource_quota.h + - include/grpc++/security/auth_context.h + - include/grpc++/security/auth_metadata_processor.h + - include/grpc++/security/credentials.h + - include/grpc++/security/server_credentials.h + - include/grpc++/server.h + - include/grpc++/server_builder.h + - include/grpc++/server_context.h + - include/grpc++/server_posix.h + - include/grpc++/support/async_stream.h + - include/grpc++/support/async_unary_call.h + - include/grpc++/support/byte_buffer.h + - include/grpc++/support/channel_arguments.h + - include/grpc++/support/config.h + - include/grpc++/support/slice.h + - include/grpc++/support/status.h + - include/grpc++/support/status_code_enum.h + - include/grpc++/support/string_ref.h + - include/grpc++/support/stub_options.h + - include/grpc++/support/sync_stream.h + - include/grpc++/support/time.h + - include/grpcpp/alarm.h + - include/grpcpp/alarm_impl.h + - include/grpcpp/channel.h + - include/grpcpp/channel_impl.h + - include/grpcpp/client_context.h + - include/grpcpp/completion_queue.h + - include/grpcpp/completion_queue_impl.h + - include/grpcpp/create_channel.h + - include/grpcpp/create_channel_impl.h + - include/grpcpp/create_channel_posix.h + - include/grpcpp/create_channel_posix_impl.h + - include/grpcpp/ext/health_check_service_server_builder_option.h + - include/grpcpp/generic/async_generic_service.h + - include/grpcpp/generic/generic_stub.h + - include/grpcpp/generic/generic_stub_impl.h + - include/grpcpp/grpcpp.h + - include/grpcpp/health_check_service_interface.h + - include/grpcpp/health_check_service_interface_impl.h + - include/grpcpp/impl/call.h + - include/grpcpp/impl/channel_argument_option.h + - include/grpcpp/impl/client_unary_call.h + - include/grpcpp/impl/codegen/async_generic_service.h + - include/grpcpp/impl/codegen/async_stream.h + - include/grpcpp/impl/codegen/async_stream_impl.h + - include/grpcpp/impl/codegen/async_unary_call.h + - include/grpcpp/impl/codegen/async_unary_call_impl.h + - include/grpcpp/impl/codegen/byte_buffer.h + - include/grpcpp/impl/codegen/call.h + - include/grpcpp/impl/codegen/call_hook.h + - include/grpcpp/impl/codegen/call_op_set.h + - include/grpcpp/impl/codegen/call_op_set_interface.h + - include/grpcpp/impl/codegen/callback_common.h + - include/grpcpp/impl/codegen/channel_interface.h + - include/grpcpp/impl/codegen/client_callback.h + - include/grpcpp/impl/codegen/client_callback_impl.h + - include/grpcpp/impl/codegen/client_context.h + - include/grpcpp/impl/codegen/client_context_impl.h + - include/grpcpp/impl/codegen/client_interceptor.h + - include/grpcpp/impl/codegen/client_unary_call.h + - include/grpcpp/impl/codegen/completion_queue.h + - include/grpcpp/impl/codegen/completion_queue_impl.h + - include/grpcpp/impl/codegen/completion_queue_tag.h + - include/grpcpp/impl/codegen/config.h + - include/grpcpp/impl/codegen/config_protobuf.h + - include/grpcpp/impl/codegen/core_codegen.h + - include/grpcpp/impl/codegen/core_codegen_interface.h + - include/grpcpp/impl/codegen/create_auth_context.h + - include/grpcpp/impl/codegen/delegating_channel.h + - include/grpcpp/impl/codegen/grpc_library.h + - include/grpcpp/impl/codegen/intercepted_channel.h + - include/grpcpp/impl/codegen/interceptor.h + - include/grpcpp/impl/codegen/interceptor_common.h + - include/grpcpp/impl/codegen/message_allocator.h + - include/grpcpp/impl/codegen/metadata_map.h + - include/grpcpp/impl/codegen/method_handler.h + - include/grpcpp/impl/codegen/method_handler_impl.h + - include/grpcpp/impl/codegen/proto_buffer_reader.h + - include/grpcpp/impl/codegen/proto_buffer_writer.h + - include/grpcpp/impl/codegen/proto_utils.h + - include/grpcpp/impl/codegen/rpc_method.h + - include/grpcpp/impl/codegen/rpc_service_method.h + - include/grpcpp/impl/codegen/security/auth_context.h + - include/grpcpp/impl/codegen/serialization_traits.h + - include/grpcpp/impl/codegen/server_callback.h + - include/grpcpp/impl/codegen/server_callback_handlers.h + - include/grpcpp/impl/codegen/server_callback_impl.h + - include/grpcpp/impl/codegen/server_context.h + - include/grpcpp/impl/codegen/server_context_impl.h + - include/grpcpp/impl/codegen/server_interceptor.h + - include/grpcpp/impl/codegen/server_interface.h + - include/grpcpp/impl/codegen/service_type.h + - include/grpcpp/impl/codegen/slice.h + - include/grpcpp/impl/codegen/status.h + - include/grpcpp/impl/codegen/status_code_enum.h + - include/grpcpp/impl/codegen/string_ref.h + - include/grpcpp/impl/codegen/stub_options.h + - include/grpcpp/impl/codegen/sync.h + - include/grpcpp/impl/codegen/sync_stream.h + - include/grpcpp/impl/codegen/sync_stream_impl.h + - include/grpcpp/impl/codegen/time.h + - include/grpcpp/impl/grpc_library.h + - include/grpcpp/impl/method_handler_impl.h + - include/grpcpp/impl/rpc_method.h + - include/grpcpp/impl/rpc_service_method.h + - include/grpcpp/impl/serialization_traits.h + - include/grpcpp/impl/server_builder_option.h + - include/grpcpp/impl/server_builder_option_impl.h + - include/grpcpp/impl/server_builder_plugin.h + - include/grpcpp/impl/server_initializer.h + - include/grpcpp/impl/server_initializer_impl.h + - include/grpcpp/impl/service_type.h + - include/grpcpp/resource_quota.h + - include/grpcpp/resource_quota_impl.h + - include/grpcpp/security/auth_context.h + - include/grpcpp/security/auth_metadata_processor.h + - include/grpcpp/security/auth_metadata_processor_impl.h + - include/grpcpp/security/credentials.h + - include/grpcpp/security/credentials_impl.h + - include/grpcpp/security/server_credentials.h + - include/grpcpp/security/server_credentials_impl.h + - include/grpcpp/security/tls_credentials_options.h + - include/grpcpp/server.h + - include/grpcpp/server_builder.h + - include/grpcpp/server_builder_impl.h + - include/grpcpp/server_context.h + - include/grpcpp/server_impl.h + - include/grpcpp/server_posix.h + - include/grpcpp/server_posix_impl.h + - include/grpcpp/support/async_stream.h + - include/grpcpp/support/async_stream_impl.h + - include/grpcpp/support/async_unary_call.h + - include/grpcpp/support/async_unary_call_impl.h + - include/grpcpp/support/byte_buffer.h + - include/grpcpp/support/channel_arguments.h + - include/grpcpp/support/channel_arguments_impl.h + - include/grpcpp/support/client_callback.h + - include/grpcpp/support/client_callback_impl.h + - include/grpcpp/support/client_interceptor.h + - include/grpcpp/support/config.h + - include/grpcpp/support/interceptor.h + - include/grpcpp/support/message_allocator.h + - include/grpcpp/support/method_handler.h + - include/grpcpp/support/proto_buffer_reader.h + - include/grpcpp/support/proto_buffer_writer.h + - include/grpcpp/support/server_callback.h + - include/grpcpp/support/server_callback_impl.h + - include/grpcpp/support/server_interceptor.h + - include/grpcpp/support/slice.h + - include/grpcpp/support/status.h + - include/grpcpp/support/status_code_enum.h + - include/grpcpp/support/string_ref.h + - include/grpcpp/support/stub_options.h + - include/grpcpp/support/sync_stream.h + - include/grpcpp/support/sync_stream_impl.h + - include/grpcpp/support/time.h + - include/grpcpp/support/validate_service_config.h + headers: + - src/cpp/client/create_channel_internal.h + - src/cpp/client/secure_credentials.h + - src/cpp/common/channel_filter.h + - src/cpp/common/secure_auth_context.h + - src/cpp/common/tls_credentials_options_util.h + - src/cpp/server/dynamic_thread_pool.h + - src/cpp/server/external_connection_acceptor_impl.h + - src/cpp/server/health/default_health_check_service.h + - src/cpp/server/secure_server_credentials.h + - src/cpp/server/thread_pool_interface.h + - src/cpp/thread_manager/thread_manager.h + src: + - src/cpp/client/channel_cc.cc + - src/cpp/client/client_context.cc + - src/cpp/client/client_interceptor.cc + - src/cpp/client/create_channel.cc + - src/cpp/client/create_channel_internal.cc + - src/cpp/client/create_channel_posix.cc + - src/cpp/client/credentials_cc.cc + - src/cpp/client/insecure_credentials.cc + - src/cpp/client/secure_credentials.cc + - src/cpp/codegen/codegen_init.cc + - src/cpp/common/alarm.cc + - src/cpp/common/auth_property_iterator.cc + - src/cpp/common/channel_arguments.cc + - src/cpp/common/channel_filter.cc + - src/cpp/common/completion_queue_cc.cc + - src/cpp/common/core_codegen.cc + - src/cpp/common/resource_quota_cc.cc + - src/cpp/common/rpc_method.cc + - src/cpp/common/secure_auth_context.cc + - src/cpp/common/secure_channel_arguments.cc + - src/cpp/common/secure_create_auth_context.cc + - src/cpp/common/tls_credentials_options.cc + - src/cpp/common/tls_credentials_options_util.cc + - src/cpp/common/validate_service_config.cc + - src/cpp/common/version_cc.cc + - src/cpp/server/async_generic_service.cc + - src/cpp/server/channel_argument_option.cc + - src/cpp/server/create_default_thread_pool.cc + - src/cpp/server/dynamic_thread_pool.cc + - src/cpp/server/external_connection_acceptor_impl.cc + - src/cpp/server/health/default_health_check_service.cc + - src/cpp/server/health/health_check_service.cc + - src/cpp/server/health/health_check_service_server_builder_option.cc + - src/cpp/server/insecure_server_credentials.cc + - src/cpp/server/secure_server_credentials.cc + - src/cpp/server/server_builder.cc + - src/cpp/server/server_callback.cc + - src/cpp/server/server_cc.cc + - src/cpp/server/server_context.cc + - src/cpp/server/server_credentials.cc + - src/cpp/server/server_posix.cc + - src/cpp/thread_manager/thread_manager.cc + - src/cpp/util/byte_buffer_cc.cc + - src/cpp/util/status.cc + - src/cpp/util/string_ref.cc + - src/cpp/util/time_cc.cc + deps: + - grpc + - gpr + - address_sorting + - upb + baselib: true + dll: true +- name: grpc++_alts + build: all + language: c++ + public_headers: + - include/grpcpp/security/alts_context.h + - include/grpcpp/security/alts_util.h + headers: [] + src: + - src/cpp/common/alts_context.cc + - src/cpp/common/alts_util.cc + deps: + - grpc++ + - grpc + - gpr + - address_sorting + - upb + baselib: true +- name: grpc++_error_details + build: all + language: c++ + public_headers: + - include/grpc++/support/error_details.h + - include/grpcpp/support/error_details.h + - include/grpcpp/support/error_details_impl.h + headers: [] + src: + - src/proto/grpc/status/status.proto + - src/cpp/util/error_details.cc + deps: + - grpc++ + - grpc + - gpr + - address_sorting + - upb +- name: grpc++_reflection + build: all + language: c++ + public_headers: + - include/grpc++/ext/proto_server_reflection_plugin.h + - include/grpcpp/ext/proto_server_reflection_plugin.h + - include/grpcpp/ext/proto_server_reflection_plugin_impl.h + headers: + - src/cpp/ext/proto_server_reflection.h + src: + - src/proto/grpc/reflection/v1alpha/reflection.proto + - src/cpp/ext/proto_server_reflection.cc + - src/cpp/ext/proto_server_reflection_plugin.cc + deps: + - grpc++ + - grpc + - gpr + - address_sorting + - upb +- name: grpc++_test + build: private + language: c++ + public_headers: + - include/grpc++/test/mock_stream.h + - include/grpc++/test/server_context_test_spouse.h + - include/grpcpp/test/channel_test_peer.h + - include/grpcpp/test/default_reactor_test_peer.h + - include/grpcpp/test/mock_stream.h + - include/grpcpp/test/server_context_test_spouse.h + headers: [] + src: + - src/cpp/client/channel_test_peer.cc + deps: + - grpc++ + - grpc + - gpr + - address_sorting + - upb +- name: grpc++_test_config + build: private + language: c++ + public_headers: [] + headers: + - test/cpp/util/test_config.h + src: + - test/cpp/util/test_config_cc.cc + deps: + - gpr +- name: grpc++_test_util + build: private + language: c++ + public_headers: [] + headers: + - test/core/end2end/data/ssl_test_data.h + - test/cpp/util/byte_buffer_proto_helper.h + - test/cpp/util/create_test_channel.h + - test/cpp/util/string_ref_helper.h + - test/cpp/util/subprocess.h + - test/cpp/util/test_credentials_provider.h + src: + - test/core/end2end/data/client_certs.cc + - test/core/end2end/data/server1_cert.cc + - test/core/end2end/data/server1_key.cc + - test/core/end2end/data/test_root_cert.cc + - test/cpp/util/byte_buffer_proto_helper.cc + - test/cpp/util/create_test_channel.cc + - test/cpp/util/string_ref_helper.cc + - test/cpp/util/subprocess.cc + - test/cpp/util/test_credentials_provider.cc + deps: + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb +- name: grpc++_unsecure + build: all + language: c++ + public_headers: + - include/grpc++/alarm.h + - include/grpc++/channel.h + - include/grpc++/client_context.h + - include/grpc++/completion_queue.h + - include/grpc++/create_channel.h + - include/grpc++/create_channel_posix.h + - include/grpc++/ext/health_check_service_server_builder_option.h + - include/grpc++/generic/async_generic_service.h + - include/grpc++/generic/generic_stub.h + - include/grpc++/grpc++.h + - include/grpc++/health_check_service_interface.h + - include/grpc++/impl/call.h + - include/grpc++/impl/channel_argument_option.h + - include/grpc++/impl/client_unary_call.h + - include/grpc++/impl/codegen/async_stream.h + - include/grpc++/impl/codegen/async_unary_call.h + - include/grpc++/impl/codegen/byte_buffer.h + - include/grpc++/impl/codegen/call.h + - include/grpc++/impl/codegen/call_hook.h + - include/grpc++/impl/codegen/channel_interface.h + - include/grpc++/impl/codegen/client_context.h + - include/grpc++/impl/codegen/client_unary_call.h + - include/grpc++/impl/codegen/completion_queue.h + - include/grpc++/impl/codegen/completion_queue_tag.h + - include/grpc++/impl/codegen/config.h + - include/grpc++/impl/codegen/config_protobuf.h + - include/grpc++/impl/codegen/core_codegen.h + - include/grpc++/impl/codegen/core_codegen_interface.h + - include/grpc++/impl/codegen/create_auth_context.h + - include/grpc++/impl/codegen/grpc_library.h + - include/grpc++/impl/codegen/metadata_map.h + - include/grpc++/impl/codegen/method_handler_impl.h + - include/grpc++/impl/codegen/proto_utils.h + - include/grpc++/impl/codegen/rpc_method.h + - include/grpc++/impl/codegen/rpc_service_method.h + - include/grpc++/impl/codegen/security/auth_context.h + - include/grpc++/impl/codegen/serialization_traits.h + - include/grpc++/impl/codegen/server_context.h + - include/grpc++/impl/codegen/server_interface.h + - include/grpc++/impl/codegen/service_type.h + - include/grpc++/impl/codegen/slice.h + - include/grpc++/impl/codegen/status.h + - include/grpc++/impl/codegen/status_code_enum.h + - include/grpc++/impl/codegen/string_ref.h + - include/grpc++/impl/codegen/stub_options.h + - include/grpc++/impl/codegen/sync_stream.h + - include/grpc++/impl/codegen/time.h + - include/grpc++/impl/grpc_library.h + - include/grpc++/impl/method_handler_impl.h + - include/grpc++/impl/rpc_method.h + - include/grpc++/impl/rpc_service_method.h + - include/grpc++/impl/serialization_traits.h + - include/grpc++/impl/server_builder_option.h + - include/grpc++/impl/server_builder_plugin.h + - include/grpc++/impl/server_initializer.h + - include/grpc++/impl/service_type.h + - include/grpc++/resource_quota.h + - include/grpc++/security/auth_context.h + - include/grpc++/security/auth_metadata_processor.h + - include/grpc++/security/credentials.h + - include/grpc++/security/server_credentials.h + - include/grpc++/server.h + - include/grpc++/server_builder.h + - include/grpc++/server_context.h + - include/grpc++/server_posix.h + - include/grpc++/support/async_stream.h + - include/grpc++/support/async_unary_call.h + - include/grpc++/support/byte_buffer.h + - include/grpc++/support/channel_arguments.h + - include/grpc++/support/config.h + - include/grpc++/support/slice.h + - include/grpc++/support/status.h + - include/grpc++/support/status_code_enum.h + - include/grpc++/support/string_ref.h + - include/grpc++/support/stub_options.h + - include/grpc++/support/sync_stream.h + - include/grpc++/support/time.h + - include/grpcpp/alarm.h + - include/grpcpp/alarm_impl.h + - include/grpcpp/channel.h + - include/grpcpp/channel_impl.h + - include/grpcpp/client_context.h + - include/grpcpp/completion_queue.h + - include/grpcpp/completion_queue_impl.h + - include/grpcpp/create_channel.h + - include/grpcpp/create_channel_impl.h + - include/grpcpp/create_channel_posix.h + - include/grpcpp/create_channel_posix_impl.h + - include/grpcpp/ext/health_check_service_server_builder_option.h + - include/grpcpp/generic/async_generic_service.h + - include/grpcpp/generic/generic_stub.h + - include/grpcpp/generic/generic_stub_impl.h + - include/grpcpp/grpcpp.h + - include/grpcpp/health_check_service_interface.h + - include/grpcpp/health_check_service_interface_impl.h + - include/grpcpp/impl/call.h + - include/grpcpp/impl/channel_argument_option.h + - include/grpcpp/impl/client_unary_call.h + - include/grpcpp/impl/codegen/async_generic_service.h + - include/grpcpp/impl/codegen/async_stream.h + - include/grpcpp/impl/codegen/async_stream_impl.h + - include/grpcpp/impl/codegen/async_unary_call.h + - include/grpcpp/impl/codegen/async_unary_call_impl.h + - include/grpcpp/impl/codegen/byte_buffer.h + - include/grpcpp/impl/codegen/call.h + - include/grpcpp/impl/codegen/call_hook.h + - include/grpcpp/impl/codegen/call_op_set.h + - include/grpcpp/impl/codegen/call_op_set_interface.h + - include/grpcpp/impl/codegen/callback_common.h + - include/grpcpp/impl/codegen/channel_interface.h + - include/grpcpp/impl/codegen/client_callback.h + - include/grpcpp/impl/codegen/client_callback_impl.h + - include/grpcpp/impl/codegen/client_context.h + - include/grpcpp/impl/codegen/client_context_impl.h + - include/grpcpp/impl/codegen/client_interceptor.h + - include/grpcpp/impl/codegen/client_unary_call.h + - include/grpcpp/impl/codegen/completion_queue.h + - include/grpcpp/impl/codegen/completion_queue_impl.h + - include/grpcpp/impl/codegen/completion_queue_tag.h + - include/grpcpp/impl/codegen/config.h + - include/grpcpp/impl/codegen/config_protobuf.h + - include/grpcpp/impl/codegen/core_codegen.h + - include/grpcpp/impl/codegen/core_codegen_interface.h + - include/grpcpp/impl/codegen/create_auth_context.h + - include/grpcpp/impl/codegen/delegating_channel.h + - include/grpcpp/impl/codegen/grpc_library.h + - include/grpcpp/impl/codegen/intercepted_channel.h + - include/grpcpp/impl/codegen/interceptor.h + - include/grpcpp/impl/codegen/interceptor_common.h + - include/grpcpp/impl/codegen/message_allocator.h + - include/grpcpp/impl/codegen/metadata_map.h + - include/grpcpp/impl/codegen/method_handler.h + - include/grpcpp/impl/codegen/method_handler_impl.h + - include/grpcpp/impl/codegen/proto_buffer_reader.h + - include/grpcpp/impl/codegen/proto_buffer_writer.h + - include/grpcpp/impl/codegen/proto_utils.h + - include/grpcpp/impl/codegen/rpc_method.h + - include/grpcpp/impl/codegen/rpc_service_method.h + - include/grpcpp/impl/codegen/security/auth_context.h + - include/grpcpp/impl/codegen/serialization_traits.h + - include/grpcpp/impl/codegen/server_callback.h + - include/grpcpp/impl/codegen/server_callback_handlers.h + - include/grpcpp/impl/codegen/server_callback_impl.h + - include/grpcpp/impl/codegen/server_context.h + - include/grpcpp/impl/codegen/server_context_impl.h + - include/grpcpp/impl/codegen/server_interceptor.h + - include/grpcpp/impl/codegen/server_interface.h + - include/grpcpp/impl/codegen/service_type.h + - include/grpcpp/impl/codegen/slice.h + - include/grpcpp/impl/codegen/status.h + - include/grpcpp/impl/codegen/status_code_enum.h + - include/grpcpp/impl/codegen/string_ref.h + - include/grpcpp/impl/codegen/stub_options.h + - include/grpcpp/impl/codegen/sync.h + - include/grpcpp/impl/codegen/sync_stream.h + - include/grpcpp/impl/codegen/sync_stream_impl.h + - include/grpcpp/impl/codegen/time.h + - include/grpcpp/impl/grpc_library.h + - include/grpcpp/impl/method_handler_impl.h + - include/grpcpp/impl/rpc_method.h + - include/grpcpp/impl/rpc_service_method.h + - include/grpcpp/impl/serialization_traits.h + - include/grpcpp/impl/server_builder_option.h + - include/grpcpp/impl/server_builder_option_impl.h + - include/grpcpp/impl/server_builder_plugin.h + - include/grpcpp/impl/server_initializer.h + - include/grpcpp/impl/server_initializer_impl.h + - include/grpcpp/impl/service_type.h + - include/grpcpp/resource_quota.h + - include/grpcpp/resource_quota_impl.h + - include/grpcpp/security/auth_context.h + - include/grpcpp/security/auth_metadata_processor.h + - include/grpcpp/security/auth_metadata_processor_impl.h + - include/grpcpp/security/credentials.h + - include/grpcpp/security/credentials_impl.h + - include/grpcpp/security/server_credentials.h + - include/grpcpp/security/server_credentials_impl.h + - include/grpcpp/security/tls_credentials_options.h + - include/grpcpp/server.h + - include/grpcpp/server_builder.h + - include/grpcpp/server_builder_impl.h + - include/grpcpp/server_context.h + - include/grpcpp/server_impl.h + - include/grpcpp/server_posix.h + - include/grpcpp/server_posix_impl.h + - include/grpcpp/support/async_stream.h + - include/grpcpp/support/async_stream_impl.h + - include/grpcpp/support/async_unary_call.h + - include/grpcpp/support/async_unary_call_impl.h + - include/grpcpp/support/byte_buffer.h + - include/grpcpp/support/channel_arguments.h + - include/grpcpp/support/channel_arguments_impl.h + - include/grpcpp/support/client_callback.h + - include/grpcpp/support/client_callback_impl.h + - include/grpcpp/support/client_interceptor.h + - include/grpcpp/support/config.h + - include/grpcpp/support/interceptor.h + - include/grpcpp/support/message_allocator.h + - include/grpcpp/support/method_handler.h + - include/grpcpp/support/proto_buffer_reader.h + - include/grpcpp/support/proto_buffer_writer.h + - include/grpcpp/support/server_callback.h + - include/grpcpp/support/server_callback_impl.h + - include/grpcpp/support/server_interceptor.h + - include/grpcpp/support/slice.h + - include/grpcpp/support/status.h + - include/grpcpp/support/status_code_enum.h + - include/grpcpp/support/string_ref.h + - include/grpcpp/support/stub_options.h + - include/grpcpp/support/sync_stream.h + - include/grpcpp/support/sync_stream_impl.h + - include/grpcpp/support/time.h + - include/grpcpp/support/validate_service_config.h + headers: + - src/cpp/client/create_channel_internal.h + - src/cpp/common/channel_filter.h + - src/cpp/server/dynamic_thread_pool.h + - src/cpp/server/external_connection_acceptor_impl.h + - src/cpp/server/health/default_health_check_service.h + - src/cpp/server/thread_pool_interface.h + - src/cpp/thread_manager/thread_manager.h + src: + - src/cpp/client/channel_cc.cc + - src/cpp/client/client_context.cc + - src/cpp/client/client_interceptor.cc + - src/cpp/client/create_channel.cc + - src/cpp/client/create_channel_internal.cc + - src/cpp/client/create_channel_posix.cc + - src/cpp/client/credentials_cc.cc + - src/cpp/client/insecure_credentials.cc + - src/cpp/codegen/codegen_init.cc + - src/cpp/common/alarm.cc + - src/cpp/common/channel_arguments.cc + - src/cpp/common/channel_filter.cc + - src/cpp/common/completion_queue_cc.cc + - src/cpp/common/core_codegen.cc + - src/cpp/common/insecure_create_auth_context.cc + - src/cpp/common/resource_quota_cc.cc + - src/cpp/common/rpc_method.cc + - src/cpp/common/validate_service_config.cc + - src/cpp/common/version_cc.cc + - src/cpp/server/async_generic_service.cc + - src/cpp/server/channel_argument_option.cc + - src/cpp/server/create_default_thread_pool.cc + - src/cpp/server/dynamic_thread_pool.cc + - src/cpp/server/external_connection_acceptor_impl.cc + - src/cpp/server/health/default_health_check_service.cc + - src/cpp/server/health/health_check_service.cc + - src/cpp/server/health/health_check_service_server_builder_option.cc + - src/cpp/server/insecure_server_credentials.cc + - src/cpp/server/server_builder.cc + - src/cpp/server/server_callback.cc + - src/cpp/server/server_cc.cc + - src/cpp/server/server_context.cc + - src/cpp/server/server_credentials.cc + - src/cpp/server/server_posix.cc + - src/cpp/thread_manager/thread_manager.cc + - src/cpp/util/byte_buffer_cc.cc + - src/cpp/util/status.cc + - src/cpp/util/string_ref.cc + - src/cpp/util/time_cc.cc + deps: + - grpc_unsecure + - gpr + - address_sorting + - upb + baselib: true + dll: true + secure: false +- name: grpc_plugin_support + build: protoc + language: c++ + public_headers: + - include/grpc++/impl/codegen/config_protobuf.h + - include/grpcpp/impl/codegen/config_protobuf.h + headers: + - src/compiler/config.h + - src/compiler/config_protobuf.h + - src/compiler/cpp_generator.h + - src/compiler/cpp_generator_helpers.h + - src/compiler/cpp_plugin.h + - src/compiler/csharp_generator.h + - src/compiler/csharp_generator_helpers.h + - src/compiler/generator_helpers.h + - src/compiler/node_generator.h + - src/compiler/node_generator_helpers.h + - src/compiler/objective_c_generator.h + - src/compiler/objective_c_generator_helpers.h + - src/compiler/php_generator.h + - src/compiler/php_generator_helpers.h + - src/compiler/protobuf_plugin.h + - src/compiler/python_generator.h + - src/compiler/python_generator_helpers.h + - src/compiler/python_private_generator.h + - src/compiler/ruby_generator.h + - src/compiler/ruby_generator_helpers-inl.h + - src/compiler/ruby_generator_map-inl.h + - src/compiler/ruby_generator_string-inl.h + - src/compiler/schema_interface.h + src: + - src/compiler/cpp_generator.cc + - src/compiler/csharp_generator.cc + - src/compiler/node_generator.cc + - src/compiler/objective_c_generator.cc + - src/compiler/php_generator.cc + - src/compiler/python_generator.cc + - src/compiler/ruby_generator.cc + deps: [] + secure: false +- name: grpcpp_channelz + build: all + language: c++ + public_headers: + - include/grpcpp/ext/channelz_service_plugin.h + - include/grpcpp/ext/channelz_service_plugin_impl.h + headers: + - src/cpp/server/channelz/channelz_service.h + src: + - src/proto/grpc/channelz/channelz.proto + - src/cpp/server/channelz/channelz_service.cc + - src/cpp/server/channelz/channelz_service_plugin.cc + deps: + - grpc++ + - grpc + - gpr + - address_sorting + - upb +targets: +- name: algorithm_test + build: test + language: c + headers: [] + src: + - test/core/compression/algorithm_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: alloc_test + build: test + language: c + headers: [] + src: + - test/core/gpr/alloc_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: alpn_test + build: test + language: c + headers: [] + src: + - test/core/transport/chttp2/alpn_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: alts_counter_test + build: test + language: c + headers: + - test/core/tsi/alts/crypt/gsec_test_util.h + src: + - test/core/tsi/alts/crypt/gsec_test_util.cc + - test/core/tsi/alts/frame_protector/alts_counter_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: alts_crypt_test + build: test + language: c + headers: + - test/core/tsi/alts/crypt/gsec_test_util.h + src: + - test/core/tsi/alts/crypt/aes_gcm_test.cc + - test/core/tsi/alts/crypt/gsec_test_util.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: alts_crypter_test + build: test + language: c + headers: + - test/core/tsi/alts/crypt/gsec_test_util.h + src: + - test/core/tsi/alts/crypt/gsec_test_util.cc + - test/core/tsi/alts/frame_protector/alts_crypter_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: alts_frame_protector_test + build: test + language: c + headers: + - test/core/tsi/alts/crypt/gsec_test_util.h + - test/core/tsi/transport_security_test_lib.h + src: + - test/core/tsi/alts/crypt/gsec_test_util.cc + - test/core/tsi/alts/frame_protector/alts_frame_protector_test.cc + - test/core/tsi/transport_security_test_lib.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: alts_grpc_record_protocol_test + build: test + language: c + headers: + - test/core/tsi/alts/crypt/gsec_test_util.h + src: + - test/core/tsi/alts/crypt/gsec_test_util.cc + - test/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: alts_handshaker_client_test + build: test + language: c + headers: + - test/core/tsi/alts/handshaker/alts_handshaker_service_api_test_lib.h + src: + - test/core/tsi/alts/handshaker/alts_handshaker_client_test.cc + - test/core/tsi/alts/handshaker/alts_handshaker_service_api_test_lib.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: alts_iovec_record_protocol_test + build: test + language: c + headers: + - test/core/tsi/alts/crypt/gsec_test_util.h + src: + - test/core/tsi/alts/crypt/gsec_test_util.cc + - test/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: alts_security_connector_test + build: test + language: c + headers: [] + src: + - test/core/security/alts_security_connector_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: alts_tsi_handshaker_test + build: test + language: c + headers: + - test/core/tsi/alts/handshaker/alts_handshaker_service_api_test_lib.h + src: + - test/core/tsi/alts/handshaker/alts_handshaker_service_api_test_lib.cc + - test/core/tsi/alts/handshaker/alts_tsi_handshaker_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: alts_tsi_utils_test + build: test + language: c + headers: + - test/core/tsi/alts/handshaker/alts_handshaker_service_api_test_lib.h + src: + - test/core/tsi/alts/handshaker/alts_handshaker_service_api_test_lib.cc + - test/core/tsi/alts/handshaker/alts_tsi_utils_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: alts_zero_copy_grpc_protector_test + build: test + language: c + headers: + - test/core/tsi/alts/crypt/gsec_test_util.h + src: + - test/core/tsi/alts/crypt/gsec_test_util.cc + - test/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: arena_test + build: test + language: c + headers: [] + src: + - test/core/gpr/arena_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: auth_context_test + build: test + language: c + headers: [] + src: + - test/core/security/auth_context_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: avl_test + build: test + language: c + headers: [] + src: + - test/core/avl/avl_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: b64_test + build: test + language: c + headers: [] + src: + - test/core/slice/b64_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: bad_server_response_test + build: test + language: c + headers: + - test/core/end2end/cq_verifier.h + src: + - test/core/end2end/bad_server_response_test.cc + - test/core/end2end/cq_verifier.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: bad_ssl_alpn_test + build: test + language: c + headers: + - test/core/end2end/cq_verifier.h + src: + - test/core/bad_ssl/bad_ssl_test.cc + - test/core/end2end/cq_verifier.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac +- name: bad_ssl_cert_test + build: test + language: c + headers: + - test/core/end2end/cq_verifier.h + src: + - test/core/bad_ssl/bad_ssl_test.cc + - test/core/end2end/cq_verifier.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac +- name: bin_decoder_test + build: test + language: c + headers: [] + src: + - test/core/transport/chttp2/bin_decoder_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: bin_encoder_test + build: test + language: c + headers: [] + src: + - test/core/transport/chttp2/bin_encoder_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: buffer_list_test + build: test + language: c + headers: [] + src: + - test/core/iomgr/buffer_list_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: channel_args_test + build: test + language: c + headers: [] + src: + - test/core/channel/channel_args_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: channel_create_test + build: test + language: c + headers: [] + src: + - test/core/surface/channel_create_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: channel_stack_builder_test + build: test + language: c + headers: [] + src: + - test/core/channel/channel_stack_builder_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: channel_stack_test + build: test + language: c + headers: [] + src: + - test/core/channel/channel_stack_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: check_gcp_environment_linux_test + build: test + language: c + headers: [] + src: + - test/core/security/check_gcp_environment_linux_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: check_gcp_environment_windows_test + build: test + language: c + headers: [] + src: + - test/core/security/check_gcp_environment_windows_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: client_ssl_test + build: test + language: c + headers: [] + src: + - test/core/handshake/client_ssl.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac +- name: cmdline_test + build: test + language: c + headers: [] + src: + - test/core/util/cmdline_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: combiner_test + build: test + language: c + headers: [] + src: + - test/core/iomgr/combiner_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac +- name: completion_queue_threading_test + build: test + run: false + language: c + headers: [] + src: + - test/core/surface/completion_queue_threading_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: compression_test + build: test + language: c + headers: [] + src: + - test/core/compression/compression_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: concurrent_connectivity_test + build: test + run: false + language: c + headers: [] + src: + - test/core/surface/concurrent_connectivity_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: connection_refused_test + build: test + language: c + headers: + - test/core/end2end/cq_verifier.h + src: + - test/core/end2end/connection_refused_test.cc + - test/core/end2end/cq_verifier.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: cpu_test + build: test + language: c + headers: [] + src: + - test/core/gpr/cpu_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: dns_resolver_connectivity_using_ares_resolver_test + build: test + language: c + headers: [] + src: + - test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + args: + - --resolver=ares +- name: dns_resolver_connectivity_using_native_resolver_test + build: test + language: c + headers: [] + src: + - test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + args: + - --resolver=native +- name: dns_resolver_cooldown_test + build: test + language: c + headers: [] + src: + - test/core/client_channel/resolvers/dns_resolver_cooldown_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: dns_resolver_test + build: test + language: c + headers: [] + src: + - test/core/client_channel/resolvers/dns_resolver_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: dualstack_socket_test + build: test + language: c + headers: + - test/core/end2end/cq_verifier.h + src: + - test/core/end2end/cq_verifier.cc + - test/core/end2end/dualstack_socket_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac +- name: endpoint_pair_test + build: test + language: c + headers: + - test/core/iomgr/endpoint_tests.h + src: + - test/core/iomgr/endpoint_pair_test.cc + - test/core/iomgr/endpoint_tests.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: env_test + build: test + language: c + headers: [] + src: + - test/core/gpr/env_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: error_test + build: test + language: c + headers: + - test/core/iomgr/endpoint_tests.h + src: + - test/core/iomgr/endpoint_tests.cc + - test/core/iomgr/error_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: ev_epollex_linux_test + build: test + language: c + headers: [] + src: + - test/core/iomgr/ev_epollex_linux_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac +- name: fake_resolver_test + build: test + language: c + headers: [] + src: + - test/core/client_channel/resolvers/fake_resolver_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: fake_transport_security_test + build: test + language: c + headers: + - test/core/tsi/transport_security_test_lib.h + src: + - test/core/tsi/fake_transport_security_test.cc + - test/core/tsi/transport_security_test_lib.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: fd_conservation_posix_test + build: test + language: c + headers: [] + src: + - test/core/iomgr/fd_conservation_posix_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac +- name: fd_posix_test + build: test + language: c + headers: [] + src: + - test/core/iomgr/fd_posix_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac +- name: fling_stream_test + build: test + language: c + headers: + - test/core/end2end/data/ssl_test_data.h + src: + - test/core/end2end/data/client_certs.cc + - test/core/end2end/data/server1_cert.cc + - test/core/end2end/data/server1_key.cc + - test/core/end2end/data/test_root_cert.cc + - test/core/fling/fling_stream_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac +- name: fling_test + build: test + language: c + headers: + - test/core/end2end/data/ssl_test_data.h + src: + - test/core/end2end/data/client_certs.cc + - test/core/end2end/data/server1_cert.cc + - test/core/end2end/data/server1_key.cc + - test/core/end2end/data/test_root_cert.cc + - test/core/fling/fling_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac +- name: fork_test + build: test + language: c + headers: [] + src: + - test/core/gprpp/fork_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac + uses_polling: false +- name: format_request_test + build: test + language: c + headers: + - test/core/end2end/data/ssl_test_data.h + src: + - test/core/end2end/data/client_certs.cc + - test/core/end2end/data/server1_cert.cc + - test/core/end2end/data/server1_key.cc + - test/core/end2end/data/test_root_cert.cc + - test/core/http/format_request_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: frame_handler_test + build: test + language: c + headers: + - test/core/tsi/alts/crypt/gsec_test_util.h + src: + - test/core/tsi/alts/crypt/gsec_test_util.cc + - test/core/tsi/alts/frame_protector/frame_handler_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: goaway_server_test + build: test + language: c + headers: + - test/core/end2end/cq_verifier.h + src: + - test/core/end2end/cq_verifier.cc + - test/core/end2end/goaway_server_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: grpc_alts_credentials_options_test + build: test + language: c + headers: [] + src: + - test/core/security/grpc_alts_credentials_options_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: grpc_byte_buffer_reader_test + build: test + language: c + headers: [] + src: + - test/core/surface/byte_buffer_reader_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: grpc_completion_queue_test + build: test + language: c + headers: [] + src: + - test/core/surface/completion_queue_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: grpc_ipv6_loopback_available_test + build: test + language: c + headers: [] + src: + - test/core/iomgr/grpc_ipv6_loopback_available_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: handshake_server_with_readahead_handshaker_test + build: test + language: c + headers: + - test/core/handshake/server_ssl_common.h + src: + - test/core/handshake/readahead_handshaker_server_ssl.cc + - test/core/handshake/server_ssl_common.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac +- name: handshake_verify_peer_options_test + build: test + language: c + headers: [] + src: + - test/core/handshake/verify_peer_options.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac +- name: histogram_test + build: test + language: c + headers: [] + src: + - test/core/util/histogram_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: host_port_test + build: test + language: c + headers: [] + src: + - test/core/gprpp/host_port_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: hpack_encoder_test + build: test + language: c + headers: [] + src: + - test/core/transport/chttp2/hpack_encoder_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: hpack_parser_test + build: test + language: c + headers: [] + src: + - test/core/transport/chttp2/hpack_parser_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: hpack_table_test + build: test + language: c + headers: [] + src: + - test/core/transport/chttp2/hpack_table_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: httpcli_test + build: test + language: c + headers: + - test/core/end2end/data/ssl_test_data.h + src: + - test/core/end2end/data/client_certs.cc + - test/core/end2end/data/server1_cert.cc + - test/core/end2end/data/server1_key.cc + - test/core/end2end/data/test_root_cert.cc + - test/core/http/httpcli_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac +- name: httpscli_test + build: test + language: c + headers: + - test/core/end2end/data/ssl_test_data.h + src: + - test/core/end2end/data/client_certs.cc + - test/core/end2end/data/server1_cert.cc + - test/core/end2end/data/server1_key.cc + - test/core/end2end/data/test_root_cert.cc + - test/core/http/httpscli_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac +- name: init_test + build: test + language: c + headers: [] + src: + - test/core/surface/init_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: inproc_callback_test + build: test + language: c + headers: [] + src: + - test/core/end2end/inproc_callback_test.cc + deps: + - end2end_tests + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: invalid_call_argument_test + build: test + language: c + headers: + - test/core/end2end/cq_verifier.h + src: + - test/core/end2end/cq_verifier.cc + - test/core/end2end/invalid_call_argument_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: json_token_test + build: test + language: c + headers: [] + src: + - test/core/security/json_token_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: jwt_verifier_test + build: test + language: c + headers: [] + src: + - test/core/security/jwt_verifier_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: lame_client_test + build: test + language: c + headers: + - test/core/end2end/cq_verifier.h + src: + - test/core/end2end/cq_verifier.cc + - test/core/surface/lame_client_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: load_file_test + build: test + language: c + headers: [] + src: + - test/core/iomgr/load_file_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: log_test + build: test + language: c + headers: [] + src: + - test/core/gpr/log_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: manual_constructor_test + build: test + language: c + headers: [] + src: + - test/core/gprpp/manual_constructor_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: message_compress_test + build: test + language: c + headers: [] + src: + - test/core/compression/message_compress_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: metadata_test + build: test + language: c + headers: [] + src: + - test/core/transport/metadata_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: minimal_stack_is_minimal_test + build: test + language: c + headers: [] + src: + - test/core/channel/minimal_stack_is_minimal_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: mpmcqueue_test + build: test + language: c + headers: [] + src: + - test/core/iomgr/mpmcqueue_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: mpscq_test + build: test + language: c + headers: [] + src: + - test/core/gprpp/mpscq_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac + uses_polling: false +- name: multiple_server_queues_test + build: test + language: c + headers: + - test/core/end2end/cq_verifier.h + src: + - test/core/end2end/cq_verifier.cc + - test/core/end2end/multiple_server_queues_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: murmur_hash_test + build: test + language: c + headers: [] + src: + - test/core/gpr/murmur_hash_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: no_server_test + build: test + language: c + headers: + - test/core/end2end/cq_verifier.h + src: + - test/core/end2end/cq_verifier.cc + - test/core/end2end/no_server_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: num_external_connectivity_watchers_test + build: test + language: c + headers: [] + src: + - test/core/surface/num_external_connectivity_watchers_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: parse_address_test + build: test + language: c + headers: [] + src: + - test/core/client_channel/parse_address_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: parse_address_with_named_scope_id_test + build: test + language: c + headers: [] + src: + - test/core/client_channel/parse_address_with_named_scope_id_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac + uses_polling: false +- name: parser_test + build: test + language: c + headers: + - test/core/end2end/data/ssl_test_data.h + src: + - test/core/end2end/data/client_certs.cc + - test/core/end2end/data/server1_cert.cc + - test/core/end2end/data/server1_key.cc + - test/core/end2end/data/test_root_cert.cc + - test/core/http/parser_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: percent_encoding_test + build: test + language: c + headers: [] + src: + - test/core/slice/percent_encoding_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: public_headers_must_be_c89 + build: test + language: c + headers: [] + src: + - test/core/surface/public_headers_must_be_c89.c + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: resolve_address_using_ares_resolver_posix_test + build: test + language: c + headers: [] + src: + - test/core/iomgr/resolve_address_posix_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + args: + - --resolver=ares + platforms: + - linux + - posix + - mac +- name: resolve_address_using_ares_resolver_test + build: test + language: c + headers: [] + src: + - test/core/iomgr/resolve_address_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + args: + - --resolver=ares +- name: resolve_address_using_native_resolver_posix_test + build: test + language: c + headers: [] + src: + - test/core/iomgr/resolve_address_posix_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + args: + - --resolver=native + platforms: + - linux + - posix + - mac +- name: resolve_address_using_native_resolver_test + build: test + language: c + headers: [] + src: + - test/core/iomgr/resolve_address_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + args: + - --resolver=native +- name: resource_quota_test + build: test + language: c + headers: [] + src: + - test/core/iomgr/resource_quota_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: secure_channel_create_test + build: test + language: c + headers: [] + src: + - test/core/surface/secure_channel_create_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: secure_endpoint_test + build: test + language: c + headers: + - test/core/iomgr/endpoint_tests.h + src: + - test/core/iomgr/endpoint_tests.cc + - test/core/security/secure_endpoint_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: security_connector_test + build: test + language: c + headers: [] + src: + - test/core/security/security_connector_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: sequential_connectivity_test + build: test + run: false + language: c + headers: [] + src: + - test/core/surface/sequential_connectivity_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: server_chttp2_test + build: test + language: c + headers: [] + src: + - test/core/surface/server_chttp2_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: server_ssl_test + build: test + language: c + headers: + - test/core/handshake/server_ssl_common.h + src: + - test/core/handshake/server_ssl.cc + - test/core/handshake/server_ssl_common.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac +- name: server_test + build: test + language: c + headers: [] + src: + - test/core/surface/server_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: slice_buffer_test + build: test + language: c + headers: [] + src: + - test/core/slice/slice_buffer_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: slice_string_helpers_test + build: test + language: c + headers: [] + src: + - test/core/slice/slice_string_helpers_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: sockaddr_resolver_test + build: test + language: c + headers: [] + src: + - test/core/client_channel/resolvers/sockaddr_resolver_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: sockaddr_utils_test + build: test + language: c + headers: [] + src: + - test/core/iomgr/sockaddr_utils_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: socket_utils_test + build: test + language: c + headers: [] + src: + - test/core/iomgr/socket_utils_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac +- name: spinlock_test + build: test + language: c + headers: [] + src: + - test/core/gpr/spinlock_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: ssl_credentials_test + build: test + language: c + headers: [] + src: + - test/core/security/ssl_credentials_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: ssl_transport_security_test + build: test + language: c + headers: + - test/core/tsi/transport_security_test_lib.h + src: + - test/core/tsi/ssl_transport_security_test.cc + - test/core/tsi/transport_security_test_lib.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac +- name: status_conversion_test + build: test + language: c + headers: [] + src: + - test/core/transport/status_conversion_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: stream_compression_test + build: test + language: c + headers: [] + src: + - test/core/compression/stream_compression_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: stream_map_test + build: test + language: c + headers: [] + src: + - test/core/transport/chttp2/stream_map_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: stream_owned_slice_test + build: test + language: c + headers: [] + src: + - test/core/transport/stream_owned_slice_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: string_test + build: test + language: c + headers: [] + src: + - test/core/gpr/string_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: sync_test + build: test + language: c + headers: [] + src: + - test/core/gpr/sync_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: tcp_client_posix_test + build: test + language: c + headers: [] + src: + - test/core/iomgr/tcp_client_posix_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac +- name: tcp_posix_test + build: test + language: c + headers: + - test/core/iomgr/endpoint_tests.h + src: + - test/core/iomgr/endpoint_tests.cc + - test/core/iomgr/tcp_posix_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + platforms: + - linux + - posix +- name: tcp_server_posix_test + build: test + language: c + headers: [] + src: + - test/core/iomgr/tcp_server_posix_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac +- name: test_core_gpr_time_test + build: test + language: c + headers: [] + src: + - test/core/gpr/time_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: test_core_security_credentials_test + build: test + language: c + headers: [] + src: + - test/core/security/credentials_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: test_core_slice_slice_test + build: test + language: c + headers: [] + src: + - test/core/slice/slice_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: thd_test + build: test + language: c + headers: [] + src: + - test/core/gprpp/thd_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: threadpool_test + build: test + language: c + headers: [] + src: + - test/core/iomgr/threadpool_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: time_averaged_stats_test + build: test + language: c + headers: [] + src: + - test/core/iomgr/time_averaged_stats_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: timeout_encoding_test + build: test + language: c + headers: [] + src: + - test/core/transport/timeout_encoding_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: timer_heap_test + build: test + language: c + headers: [] + src: + - test/core/iomgr/timer_heap_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: timer_list_test + build: test + language: c + headers: [] + src: + - test/core/iomgr/timer_list_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: tls_test + build: test + language: c + headers: [] + src: + - test/core/gpr/tls_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: transport_security_common_api_test + build: test + language: c + headers: [] + src: + - test/core/tsi/alts/handshaker/transport_security_common_api_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: transport_security_test + build: test + language: c + headers: [] + src: + - test/core/tsi/transport_security_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: udp_server_test + build: test + language: c + headers: [] + src: + - test/core/iomgr/udp_server_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac +- name: uri_parser_test + build: test + language: c + headers: [] + src: + - test/core/client_channel/uri_parser_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: useful_test + build: test + language: c + headers: [] + src: + - test/core/gpr/useful_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: varint_test + build: test + language: c + headers: [] + src: + - test/core/transport/chttp2/varint_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: address_sorting_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/cpp/naming/address_sorting_test.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc++_test_config + - grpc + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac +- name: address_sorting_test_unsecure + gtest: true + build: test + language: c++ + headers: + - test/cpp/util/byte_buffer_proto_helper.h + - test/cpp/util/string_ref_helper.h + - test/cpp/util/subprocess.h + src: + - test/cpp/naming/address_sorting_test.cc + - test/cpp/util/byte_buffer_proto_helper.cc + - test/cpp/util/string_ref_helper.cc + - test/cpp/util/subprocess.cc + deps: + - grpc_test_util_unsecure + - grpc++_unsecure + - grpc_unsecure + - grpc++_test_config + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac +- name: alarm_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/cpp/common/alarm_test.cc + deps: + - grpc_test_util_unsecure + - grpc++_unsecure + - grpc_unsecure + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac +- name: alts_concurrent_connectivity_test + gtest: true + build: test + language: c++ + headers: + - test/core/end2end/cq_verifier.h + - test/core/tsi/alts/fake_handshaker/fake_handshaker_server.h + src: + - test/core/tsi/alts/fake_handshaker/handshaker.proto + - test/core/tsi/alts/fake_handshaker/transport_security_common.proto + - test/core/end2end/cq_verifier.cc + - test/core/tsi/alts/fake_handshaker/fake_handshaker_server.cc + - test/core/tsi/alts/handshaker/alts_concurrent_connectivity_test.cc + deps: + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac +- name: alts_credentials_fuzzer + build: fuzzer + language: c++ + headers: [] + src: + - test/core/security/alts_credentials_fuzzer.cc + - test/core/util/fuzzer_corpus_test.cc + deps: + - grpc_test_util + - grpc++_test_config + - grpc + - gpr + - address_sorting + - upb + corpus_dirs: + - test/core/security/corpus/alts_credentials_corpus + maxlen: 2048 +- name: alts_util_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/cpp/common/alts_util_test.cc + deps: + - grpc++_test_util + - grpc++_alts + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb +- name: async_end2end_test + gtest: true + build: test + language: c++ + headers: [] + src: + - src/proto/grpc/health/v1/health.proto + - src/proto/grpc/testing/duplicate/echo_duplicate.proto + - src/proto/grpc/testing/echo.proto + - src/proto/grpc/testing/echo_messages.proto + - src/proto/grpc/testing/simple_messages.proto + - test/cpp/end2end/async_end2end_test.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb +- name: auth_property_iterator_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/cpp/common/auth_property_iterator_test.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: backoff_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/core/backoff/backoff_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: bad_streaming_id_bad_client_test + gtest: true + build: test + language: c++ + headers: + - test/core/bad_client/bad_client.h + - test/core/end2end/cq_verifier.h + src: + - test/core/bad_client/bad_client.cc + - test/core/bad_client/tests/bad_streaming_id.cc + - test/core/end2end/cq_verifier.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: badreq_bad_client_test + gtest: true + build: test + language: c++ + headers: + - test/core/bad_client/bad_client.h + - test/core/end2end/cq_verifier.h + src: + - test/core/bad_client/bad_client.cc + - test/core/bad_client/tests/badreq.cc + - test/core/end2end/cq_verifier.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: bdp_estimator_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/core/transport/bdp_estimator_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac + uses_polling: false +- name: bm_alarm + build: test + language: c++ + headers: [] + src: + - test/cpp/microbenchmarks/bm_alarm.cc + deps: + - benchmark_helpers + - grpc_test_util_unsecure + - grpc++_unsecure + - grpc_unsecure + - grpc++_test_config + - gpr + - address_sorting + - upb + - benchmark + benchmark: true + defaults: benchmark + platforms: + - linux + - posix +- name: bm_arena + build: test + language: c++ + headers: [] + src: + - test/cpp/microbenchmarks/bm_arena.cc + deps: + - benchmark_helpers + - grpc_test_util_unsecure + - grpc++_unsecure + - grpc_unsecure + - grpc++_test_config + - gpr + - address_sorting + - upb + - benchmark + benchmark: true + defaults: benchmark + platforms: + - linux + - posix + uses_polling: false +- name: bm_byte_buffer + build: test + language: c++ + headers: [] + src: + - test/cpp/microbenchmarks/bm_byte_buffer.cc + deps: + - benchmark_helpers + - grpc_test_util_unsecure + - grpc++_unsecure + - grpc_unsecure + - grpc++_test_config + - gpr + - address_sorting + - upb + - benchmark + benchmark: true + defaults: benchmark + platforms: + - linux + - posix + uses_polling: false +- name: bm_call_create + build: test + language: c++ + headers: [] + src: + - test/cpp/microbenchmarks/bm_call_create.cc + deps: + - benchmark_helpers + - grpc_test_util_unsecure + - grpc++_unsecure + - grpc_unsecure + - grpc++_test_config + - gpr + - address_sorting + - upb + - benchmark + benchmark: true + defaults: benchmark + platforms: + - linux + - posix + uses_polling: false +- name: bm_callback_streaming_ping_pong + build: test + language: c++ + headers: + - test/cpp/microbenchmarks/callback_streaming_ping_pong.h + - test/cpp/microbenchmarks/callback_test_service.h + - test/cpp/util/byte_buffer_proto_helper.h + - test/cpp/util/string_ref_helper.h + - test/cpp/util/subprocess.h + src: + - test/cpp/microbenchmarks/bm_callback_streaming_ping_pong.cc + - test/cpp/microbenchmarks/callback_test_service.cc + - test/cpp/util/byte_buffer_proto_helper.cc + - test/cpp/util/string_ref_helper.cc + - test/cpp/util/subprocess.cc + deps: + - benchmark_helpers + - grpc_test_util_unsecure + - grpc++_unsecure + - grpc_unsecure + - grpc++_test_config + - gpr + - address_sorting + - upb + - benchmark + benchmark: true + defaults: benchmark + platforms: + - linux + - posix +- name: bm_callback_unary_ping_pong + build: test + language: c++ + headers: + - test/cpp/microbenchmarks/callback_test_service.h + - test/cpp/microbenchmarks/callback_unary_ping_pong.h + - test/cpp/util/byte_buffer_proto_helper.h + - test/cpp/util/string_ref_helper.h + - test/cpp/util/subprocess.h + src: + - test/cpp/microbenchmarks/bm_callback_unary_ping_pong.cc + - test/cpp/microbenchmarks/callback_test_service.cc + - test/cpp/util/byte_buffer_proto_helper.cc + - test/cpp/util/string_ref_helper.cc + - test/cpp/util/subprocess.cc + deps: + - benchmark_helpers + - grpc_test_util_unsecure + - grpc++_unsecure + - grpc_unsecure + - grpc++_test_config + - gpr + - address_sorting + - upb + - benchmark + benchmark: true + defaults: benchmark + platforms: + - linux + - posix +- name: bm_channel + build: test + language: c++ + headers: [] + src: + - test/cpp/microbenchmarks/bm_channel.cc + deps: + - benchmark_helpers + - grpc_test_util_unsecure + - grpc++_unsecure + - grpc_unsecure + - grpc++_test_config + - gpr + - address_sorting + - upb + - benchmark + benchmark: true + defaults: benchmark + platforms: + - linux + - posix + uses_polling: false +- name: bm_chttp2_hpack + build: test + language: c++ + headers: [] + src: + - test/cpp/microbenchmarks/bm_chttp2_hpack.cc + deps: + - benchmark_helpers + - grpc_test_util_unsecure + - grpc++_unsecure + - grpc_unsecure + - grpc++_test_config + - gpr + - address_sorting + - upb + - benchmark + benchmark: true + defaults: benchmark + platforms: + - linux + - posix + uses_polling: false +- name: bm_chttp2_transport + build: test + language: c++ + headers: [] + src: + - test/cpp/microbenchmarks/bm_chttp2_transport.cc + deps: + - benchmark_helpers + - grpc_test_util_unsecure + - grpc++_unsecure + - grpc_unsecure + - grpc++_test_config + - gpr + - address_sorting + - upb + - benchmark + benchmark: true + defaults: benchmark + platforms: + - linux + - posix +- name: bm_closure + build: test + language: c++ + headers: [] + src: + - test/cpp/microbenchmarks/bm_closure.cc + deps: + - benchmark_helpers + - grpc_test_util_unsecure + - grpc++_unsecure + - grpc_unsecure + - grpc++_test_config + - gpr + - address_sorting + - upb + - benchmark + benchmark: true + defaults: benchmark + platforms: + - linux + - posix +- name: bm_cq + build: test + language: c++ + headers: [] + src: + - test/cpp/microbenchmarks/bm_cq.cc + deps: + - benchmark_helpers + - grpc_test_util_unsecure + - grpc++_unsecure + - grpc_unsecure + - grpc++_test_config + - gpr + - address_sorting + - upb + - benchmark + benchmark: true + defaults: benchmark + platforms: + - linux + - posix +- name: bm_cq_multiple_threads + build: test + language: c++ + headers: [] + src: + - test/cpp/microbenchmarks/bm_cq_multiple_threads.cc + deps: + - benchmark_helpers + - grpc_test_util_unsecure + - grpc++_unsecure + - grpc_unsecure + - grpc++_test_config + - gpr + - address_sorting + - upb + - benchmark + benchmark: true + defaults: benchmark + platforms: + - linux + - posix + uses_polling: false +- name: bm_error + build: test + language: c++ + headers: [] + src: + - test/cpp/microbenchmarks/bm_error.cc + deps: + - benchmark_helpers + - grpc_test_util_unsecure + - grpc++_unsecure + - grpc_unsecure + - grpc++_test_config + - gpr + - address_sorting + - upb + - benchmark + benchmark: true + defaults: benchmark + platforms: + - linux + - posix + uses_polling: false +- name: bm_fullstack_streaming_ping_pong + build: test + language: c++ + headers: + - test/cpp/microbenchmarks/fullstack_streaming_ping_pong.h + src: + - test/cpp/microbenchmarks/bm_fullstack_streaming_ping_pong.cc + deps: + - benchmark_helpers + - grpc_test_util_unsecure + - grpc++_unsecure + - grpc_unsecure + - grpc++_test_config + - gpr + - address_sorting + - upb + - benchmark + benchmark: true + defaults: benchmark + platforms: + - linux + - posix +- name: bm_fullstack_streaming_pump + build: test + language: c++ + headers: + - test/cpp/microbenchmarks/fullstack_streaming_pump.h + src: + - test/cpp/microbenchmarks/bm_fullstack_streaming_pump.cc + deps: + - benchmark_helpers + - grpc_test_util_unsecure + - grpc++_unsecure + - grpc_unsecure + - grpc++_test_config + - gpr + - address_sorting + - upb + - benchmark + benchmark: true + defaults: benchmark + platforms: + - linux + - posix +- name: bm_fullstack_trickle + build: test + run: false + language: c++ + headers: [] + src: + - test/cpp/microbenchmarks/bm_fullstack_trickle.cc + deps: + - benchmark_helpers + - grpc_test_util_unsecure + - grpc++_unsecure + - grpc_unsecure + - grpc++_test_config + - gpr + - address_sorting + - upb + - benchmark + benchmark: true + defaults: benchmark + platforms: + - linux + - posix + - mac +- name: bm_fullstack_unary_ping_pong + build: test + language: c++ + headers: + - test/cpp/microbenchmarks/fullstack_unary_ping_pong.h + src: + - test/cpp/microbenchmarks/bm_fullstack_unary_ping_pong.cc + deps: + - benchmark_helpers + - grpc_test_util_unsecure + - grpc++_unsecure + - grpc_unsecure + - grpc++_test_config + - gpr + - address_sorting + - upb + - benchmark + benchmark: true + defaults: benchmark + platforms: + - linux + - posix +- name: bm_metadata + build: test + language: c++ + headers: [] + src: + - test/cpp/microbenchmarks/bm_metadata.cc + deps: + - benchmark_helpers + - grpc_test_util_unsecure + - grpc++_unsecure + - grpc_unsecure + - grpc++_test_config + - gpr + - address_sorting + - upb + - benchmark + benchmark: true + defaults: benchmark + platforms: + - linux + - posix + uses_polling: false +- name: bm_pollset + build: test + language: c++ + headers: [] + src: + - test/cpp/microbenchmarks/bm_pollset.cc + deps: + - benchmark_helpers + - grpc_test_util_unsecure + - grpc++_unsecure + - grpc_unsecure + - grpc++_test_config + - gpr + - address_sorting + - upb + - benchmark + benchmark: true + defaults: benchmark + platforms: + - linux + - posix +- name: bm_threadpool + build: test + run: false + language: c++ + headers: [] + src: + - test/cpp/microbenchmarks/bm_threadpool.cc + deps: + - benchmark_helpers + - grpc_test_util_unsecure + - grpc++_unsecure + - grpc_unsecure + - grpc++_test_config + - gpr + - address_sorting + - upb + - benchmark + benchmark: true + defaults: benchmark + platforms: + - linux + - posix + - mac + uses_polling: false +- name: bm_timer + build: test + language: c++ + headers: [] + src: + - test/cpp/microbenchmarks/bm_timer.cc + deps: + - benchmark_helpers + - grpc_test_util_unsecure + - grpc++_unsecure + - grpc_unsecure + - grpc++_test_config + - gpr + - address_sorting + - upb + - benchmark + benchmark: true + defaults: benchmark + platforms: + - linux + - posix + uses_polling: false +- name: byte_buffer_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/cpp/util/byte_buffer_test.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: byte_stream_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/core/transport/byte_stream_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: cancel_ares_query_test + gtest: true + build: test + run: false + language: c++ + headers: + - test/core/end2end/cq_verifier.h + - test/cpp/naming/dns_test_util.h + src: + - test/core/end2end/cq_verifier.cc + - test/cpp/naming/cancel_ares_query_test.cc + - test/cpp/naming/dns_test_util.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc++_test_config + - grpc + - gpr + - address_sorting + - upb +- name: cfstream_test + gtest: true + build: test + run: false + language: c++ + headers: + - test/cpp/end2end/test_service_impl.h + src: + - src/proto/grpc/testing/echo.proto + - src/proto/grpc/testing/echo_messages.proto + - src/proto/grpc/testing/simple_messages.proto + - test/cpp/end2end/cfstream_test.cc + - test/cpp/end2end/test_service_impl.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb +- name: channel_arguments_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/cpp/common/channel_arguments_test.cc + deps: + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: channel_filter_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/cpp/common/channel_filter_test.cc + deps: + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: channel_trace_test + gtest: true + build: test + language: c++ + headers: + - test/cpp/util/channel_trace_proto_helper.h + src: + - src/proto/grpc/channelz/channelz.proto + - test/core/channel/channel_trace_test.cc + - test/cpp/util/channel_trace_proto_helper.cc + deps: + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb +- name: channelz_registry_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/core/channel/channelz_registry_test.cc + deps: + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: channelz_service_test + gtest: true + build: test + language: c++ + headers: + - test/cpp/end2end/test_service_impl.h + src: + - src/proto/grpc/testing/echo.proto + - src/proto/grpc/testing/echo_messages.proto + - src/proto/grpc/testing/simple_messages.proto + - test/cpp/end2end/channelz_service_test.cc + - test/cpp/end2end/test_service_impl.cc + deps: + - grpcpp_channelz + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb +- name: channelz_test + gtest: true + build: test + language: c++ + headers: + - test/cpp/util/channel_trace_proto_helper.h + src: + - src/proto/grpc/channelz/channelz.proto + - test/core/channel/channelz_test.cc + - test/cpp/util/channel_trace_proto_helper.cc + deps: + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb +- name: cli_call_test + gtest: true + build: test + language: c++ + headers: + - test/cpp/util/cli_call.h + - test/cpp/util/cli_credentials.h + - test/cpp/util/config_grpc_cli.h + - test/cpp/util/grpc_tool.h + - test/cpp/util/proto_file_parser.h + - test/cpp/util/proto_reflection_descriptor_database.h + - test/cpp/util/service_describer.h + src: + - src/proto/grpc/reflection/v1alpha/reflection.proto + - src/proto/grpc/testing/echo.proto + - src/proto/grpc/testing/echo_messages.proto + - src/proto/grpc/testing/simple_messages.proto + - test/cpp/util/cli_call.cc + - test/cpp/util/cli_call_test.cc + - test/cpp/util/cli_credentials.cc + - test/cpp/util/grpc_tool.cc + - test/cpp/util/proto_file_parser.cc + - test/cpp/util/proto_reflection_descriptor_database.cc + - test/cpp/util/service_describer.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb +- name: client_callback_end2end_test + gtest: true + build: test + language: c++ + headers: + - test/cpp/end2end/interceptors_util.h + - test/cpp/end2end/test_service_impl.h + src: + - src/proto/grpc/testing/echo.proto + - src/proto/grpc/testing/echo_messages.proto + - src/proto/grpc/testing/simple_messages.proto + - test/cpp/end2end/client_callback_end2end_test.cc + - test/cpp/end2end/interceptors_util.cc + - test/cpp/end2end/test_service_impl.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb +- name: client_channel_stress_test + gtest: true + build: test + run: false + language: c++ + headers: + - test/cpp/end2end/test_service_impl.h + src: + - src/proto/grpc/lb/v1/load_balancer.proto + - src/proto/grpc/testing/duplicate/echo_duplicate.proto + - src/proto/grpc/testing/echo.proto + - src/proto/grpc/testing/echo_messages.proto + - src/proto/grpc/testing/simple_messages.proto + - test/cpp/client/client_channel_stress_test.cc + - test/cpp/end2end/test_service_impl.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac +- name: client_fuzzer + build: fuzzer + language: c++ + headers: [] + src: + - test/core/end2end/fuzzers/client_fuzzer.cc + - test/core/util/fuzzer_corpus_test.cc + deps: + - grpc_test_util + - grpc++_test_config + - grpc + - gpr + - address_sorting + - upb + corpus_dirs: + - test/core/end2end/fuzzers/client_fuzzer_corpus + dict: test/core/end2end/fuzzers/hpack.dictionary + maxlen: 2048 +- name: client_interceptors_end2end_test + gtest: true + build: test + language: c++ + headers: + - test/cpp/end2end/interceptors_util.h + - test/cpp/end2end/test_service_impl.h + src: + - src/proto/grpc/testing/echo.proto + - src/proto/grpc/testing/echo_messages.proto + - src/proto/grpc/testing/simple_messages.proto + - test/cpp/end2end/client_interceptors_end2end_test.cc + - test/cpp/end2end/interceptors_util.cc + - test/cpp/end2end/test_service_impl.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb +- name: client_lb_end2end_test + gtest: true + build: test + run: false + language: c++ + headers: + - test/core/util/test_lb_policies.h + - test/cpp/end2end/test_service_impl.h + src: + - src/proto/grpc/testing/duplicate/echo_duplicate.proto + - src/proto/grpc/testing/echo.proto + - src/proto/grpc/testing/echo_messages.proto + - src/proto/grpc/testing/simple_messages.proto + - src/proto/grpc/testing/xds/orca_load_report_for_test.proto + - test/core/util/test_lb_policies.cc + - test/cpp/end2end/client_lb_end2end_test.cc + - test/cpp/end2end/test_service_impl.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac +- name: codegen_test_full + gtest: true + build: test + language: c++ + headers: [] + src: + - test/cpp/codegen/codegen_test_full.cc + deps: + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: codegen_test_minimal + gtest: true + build: test + language: c++ + headers: [] + src: + - test/cpp/codegen/codegen_test_minimal.cc + deps: + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: connection_prefix_bad_client_test + gtest: true + build: test + language: c++ + headers: + - test/core/bad_client/bad_client.h + - test/core/end2end/cq_verifier.h + src: + - test/core/bad_client/bad_client.cc + - test/core/bad_client/tests/connection_prefix.cc + - test/core/end2end/cq_verifier.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: connectivity_state_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/core/transport/connectivity_state_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: context_list_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/core/transport/chttp2/context_list_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: delegating_channel_test + gtest: true + build: test + language: c++ + headers: + - test/cpp/end2end/test_service_impl.h + src: + - src/proto/grpc/testing/echo.proto + - src/proto/grpc/testing/echo_messages.proto + - src/proto/grpc/testing/simple_messages.proto + - test/cpp/end2end/delegating_channel_test.cc + - test/cpp/end2end/test_service_impl.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb +- name: destroy_grpclb_channel_with_active_connect_stress_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/cpp/client/destroy_grpclb_channel_with_active_connect_stress_test.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb +- name: duplicate_header_bad_client_test + gtest: true + build: test + language: c++ + headers: + - test/core/bad_client/bad_client.h + - test/core/end2end/cq_verifier.h + src: + - test/core/bad_client/bad_client.cc + - test/core/bad_client/tests/duplicate_header.cc + - test/core/end2end/cq_verifier.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: end2end_test + gtest: true + build: test + run: false + language: c++ + headers: + - test/cpp/end2end/interceptors_util.h + - test/cpp/end2end/test_service_impl.h + src: + - src/proto/grpc/testing/duplicate/echo_duplicate.proto + - src/proto/grpc/testing/echo.proto + - src/proto/grpc/testing/echo_messages.proto + - src/proto/grpc/testing/simple_messages.proto + - test/cpp/end2end/end2end_test.cc + - test/cpp/end2end/interceptors_util.cc + - test/cpp/end2end/test_service_impl.cc + deps: + - grpc++_test_util + - grpc++_test + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb +- name: error_details_test + gtest: true + build: test + language: c++ + headers: [] + src: + - src/proto/grpc/testing/echo_messages.proto + - test/cpp/util/error_details_test.cc + deps: + - grpc++_error_details + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb +- name: eventmanager_libuv_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/core/iomgr/poller/eventmanager_libuv_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: exception_test + gtest: true + build: test + language: c++ + headers: [] + src: + - src/proto/grpc/testing/echo.proto + - src/proto/grpc/testing/echo_messages.proto + - src/proto/grpc/testing/simple_messages.proto + - test/cpp/end2end/exception_test.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb +- name: filter_end2end_test + gtest: true + build: test + language: c++ + headers: [] + src: + - src/proto/grpc/testing/duplicate/echo_duplicate.proto + - src/proto/grpc/testing/echo.proto + - src/proto/grpc/testing/echo_messages.proto + - src/proto/grpc/testing/simple_messages.proto + - test/cpp/end2end/filter_end2end_test.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb +- name: flaky_network_test + gtest: true + build: test + run: false + language: c++ + headers: + - test/cpp/end2end/test_service_impl.h + src: + - src/proto/grpc/testing/echo.proto + - src/proto/grpc/testing/echo_messages.proto + - src/proto/grpc/testing/simple_messages.proto + - test/cpp/end2end/flaky_network_test.cc + - test/cpp/end2end/test_service_impl.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb +- name: generic_end2end_test + gtest: true + build: test + language: c++ + headers: [] + src: + - src/proto/grpc/testing/duplicate/echo_duplicate.proto + - src/proto/grpc/testing/echo.proto + - src/proto/grpc/testing/echo_messages.proto + - src/proto/grpc/testing/simple_messages.proto + - test/cpp/end2end/generic_end2end_test.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb +- name: global_config_env_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/core/gprpp/global_config_env_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac + uses_polling: false +- name: global_config_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/core/gprpp/global_config_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: grpc_cli + build: test + run: false + language: c++ + headers: + - test/cpp/util/cli_call.h + - test/cpp/util/cli_credentials.h + - test/cpp/util/config_grpc_cli.h + - test/cpp/util/grpc_tool.h + - test/cpp/util/proto_file_parser.h + - test/cpp/util/proto_reflection_descriptor_database.h + - test/cpp/util/service_describer.h + src: + - src/proto/grpc/reflection/v1alpha/reflection.proto + - test/cpp/util/cli_call.cc + - test/cpp/util/cli_credentials.cc + - test/cpp/util/grpc_cli.cc + - test/cpp/util/grpc_tool.cc + - test/cpp/util/proto_file_parser.cc + - test/cpp/util/proto_reflection_descriptor_database.cc + - test/cpp/util/service_describer.cc + deps: + - grpc++ + - grpc++_test_config + - grpc + - gpr + - address_sorting + - upb +- name: grpc_cpp_plugin + build: protoc + language: c++ + headers: [] + src: + - src/compiler/cpp_plugin.cc + deps: + - grpc_plugin_support + secure: false +- name: grpc_csharp_plugin + build: protoc + language: c++ + headers: [] + src: + - src/compiler/csharp_plugin.cc + deps: + - grpc_plugin_support + secure: false +- name: grpc_node_plugin + build: protoc + language: c++ + headers: [] + src: + - src/compiler/node_plugin.cc + deps: + - grpc_plugin_support + secure: false +- name: grpc_objective_c_plugin + build: protoc + language: c++ + headers: [] + src: + - src/compiler/objective_c_plugin.cc + deps: + - grpc_plugin_support + secure: false +- name: grpc_php_plugin + build: protoc + language: c++ + headers: [] + src: + - src/compiler/php_plugin.cc + deps: + - grpc_plugin_support + secure: false +- name: grpc_python_plugin + build: protoc + language: c++ + headers: [] + src: + - src/compiler/python_plugin.cc + deps: + - grpc_plugin_support + secure: false +- name: grpc_ruby_plugin + build: protoc + language: c++ + headers: [] + src: + - src/compiler/ruby_plugin.cc + deps: + - grpc_plugin_support + secure: false +- name: grpc_tls_credentials_options_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/core/security/grpc_tls_credentials_options_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: grpc_tool_test + gtest: true + build: test + language: c++ + headers: + - test/cpp/util/cli_call.h + - test/cpp/util/cli_credentials.h + - test/cpp/util/config_grpc_cli.h + - test/cpp/util/grpc_tool.h + - test/cpp/util/proto_file_parser.h + - test/cpp/util/proto_reflection_descriptor_database.h + - test/cpp/util/service_describer.h + src: + - src/proto/grpc/testing/echo.proto + - src/proto/grpc/testing/echo_messages.proto + - src/proto/grpc/testing/simple_messages.proto + - test/cpp/util/cli_call.cc + - test/cpp/util/cli_credentials.cc + - test/cpp/util/grpc_tool.cc + - test/cpp/util/grpc_tool_test.cc + - test/cpp/util/proto_file_parser.cc + - test/cpp/util/proto_reflection_descriptor_database.cc + - test/cpp/util/service_describer.cc + deps: + - grpc++_test_util + - grpc++_reflection + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac +- name: grpclb_api_test + gtest: true + build: test + language: c++ + headers: [] + src: + - src/proto/grpc/lb/v1/load_balancer.proto + - test/cpp/grpclb/grpclb_api_test.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb +- name: grpclb_end2end_test + gtest: true + build: test + run: false + language: c++ + headers: + - test/cpp/end2end/test_service_impl.h + src: + - src/proto/grpc/lb/v1/load_balancer.proto + - src/proto/grpc/testing/duplicate/echo_duplicate.proto + - src/proto/grpc/testing/echo.proto + - src/proto/grpc/testing/echo_messages.proto + - src/proto/grpc/testing/simple_messages.proto + - test/cpp/end2end/grpclb_end2end_test.cc + - test/cpp/end2end/test_service_impl.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac +- name: h2_ssl_session_reuse_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/core/end2end/h2_ssl_session_reuse_test.cc + deps: + - end2end_tests + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: head_of_line_blocking_bad_client_test + gtest: true + build: test + language: c++ + headers: + - test/core/bad_client/bad_client.h + - test/core/end2end/cq_verifier.h + src: + - test/core/bad_client/bad_client.cc + - test/core/bad_client/tests/head_of_line_blocking.cc + - test/core/end2end/cq_verifier.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: headers_bad_client_test + gtest: true + build: test + language: c++ + headers: + - test/core/bad_client/bad_client.h + - test/core/end2end/cq_verifier.h + src: + - test/core/bad_client/bad_client.cc + - test/core/bad_client/tests/headers.cc + - test/core/end2end/cq_verifier.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: health_service_end2end_test + gtest: true + build: test + language: c++ + headers: + - test/cpp/end2end/test_health_check_service_impl.h + - test/cpp/end2end/test_service_impl.h + src: + - src/proto/grpc/health/v1/health.proto + - src/proto/grpc/testing/duplicate/echo_duplicate.proto + - src/proto/grpc/testing/echo.proto + - src/proto/grpc/testing/echo_messages.proto + - src/proto/grpc/testing/simple_messages.proto + - test/cpp/end2end/health_service_end2end_test.cc + - test/cpp/end2end/test_health_check_service_impl.cc + - test/cpp/end2end/test_service_impl.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb +- name: hpack_parser_fuzzer_test + build: fuzzer + language: c++ + headers: [] + src: + - test/core/transport/chttp2/hpack_parser_fuzzer_test.cc + - test/core/util/fuzzer_corpus_test.cc + deps: + - grpc_test_util + - grpc++_test_config + - grpc + - gpr + - address_sorting + - upb + corpus_dirs: + - test/core/transport/chttp2/hpack_parser_corpus + dict: test/core/end2end/fuzzers/hpack.dictionary + maxlen: 512 +- name: http2_client + build: test + run: false + language: c++ + headers: [] + src: + - src/proto/grpc/testing/empty.proto + - src/proto/grpc/testing/messages.proto + - src/proto/grpc/testing/test.proto + - test/cpp/interop/http2_client.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc++_test_config + - grpc + - gpr + - address_sorting + - upb +- name: http_request_fuzzer_test + build: fuzzer + language: c++ + headers: [] + src: + - test/core/http/request_fuzzer.cc + - test/core/util/fuzzer_corpus_test.cc + deps: + - grpc_test_util + - grpc++_test_config + - grpc + - gpr + - address_sorting + - upb + corpus_dirs: + - test/core/http/request_corpus + maxlen: 2048 +- name: http_response_fuzzer_test + build: fuzzer + language: c++ + headers: [] + src: + - test/core/http/response_fuzzer.cc + - test/core/util/fuzzer_corpus_test.cc + deps: + - grpc_test_util + - grpc++_test_config + - grpc + - gpr + - address_sorting + - upb + corpus_dirs: + - test/core/http/response_corpus + maxlen: 2048 +- name: hybrid_end2end_test + gtest: true + build: test + language: c++ + headers: + - test/cpp/end2end/test_service_impl.h + src: + - src/proto/grpc/testing/duplicate/echo_duplicate.proto + - src/proto/grpc/testing/echo.proto + - src/proto/grpc/testing/echo_messages.proto + - src/proto/grpc/testing/simple_messages.proto + - test/cpp/end2end/hybrid_end2end_test.cc + - test/cpp/end2end/test_service_impl.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb +- name: initial_settings_frame_bad_client_test + gtest: true + build: test + language: c++ + headers: + - test/core/bad_client/bad_client.h + - test/core/end2end/cq_verifier.h + src: + - test/core/bad_client/bad_client.cc + - test/core/bad_client/tests/initial_settings_frame.cc + - test/core/end2end/cq_verifier.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: interop_client + build: test + run: false + language: c++ + headers: + - test/core/security/oauth2_utils.h + - test/cpp/interop/client_helper.h + - test/cpp/interop/interop_client.h + src: + - src/proto/grpc/testing/empty.proto + - src/proto/grpc/testing/messages.proto + - src/proto/grpc/testing/test.proto + - test/core/security/oauth2_utils.cc + - test/cpp/interop/client.cc + - test/cpp/interop/client_helper.cc + - test/cpp/interop/interop_client.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc++_test_config + - grpc + - gpr + - address_sorting + - upb +- name: interop_server + build: test + run: false + language: c++ + headers: + - test/cpp/interop/server_helper.h + src: + - src/proto/grpc/testing/empty.proto + - src/proto/grpc/testing/messages.proto + - src/proto/grpc/testing/test.proto + - test/cpp/interop/interop_server.cc + - test/cpp/interop/interop_server_bootstrap.cc + - test/cpp/interop/server_helper.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc++_test_config + - grpc + - gpr + - address_sorting + - upb +- name: interop_test + build: test + language: c++ + headers: [] + src: + - test/cpp/interop/interop_test.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc++_test_config + - grpc + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac +- name: json_fuzzer_test + build: fuzzer + language: c++ + headers: [] + src: + - test/core/json/fuzzer.cc + - test/core/util/fuzzer_corpus_test.cc + deps: + - grpc_test_util + - grpc++_test_config + - grpc + - gpr + - address_sorting + - upb + corpus_dirs: + - test/core/json/corpus + maxlen: 512 +- name: json_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/core/json/json_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: large_metadata_bad_client_test + gtest: true + build: test + language: c++ + headers: + - test/core/bad_client/bad_client.h + - test/core/end2end/cq_verifier.h + src: + - test/core/bad_client/bad_client.cc + - test/core/bad_client/tests/large_metadata.cc + - test/core/end2end/cq_verifier.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: lb_get_cpu_stats_test + gtest: true + build: test + language: c++ + headers: + - src/cpp/server/load_reporter/get_cpu_stats.h + src: + - src/cpp/server/load_reporter/get_cpu_stats_linux.cc + - src/cpp/server/load_reporter/get_cpu_stats_macos.cc + - src/cpp/server/load_reporter/get_cpu_stats_unsupported.cc + - src/cpp/server/load_reporter/get_cpu_stats_windows.cc + - test/cpp/server/load_reporter/get_cpu_stats_test.cc + deps: + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb +- name: lb_load_data_store_test + gtest: true + build: test + language: c++ + headers: + - src/cpp/server/load_reporter/constants.h + - src/cpp/server/load_reporter/load_data_store.h + src: + - src/cpp/server/load_reporter/load_data_store.cc + - test/cpp/server/load_reporter/load_data_store_test.cc + deps: + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb +- name: linux_system_roots_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/core/security/linux_system_roots_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: message_allocator_end2end_test + gtest: true + build: test + language: c++ + headers: + - test/cpp/end2end/test_service_impl.h + src: + - src/proto/grpc/testing/echo.proto + - src/proto/grpc/testing/echo_messages.proto + - src/proto/grpc/testing/simple_messages.proto + - test/cpp/end2end/message_allocator_end2end_test.cc + - test/cpp/end2end/test_service_impl.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb +- name: mock_test + gtest: true + build: test + language: c++ + headers: [] + src: + - src/proto/grpc/testing/duplicate/echo_duplicate.proto + - src/proto/grpc/testing/echo.proto + - src/proto/grpc/testing/echo_messages.proto + - src/proto/grpc/testing/simple_messages.proto + - test/cpp/end2end/mock_test.cc + deps: + - grpc++_test_util + - grpc++_test + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb +- name: nanopb_fuzzer_response_test + build: fuzzer + language: c++ + headers: [] + src: + - test/core/nanopb/fuzzer_response.cc + - test/core/util/fuzzer_corpus_test.cc + deps: + - grpc_test_util + - grpc++_test_config + - grpc + - gpr + - address_sorting + - upb + corpus_dirs: + - test/core/nanopb/corpus_response + maxlen: 128 +- name: nanopb_fuzzer_serverlist_test + build: fuzzer + language: c++ + headers: [] + src: + - test/core/nanopb/fuzzer_serverlist.cc + - test/core/util/fuzzer_corpus_test.cc + deps: + - grpc_test_util + - grpc++_test_config + - grpc + - gpr + - address_sorting + - upb + corpus_dirs: + - test/core/nanopb/corpus_serverlist + maxlen: 128 +- name: nonblocking_test + gtest: true + build: test + language: c++ + headers: [] + src: + - src/proto/grpc/testing/echo.proto + - src/proto/grpc/testing/echo_messages.proto + - src/proto/grpc/testing/simple_messages.proto + - test/cpp/end2end/nonblocking_test.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb +- name: noop-benchmark + build: test + language: c++ + headers: [] + src: + - test/cpp/microbenchmarks/noop-benchmark.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + - benchmark + benchmark: true + defaults: benchmark +- name: orphanable_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/core/gprpp/orphanable_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: out_of_bounds_bad_client_test + gtest: true + build: test + language: c++ + headers: + - test/core/bad_client/bad_client.h + - test/core/end2end/cq_verifier.h + src: + - test/core/bad_client/bad_client.cc + - test/core/bad_client/tests/out_of_bounds.cc + - test/core/end2end/cq_verifier.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: percent_decode_fuzzer + build: fuzzer + language: c++ + headers: [] + src: + - test/core/slice/percent_decode_fuzzer.cc + - test/core/util/fuzzer_corpus_test.cc + deps: + - grpc_test_util + - grpc++_test_config + - grpc + - gpr + - address_sorting + - upb + corpus_dirs: + - test/core/slice/percent_decode_corpus + maxlen: 32 +- name: percent_encode_fuzzer + build: fuzzer + language: c++ + headers: [] + src: + - test/core/slice/percent_encode_fuzzer.cc + - test/core/util/fuzzer_corpus_test.cc + deps: + - grpc_test_util + - grpc++_test_config + - grpc + - gpr + - address_sorting + - upb + corpus_dirs: + - test/core/slice/percent_encode_corpus + maxlen: 32 +- name: pid_controller_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/core/transport/pid_controller_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: port_sharing_end2end_test + gtest: true + build: test + language: c++ + headers: + - test/cpp/end2end/test_service_impl.h + src: + - src/proto/grpc/testing/echo.proto + - src/proto/grpc/testing/echo_messages.proto + - src/proto/grpc/testing/simple_messages.proto + - test/cpp/end2end/port_sharing_end2end_test.cc + - test/cpp/end2end/test_service_impl.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb +- name: proto_server_reflection_test + gtest: true + build: test + language: c++ + headers: + - test/cpp/end2end/test_service_impl.h + - test/cpp/util/proto_reflection_descriptor_database.h + src: + - src/proto/grpc/testing/duplicate/echo_duplicate.proto + - src/proto/grpc/testing/echo.proto + - src/proto/grpc/testing/echo_messages.proto + - src/proto/grpc/testing/simple_messages.proto + - test/cpp/end2end/proto_server_reflection_test.cc + - test/cpp/end2end/test_service_impl.cc + - test/cpp/util/proto_reflection_descriptor_database.cc + deps: + - grpc++_test_util + - grpc++_reflection + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb +- name: proto_utils_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/cpp/codegen/proto_utils_test.cc + deps: + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: qps_json_driver + build: test + run: false + language: c++ + headers: + - src/cpp/util/core_stats.h + - test/cpp/qps/benchmark_config.h + - test/cpp/qps/client.h + - test/cpp/qps/driver.h + - test/cpp/qps/histogram.h + - test/cpp/qps/interarrival.h + - test/cpp/qps/parse_json.h + - test/cpp/qps/qps_server_builder.h + - test/cpp/qps/qps_worker.h + - test/cpp/qps/report.h + - test/cpp/qps/server.h + - test/cpp/qps/stats.h + - test/cpp/qps/usage_timer.h + src: + - src/proto/grpc/core/stats.proto + - src/proto/grpc/testing/benchmark_service.proto + - src/proto/grpc/testing/control.proto + - src/proto/grpc/testing/messages.proto + - src/proto/grpc/testing/payloads.proto + - src/proto/grpc/testing/report_qps_scenario_service.proto + - src/proto/grpc/testing/stats.proto + - src/proto/grpc/testing/worker_service.proto + - src/cpp/util/core_stats.cc + - test/cpp/qps/benchmark_config.cc + - test/cpp/qps/client_async.cc + - test/cpp/qps/client_callback.cc + - test/cpp/qps/client_sync.cc + - test/cpp/qps/driver.cc + - test/cpp/qps/parse_json.cc + - test/cpp/qps/qps_json_driver.cc + - test/cpp/qps/qps_server_builder.cc + - test/cpp/qps/qps_worker.cc + - test/cpp/qps/report.cc + - test/cpp/qps/server_async.cc + - test/cpp/qps/server_callback.cc + - test/cpp/qps/server_sync.cc + - test/cpp/qps/usage_timer.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc++_test_config + - grpc + - gpr + - address_sorting + - upb +- name: qps_worker + build: test + run: false + language: c++ + headers: + - src/cpp/util/core_stats.h + - test/cpp/qps/client.h + - test/cpp/qps/histogram.h + - test/cpp/qps/interarrival.h + - test/cpp/qps/qps_server_builder.h + - test/cpp/qps/qps_worker.h + - test/cpp/qps/server.h + - test/cpp/qps/stats.h + - test/cpp/qps/usage_timer.h + src: + - src/proto/grpc/core/stats.proto + - src/proto/grpc/testing/benchmark_service.proto + - src/proto/grpc/testing/control.proto + - src/proto/grpc/testing/messages.proto + - src/proto/grpc/testing/payloads.proto + - src/proto/grpc/testing/stats.proto + - src/proto/grpc/testing/worker_service.proto + - src/cpp/util/core_stats.cc + - test/cpp/qps/client_async.cc + - test/cpp/qps/client_callback.cc + - test/cpp/qps/client_sync.cc + - test/cpp/qps/qps_server_builder.cc + - test/cpp/qps/qps_worker.cc + - test/cpp/qps/server_async.cc + - test/cpp/qps/server_callback.cc + - test/cpp/qps/server_sync.cc + - test/cpp/qps/usage_timer.cc + - test/cpp/qps/worker.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc++_test_config + - grpc + - gpr + - address_sorting + - upb +- name: raw_end2end_test + gtest: true + build: test + language: c++ + headers: + - test/cpp/end2end/test_service_impl.h + src: + - src/proto/grpc/testing/duplicate/echo_duplicate.proto + - src/proto/grpc/testing/echo.proto + - src/proto/grpc/testing/echo_messages.proto + - src/proto/grpc/testing/simple_messages.proto + - test/cpp/end2end/raw_end2end_test.cc + - test/cpp/end2end/test_service_impl.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb +- name: ref_counted_ptr_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/core/gprpp/ref_counted_ptr_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: ref_counted_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/core/gprpp/ref_counted_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: retry_throttle_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/core/client_channel/retry_throttle_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: secure_auth_context_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/cpp/common/secure_auth_context_test.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb +- name: server_builder_plugin_test + gtest: true + build: test + language: c++ + headers: + - test/cpp/end2end/test_service_impl.h + src: + - src/proto/grpc/testing/duplicate/echo_duplicate.proto + - src/proto/grpc/testing/echo.proto + - src/proto/grpc/testing/echo_messages.proto + - src/proto/grpc/testing/simple_messages.proto + - test/cpp/end2end/server_builder_plugin_test.cc + - test/cpp/end2end/test_service_impl.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb +- name: server_builder_test + gtest: true + build: test + language: c++ + headers: [] + src: + - src/proto/grpc/testing/echo.proto + - src/proto/grpc/testing/echo_messages.proto + - src/proto/grpc/testing/simple_messages.proto + - test/cpp/server/server_builder_test.cc + deps: + - grpc_test_util_unsecure + - grpc++_unsecure + - grpc_unsecure + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac +- name: server_builder_with_socket_mutator_test + gtest: true + build: test + language: c++ + headers: [] + src: + - src/proto/grpc/testing/echo.proto + - src/proto/grpc/testing/echo_messages.proto + - src/proto/grpc/testing/simple_messages.proto + - test/cpp/server/server_builder_with_socket_mutator_test.cc + deps: + - grpc_test_util_unsecure + - grpc++_unsecure + - grpc_unsecure + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac +- name: server_context_test_spouse_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/cpp/test/server_context_test_spouse_test.cc + deps: + - grpc++_test_util + - grpc++_test + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb +- name: server_early_return_test + gtest: true + build: test + language: c++ + headers: [] + src: + - src/proto/grpc/testing/echo.proto + - src/proto/grpc/testing/echo_messages.proto + - src/proto/grpc/testing/simple_messages.proto + - test/cpp/end2end/server_early_return_test.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb +- name: server_fuzzer + build: fuzzer + language: c++ + headers: [] + src: + - test/core/end2end/fuzzers/server_fuzzer.cc + - test/core/util/fuzzer_corpus_test.cc + deps: + - grpc_test_util + - grpc++_test_config + - grpc + - gpr + - address_sorting + - upb + corpus_dirs: + - test/core/end2end/fuzzers/server_fuzzer_corpus + dict: test/core/end2end/fuzzers/hpack.dictionary + maxlen: 2048 +- name: server_interceptors_end2end_test + gtest: true + build: test + language: c++ + headers: + - test/cpp/end2end/interceptors_util.h + - test/cpp/end2end/test_service_impl.h + src: + - src/proto/grpc/testing/echo.proto + - src/proto/grpc/testing/echo_messages.proto + - src/proto/grpc/testing/simple_messages.proto + - test/cpp/end2end/interceptors_util.cc + - test/cpp/end2end/server_interceptors_end2end_test.cc + - test/cpp/end2end/test_service_impl.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb +- name: server_registered_method_bad_client_test + gtest: true + build: test + language: c++ + headers: + - test/core/bad_client/bad_client.h + - test/core/end2end/cq_verifier.h + src: + - test/core/bad_client/bad_client.cc + - test/core/bad_client/tests/server_registered_method.cc + - test/core/end2end/cq_verifier.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: server_request_call_test + gtest: true + build: test + language: c++ + headers: [] + src: + - src/proto/grpc/testing/echo.proto + - src/proto/grpc/testing/echo_messages.proto + - src/proto/grpc/testing/simple_messages.proto + - test/cpp/server/server_request_call_test.cc + deps: + - grpc_test_util_unsecure + - grpc++_unsecure + - grpc_unsecure + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac +- name: service_config_end2end_test + gtest: true + build: test + language: c++ + headers: + - test/cpp/end2end/test_service_impl.h + src: + - src/proto/grpc/testing/duplicate/echo_duplicate.proto + - src/proto/grpc/testing/echo.proto + - src/proto/grpc/testing/echo_messages.proto + - src/proto/grpc/testing/simple_messages.proto + - test/cpp/end2end/service_config_end2end_test.cc + - test/cpp/end2end/test_service_impl.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb +- name: service_config_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/core/client_channel/service_config_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: settings_timeout_test + gtest: true + build: test + run: false + language: c++ + headers: [] + src: + - test/core/transport/chttp2/settings_timeout_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: shutdown_test + gtest: true + build: test + language: c++ + headers: [] + src: + - src/proto/grpc/testing/duplicate/echo_duplicate.proto + - src/proto/grpc/testing/echo.proto + - src/proto/grpc/testing/echo_messages.proto + - src/proto/grpc/testing/simple_messages.proto + - test/cpp/end2end/shutdown_test.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb +- name: simple_request_bad_client_test + gtest: true + build: test + language: c++ + headers: + - test/core/bad_client/bad_client.h + - test/core/end2end/cq_verifier.h + src: + - test/core/bad_client/bad_client.cc + - test/core/bad_client/tests/simple_request.cc + - test/core/end2end/cq_verifier.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: slice_hash_table_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/core/slice/slice_hash_table_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: slice_weak_hash_table_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/core/slice/slice_weak_hash_table_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: ssl_server_fuzzer + build: fuzzer + language: c++ + headers: [] + src: + - test/core/security/ssl_server_fuzzer.cc + - test/core/util/fuzzer_corpus_test.cc + deps: + - grpc_test_util + - grpc++_test_config + - grpc + - gpr + - address_sorting + - upb + corpus_dirs: + - test/core/security/corpus/ssl_server_corpus + maxlen: 2048 +- name: static_metadata_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/core/transport/static_metadata_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: stats_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/core/debug/stats_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: status_metadata_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/core/transport/status_metadata_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: status_util_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/core/channel/status_util_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: streaming_throughput_test + gtest: true + build: test + language: c++ + headers: [] + src: + - src/proto/grpc/testing/duplicate/echo_duplicate.proto + - src/proto/grpc/testing/echo.proto + - src/proto/grpc/testing/echo_messages.proto + - src/proto/grpc/testing/simple_messages.proto + - test/cpp/end2end/streaming_throughput_test.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac +- name: string_ref_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/cpp/util/string_ref_test.cc + deps: + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: test_cpp_client_credentials_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/cpp/client/credentials_test.cc + deps: + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb +- name: test_cpp_util_slice_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/cpp/util/slice_test.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: test_cpp_util_time_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/cpp/util/time_test.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb + uses_polling: false +- name: thread_manager_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/cpp/thread_manager/thread_manager_test.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc++_test_config + - grpc + - gpr + - address_sorting + - upb +- name: thread_stress_test + gtest: true + build: test + language: c++ + headers: [] + src: + - src/proto/grpc/testing/duplicate/echo_duplicate.proto + - src/proto/grpc/testing/echo.proto + - src/proto/grpc/testing/echo_messages.proto + - src/proto/grpc/testing/simple_messages.proto + - test/cpp/end2end/thread_stress_test.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac +- name: time_jump_test + gtest: true + build: test + run: false + language: c++ + headers: [] + src: + - test/cpp/common/time_jump_test.cc + deps: + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac +- name: timer_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/cpp/common/timer_test.cc + deps: + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb +- name: tls_security_connector_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/core/security/tls_security_connector_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: unknown_frame_bad_client_test + gtest: true + build: test + language: c++ + headers: + - test/core/bad_client/bad_client.h + - test/core/end2end/cq_verifier.h + src: + - test/core/bad_client/bad_client.cc + - test/core/bad_client/tests/unknown_frame.cc + - test/core/end2end/cq_verifier.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: uri_fuzzer_test + build: fuzzer + language: c++ + headers: [] + src: + - test/core/client_channel/uri_fuzzer_test.cc + - test/core/util/fuzzer_corpus_test.cc + deps: + - grpc_test_util + - grpc++_test_config + - grpc + - gpr + - address_sorting + - upb + corpus_dirs: + - test/core/client_channel/uri_corpus + maxlen: 128 +- name: window_overflow_bad_client_test + gtest: true + build: test + language: c++ + headers: + - test/core/bad_client/bad_client.h + - test/core/end2end/cq_verifier.h + src: + - test/core/bad_client/bad_client.cc + - test/core/bad_client/tests/window_overflow.cc + - test/core/end2end/cq_verifier.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: work_serializer_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/core/iomgr/work_serializer_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac +- name: writes_per_rpc_test + gtest: true + build: test + language: c++ + headers: + - test/core/util/cmdline.h + - test/core/util/debugger_macros.h + - test/core/util/fuzzer_util.h + - test/core/util/grpc_profiler.h + - test/core/util/histogram.h + - test/core/util/memory_counters.h + - test/core/util/mock_endpoint.h + - test/core/util/parse_hexstring.h + - test/core/util/passthru_endpoint.h + - test/core/util/port.h + - test/core/util/port_server_client.h + - test/core/util/reconnect_server.h + - test/core/util/slice_splitter.h + - test/core/util/subprocess.h + - test/core/util/test_config.h + - test/core/util/test_tcp_server.h + - test/core/util/tracer_util.h + - test/core/util/trickle_endpoint.h + src: + - src/proto/grpc/testing/echo.proto + - src/proto/grpc/testing/echo_messages.proto + - src/proto/grpc/testing/simple_messages.proto + - test/core/util/cmdline.cc + - test/core/util/debugger_macros.cc + - test/core/util/fuzzer_util.cc + - test/core/util/grpc_profiler.cc + - test/core/util/histogram.cc + - test/core/util/memory_counters.cc + - test/core/util/mock_endpoint.cc + - test/core/util/parse_hexstring.cc + - test/core/util/passthru_endpoint.cc + - test/core/util/port.cc + - test/core/util/port_isolated_runtime_environment.cc + - test/core/util/port_server_client.cc + - test/core/util/reconnect_server.cc + - test/core/util/slice_splitter.cc + - test/core/util/subprocess_posix.cc + - test/core/util/subprocess_windows.cc + - test/core/util/test_config.cc + - test/core/util/test_tcp_server.cc + - test/core/util/tracer_util.cc + - test/core/util/trickle_endpoint.cc + - test/cpp/performance/writes_per_rpc_test.cc + deps: + - grpc++ + - grpc + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac +- name: xds_bootstrap_test + gtest: true + build: test + language: c++ + headers: [] + src: + - test/core/client_channel/xds_bootstrap_test.cc + deps: + - grpc_test_util + - grpc + - gpr + - address_sorting + - upb +- name: xds_end2end_test + gtest: true + build: test + run: false + language: c++ + headers: + - test/cpp/end2end/test_service_impl.h + src: + - src/proto/grpc/testing/duplicate/echo_duplicate.proto + - src/proto/grpc/testing/echo.proto + - src/proto/grpc/testing/echo_messages.proto + - src/proto/grpc/testing/simple_messages.proto + - src/proto/grpc/testing/xds/ads_for_test.proto + - src/proto/grpc/testing/xds/cds_for_test.proto + - src/proto/grpc/testing/xds/eds_for_test.proto + - src/proto/grpc/testing/xds/lds_rds_for_test.proto + - src/proto/grpc/testing/xds/lrs_for_test.proto + - test/cpp/end2end/test_service_impl.cc + - test/cpp/end2end/xds_end2end_test.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc + - gpr + - address_sorting + - upb + platforms: + - linux + - posix + - mac +- name: xds_interop_client + build: test + run: false + language: c++ + headers: [] + src: + - src/proto/grpc/testing/empty.proto + - src/proto/grpc/testing/messages.proto + - src/proto/grpc/testing/test.proto + - test/cpp/interop/xds_interop_client.cc + deps: + - grpc_test_util + - grpc++ + - grpc++_test_config + - grpc + - gpr + - address_sorting + - upb +- name: xds_interop_server + build: test + run: false + language: c++ + headers: [] + src: + - src/proto/grpc/testing/empty.proto + - src/proto/grpc/testing/messages.proto + - src/proto/grpc/testing/test.proto + - test/cpp/interop/xds_interop_server.cc + deps: + - grpc_test_util + - grpc++ + - grpc++_test_config + - grpc + - gpr + - address_sorting + - upb +tests: [] diff --git a/build_config.rb b/build_config.rb new file mode 100644 index 00000000..bbbf0481 --- /dev/null +++ b/build_config.rb @@ -0,0 +1,17 @@ +# Copyright 2017 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +module GrpcBuildConfig + CORE_WINDOWS_DLL = '/tmp/libs/opt/grpc-10.dll' +end diff --git a/build_handwritten.yaml b/build_handwritten.yaml new file mode 100644 index 00000000..f5d9eb30 --- /dev/null +++ b/build_handwritten.yaml @@ -0,0 +1,263 @@ +'#1': This file describes the list of targets and dependencies. +'#2': It is used among other things to generate all of our project files. +'#3': Please refer to the templates directory for more information. +settings: + '#01': The public version number of the library. + '#02': === + '#03': Please update the 'g_stands_for' field periodically with a new g word + '#04': not listed in doc/g_stands_for.md - and update that document to list the + '#05': new word. When doing so, please also update BUILD. + '#06': === + '#07': Master always has a "-dev" suffix + '#08': Use "-preN" suffixes to identify pre-release versions + '#09': Per-language overrides are possible with (eg) ruby_version tag here + '#10': See the expand_version.py for all the quirks here + core_version: 10.0.0 + csharp_major_version: 2 + g_stands_for: gradius + version: 1.30.2 +targets: +- name: check_epollexclusive + build: tool + language: c + src: + - test/build/check_epollexclusive.c + deps: + - grpc + - gpr +- name: gen_hpack_tables + build: tool + language: c++ + src: + - tools/codegen/core/gen_hpack_tables.cc + deps: + - grpc + - gpr + uses_polling: false +- name: gen_legal_metadata_characters + build: tool + language: c++ + src: + - tools/codegen/core/gen_legal_metadata_characters.cc + deps: [] +- name: gen_percent_encoding_tables + build: tool + language: c++ + src: + - tools/codegen/core/gen_percent_encoding_tables.cc + deps: [] + uses_polling: false +vspackages: +- linkage: static + name: grpc.dependencies.zlib + props: false + redist: true + version: 1.2.8.10 +- linkage: static + name: grpc.dependencies.openssl + props: true + redist: true + version: 1.0.204.1 +- name: gflags + props: false + redist: false + version: 2.1.2.1 +- name: gtest + props: false + redist: false + version: 1.7.0.1 +configs: + asan: + CC: clang + CPPFLAGS: -O0 -fsanitize-coverage=edge,trace-pc-guard -fsanitize=address -fno-omit-frame-pointer + -Wno-unused-command-line-argument -DGPR_NO_DIRECT_SYSCALLS + CXX: clang++ + LD: clang++ + LDFLAGS: -fsanitize=address + LDXX: clang++ + compile_the_world: true + test_environ: + ASAN_OPTIONS: detect_leaks=1:color=always + LSAN_OPTIONS: suppressions=test/core/util/lsan_suppressions.txt:report_objects=1 + asan-noleaks: + CC: clang + CPPFLAGS: -O0 -fsanitize-coverage=edge,trace-pc-guard -fsanitize=address -fno-omit-frame-pointer + -Wno-unused-command-line-argument -DGPR_NO_DIRECT_SYSCALLS + CXX: clang++ + LD: clang++ + LDFLAGS: fsanitize=address + LDXX: clang++ + compile_the_world: true + test_environ: + ASAN_OPTIONS: detect_leaks=0:color=always + asan-trace-cmp: + CC: clang + CPPFLAGS: -O0 -fsanitize-coverage=edge,trace-pc-guard -fsanitize-coverage=trace-cmp + -fsanitize=address -fno-omit-frame-pointer -Wno-unused-command-line-argument + -DGPR_NO_DIRECT_SYSCALLS + CXX: clang++ + LD: clang++ + LDFLAGS: -fsanitize=address + LDXX: clang++ + compile_the_world: true + test_environ: + ASAN_OPTIONS: detect_leaks=1:color=always + LSAN_OPTIONS: suppressions=test/core/util/lsan_suppressions.txt:report_objects=1 + basicprof: + CPPFLAGS: -O2 -DGRPC_BASIC_PROFILER -DGRPC_TIMERS_RDTSC + DEFINES: NDEBUG + c++-compat: + CFLAGS: -Wc++-compat + CPPFLAGS: -O0 + DEFINES: _DEBUG DEBUG + counters: + CPPFLAGS: -O2 -DGPR_LOW_LEVEL_COUNTERS + DEFINES: NDEBUG + counters_with_memory_counter: + CPPFLAGS: -O2 -DGPR_LOW_LEVEL_COUNTERS -DGPR_WRAP_MEMORY_COUNTER + DEFINES: NDEBUG + LDFLAGS: -Wl,--wrap=malloc -Wl,--wrap=calloc -Wl,--wrap=realloc -Wl,--wrap=free + dbg: + CPPFLAGS: -O0 + DEFINES: _DEBUG DEBUG + gcov: + CC: gcc + CPPFLAGS: -O0 -fprofile-arcs -ftest-coverage -Wno-return-type + CXX: g++ + DEFINES: _DEBUG DEBUG GPR_GCOV + LD: gcc + LDFLAGS: -fprofile-arcs -ftest-coverage -rdynamic -lstdc++ + LDXX: g++ + helgrind: + CPPFLAGS: -O0 + DEFINES: _DEBUG DEBUG + LDFLAGS: -rdynamic + valgrind: --tool=helgrind + lto: + CPPFLAGS: -O2 + DEFINES: NDEBUG + memcheck: + CPPFLAGS: -O0 + DEFINES: _DEBUG DEBUG + LDFLAGS: -rdynamic + valgrind: --tool=memcheck --leak-check=full + msan: + CC: clang + CPPFLAGS: -O0 -stdlib=libc++ -fsanitize-coverage=edge,trace-pc-guard -fsanitize=memory + -fsanitize-memory-track-origins -fsanitize-memory-use-after-dtor -fno-omit-frame-pointer + -DGTEST_HAS_TR1_TUPLE=0 -DGTEST_USE_OWN_TR1_TUPLE=1 -Wno-unused-command-line-argument + -fPIE -pie -DGPR_NO_DIRECT_SYSCALLS + CXX: clang++ + DEFINES: NDEBUG + LD: clang++ + LDFLAGS: -stdlib=libc++ -fsanitize=memory -DGTEST_HAS_TR1_TUPLE=0 -DGTEST_USE_OWN_TR1_TUPLE=1 + -fPIE -pie $(if $(JENKINS_BUILD),-Wl$(comma)-Ttext-segment=0x7e0000000000,) + LDXX: clang++ + compile_the_world: true + test_environ: + MSAN_OPTIONS: poison_in_dtor=1 + mutrace: + CPPFLAGS: -O3 -fno-omit-frame-pointer + DEFINES: NDEBUG + LDFLAGS: -rdynamic + noexcept: + CPPFLAGS: -O2 -Wframe-larger-than=16384 + CXXFLAGS: -fno-exceptions + DEFINES: NDEBUG + opt: + CPPFLAGS: -O2 -Wframe-larger-than=16384 + DEFINES: NDEBUG + stapprof: + CPPFLAGS: -O2 -DGRPC_STAP_PROFILER + DEFINES: NDEBUG + tsan: + CC: clang + CPPFLAGS: -O0 -fsanitize=thread -fno-omit-frame-pointer -Wno-unused-command-line-argument + -DGPR_NO_DIRECT_SYSCALLS + CXX: clang++ + DEFINES: GRPC_TSAN + LD: clang++ + LDFLAGS: -fsanitize=thread + LDXX: clang++ + compile_the_world: true + test_environ: + TSAN_OPTIONS: suppressions=test/core/util/tsan_suppressions.txt:halt_on_error=1:second_deadlock_stack=1 + ubsan: + CC: clang + CPPFLAGS: -O0 -stdlib=libc++ -fsanitize-coverage=edge,trace-pc-guard -fsanitize=undefined + -fno-omit-frame-pointer -Wno-unused-command-line-argument -Wvarargs + CXX: clang++ + DEFINES: NDEBUG GRPC_UBSAN + LD: clang++ + LDFLAGS: -stdlib=libc++ -fsanitize=undefined,unsigned-integer-overflow + LDXX: clang++ + compile_the_world: true + test_environ: + UBSAN_OPTIONS: halt_on_error=1:print_stacktrace=1:suppressions=test/core/util/ubsan_suppressions.txt +defaults: + ares: + CFLAGS: -g + CPPFLAGS: -Ithird_party/cares -Ithird_party/cares/cares -fvisibility=hidden -D_GNU_SOURCE + $(if $(subst Darwin,,$(SYSTEM)),,-Ithird_party/cares/config_darwin) $(if $(subst + FreeBSD,,$(SYSTEM)),,-Ithird_party/cares/config_freebsd) $(if $(subst Linux,,$(SYSTEM)),,-Ithird_party/cares/config_linux) + $(if $(subst OpenBSD,,$(SYSTEM)),,-Ithird_party/cares/config_openbsd) -DWIN32_LEAN_AND_MEAN + -D_HAS_EXCEPTIONS=0 -DNOMINMAX $(if $(subst MINGW32,,$(SYSTEM)),-DHAVE_CONFIG_H,) + benchmark: + CPPFLAGS: -Ithird_party/benchmark/include -DHAVE_POSIX_REGEX + boringssl: + CFLAGS: -g + CPPFLAGS: -Ithird_party/boringssl-with-bazel/src/include -fvisibility=hidden -DOPENSSL_NO_ASM + -D_GNU_SOURCE -DWIN32_LEAN_AND_MEAN -D_HAS_EXCEPTIONS=0 -DNOMINMAX + CXXFLAGS: -fno-exceptions + global: + CFLAGS: -g + COREFLAGS: -fno-exceptions + CPPFLAGS: -g -Wall -Wextra -DOSATOMIC_USE_INLINED=1 -Ithird_party/abseil-cpp -Ithird_party/upb + -Isrc/core/ext/upb-generated + LDFLAGS: -g + zlib: + CFLAGS: -fvisibility=hidden +php_config_m4: + deps: + - grpc + - address_sorting + - boringssl + - z + headers: + - src/php/ext/grpc/byte_buffer.h + - src/php/ext/grpc/call.h + - src/php/ext/grpc/call_credentials.h + - src/php/ext/grpc/channel.h + - src/php/ext/grpc/channel_credentials.h + - src/php/ext/grpc/completion_queue.h + - src/php/ext/grpc/php7_wrapper.h + - src/php/ext/grpc/php_grpc.h + - src/php/ext/grpc/server.h + - src/php/ext/grpc/server_credentials.h + - src/php/ext/grpc/timeval.h + - src/php/ext/grpc/version.h + src: + - src/php/ext/grpc/byte_buffer.c + - src/php/ext/grpc/call.c + - src/php/ext/grpc/call_credentials.c + - src/php/ext/grpc/channel.c + - src/php/ext/grpc/channel_credentials.c + - src/php/ext/grpc/completion_queue.c + - src/php/ext/grpc/php_grpc.c + - src/php/ext/grpc/server.c + - src/php/ext/grpc/server_credentials.c + - src/php/ext/grpc/timeval.c +python_dependencies: + deps: + - grpc + - address_sorting + - ares + - boringssl + - z +ruby_gem: + deps: + - grpc + - address_sorting + - ares + - boringssl + - z diff --git a/cmake/OWNERS b/cmake/OWNERS new file mode 100644 index 00000000..a6181f62 --- /dev/null +++ b/cmake/OWNERS @@ -0,0 +1,4 @@ +set noparent +@jtattermusch +@nicolasnoble +@apolcyn diff --git a/cmake/abseil-cpp.cmake b/cmake/abseil-cpp.cmake new file mode 100644 index 00000000..078d4954 --- /dev/null +++ b/cmake/abseil-cpp.cmake @@ -0,0 +1,40 @@ +# Copyright 2019 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +if(gRPC_ABSL_PROVIDER STREQUAL "module") + if(NOT ABSL_ROOT_DIR) + set(ABSL_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/abseil-cpp) + endif() + if(EXISTS "${ABSL_ROOT_DIR}/CMakeLists.txt") + add_subdirectory(${ABSL_ROOT_DIR} third_party/abseil-cpp) + if(TARGET absl_base) + if(gRPC_INSTALL AND _gRPC_INSTALL_SUPPORTED_FROM_MODULE) + install(TARGETS ${gRPC_ABSL_USED_TARGETS} EXPORT gRPCTargets + RUNTIME DESTINATION ${gRPC_INSTALL_BINDIR} + LIBRARY DESTINATION ${gRPC_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${gRPC_INSTALL_LIBDIR}) + endif() + endif() + else() + message(WARNING "gRPC_ABSL_PROVIDER is \"module\" but ABSL_ROOT_DIR is wrong") + endif() + if(gRPC_INSTALL AND NOT _gRPC_INSTALL_SUPPORTED_FROM_MODULE) + message(WARNING "gRPC_INSTALL will be forced to FALSE because gRPC_ABSL_PROVIDER is \"module\" and CMake version (${CMAKE_VERSION}) is less than 3.13.") + set(gRPC_INSTALL FALSE) + endif() +elseif(gRPC_ABSL_PROVIDER STREQUAL "package") + # Use "CONFIG" as there is no built-in cmake module for absl. + find_package(absl REQUIRED CONFIG) + set(_gRPC_FIND_ABSL "if(NOT absl_FOUND)\n find_package(absl CONFIG)\nendif()") +endif() diff --git a/cmake/address_sorting.cmake b/cmake/address_sorting.cmake new file mode 100644 index 00000000..f7203b3a --- /dev/null +++ b/cmake/address_sorting.cmake @@ -0,0 +1,16 @@ +# Copyright 2017 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set(_gRPC_ADDRESS_SORTING_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/third_party/address_sorting/include") +set(_gRPC_ADDRESS_SORTING_LIBRARIES address_sorting) diff --git a/cmake/benchmark.cmake b/cmake/benchmark.cmake new file mode 100644 index 00000000..93363100 --- /dev/null +++ b/cmake/benchmark.cmake @@ -0,0 +1,37 @@ +# Copyright 2017 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +if(gRPC_BENCHMARK_PROVIDER STREQUAL "module") + set(BENCHMARK_ENABLE_GTEST_TESTS OFF CACHE BOOL "Turn off gTest in gBenchmark") + if(NOT BENCHMARK_ROOT_DIR) + set(BENCHMARK_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/benchmark) + endif() + if(EXISTS "${BENCHMARK_ROOT_DIR}/CMakeLists.txt") + add_subdirectory(${BENCHMARK_ROOT_DIR} third_party/benchmark) + if(TARGET benchmark) + set(_gRPC_BENCHMARK_LIBRARIES benchmark) + endif() + else() + message(WARNING "gRPC_BENCHMARK_PROVIDER is \"module\" but BENCHMARK_ROOT_DIR is wrong") + endif() +elseif(gRPC_BENCHMARK_PROVIDER STREQUAL "package") + # Use "CONFIG" as there is no built-in cmake module for benchmark. + find_package(benchmark REQUIRED CONFIG) + if(TARGET benchmark::benchmark) + set(_gRPC_BENCHMARK_LIBRARIES benchmark::benchmark) + endif() + set(_gRPC_FIND_BENCHMARK "if(NOT benchmark_FOUND)\n find_package(benchmark CONFIG)\nendif()") +elseif(gRPC_BENCHMARK_PROVIDER STREQUAL "none") + # Benchmark is a test-only dependency and can be avoided if we're not building tests. +endif() diff --git a/cmake/cares.cmake b/cmake/cares.cmake new file mode 100644 index 00000000..b3209ac3 --- /dev/null +++ b/cmake/cares.cmake @@ -0,0 +1,47 @@ +# Copyright 2017 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +if(gRPC_CARES_PROVIDER STREQUAL "module") + if(NOT CARES_ROOT_DIR) + set(CARES_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/cares/cares) + endif() + set(CARES_SHARED OFF CACHE BOOL "disable shared library") + set(CARES_STATIC ON CACHE BOOL "link cares statically") + if(gRPC_BACKWARDS_COMPATIBILITY_MODE) + # See https://github.com/grpc/grpc/issues/17255 + set(HAVE_LIBNSL OFF CACHE BOOL "avoid cares dependency on libnsl") + endif() + add_subdirectory("${CARES_ROOT_DIR}" third_party/cares/cares) + + if(TARGET c-ares) + set(_gRPC_CARES_LIBRARIES c-ares) + if(gRPC_INSTALL AND _gRPC_INSTALL_SUPPORTED_FROM_MODULE) + install(TARGETS c-ares EXPORT gRPCTargets + RUNTIME DESTINATION ${gRPC_INSTALL_BINDIR} + LIBRARY DESTINATION ${gRPC_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${gRPC_INSTALL_LIBDIR}) + endif() + endif() + + if(gRPC_INSTALL AND NOT _gRPC_INSTALL_SUPPORTED_FROM_MODULE) + message(WARNING "gRPC_INSTALL will be forced to FALSE because gRPC_CARES_PROVIDER is \"module\" and CMake version (${CMAKE_VERSION}) is less than 3.13.") + set(gRPC_INSTALL FALSE) + endif() +elseif(gRPC_CARES_PROVIDER STREQUAL "package") + find_package(c-ares 1.13.0 REQUIRED) + if(TARGET c-ares::cares) + set(_gRPC_CARES_LIBRARIES c-ares::cares) + endif() + set(_gRPC_FIND_CARES "if(NOT c-ares_FOUND)\n find_package(c-ares)\nendif()") +endif() diff --git a/cmake/gRPCConfig.cmake.in b/cmake/gRPCConfig.cmake.in new file mode 100644 index 00000000..5bfa73c2 --- /dev/null +++ b/cmake/gRPCConfig.cmake.in @@ -0,0 +1,12 @@ +# Module path +list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/modules) + +# Depend packages +@_gRPC_FIND_ZLIB@ +@_gRPC_FIND_PROTOBUF@ +@_gRPC_FIND_SSL@ +@_gRPC_FIND_CARES@ +@_gRPC_FIND_ABSL@ + +# Targets +include(${CMAKE_CURRENT_LIST_DIR}/gRPCTargets.cmake) diff --git a/cmake/gflags.cmake b/cmake/gflags.cmake new file mode 100644 index 00000000..f00c4666 --- /dev/null +++ b/cmake/gflags.cmake @@ -0,0 +1,34 @@ +# Copyright 2017 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +if(gRPC_GFLAGS_PROVIDER STREQUAL "module") + if(NOT GFLAGS_ROOT_DIR) + set(GFLAGS_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gflags) + endif() + if(EXISTS "${GFLAGS_ROOT_DIR}/CMakeLists.txt") + add_subdirectory(${GFLAGS_ROOT_DIR} third_party/gflags) + set(_gRPC_GFLAGS_LIBRARIES gflags::gflags) + else() + message(WARNING "gRPC_GFLAGS_PROVIDER is \"module\" but GFLAGS_ROOT_DIR is wrong") + endif() +elseif(gRPC_GFLAGS_PROVIDER STREQUAL "package") + # Use "CONFIG" as there is no built-in cmake module for gflags. + find_package(gflags REQUIRED CONFIG) + if(TARGET gflags::gflags) + set(_gRPC_GFLAGS_LIBRARIES gflags::gflags) + endif() + set(_gRPC_FIND_GFLAGS "if(NOT gflags_FOUND)\n find_package(gflags CONFIG)\nendif()") +elseif(gRPC_GFLAGS_PROVIDER STREQUAL "none") + # gflags is a test-only dependency and can be avoided if we're not building tests. +endif() diff --git a/cmake/modules/Findc-ares.cmake b/cmake/modules/Findc-ares.cmake new file mode 100644 index 00000000..c614170d --- /dev/null +++ b/cmake/modules/Findc-ares.cmake @@ -0,0 +1,48 @@ +include(FindPackageHandleStandardArgs) + +function(__cares_get_version) + if(c-ares_INCLUDE_DIR AND EXISTS "${c-ares_INCLUDE_DIR}/ares_version.h") + file(STRINGS "${c-ares_INCLUDE_DIR}/ares_version.h" _cares_version_str REGEX "^#define ARES_VERSION_STR \"([^\n]*)\"$") + if(_cares_version_str MATCHES "#define ARES_VERSION_STR \"([^\n]*)\"") + set(c-ares_VERSION "${CMAKE_MATCH_1}" PARENT_SCOPE) + endif() + endif() +endfunction() + +# We need to disable version checking, since c-ares does not provide it. +set(_cares_version_var_suffixes "" _MAJOR _MINOR _PATCH _TWEAK _COUNT) +foreach(_suffix IN LISTS _cares_version_var_suffixes) + set(_cares_save_FIND_VERSION${_suffix} ${c-ares_FIND_VERSION${_suffix}}) + unset(c-ares_FIND_VERSION${_suffix}) +endforeach() +find_package(c-ares CONFIG) +foreach(_suffix IN LISTS _cares_version_var_suffixes) + set(c-ares_FIND_VERSION${_suffix} ${_cares_save_FIND_VERSION${_suffix}}) +endforeach() + +if(c-ares_FOUND) + if(NOT DEFINED c-ares_VERSION) + __cares_get_version() + endif() + + find_package_handle_standard_args(c-ares CONFIG_MODE) + return() +endif() + +find_path(c-ares_INCLUDE_DIR NAMES ares.h) +__cares_get_version() + +find_library(c-ares_LIBRARY cares) + +find_package_handle_standard_args(c-ares + REQUIRED_VARS c-ares_INCLUDE_DIR c-ares_LIBRARY + VERSION_VAR c-ares_VERSION + ) + +if(c-ares_FOUND) + add_library(c-ares::cares UNKNOWN IMPORTED) + set_target_properties(c-ares::cares PROPERTIES + IMPORTED_LOCATION "${c-ares_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${c-ares_INCLUDE_DIR}" + ) +endif() diff --git a/cmake/msvc_static_runtime.cmake b/cmake/msvc_static_runtime.cmake new file mode 100644 index 00000000..73cb881a --- /dev/null +++ b/cmake/msvc_static_runtime.cmake @@ -0,0 +1,30 @@ +# Copyright 2017 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +option(gRPC_MSVC_STATIC_RUNTIME "Link with static msvc runtime libraries" OFF) + +if(gRPC_MSVC_STATIC_RUNTIME) + # switch from dynamic to static linking of msvcrt + foreach(flag_var + CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE + CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO + CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE + CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) + + if(${flag_var} MATCHES "/MD") + string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}") + endif() + endforeach() +endif() + diff --git a/cmake/pkg-config-template.pc.in b/cmake/pkg-config-template.pc.in new file mode 100644 index 00000000..d56154bb --- /dev/null +++ b/cmake/pkg-config-template.pc.in @@ -0,0 +1,12 @@ +prefix=@CMAKE_INSTALL_PREFIX@ +exec_prefix=${prefix} +includedir=${prefix}/include +libdir=${exec_prefix}/lib + +Name: @PC_NAME@ +Description: @PC_DESCRIPTION@ +Version: @PC_VERSION@ +Cflags: -I${includedir} +Requires: @PC_REQUIRES@ +Libs: -L${libdir} @PC_LIB@ +Libs.private: @PC_LIBS_PRIVATE@ diff --git a/cmake/protobuf.cmake b/cmake/protobuf.cmake new file mode 100644 index 00000000..f23f65d4 --- /dev/null +++ b/cmake/protobuf.cmake @@ -0,0 +1,95 @@ +# Copyright 2017 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +if(gRPC_PROTOBUF_PROVIDER STREQUAL "module") + # Building the protobuf tests require gmock what is not part of a standard protobuf checkout. + # Disable them unless they are explicitly requested from the cmake command line (when we assume + # gmock is downloaded to the right location inside protobuf). + if(NOT protobuf_BUILD_TESTS) + set(protobuf_BUILD_TESTS OFF CACHE BOOL "Build protobuf tests") + endif() + # Disable building protobuf with zlib. Building protobuf with zlib breaks + # the build if zlib is not installed on the system. + if(NOT protobuf_WITH_ZLIB) + set(protobuf_WITH_ZLIB OFF CACHE BOOL "Build protobuf with zlib.") + endif() + if(NOT PROTOBUF_ROOT_DIR) + set(PROTOBUF_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/protobuf) + endif() + + if(EXISTS "${PROTOBUF_ROOT_DIR}/cmake/CMakeLists.txt") + set(protobuf_MSVC_STATIC_RUNTIME OFF CACHE BOOL "Link static runtime libraries") + add_subdirectory(${PROTOBUF_ROOT_DIR}/cmake third_party/protobuf) + if(TARGET ${_gRPC_PROTOBUF_LIBRARY_NAME}) + set(_gRPC_PROTOBUF_LIBRARIES ${_gRPC_PROTOBUF_LIBRARY_NAME}) + endif() + if(TARGET libprotoc) + set(_gRPC_PROTOBUF_PROTOC_LIBRARIES libprotoc) + endif() + if(TARGET protoc) + set(_gRPC_PROTOBUF_PROTOC protoc) + if(CMAKE_CROSSCOMPILING) + find_program(_gRPC_PROTOBUF_PROTOC_EXECUTABLE protoc) + else() + set(_gRPC_PROTOBUF_PROTOC_EXECUTABLE $) + endif() + endif() + # For well-known .proto files distributed with protobuf + set(_gRPC_PROTOBUF_WELLKNOWN_INCLUDE_DIR "${PROTOBUF_ROOT_DIR}/src") + else() + message(WARNING "gRPC_PROTOBUF_PROVIDER is \"module\" but PROTOBUF_ROOT_DIR is wrong") + endif() + if(gRPC_INSTALL AND NOT _gRPC_INSTALL_SUPPORTED_FROM_MODULE) + message(WARNING "gRPC_INSTALL will be forced to FALSE because gRPC_PROTOBUF_PROVIDER is \"module\" and CMake version (${CMAKE_VERSION}) is less than 3.13.") + set(gRPC_INSTALL FALSE) + endif() +elseif(gRPC_PROTOBUF_PROVIDER STREQUAL "package") + find_package(Protobuf REQUIRED ${gRPC_PROTOBUF_PACKAGE_TYPE}) + + # {Protobuf,PROTOBUF}_FOUND is defined based on find_package type ("MODULE" vs "CONFIG"). + # For "MODULE", the case has also changed between cmake 3.5 and 3.6. + # We use the legacy uppercase version for *_LIBRARIES AND *_INCLUDE_DIRS variables + # as newer cmake versions provide them too for backward compatibility. + if(Protobuf_FOUND OR PROTOBUF_FOUND) + if(TARGET protobuf::${_gRPC_PROTOBUF_LIBRARY_NAME}) + set(_gRPC_PROTOBUF_LIBRARIES protobuf::${_gRPC_PROTOBUF_LIBRARY_NAME}) + else() + set(_gRPC_PROTOBUF_LIBRARIES ${PROTOBUF_LIBRARIES}) + endif() + if(TARGET protobuf::libprotoc) + set(_gRPC_PROTOBUF_PROTOC_LIBRARIES protobuf::libprotoc) + # extract the include dir from target's properties + get_target_property(_gRPC_PROTOBUF_WELLKNOWN_INCLUDE_DIR protobuf::libprotoc INTERFACE_INCLUDE_DIRECTORIES) + else() + set(_gRPC_PROTOBUF_PROTOC_LIBRARIES ${PROTOBUF_PROTOC_LIBRARIES}) + set(_gRPC_PROTOBUF_WELLKNOWN_INCLUDE_DIR ${PROTOBUF_INCLUDE_DIRS}) + endif() + if(TARGET protobuf::protoc) + set(_gRPC_PROTOBUF_PROTOC protobuf::protoc) + if(CMAKE_CROSSCOMPILING) + find_program(_gRPC_PROTOBUF_PROTOC_EXECUTABLE protoc) + else() + set(_gRPC_PROTOBUF_PROTOC_EXECUTABLE $) + endif() + else() + set(_gRPC_PROTOBUF_PROTOC ${PROTOBUF_PROTOC_EXECUTABLE}) + if(CMAKE_CROSSCOMPILING) + find_program(_gRPC_PROTOBUF_PROTOC_EXECUTABLE protoc) + else() + set(_gRPC_PROTOBUF_PROTOC_EXECUTABLE ${PROTOBUF_PROTOC_EXECUTABLE}) + endif() + endif() + set(_gRPC_FIND_PROTOBUF "if(NOT Protobuf_FOUND AND NOT PROTOBUF_FOUND)\n find_package(Protobuf ${gRPC_PROTOBUF_PACKAGE_TYPE})\nendif()") + endif() +endif() diff --git a/cmake/ssl.cmake b/cmake/ssl.cmake new file mode 100644 index 00000000..bf43e475 --- /dev/null +++ b/cmake/ssl.cmake @@ -0,0 +1,76 @@ +# Copyright 2017 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# The CMakeLists.txt for BoringSSL doesn't propagate include directories +# transitively so `_gRPC_SSL_INCLUDE_DIR` should be set for gRPC +# to find header files. + +if(gRPC_SSL_PROVIDER STREQUAL "module") + if(NOT BORINGSSL_ROOT_DIR) + set(BORINGSSL_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/boringssl-with-bazel) + endif() + + if(EXISTS "${BORINGSSL_ROOT_DIR}/CMakeLists.txt") + if(CMAKE_GENERATOR MATCHES "Visual Studio") + if(CMAKE_VERSION VERSION_LESS 3.13) + # Visual Studio build with assembly optimizations is broken for older + # version of CMake (< 3.13). + message(WARNING "Disabling SSL assembly support because CMake version ${CMAKE_VERSION} is too old (less than 3.13)") + set(OPENSSL_NO_ASM ON) + else() + # If we're using a new enough version of CMake, make sure that the + # NASM assembler can be found. + include(CheckLanguage) + check_language(ASM_NASM) + if(NOT CMAKE_ASM_NASM_COMPILER) + message(WARNING "Disabling SSL assembly support because NASM could not be found") + set(OPENSSL_NO_ASM ON) + endif() + endif() + endif() + + add_subdirectory(${BORINGSSL_ROOT_DIR} third_party/boringssl-with-bazel) + if(TARGET ssl) + set(_gRPC_SSL_LIBRARIES ssl crypto) + set(_gRPC_SSL_INCLUDE_DIR ${BORINGSSL_ROOT_DIR}/src/include) + if(gRPC_INSTALL AND _gRPC_INSTALL_SUPPORTED_FROM_MODULE) + install(TARGETS ssl crypto EXPORT gRPCTargets + RUNTIME DESTINATION ${gRPC_INSTALL_BINDIR} + LIBRARY DESTINATION ${gRPC_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${gRPC_INSTALL_LIBDIR}) + endif() + endif() + else() + message(WARNING "gRPC_SSL_PROVIDER is \"module\" but BORINGSSL_ROOT_DIR is wrong") + endif() + if(gRPC_INSTALL AND NOT _gRPC_INSTALL_SUPPORTED_FROM_MODULE) + message(WARNING "gRPC_INSTALL will be forced to FALSE because gRPC_SSL_PROVIDER is \"module\" and CMake version (${CMAKE_VERSION}) is less than 3.13.") + set(gRPC_INSTALL FALSE) + endif() +elseif(gRPC_SSL_PROVIDER STREQUAL "package") + # OpenSSL installation directory can be configured by setting OPENSSL_ROOT_DIR + # We expect to locate OpenSSL using the built-in cmake module as the openssl + # project itself does not provide installation support in its CMakeLists.txt + # See https://cmake.org/cmake/help/v3.6/module/FindOpenSSL.html + find_package(OpenSSL REQUIRED) + + if(TARGET OpenSSL::SSL) + set(_gRPC_SSL_LIBRARIES OpenSSL::SSL OpenSSL::Crypto) + else() + set(_gRPC_SSL_LIBRARIES ${OPENSSL_LIBRARIES}) + endif() + set(_gRPC_SSL_INCLUDE_DIR ${OPENSSL_INCLUDE_DIR}) + + set(_gRPC_FIND_SSL "if(NOT OPENSSL_FOUND)\n find_package(OpenSSL)\nendif()") +endif() diff --git a/cmake/upb.cmake b/cmake/upb.cmake new file mode 100644 index 00000000..2c0ab84e --- /dev/null +++ b/cmake/upb.cmake @@ -0,0 +1,20 @@ +# Copyright 2019 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set(UPB_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/upb) + +set(_gRPC_UPB_INCLUDE_DIR "${UPB_ROOT_DIR}") +set(_gRPC_UPB_GRPC_GENERATED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src/core/ext/upb-generated") + +set(_gRPC_UPB_LIBRARIES upb) diff --git a/cmake/zlib.cmake b/cmake/zlib.cmake new file mode 100644 index 00000000..9d658921 --- /dev/null +++ b/cmake/zlib.cmake @@ -0,0 +1,61 @@ +# Copyright 2017 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# The CMakeLists.txt for zlib doesn't propagate include directories +# transitively so `_gRPC_ZLIB_INCLUDE_DIR` should be set for gRPC +# to find header files. + +if(gRPC_ZLIB_PROVIDER STREQUAL "module") + if(NOT ZLIB_ROOT_DIR) + set(ZLIB_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/zlib) + endif() + if(EXISTS "${ZLIB_ROOT_DIR}/CMakeLists.txt") + # TODO(jtattermusch): workaround for https://github.com/madler/zlib/issues/218 + include_directories("${ZLIB_ROOT_DIR}") + add_subdirectory(${ZLIB_ROOT_DIR} third_party/zlib) + + if(TARGET zlibstatic) + set(_gRPC_ZLIB_LIBRARIES zlibstatic) + set(_gRPC_ZLIB_INCLUDE_DIR "${ZLIB_ROOT_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib") + if(gRPC_INSTALL AND _gRPC_INSTALL_SUPPORTED_FROM_MODULE) + install(TARGETS zlibstatic EXPORT gRPCTargets + RUNTIME DESTINATION ${gRPC_INSTALL_BINDIR} + LIBRARY DESTINATION ${gRPC_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${gRPC_INSTALL_LIBDIR}) + endif() + endif() + else() + message(WARNING "gRPC_ZLIB_PROVIDER is \"module\" but ZLIB_ROOT_DIR is wrong") + endif() + if(gRPC_INSTALL AND NOT _gRPC_INSTALL_SUPPORTED_FROM_MODULE) + message(WARNING "gRPC_INSTALL will be forced to FALSE because gRPC_ZLIB_PROVIDER is \"module\" and CMake version (${CMAKE_VERSION}) is less than 3.13.") + set(gRPC_INSTALL FALSE) + endif() +elseif(gRPC_ZLIB_PROVIDER STREQUAL "package") + # zlib installation directory can be configured by setting ZLIB_ROOT + # We allow locating zlib using both "CONFIG" and "MODULE" as the expectation + # is that many Linux systems will have zlib installed via a distribution + # package ("MODULE"), while on Windows the user is likely to have installed + # zlib using cmake ("CONFIG"). + # See https://cmake.org/cmake/help/v3.6/module/FindZLIB.html + find_package(ZLIB REQUIRED) + + if(TARGET ZLIB::ZLIB) + set(_gRPC_ZLIB_LIBRARIES ZLIB::ZLIB) + else() + set(_gRPC_ZLIB_LIBRARIES ${ZLIB_LIBRARIES}) + endif() + set(_gRPC_ZLIB_INCLUDE_DIR ${ZLIB_INCLUDE_DIRS}) + set(_gRPC_FIND_ZLIB "if(NOT ZLIB_FOUND)\n find_package(ZLIB)\nendif()") +endif() diff --git a/composer.json b/composer.json new file mode 100644 index 00000000..b8f43464 --- /dev/null +++ b/composer.json @@ -0,0 +1,23 @@ +{ + "name": "grpc/grpc", + "type": "library", + "description": "gRPC library for PHP", + "keywords": ["rpc"], + "homepage": "https://grpc.io", + "license": "Apache-2.0", + "require": { + "php": ">=5.5.0" + }, + "require-dev": { + "google/auth": "^v1.3.0" + }, + "suggest": { + "ext-protobuf": "For better performance, install the protobuf C extension.", + "google/protobuf": "To get started using grpc quickly, install the native protobuf library." + }, + "autoload": { + "psr-4": { + "Grpc\\": "src/php/lib/Grpc/" + } + } +} diff --git a/config.m4 b/config.m4 new file mode 100644 index 00000000..cd1019ab --- /dev/null +++ b/config.m4 @@ -0,0 +1,998 @@ +PHP_ARG_ENABLE(grpc, whether to enable grpc support, +[ --enable-grpc Enable grpc support]) + +if test "$PHP_GRPC" != "no"; then + dnl Write more examples of tests here... + + dnl # --with-grpc -> add include path + PHP_ADD_INCLUDE(PHP_EXT_SRCDIR()/include) + PHP_ADD_INCLUDE(PHP_EXT_SRCDIR()/src/core/ext/upb-generated) + PHP_ADD_INCLUDE(PHP_EXT_SRCDIR()/src/php/ext/grpc) + PHP_ADD_INCLUDE(PHP_EXT_SRCDIR()/third_party/abseil-cpp) + PHP_ADD_INCLUDE(PHP_EXT_SRCDIR()/third_party/address_sorting/include) + PHP_ADD_INCLUDE(PHP_EXT_SRCDIR()/third_party/boringssl-with-bazel/src/include) + PHP_ADD_INCLUDE(PHP_EXT_SRCDIR()/third_party/upb) + + LIBS="-lpthread $LIBS" + + CFLAGS="-Wall -Werror -Wno-parentheses-equality -Wno-unused-value -std=c11 -g -O2" + CXXFLAGS="-std=c++11 -fno-exceptions -fno-rtti -g -O2" + GRPC_SHARED_LIBADD="-lpthread $GRPC_SHARED_LIBADD" + PHP_REQUIRE_CXX() + PHP_ADD_LIBRARY(pthread) + PHP_ADD_LIBRARY(dl,,GRPC_SHARED_LIBADD) + PHP_ADD_LIBRARY(dl) + + case $host in + *darwin*) + PHP_ADD_LIBRARY(c++,1,GRPC_SHARED_LIBADD) + ;; + *) + PHP_ADD_LIBRARY(stdc++,1,GRPC_SHARED_LIBADD) + PHP_ADD_LIBRARY(rt,,GRPC_SHARED_LIBADD) + PHP_ADD_LIBRARY(rt) + ;; + esac + + PHP_SUBST(GRPC_SHARED_LIBADD) + + PHP_NEW_EXTENSION(grpc, + src/core/ext/filters/census/grpc_context.cc \ + src/core/ext/filters/client_channel/backend_metric.cc \ + src/core/ext/filters/client_channel/backup_poller.cc \ + src/core/ext/filters/client_channel/channel_connectivity.cc \ + src/core/ext/filters/client_channel/client_channel.cc \ + src/core/ext/filters/client_channel/client_channel_channelz.cc \ + src/core/ext/filters/client_channel/client_channel_factory.cc \ + src/core/ext/filters/client_channel/client_channel_plugin.cc \ + src/core/ext/filters/client_channel/global_subchannel_pool.cc \ + src/core/ext/filters/client_channel/health/health_check_client.cc \ + src/core/ext/filters/client_channel/http_connect_handshaker.cc \ + src/core/ext/filters/client_channel/http_proxy.cc \ + src/core/ext/filters/client_channel/lb_policy.cc \ + src/core/ext/filters/client_channel/lb_policy/address_filtering.cc \ + src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc \ + src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc \ + src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc \ + src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc \ + src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc \ + src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc \ + src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc \ + src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc \ + src/core/ext/filters/client_channel/lb_policy/priority/priority.cc \ + src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc \ + src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc \ + src/core/ext/filters/client_channel/lb_policy/xds/cds.cc \ + src/core/ext/filters/client_channel/lb_policy/xds/eds.cc \ + src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc \ + src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc \ + src/core/ext/filters/client_channel/lb_policy_registry.cc \ + src/core/ext/filters/client_channel/local_subchannel_pool.cc \ + src/core/ext/filters/client_channel/parse_address.cc \ + src/core/ext/filters/client_channel/proxy_mapper_registry.cc \ + src/core/ext/filters/client_channel/resolver.cc \ + src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc \ + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc \ + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc \ + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc \ + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc \ + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc \ + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc \ + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc \ + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc \ + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc \ + src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc \ + src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc \ + src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc \ + src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc \ + src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc \ + src/core/ext/filters/client_channel/resolver_registry.cc \ + src/core/ext/filters/client_channel/resolver_result_parsing.cc \ + src/core/ext/filters/client_channel/resolving_lb_policy.cc \ + src/core/ext/filters/client_channel/retry_throttle.cc \ + src/core/ext/filters/client_channel/server_address.cc \ + src/core/ext/filters/client_channel/service_config.cc \ + src/core/ext/filters/client_channel/service_config_parser.cc \ + src/core/ext/filters/client_channel/subchannel.cc \ + src/core/ext/filters/client_channel/subchannel_pool_interface.cc \ + src/core/ext/filters/client_channel/xds/xds_api.cc \ + src/core/ext/filters/client_channel/xds/xds_bootstrap.cc \ + src/core/ext/filters/client_channel/xds/xds_channel_secure.cc \ + src/core/ext/filters/client_channel/xds/xds_client.cc \ + src/core/ext/filters/client_channel/xds/xds_client_stats.cc \ + src/core/ext/filters/client_idle/client_idle_filter.cc \ + src/core/ext/filters/deadline/deadline_filter.cc \ + src/core/ext/filters/http/client/http_client_filter.cc \ + src/core/ext/filters/http/client_authority_filter.cc \ + src/core/ext/filters/http/http_filters_plugin.cc \ + src/core/ext/filters/http/message_compress/message_compress_filter.cc \ + src/core/ext/filters/http/message_compress/message_decompress_filter.cc \ + src/core/ext/filters/http/server/http_server_filter.cc \ + src/core/ext/filters/max_age/max_age_filter.cc \ + src/core/ext/filters/message_size/message_size_filter.cc \ + src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc \ + src/core/ext/filters/workarounds/workaround_utils.cc \ + src/core/ext/transport/chttp2/alpn/alpn.cc \ + src/core/ext/transport/chttp2/client/authority.cc \ + src/core/ext/transport/chttp2/client/chttp2_connector.cc \ + src/core/ext/transport/chttp2/client/insecure/channel_create.cc \ + src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc \ + src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc \ + src/core/ext/transport/chttp2/server/chttp2_server.cc \ + src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc \ + src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc \ + src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc \ + src/core/ext/transport/chttp2/transport/bin_decoder.cc \ + src/core/ext/transport/chttp2/transport/bin_encoder.cc \ + src/core/ext/transport/chttp2/transport/chttp2_plugin.cc \ + src/core/ext/transport/chttp2/transport/chttp2_transport.cc \ + src/core/ext/transport/chttp2/transport/context_list.cc \ + src/core/ext/transport/chttp2/transport/flow_control.cc \ + src/core/ext/transport/chttp2/transport/frame_data.cc \ + src/core/ext/transport/chttp2/transport/frame_goaway.cc \ + src/core/ext/transport/chttp2/transport/frame_ping.cc \ + src/core/ext/transport/chttp2/transport/frame_rst_stream.cc \ + src/core/ext/transport/chttp2/transport/frame_settings.cc \ + src/core/ext/transport/chttp2/transport/frame_window_update.cc \ + src/core/ext/transport/chttp2/transport/hpack_encoder.cc \ + src/core/ext/transport/chttp2/transport/hpack_parser.cc \ + src/core/ext/transport/chttp2/transport/hpack_table.cc \ + src/core/ext/transport/chttp2/transport/http2_settings.cc \ + src/core/ext/transport/chttp2/transport/huffsyms.cc \ + src/core/ext/transport/chttp2/transport/incoming_metadata.cc \ + src/core/ext/transport/chttp2/transport/parsing.cc \ + src/core/ext/transport/chttp2/transport/stream_lists.cc \ + src/core/ext/transport/chttp2/transport/stream_map.cc \ + src/core/ext/transport/chttp2/transport/varint.cc \ + src/core/ext/transport/chttp2/transport/writing.cc \ + src/core/ext/transport/inproc/inproc_plugin.cc \ + src/core/ext/transport/inproc/inproc_transport.cc \ + src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c \ + src/core/ext/upb-generated/envoy/annotations/resource.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/cds.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/eds.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/lds.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/listener.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/rds.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/route.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/srds.upb.c \ + src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c \ + src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c \ + src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c \ + src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c \ + src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c \ + src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c \ + src/core/ext/upb-generated/envoy/type/http.upb.c \ + src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c \ + src/core/ext/upb-generated/envoy/type/matcher/string.upb.c \ + src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c \ + src/core/ext/upb-generated/envoy/type/percent.upb.c \ + src/core/ext/upb-generated/envoy/type/range.upb.c \ + src/core/ext/upb-generated/envoy/type/semantic_version.upb.c \ + src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c \ + src/core/ext/upb-generated/gogoproto/gogo.upb.c \ + src/core/ext/upb-generated/google/api/annotations.upb.c \ + src/core/ext/upb-generated/google/api/http.upb.c \ + src/core/ext/upb-generated/google/protobuf/any.upb.c \ + src/core/ext/upb-generated/google/protobuf/descriptor.upb.c \ + src/core/ext/upb-generated/google/protobuf/duration.upb.c \ + src/core/ext/upb-generated/google/protobuf/empty.upb.c \ + src/core/ext/upb-generated/google/protobuf/struct.upb.c \ + src/core/ext/upb-generated/google/protobuf/timestamp.upb.c \ + src/core/ext/upb-generated/google/protobuf/wrappers.upb.c \ + src/core/ext/upb-generated/google/rpc/status.upb.c \ + src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c \ + src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c \ + src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c \ + src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c \ + src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c \ + src/core/ext/upb-generated/udpa/annotations/migrate.upb.c \ + src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c \ + src/core/ext/upb-generated/udpa/annotations/status.upb.c \ + src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c \ + src/core/ext/upb-generated/validate/validate.upb.c \ + src/core/lib/avl/avl.cc \ + src/core/lib/backoff/backoff.cc \ + src/core/lib/channel/channel_args.cc \ + src/core/lib/channel/channel_stack.cc \ + src/core/lib/channel/channel_stack_builder.cc \ + src/core/lib/channel/channel_trace.cc \ + src/core/lib/channel/channelz.cc \ + src/core/lib/channel/channelz_registry.cc \ + src/core/lib/channel/connected_channel.cc \ + src/core/lib/channel/handshaker.cc \ + src/core/lib/channel/handshaker_registry.cc \ + src/core/lib/channel/status_util.cc \ + src/core/lib/compression/compression.cc \ + src/core/lib/compression/compression_args.cc \ + src/core/lib/compression/compression_internal.cc \ + src/core/lib/compression/message_compress.cc \ + src/core/lib/compression/stream_compression.cc \ + src/core/lib/compression/stream_compression_gzip.cc \ + src/core/lib/compression/stream_compression_identity.cc \ + src/core/lib/debug/stats.cc \ + src/core/lib/debug/stats_data.cc \ + src/core/lib/debug/trace.cc \ + src/core/lib/gpr/alloc.cc \ + src/core/lib/gpr/atm.cc \ + src/core/lib/gpr/cpu_iphone.cc \ + src/core/lib/gpr/cpu_linux.cc \ + src/core/lib/gpr/cpu_posix.cc \ + src/core/lib/gpr/cpu_windows.cc \ + src/core/lib/gpr/env_linux.cc \ + src/core/lib/gpr/env_posix.cc \ + src/core/lib/gpr/env_windows.cc \ + src/core/lib/gpr/log.cc \ + src/core/lib/gpr/log_android.cc \ + src/core/lib/gpr/log_linux.cc \ + src/core/lib/gpr/log_posix.cc \ + src/core/lib/gpr/log_windows.cc \ + src/core/lib/gpr/murmur_hash.cc \ + src/core/lib/gpr/string.cc \ + src/core/lib/gpr/string_posix.cc \ + src/core/lib/gpr/string_util_windows.cc \ + src/core/lib/gpr/string_windows.cc \ + src/core/lib/gpr/sync.cc \ + src/core/lib/gpr/sync_abseil.cc \ + src/core/lib/gpr/sync_posix.cc \ + src/core/lib/gpr/sync_windows.cc \ + src/core/lib/gpr/time.cc \ + src/core/lib/gpr/time_posix.cc \ + src/core/lib/gpr/time_precise.cc \ + src/core/lib/gpr/time_windows.cc \ + src/core/lib/gpr/tls_pthread.cc \ + src/core/lib/gpr/tmpfile_msys.cc \ + src/core/lib/gpr/tmpfile_posix.cc \ + src/core/lib/gpr/tmpfile_windows.cc \ + src/core/lib/gpr/wrap_memcpy.cc \ + src/core/lib/gprpp/arena.cc \ + src/core/lib/gprpp/fork.cc \ + src/core/lib/gprpp/global_config_env.cc \ + src/core/lib/gprpp/host_port.cc \ + src/core/lib/gprpp/mpscq.cc \ + src/core/lib/gprpp/thd_posix.cc \ + src/core/lib/gprpp/thd_windows.cc \ + src/core/lib/http/format_request.cc \ + src/core/lib/http/httpcli.cc \ + src/core/lib/http/httpcli_security_connector.cc \ + src/core/lib/http/parser.cc \ + src/core/lib/iomgr/buffer_list.cc \ + src/core/lib/iomgr/call_combiner.cc \ + src/core/lib/iomgr/cfstream_handle.cc \ + src/core/lib/iomgr/combiner.cc \ + src/core/lib/iomgr/dualstack_socket_posix.cc \ + src/core/lib/iomgr/endpoint.cc \ + src/core/lib/iomgr/endpoint_cfstream.cc \ + src/core/lib/iomgr/endpoint_pair_posix.cc \ + src/core/lib/iomgr/endpoint_pair_uv.cc \ + src/core/lib/iomgr/endpoint_pair_windows.cc \ + src/core/lib/iomgr/error.cc \ + src/core/lib/iomgr/error_cfstream.cc \ + src/core/lib/iomgr/ev_apple.cc \ + src/core/lib/iomgr/ev_epoll1_linux.cc \ + src/core/lib/iomgr/ev_epollex_linux.cc \ + src/core/lib/iomgr/ev_poll_posix.cc \ + src/core/lib/iomgr/ev_posix.cc \ + src/core/lib/iomgr/ev_windows.cc \ + src/core/lib/iomgr/exec_ctx.cc \ + src/core/lib/iomgr/executor.cc \ + src/core/lib/iomgr/executor/mpmcqueue.cc \ + src/core/lib/iomgr/executor/threadpool.cc \ + src/core/lib/iomgr/fork_posix.cc \ + src/core/lib/iomgr/fork_windows.cc \ + src/core/lib/iomgr/gethostname_fallback.cc \ + src/core/lib/iomgr/gethostname_host_name_max.cc \ + src/core/lib/iomgr/gethostname_sysconf.cc \ + src/core/lib/iomgr/grpc_if_nametoindex_posix.cc \ + src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc \ + src/core/lib/iomgr/internal_errqueue.cc \ + src/core/lib/iomgr/iocp_windows.cc \ + src/core/lib/iomgr/iomgr.cc \ + src/core/lib/iomgr/iomgr_custom.cc \ + src/core/lib/iomgr/iomgr_internal.cc \ + src/core/lib/iomgr/iomgr_posix.cc \ + src/core/lib/iomgr/iomgr_posix_cfstream.cc \ + src/core/lib/iomgr/iomgr_uv.cc \ + src/core/lib/iomgr/iomgr_windows.cc \ + src/core/lib/iomgr/is_epollexclusive_available.cc \ + src/core/lib/iomgr/load_file.cc \ + src/core/lib/iomgr/lockfree_event.cc \ + src/core/lib/iomgr/poller/eventmanager_libuv.cc \ + src/core/lib/iomgr/polling_entity.cc \ + src/core/lib/iomgr/pollset.cc \ + src/core/lib/iomgr/pollset_custom.cc \ + src/core/lib/iomgr/pollset_set.cc \ + src/core/lib/iomgr/pollset_set_custom.cc \ + src/core/lib/iomgr/pollset_set_windows.cc \ + src/core/lib/iomgr/pollset_uv.cc \ + src/core/lib/iomgr/pollset_windows.cc \ + src/core/lib/iomgr/resolve_address.cc \ + src/core/lib/iomgr/resolve_address_custom.cc \ + src/core/lib/iomgr/resolve_address_posix.cc \ + src/core/lib/iomgr/resolve_address_windows.cc \ + src/core/lib/iomgr/resource_quota.cc \ + src/core/lib/iomgr/sockaddr_utils.cc \ + src/core/lib/iomgr/socket_factory_posix.cc \ + src/core/lib/iomgr/socket_mutator.cc \ + src/core/lib/iomgr/socket_utils_common_posix.cc \ + src/core/lib/iomgr/socket_utils_linux.cc \ + src/core/lib/iomgr/socket_utils_posix.cc \ + src/core/lib/iomgr/socket_utils_uv.cc \ + src/core/lib/iomgr/socket_utils_windows.cc \ + src/core/lib/iomgr/socket_windows.cc \ + src/core/lib/iomgr/tcp_client.cc \ + src/core/lib/iomgr/tcp_client_cfstream.cc \ + src/core/lib/iomgr/tcp_client_custom.cc \ + src/core/lib/iomgr/tcp_client_posix.cc \ + src/core/lib/iomgr/tcp_client_windows.cc \ + src/core/lib/iomgr/tcp_custom.cc \ + src/core/lib/iomgr/tcp_posix.cc \ + src/core/lib/iomgr/tcp_server.cc \ + src/core/lib/iomgr/tcp_server_custom.cc \ + src/core/lib/iomgr/tcp_server_posix.cc \ + src/core/lib/iomgr/tcp_server_utils_posix_common.cc \ + src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc \ + src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc \ + src/core/lib/iomgr/tcp_server_windows.cc \ + src/core/lib/iomgr/tcp_uv.cc \ + src/core/lib/iomgr/tcp_windows.cc \ + src/core/lib/iomgr/time_averaged_stats.cc \ + src/core/lib/iomgr/timer.cc \ + src/core/lib/iomgr/timer_custom.cc \ + src/core/lib/iomgr/timer_generic.cc \ + src/core/lib/iomgr/timer_heap.cc \ + src/core/lib/iomgr/timer_manager.cc \ + src/core/lib/iomgr/timer_uv.cc \ + src/core/lib/iomgr/udp_server.cc \ + src/core/lib/iomgr/unix_sockets_posix.cc \ + src/core/lib/iomgr/unix_sockets_posix_noop.cc \ + src/core/lib/iomgr/wakeup_fd_eventfd.cc \ + src/core/lib/iomgr/wakeup_fd_nospecial.cc \ + src/core/lib/iomgr/wakeup_fd_pipe.cc \ + src/core/lib/iomgr/wakeup_fd_posix.cc \ + src/core/lib/iomgr/work_serializer.cc \ + src/core/lib/json/json_reader.cc \ + src/core/lib/json/json_writer.cc \ + src/core/lib/profiling/basic_timers.cc \ + src/core/lib/profiling/stap_timers.cc \ + src/core/lib/security/context/security_context.cc \ + src/core/lib/security/credentials/alts/alts_credentials.cc \ + src/core/lib/security/credentials/alts/check_gcp_environment.cc \ + src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc \ + src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc \ + src/core/lib/security/credentials/alts/check_gcp_environment_windows.cc \ + src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc \ + src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc \ + src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc \ + src/core/lib/security/credentials/composite/composite_credentials.cc \ + src/core/lib/security/credentials/credentials.cc \ + src/core/lib/security/credentials/credentials_metadata.cc \ + src/core/lib/security/credentials/fake/fake_credentials.cc \ + src/core/lib/security/credentials/google_default/credentials_generic.cc \ + src/core/lib/security/credentials/google_default/google_default_credentials.cc \ + src/core/lib/security/credentials/iam/iam_credentials.cc \ + src/core/lib/security/credentials/jwt/json_token.cc \ + src/core/lib/security/credentials/jwt/jwt_credentials.cc \ + src/core/lib/security/credentials/jwt/jwt_verifier.cc \ + src/core/lib/security/credentials/local/local_credentials.cc \ + src/core/lib/security/credentials/oauth2/oauth2_credentials.cc \ + src/core/lib/security/credentials/plugin/plugin_credentials.cc \ + src/core/lib/security/credentials/ssl/ssl_credentials.cc \ + src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc \ + src/core/lib/security/credentials/tls/tls_credentials.cc \ + src/core/lib/security/security_connector/alts/alts_security_connector.cc \ + src/core/lib/security/security_connector/fake/fake_security_connector.cc \ + src/core/lib/security/security_connector/load_system_roots_fallback.cc \ + src/core/lib/security/security_connector/load_system_roots_linux.cc \ + src/core/lib/security/security_connector/local/local_security_connector.cc \ + src/core/lib/security/security_connector/security_connector.cc \ + src/core/lib/security/security_connector/ssl/ssl_security_connector.cc \ + src/core/lib/security/security_connector/ssl_utils.cc \ + src/core/lib/security/security_connector/ssl_utils_config.cc \ + src/core/lib/security/security_connector/tls/tls_security_connector.cc \ + src/core/lib/security/transport/client_auth_filter.cc \ + src/core/lib/security/transport/secure_endpoint.cc \ + src/core/lib/security/transport/security_handshaker.cc \ + src/core/lib/security/transport/server_auth_filter.cc \ + src/core/lib/security/transport/target_authority_table.cc \ + src/core/lib/security/transport/tsi_error.cc \ + src/core/lib/security/util/json_util.cc \ + src/core/lib/slice/b64.cc \ + src/core/lib/slice/percent_encoding.cc \ + src/core/lib/slice/slice.cc \ + src/core/lib/slice/slice_buffer.cc \ + src/core/lib/slice/slice_intern.cc \ + src/core/lib/slice/slice_string_helpers.cc \ + src/core/lib/surface/api_trace.cc \ + src/core/lib/surface/byte_buffer.cc \ + src/core/lib/surface/byte_buffer_reader.cc \ + src/core/lib/surface/call.cc \ + src/core/lib/surface/call_details.cc \ + src/core/lib/surface/call_log_batch.cc \ + src/core/lib/surface/channel.cc \ + src/core/lib/surface/channel_init.cc \ + src/core/lib/surface/channel_ping.cc \ + src/core/lib/surface/channel_stack_type.cc \ + src/core/lib/surface/completion_queue.cc \ + src/core/lib/surface/completion_queue_factory.cc \ + src/core/lib/surface/event_string.cc \ + src/core/lib/surface/init.cc \ + src/core/lib/surface/init_secure.cc \ + src/core/lib/surface/lame_client.cc \ + src/core/lib/surface/metadata_array.cc \ + src/core/lib/surface/server.cc \ + src/core/lib/surface/validate_metadata.cc \ + src/core/lib/surface/version.cc \ + src/core/lib/transport/bdp_estimator.cc \ + src/core/lib/transport/byte_stream.cc \ + src/core/lib/transport/connectivity_state.cc \ + src/core/lib/transport/error_utils.cc \ + src/core/lib/transport/metadata.cc \ + src/core/lib/transport/metadata_batch.cc \ + src/core/lib/transport/pid_controller.cc \ + src/core/lib/transport/static_metadata.cc \ + src/core/lib/transport/status_conversion.cc \ + src/core/lib/transport/status_metadata.cc \ + src/core/lib/transport/timeout_encoding.cc \ + src/core/lib/transport/transport.cc \ + src/core/lib/transport/transport_op_string.cc \ + src/core/lib/uri/uri_parser.cc \ + src/core/plugin_registry/grpc_plugin_registry.cc \ + src/core/tsi/alts/crypt/aes_gcm.cc \ + src/core/tsi/alts/crypt/gsec.cc \ + src/core/tsi/alts/frame_protector/alts_counter.cc \ + src/core/tsi/alts/frame_protector/alts_crypter.cc \ + src/core/tsi/alts/frame_protector/alts_frame_protector.cc \ + src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.cc \ + src/core/tsi/alts/frame_protector/alts_seal_privacy_integrity_crypter.cc \ + src/core/tsi/alts/frame_protector/alts_unseal_privacy_integrity_crypter.cc \ + src/core/tsi/alts/frame_protector/frame_handler.cc \ + src/core/tsi/alts/handshaker/alts_handshaker_client.cc \ + src/core/tsi/alts/handshaker/alts_shared_resource.cc \ + src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc \ + src/core/tsi/alts/handshaker/alts_tsi_utils.cc \ + src/core/tsi/alts/handshaker/transport_security_common_api.cc \ + src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc \ + src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc \ + src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc \ + src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc \ + src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc \ + src/core/tsi/fake_transport_security.cc \ + src/core/tsi/local_transport_security.cc \ + src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc \ + src/core/tsi/ssl/session_cache/ssl_session_cache.cc \ + src/core/tsi/ssl/session_cache/ssl_session_openssl.cc \ + src/core/tsi/ssl_transport_security.cc \ + src/core/tsi/transport_security.cc \ + src/core/tsi/transport_security_grpc.cc \ + src/php/ext/grpc/byte_buffer.c \ + src/php/ext/grpc/call.c \ + src/php/ext/grpc/call_credentials.c \ + src/php/ext/grpc/channel.c \ + src/php/ext/grpc/channel_credentials.c \ + src/php/ext/grpc/completion_queue.c \ + src/php/ext/grpc/php_grpc.c \ + src/php/ext/grpc/server.c \ + src/php/ext/grpc/server_credentials.c \ + src/php/ext/grpc/timeval.c \ + third_party/abseil-cpp/absl/base/dynamic_annotations.cc \ + third_party/abseil-cpp/absl/base/internal/cycleclock.cc \ + third_party/abseil-cpp/absl/base/internal/raw_logging.cc \ + third_party/abseil-cpp/absl/base/internal/spinlock.cc \ + third_party/abseil-cpp/absl/base/internal/spinlock_wait.cc \ + third_party/abseil-cpp/absl/base/internal/sysinfo.cc \ + third_party/abseil-cpp/absl/base/internal/thread_identity.cc \ + third_party/abseil-cpp/absl/base/internal/throw_delegate.cc \ + third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc \ + third_party/abseil-cpp/absl/base/log_severity.cc \ + third_party/abseil-cpp/absl/numeric/int128.cc \ + third_party/abseil-cpp/absl/strings/ascii.cc \ + third_party/abseil-cpp/absl/strings/charconv.cc \ + third_party/abseil-cpp/absl/strings/escaping.cc \ + third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc \ + third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc \ + third_party/abseil-cpp/absl/strings/internal/escaping.cc \ + third_party/abseil-cpp/absl/strings/internal/memutil.cc \ + third_party/abseil-cpp/absl/strings/internal/ostringstream.cc \ + third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc \ + third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc \ + third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc \ + third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc \ + third_party/abseil-cpp/absl/strings/internal/str_format/output.cc \ + third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc \ + third_party/abseil-cpp/absl/strings/internal/utf8.cc \ + third_party/abseil-cpp/absl/strings/match.cc \ + third_party/abseil-cpp/absl/strings/numbers.cc \ + third_party/abseil-cpp/absl/strings/str_cat.cc \ + third_party/abseil-cpp/absl/strings/str_replace.cc \ + third_party/abseil-cpp/absl/strings/str_split.cc \ + third_party/abseil-cpp/absl/strings/string_view.cc \ + third_party/abseil-cpp/absl/strings/substitute.cc \ + third_party/abseil-cpp/absl/time/civil_time.cc \ + third_party/abseil-cpp/absl/time/clock.cc \ + third_party/abseil-cpp/absl/time/duration.cc \ + third_party/abseil-cpp/absl/time/format.cc \ + third_party/abseil-cpp/absl/time/internal/cctz/src/civil_time_detail.cc \ + third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc \ + third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc \ + third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.cc \ + third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc \ + third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc \ + third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc \ + third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc \ + third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.cc \ + third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc \ + third_party/abseil-cpp/absl/time/time.cc \ + third_party/abseil-cpp/absl/types/bad_optional_access.cc \ + third_party/address_sorting/address_sorting.c \ + third_party/address_sorting/address_sorting_posix.c \ + third_party/address_sorting/address_sorting_windows.c \ + third_party/boringssl-with-bazel/err_data.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_dup.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_i2d_fp.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_octet.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_print.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_utf8.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/asn1_par.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/f_string.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/time_support.c \ + third_party/boringssl-with-bazel/src/crypto/base64/base64.c \ + third_party/boringssl-with-bazel/src/crypto/bio/bio.c \ + third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.c \ + third_party/boringssl-with-bazel/src/crypto/bio/connect.c \ + third_party/boringssl-with-bazel/src/crypto/bio/fd.c \ + third_party/boringssl-with-bazel/src/crypto/bio/file.c \ + third_party/boringssl-with-bazel/src/crypto/bio/hexdump.c \ + third_party/boringssl-with-bazel/src/crypto/bio/pair.c \ + third_party/boringssl-with-bazel/src/crypto/bio/printf.c \ + third_party/boringssl-with-bazel/src/crypto/bio/socket.c \ + third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c \ + third_party/boringssl-with-bazel/src/crypto/bn_extra/bn_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/bn_extra/convert.c \ + third_party/boringssl-with-bazel/src/crypto/buf/buf.c \ + third_party/boringssl-with-bazel/src/crypto/bytestring/asn1_compat.c \ + third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c \ + third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.c \ + third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c \ + third_party/boringssl-with-bazel/src/crypto/bytestring/unicode.c \ + third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_extra.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/derive_key.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesccm.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesctrhmac.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesgcmsiv.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_chacha20poly1305.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_null.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc2.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc4.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c \ + third_party/boringssl-with-bazel/src/crypto/cmac/cmac.c \ + third_party/boringssl-with-bazel/src/crypto/conf/conf.c \ + third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-fuchsia.c \ + third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-linux.c \ + third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c \ + third_party/boringssl-with-bazel/src/crypto/cpu-arm.c \ + third_party/boringssl-with-bazel/src/crypto/cpu-intel.c \ + third_party/boringssl-with-bazel/src/crypto/cpu-ppc64le.c \ + third_party/boringssl-with-bazel/src/crypto/crypto.c \ + third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519.c \ + third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c \ + third_party/boringssl-with-bazel/src/crypto/dh/check.c \ + third_party/boringssl-with-bazel/src/crypto/dh/dh.c \ + third_party/boringssl-with-bazel/src/crypto/dh/dh_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/dh/params.c \ + third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c \ + third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c \ + third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_derive.c \ + third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c \ + third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_extra.c \ + third_party/boringssl-with-bazel/src/crypto/ecdsa_extra/ecdsa_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/engine/engine.c \ + third_party/boringssl-with-bazel/src/crypto/err/err.c \ + third_party/boringssl-with-bazel/src/crypto/evp/digestsign.c \ + third_party/boringssl-with-bazel/src/crypto/evp/evp.c \ + third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/evp/evp_ctx.c \ + third_party/boringssl-with-bazel/src/crypto/evp/p_dsa_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/evp/p_ec.c \ + third_party/boringssl-with-bazel/src/crypto/evp/p_ec_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519.c \ + third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/evp/p_rsa.c \ + third_party/boringssl-with-bazel/src/crypto/evp/p_rsa_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/evp/p_x25519.c \ + third_party/boringssl-with-bazel/src/crypto/evp/p_x25519_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/evp/pbkdf.c \ + third_party/boringssl-with-bazel/src/crypto/evp/print.c \ + third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c \ + third_party/boringssl-with-bazel/src/crypto/evp/sign.c \ + third_party/boringssl-with-bazel/src/crypto/ex_data.c \ + third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c \ + third_party/boringssl-with-bazel/src/crypto/fipsmodule/fips_shared_support.c \ + third_party/boringssl-with-bazel/src/crypto/fipsmodule/is_fips.c \ + third_party/boringssl-with-bazel/src/crypto/hkdf/hkdf.c \ + third_party/boringssl-with-bazel/src/crypto/hrss/hrss.c \ + third_party/boringssl-with-bazel/src/crypto/lhash/lhash.c \ + third_party/boringssl-with-bazel/src/crypto/mem.c \ + third_party/boringssl-with-bazel/src/crypto/obj/obj.c \ + third_party/boringssl-with-bazel/src/crypto/obj/obj_xref.c \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_all.c \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_info.c \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_oth.c \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_pk8.c \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_pkey.c \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_x509.c \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_xaux.c \ + third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c \ + third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c \ + third_party/boringssl-with-bazel/src/crypto/pkcs8/p5_pbev2.c \ + third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c \ + third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c \ + third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.c \ + third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm.c \ + third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_vec.c \ + third_party/boringssl-with-bazel/src/crypto/pool/pool.c \ + third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c \ + third_party/boringssl-with-bazel/src/crypto/rand_extra/forkunsafe.c \ + third_party/boringssl-with-bazel/src/crypto/rand_extra/fuchsia.c \ + third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c \ + third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c \ + third_party/boringssl-with-bazel/src/crypto/rc4/rc4.c \ + third_party/boringssl-with-bazel/src/crypto/refcount_c11.c \ + third_party/boringssl-with-bazel/src/crypto/refcount_lock.c \ + third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_print.c \ + third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c \ + third_party/boringssl-with-bazel/src/crypto/stack/stack.c \ + third_party/boringssl-with-bazel/src/crypto/thread.c \ + third_party/boringssl-with-bazel/src/crypto/thread_none.c \ + third_party/boringssl-with-bazel/src/crypto/thread_pthread.c \ + third_party/boringssl-with-bazel/src/crypto/thread_win.c \ + third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c \ + third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c \ + third_party/boringssl-with-bazel/src/crypto/x509/a_digest.c \ + third_party/boringssl-with-bazel/src/crypto/x509/a_sign.c \ + third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c \ + third_party/boringssl-with-bazel/src/crypto/x509/a_verify.c \ + third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c \ + third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c \ + third_party/boringssl-with-bazel/src/crypto/x509/by_dir.c \ + third_party/boringssl-with-bazel/src/crypto/x509/by_file.c \ + third_party/boringssl-with-bazel/src/crypto/x509/i2d_pr.c \ + third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c \ + third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c \ + third_party/boringssl-with-bazel/src/crypto/x509/t_req.c \ + third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c \ + third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_d2.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_def.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_r2x.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_txt.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509name.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509rset.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509spki.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_algor.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_all.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_exten.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_info.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_name.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_pkey.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_req.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_sig.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_spki.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_val.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_lib.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_node.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akeya.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bcons.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_crld.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_extku.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ia5.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_info.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_int.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ncons.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ocsp.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pci.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pcia.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pcons.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pku.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pmaps.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_sxnet.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c \ + third_party/boringssl-with-bazel/src/ssl/bio_ssl.cc \ + third_party/boringssl-with-bazel/src/ssl/d1_both.cc \ + third_party/boringssl-with-bazel/src/ssl/d1_lib.cc \ + third_party/boringssl-with-bazel/src/ssl/d1_pkt.cc \ + third_party/boringssl-with-bazel/src/ssl/d1_srtp.cc \ + third_party/boringssl-with-bazel/src/ssl/dtls_method.cc \ + third_party/boringssl-with-bazel/src/ssl/dtls_record.cc \ + third_party/boringssl-with-bazel/src/ssl/handoff.cc \ + third_party/boringssl-with-bazel/src/ssl/handshake.cc \ + third_party/boringssl-with-bazel/src/ssl/handshake_client.cc \ + third_party/boringssl-with-bazel/src/ssl/handshake_server.cc \ + third_party/boringssl-with-bazel/src/ssl/s3_both.cc \ + third_party/boringssl-with-bazel/src/ssl/s3_lib.cc \ + third_party/boringssl-with-bazel/src/ssl/s3_pkt.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_aead_ctx.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_buffer.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_file.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_session.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_stat.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc \ + third_party/boringssl-with-bazel/src/ssl/t1_enc.cc \ + third_party/boringssl-with-bazel/src/ssl/t1_lib.cc \ + third_party/boringssl-with-bazel/src/ssl/tls13_both.cc \ + third_party/boringssl-with-bazel/src/ssl/tls13_client.cc \ + third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc \ + third_party/boringssl-with-bazel/src/ssl/tls13_server.cc \ + third_party/boringssl-with-bazel/src/ssl/tls_method.cc \ + third_party/boringssl-with-bazel/src/ssl/tls_record.cc \ + third_party/upb/upb/decode.c \ + third_party/upb/upb/encode.c \ + third_party/upb/upb/msg.c \ + third_party/upb/upb/port.c \ + third_party/upb/upb/table.c \ + third_party/upb/upb/upb.c \ + , $ext_shared, , -fvisibility=hidden \ + -DOPENSSL_NO_ASM -D_GNU_SOURCE -DWIN32_LEAN_AND_MEAN \ + -D_HAS_EXCEPTIONS=0 -DNOMINMAX -DGRPC_ARES=0 \ + -DGRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK=1) + + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/census) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/health) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/lb_policy) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/lb_policy/grpclb) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/lb_policy/pick_first) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/lb_policy/priority) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/lb_policy/round_robin) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/lb_policy/weighted_target) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/lb_policy/xds) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/resolver/dns) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/resolver/dns/c_ares) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/resolver/dns/native) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/resolver/fake) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/resolver/sockaddr) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/resolver/xds) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/xds) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_idle) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/deadline) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/http) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/http/client) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/http/message_compress) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/http/server) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/max_age) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/message_size) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/workarounds) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/transport/chttp2/alpn) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/transport/chttp2/client) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/transport/chttp2/client/insecure) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/transport/chttp2/client/secure) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/transport/chttp2/server) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/transport/chttp2/server/insecure) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/transport/chttp2/server/secure) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/transport/chttp2/transport) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/transport/inproc) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/annotations) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/api/v2) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/api/v2/auth) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/api/v2/cluster) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/api/v2/core) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/api/v2/endpoint) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/api/v2/listener) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/api/v2/route) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/config/listener/v2) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/config/trace/v2) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/service/discovery/v2) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/service/load_stats/v2) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/type) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/type/matcher) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/type/metadata/v2) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/type/tracing/v2) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/gogoproto) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/google/api) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/google/protobuf) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/google/rpc) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/src/proto/grpc/gcp) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/src/proto/grpc/health/v1) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/src/proto/grpc/lb/v1) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/udpa/annotations) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/udpa/data/orca/v1) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/validate) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/avl) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/backoff) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/channel) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/compression) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/debug) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/gpr) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/gprpp) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/http) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/iomgr) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/iomgr/executor) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/iomgr/poller) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/json) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/profiling) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/context) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/alts) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/composite) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/fake) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/google_default) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/iam) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/jwt) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/local) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/oauth2) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/plugin) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/ssl) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/tls) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/security_connector) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/security_connector/alts) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/security_connector/fake) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/security_connector/local) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/security_connector/ssl) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/security_connector/tls) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/transport) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/util) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/slice) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/surface) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/transport) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/uri) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/plugin_registry) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/tsi) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/tsi/alts/crypt) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/tsi/alts/frame_protector) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/tsi/alts/handshaker) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/tsi/alts/zero_copy_frame_protector) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/tsi/ssl/session_cache) + PHP_ADD_BUILD_DIR($ext_builddir/src/php/ext/grpc) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/abseil-cpp/absl/base) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/abseil-cpp/absl/base/internal) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/abseil-cpp/absl/numeric) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/abseil-cpp/absl/strings) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/abseil-cpp/absl/strings/internal) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/abseil-cpp/absl/strings/internal/str_format) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/abseil-cpp/absl/time) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/abseil-cpp/absl/time/internal/cctz/src) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/abseil-cpp/absl/types) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/address_sorting) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/asn1) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/base64) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/bio) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/bn_extra) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/buf) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/bytestring) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/chacha) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/cipher_extra) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/cmac) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/conf) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/curve25519) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/dh) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/digest_extra) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/dsa) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/ec_extra) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/ecdh_extra) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/ecdsa_extra) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/engine) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/err) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/evp) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/fipsmodule) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/hkdf) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/hrss) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/lhash) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/obj) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/pem) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/pkcs7) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/pkcs8) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/poly1305) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/pool) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/rand_extra) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/rc4) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/rsa_extra) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/siphash) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/stack) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/trust_token) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/x509) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/x509v3) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/ssl) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/upb/upb) +fi diff --git a/config.w32 b/config.w32 new file mode 100644 index 00000000..8109f910 --- /dev/null +++ b/config.w32 @@ -0,0 +1,1046 @@ +// $Id$ +// vim:ft=javascript + +ARG_WITH("grpc", "grpc support", "no"); + +if (PHP_GRPC != "no") { + + EXTENSION("grpc", + "src\\core\\ext\\filters\\census\\grpc_context.cc " + + "src\\core\\ext\\filters\\client_channel\\backend_metric.cc " + + "src\\core\\ext\\filters\\client_channel\\backup_poller.cc " + + "src\\core\\ext\\filters\\client_channel\\channel_connectivity.cc " + + "src\\core\\ext\\filters\\client_channel\\client_channel.cc " + + "src\\core\\ext\\filters\\client_channel\\client_channel_channelz.cc " + + "src\\core\\ext\\filters\\client_channel\\client_channel_factory.cc " + + "src\\core\\ext\\filters\\client_channel\\client_channel_plugin.cc " + + "src\\core\\ext\\filters\\client_channel\\global_subchannel_pool.cc " + + "src\\core\\ext\\filters\\client_channel\\health\\health_check_client.cc " + + "src\\core\\ext\\filters\\client_channel\\http_connect_handshaker.cc " + + "src\\core\\ext\\filters\\client_channel\\http_proxy.cc " + + "src\\core\\ext\\filters\\client_channel\\lb_policy.cc " + + "src\\core\\ext\\filters\\client_channel\\lb_policy\\address_filtering.cc " + + "src\\core\\ext\\filters\\client_channel\\lb_policy\\child_policy_handler.cc " + + "src\\core\\ext\\filters\\client_channel\\lb_policy\\grpclb\\client_load_reporting_filter.cc " + + "src\\core\\ext\\filters\\client_channel\\lb_policy\\grpclb\\grpclb.cc " + + "src\\core\\ext\\filters\\client_channel\\lb_policy\\grpclb\\grpclb_balancer_addresses.cc " + + "src\\core\\ext\\filters\\client_channel\\lb_policy\\grpclb\\grpclb_channel_secure.cc " + + "src\\core\\ext\\filters\\client_channel\\lb_policy\\grpclb\\grpclb_client_stats.cc " + + "src\\core\\ext\\filters\\client_channel\\lb_policy\\grpclb\\load_balancer_api.cc " + + "src\\core\\ext\\filters\\client_channel\\lb_policy\\pick_first\\pick_first.cc " + + "src\\core\\ext\\filters\\client_channel\\lb_policy\\priority\\priority.cc " + + "src\\core\\ext\\filters\\client_channel\\lb_policy\\round_robin\\round_robin.cc " + + "src\\core\\ext\\filters\\client_channel\\lb_policy\\weighted_target\\weighted_target.cc " + + "src\\core\\ext\\filters\\client_channel\\lb_policy\\xds\\cds.cc " + + "src\\core\\ext\\filters\\client_channel\\lb_policy\\xds\\eds.cc " + + "src\\core\\ext\\filters\\client_channel\\lb_policy\\xds\\lrs.cc " + + "src\\core\\ext\\filters\\client_channel\\lb_policy\\xds\\xds_routing.cc " + + "src\\core\\ext\\filters\\client_channel\\lb_policy_registry.cc " + + "src\\core\\ext\\filters\\client_channel\\local_subchannel_pool.cc " + + "src\\core\\ext\\filters\\client_channel\\parse_address.cc " + + "src\\core\\ext\\filters\\client_channel\\proxy_mapper_registry.cc " + + "src\\core\\ext\\filters\\client_channel\\resolver.cc " + + "src\\core\\ext\\filters\\client_channel\\resolver\\dns\\c_ares\\dns_resolver_ares.cc " + + "src\\core\\ext\\filters\\client_channel\\resolver\\dns\\c_ares\\grpc_ares_ev_driver.cc " + + "src\\core\\ext\\filters\\client_channel\\resolver\\dns\\c_ares\\grpc_ares_ev_driver_libuv.cc " + + "src\\core\\ext\\filters\\client_channel\\resolver\\dns\\c_ares\\grpc_ares_ev_driver_posix.cc " + + "src\\core\\ext\\filters\\client_channel\\resolver\\dns\\c_ares\\grpc_ares_ev_driver_windows.cc " + + "src\\core\\ext\\filters\\client_channel\\resolver\\dns\\c_ares\\grpc_ares_wrapper.cc " + + "src\\core\\ext\\filters\\client_channel\\resolver\\dns\\c_ares\\grpc_ares_wrapper_fallback.cc " + + "src\\core\\ext\\filters\\client_channel\\resolver\\dns\\c_ares\\grpc_ares_wrapper_libuv.cc " + + "src\\core\\ext\\filters\\client_channel\\resolver\\dns\\c_ares\\grpc_ares_wrapper_posix.cc " + + "src\\core\\ext\\filters\\client_channel\\resolver\\dns\\c_ares\\grpc_ares_wrapper_windows.cc " + + "src\\core\\ext\\filters\\client_channel\\resolver\\dns\\dns_resolver_selection.cc " + + "src\\core\\ext\\filters\\client_channel\\resolver\\dns\\native\\dns_resolver.cc " + + "src\\core\\ext\\filters\\client_channel\\resolver\\fake\\fake_resolver.cc " + + "src\\core\\ext\\filters\\client_channel\\resolver\\sockaddr\\sockaddr_resolver.cc " + + "src\\core\\ext\\filters\\client_channel\\resolver\\xds\\xds_resolver.cc " + + "src\\core\\ext\\filters\\client_channel\\resolver_registry.cc " + + "src\\core\\ext\\filters\\client_channel\\resolver_result_parsing.cc " + + "src\\core\\ext\\filters\\client_channel\\resolving_lb_policy.cc " + + "src\\core\\ext\\filters\\client_channel\\retry_throttle.cc " + + "src\\core\\ext\\filters\\client_channel\\server_address.cc " + + "src\\core\\ext\\filters\\client_channel\\service_config.cc " + + "src\\core\\ext\\filters\\client_channel\\service_config_parser.cc " + + "src\\core\\ext\\filters\\client_channel\\subchannel.cc " + + "src\\core\\ext\\filters\\client_channel\\subchannel_pool_interface.cc " + + "src\\core\\ext\\filters\\client_channel\\xds\\xds_api.cc " + + "src\\core\\ext\\filters\\client_channel\\xds\\xds_bootstrap.cc " + + "src\\core\\ext\\filters\\client_channel\\xds\\xds_channel_secure.cc " + + "src\\core\\ext\\filters\\client_channel\\xds\\xds_client.cc " + + "src\\core\\ext\\filters\\client_channel\\xds\\xds_client_stats.cc " + + "src\\core\\ext\\filters\\client_idle\\client_idle_filter.cc " + + "src\\core\\ext\\filters\\deadline\\deadline_filter.cc " + + "src\\core\\ext\\filters\\http\\client\\http_client_filter.cc " + + "src\\core\\ext\\filters\\http\\client_authority_filter.cc " + + "src\\core\\ext\\filters\\http\\http_filters_plugin.cc " + + "src\\core\\ext\\filters\\http\\message_compress\\message_compress_filter.cc " + + "src\\core\\ext\\filters\\http\\message_compress\\message_decompress_filter.cc " + + "src\\core\\ext\\filters\\http\\server\\http_server_filter.cc " + + "src\\core\\ext\\filters\\max_age\\max_age_filter.cc " + + "src\\core\\ext\\filters\\message_size\\message_size_filter.cc " + + "src\\core\\ext\\filters\\workarounds\\workaround_cronet_compression_filter.cc " + + "src\\core\\ext\\filters\\workarounds\\workaround_utils.cc " + + "src\\core\\ext\\transport\\chttp2\\alpn\\alpn.cc " + + "src\\core\\ext\\transport\\chttp2\\client\\authority.cc " + + "src\\core\\ext\\transport\\chttp2\\client\\chttp2_connector.cc " + + "src\\core\\ext\\transport\\chttp2\\client\\insecure\\channel_create.cc " + + "src\\core\\ext\\transport\\chttp2\\client\\insecure\\channel_create_posix.cc " + + "src\\core\\ext\\transport\\chttp2\\client\\secure\\secure_channel_create.cc " + + "src\\core\\ext\\transport\\chttp2\\server\\chttp2_server.cc " + + "src\\core\\ext\\transport\\chttp2\\server\\insecure\\server_chttp2.cc " + + "src\\core\\ext\\transport\\chttp2\\server\\insecure\\server_chttp2_posix.cc " + + "src\\core\\ext\\transport\\chttp2\\server\\secure\\server_secure_chttp2.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\bin_decoder.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\bin_encoder.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\chttp2_plugin.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\chttp2_transport.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\context_list.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\flow_control.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\frame_data.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\frame_goaway.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\frame_ping.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\frame_rst_stream.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\frame_settings.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\frame_window_update.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\hpack_encoder.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\hpack_parser.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\hpack_table.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\http2_settings.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\huffsyms.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\incoming_metadata.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\parsing.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\stream_lists.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\stream_map.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\varint.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\writing.cc " + + "src\\core\\ext\\transport\\inproc\\inproc_plugin.cc " + + "src\\core\\ext\\transport\\inproc\\inproc_transport.cc " + + "src\\core\\ext\\upb-generated\\envoy\\annotations\\deprecation.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\annotations\\resource.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\auth\\cert.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\auth\\common.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\auth\\secret.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\auth\\tls.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\cds.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\cluster.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\cluster\\circuit_breaker.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\cluster\\filter.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\cluster\\outlier_detection.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\address.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\backoff.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\base.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\config_source.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\event_service_config.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\grpc_service.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\health_check.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\http_uri.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\protocol.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\socket_option.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\discovery.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\eds.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\endpoint.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\endpoint\\endpoint.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\endpoint\\endpoint_components.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\endpoint\\load_report.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\lds.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\listener.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\listener\\listener.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\listener\\listener_components.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\listener\\udp_listener_config.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\rds.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\route.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\route\\route.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\route\\route_components.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\scoped_route.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\srds.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\config\\filter\\accesslog\\v2\\accesslog.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\config\\filter\\network\\http_connection_manager\\v2\\http_connection_manager.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\config\\listener\\v2\\api_listener.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\config\\trace\\v2\\http_tracer.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\service\\discovery\\v2\\ads.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\service\\load_stats\\v2\\lrs.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\type\\http.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\type\\matcher\\regex.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\type\\matcher\\string.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\type\\metadata\\v2\\metadata.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\type\\percent.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\type\\range.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\type\\semantic_version.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\type\\tracing\\v2\\custom_tag.upb.c " + + "src\\core\\ext\\upb-generated\\gogoproto\\gogo.upb.c " + + "src\\core\\ext\\upb-generated\\google\\api\\annotations.upb.c " + + "src\\core\\ext\\upb-generated\\google\\api\\http.upb.c " + + "src\\core\\ext\\upb-generated\\google\\protobuf\\any.upb.c " + + "src\\core\\ext\\upb-generated\\google\\protobuf\\descriptor.upb.c " + + "src\\core\\ext\\upb-generated\\google\\protobuf\\duration.upb.c " + + "src\\core\\ext\\upb-generated\\google\\protobuf\\empty.upb.c " + + "src\\core\\ext\\upb-generated\\google\\protobuf\\struct.upb.c " + + "src\\core\\ext\\upb-generated\\google\\protobuf\\timestamp.upb.c " + + "src\\core\\ext\\upb-generated\\google\\protobuf\\wrappers.upb.c " + + "src\\core\\ext\\upb-generated\\google\\rpc\\status.upb.c " + + "src\\core\\ext\\upb-generated\\src\\proto\\grpc\\gcp\\altscontext.upb.c " + + "src\\core\\ext\\upb-generated\\src\\proto\\grpc\\gcp\\handshaker.upb.c " + + "src\\core\\ext\\upb-generated\\src\\proto\\grpc\\gcp\\transport_security_common.upb.c " + + "src\\core\\ext\\upb-generated\\src\\proto\\grpc\\health\\v1\\health.upb.c " + + "src\\core\\ext\\upb-generated\\src\\proto\\grpc\\lb\\v1\\load_balancer.upb.c " + + "src\\core\\ext\\upb-generated\\udpa\\annotations\\migrate.upb.c " + + "src\\core\\ext\\upb-generated\\udpa\\annotations\\sensitive.upb.c " + + "src\\core\\ext\\upb-generated\\udpa\\annotations\\status.upb.c " + + "src\\core\\ext\\upb-generated\\udpa\\data\\orca\\v1\\orca_load_report.upb.c " + + "src\\core\\ext\\upb-generated\\validate\\validate.upb.c " + + "src\\core\\lib\\avl\\avl.cc " + + "src\\core\\lib\\backoff\\backoff.cc " + + "src\\core\\lib\\channel\\channel_args.cc " + + "src\\core\\lib\\channel\\channel_stack.cc " + + "src\\core\\lib\\channel\\channel_stack_builder.cc " + + "src\\core\\lib\\channel\\channel_trace.cc " + + "src\\core\\lib\\channel\\channelz.cc " + + "src\\core\\lib\\channel\\channelz_registry.cc " + + "src\\core\\lib\\channel\\connected_channel.cc " + + "src\\core\\lib\\channel\\handshaker.cc " + + "src\\core\\lib\\channel\\handshaker_registry.cc " + + "src\\core\\lib\\channel\\status_util.cc " + + "src\\core\\lib\\compression\\compression.cc " + + "src\\core\\lib\\compression\\compression_args.cc " + + "src\\core\\lib\\compression\\compression_internal.cc " + + "src\\core\\lib\\compression\\message_compress.cc " + + "src\\core\\lib\\compression\\stream_compression.cc " + + "src\\core\\lib\\compression\\stream_compression_gzip.cc " + + "src\\core\\lib\\compression\\stream_compression_identity.cc " + + "src\\core\\lib\\debug\\stats.cc " + + "src\\core\\lib\\debug\\stats_data.cc " + + "src\\core\\lib\\debug\\trace.cc " + + "src\\core\\lib\\gpr\\alloc.cc " + + "src\\core\\lib\\gpr\\atm.cc " + + "src\\core\\lib\\gpr\\cpu_iphone.cc " + + "src\\core\\lib\\gpr\\cpu_linux.cc " + + "src\\core\\lib\\gpr\\cpu_posix.cc " + + "src\\core\\lib\\gpr\\cpu_windows.cc " + + "src\\core\\lib\\gpr\\env_linux.cc " + + "src\\core\\lib\\gpr\\env_posix.cc " + + "src\\core\\lib\\gpr\\env_windows.cc " + + "src\\core\\lib\\gpr\\log.cc " + + "src\\core\\lib\\gpr\\log_android.cc " + + "src\\core\\lib\\gpr\\log_linux.cc " + + "src\\core\\lib\\gpr\\log_posix.cc " + + "src\\core\\lib\\gpr\\log_windows.cc " + + "src\\core\\lib\\gpr\\murmur_hash.cc " + + "src\\core\\lib\\gpr\\string.cc " + + "src\\core\\lib\\gpr\\string_posix.cc " + + "src\\core\\lib\\gpr\\string_util_windows.cc " + + "src\\core\\lib\\gpr\\string_windows.cc " + + "src\\core\\lib\\gpr\\sync.cc " + + "src\\core\\lib\\gpr\\sync_abseil.cc " + + "src\\core\\lib\\gpr\\sync_posix.cc " + + "src\\core\\lib\\gpr\\sync_windows.cc " + + "src\\core\\lib\\gpr\\time.cc " + + "src\\core\\lib\\gpr\\time_posix.cc " + + "src\\core\\lib\\gpr\\time_precise.cc " + + "src\\core\\lib\\gpr\\time_windows.cc " + + "src\\core\\lib\\gpr\\tls_pthread.cc " + + "src\\core\\lib\\gpr\\tmpfile_msys.cc " + + "src\\core\\lib\\gpr\\tmpfile_posix.cc " + + "src\\core\\lib\\gpr\\tmpfile_windows.cc " + + "src\\core\\lib\\gpr\\wrap_memcpy.cc " + + "src\\core\\lib\\gprpp\\arena.cc " + + "src\\core\\lib\\gprpp\\fork.cc " + + "src\\core\\lib\\gprpp\\global_config_env.cc " + + "src\\core\\lib\\gprpp\\host_port.cc " + + "src\\core\\lib\\gprpp\\mpscq.cc " + + "src\\core\\lib\\gprpp\\thd_posix.cc " + + "src\\core\\lib\\gprpp\\thd_windows.cc " + + "src\\core\\lib\\http\\format_request.cc " + + "src\\core\\lib\\http\\httpcli.cc " + + "src\\core\\lib\\http\\httpcli_security_connector.cc " + + "src\\core\\lib\\http\\parser.cc " + + "src\\core\\lib\\iomgr\\buffer_list.cc " + + "src\\core\\lib\\iomgr\\call_combiner.cc " + + "src\\core\\lib\\iomgr\\cfstream_handle.cc " + + "src\\core\\lib\\iomgr\\combiner.cc " + + "src\\core\\lib\\iomgr\\dualstack_socket_posix.cc " + + "src\\core\\lib\\iomgr\\endpoint.cc " + + "src\\core\\lib\\iomgr\\endpoint_cfstream.cc " + + "src\\core\\lib\\iomgr\\endpoint_pair_posix.cc " + + "src\\core\\lib\\iomgr\\endpoint_pair_uv.cc " + + "src\\core\\lib\\iomgr\\endpoint_pair_windows.cc " + + "src\\core\\lib\\iomgr\\error.cc " + + "src\\core\\lib\\iomgr\\error_cfstream.cc " + + "src\\core\\lib\\iomgr\\ev_apple.cc " + + "src\\core\\lib\\iomgr\\ev_epoll1_linux.cc " + + "src\\core\\lib\\iomgr\\ev_epollex_linux.cc " + + "src\\core\\lib\\iomgr\\ev_poll_posix.cc " + + "src\\core\\lib\\iomgr\\ev_posix.cc " + + "src\\core\\lib\\iomgr\\ev_windows.cc " + + "src\\core\\lib\\iomgr\\exec_ctx.cc " + + "src\\core\\lib\\iomgr\\executor.cc " + + "src\\core\\lib\\iomgr\\executor\\mpmcqueue.cc " + + "src\\core\\lib\\iomgr\\executor\\threadpool.cc " + + "src\\core\\lib\\iomgr\\fork_posix.cc " + + "src\\core\\lib\\iomgr\\fork_windows.cc " + + "src\\core\\lib\\iomgr\\gethostname_fallback.cc " + + "src\\core\\lib\\iomgr\\gethostname_host_name_max.cc " + + "src\\core\\lib\\iomgr\\gethostname_sysconf.cc " + + "src\\core\\lib\\iomgr\\grpc_if_nametoindex_posix.cc " + + "src\\core\\lib\\iomgr\\grpc_if_nametoindex_unsupported.cc " + + "src\\core\\lib\\iomgr\\internal_errqueue.cc " + + "src\\core\\lib\\iomgr\\iocp_windows.cc " + + "src\\core\\lib\\iomgr\\iomgr.cc " + + "src\\core\\lib\\iomgr\\iomgr_custom.cc " + + "src\\core\\lib\\iomgr\\iomgr_internal.cc " + + "src\\core\\lib\\iomgr\\iomgr_posix.cc " + + "src\\core\\lib\\iomgr\\iomgr_posix_cfstream.cc " + + "src\\core\\lib\\iomgr\\iomgr_uv.cc " + + "src\\core\\lib\\iomgr\\iomgr_windows.cc " + + "src\\core\\lib\\iomgr\\is_epollexclusive_available.cc " + + "src\\core\\lib\\iomgr\\load_file.cc " + + "src\\core\\lib\\iomgr\\lockfree_event.cc " + + "src\\core\\lib\\iomgr\\poller\\eventmanager_libuv.cc " + + "src\\core\\lib\\iomgr\\polling_entity.cc " + + "src\\core\\lib\\iomgr\\pollset.cc " + + "src\\core\\lib\\iomgr\\pollset_custom.cc " + + "src\\core\\lib\\iomgr\\pollset_set.cc " + + "src\\core\\lib\\iomgr\\pollset_set_custom.cc " + + "src\\core\\lib\\iomgr\\pollset_set_windows.cc " + + "src\\core\\lib\\iomgr\\pollset_uv.cc " + + "src\\core\\lib\\iomgr\\pollset_windows.cc " + + "src\\core\\lib\\iomgr\\resolve_address.cc " + + "src\\core\\lib\\iomgr\\resolve_address_custom.cc " + + "src\\core\\lib\\iomgr\\resolve_address_posix.cc " + + "src\\core\\lib\\iomgr\\resolve_address_windows.cc " + + "src\\core\\lib\\iomgr\\resource_quota.cc " + + "src\\core\\lib\\iomgr\\sockaddr_utils.cc " + + "src\\core\\lib\\iomgr\\socket_factory_posix.cc " + + "src\\core\\lib\\iomgr\\socket_mutator.cc " + + "src\\core\\lib\\iomgr\\socket_utils_common_posix.cc " + + "src\\core\\lib\\iomgr\\socket_utils_linux.cc " + + "src\\core\\lib\\iomgr\\socket_utils_posix.cc " + + "src\\core\\lib\\iomgr\\socket_utils_uv.cc " + + "src\\core\\lib\\iomgr\\socket_utils_windows.cc " + + "src\\core\\lib\\iomgr\\socket_windows.cc " + + "src\\core\\lib\\iomgr\\tcp_client.cc " + + "src\\core\\lib\\iomgr\\tcp_client_cfstream.cc " + + "src\\core\\lib\\iomgr\\tcp_client_custom.cc " + + "src\\core\\lib\\iomgr\\tcp_client_posix.cc " + + "src\\core\\lib\\iomgr\\tcp_client_windows.cc " + + "src\\core\\lib\\iomgr\\tcp_custom.cc " + + "src\\core\\lib\\iomgr\\tcp_posix.cc " + + "src\\core\\lib\\iomgr\\tcp_server.cc " + + "src\\core\\lib\\iomgr\\tcp_server_custom.cc " + + "src\\core\\lib\\iomgr\\tcp_server_posix.cc " + + "src\\core\\lib\\iomgr\\tcp_server_utils_posix_common.cc " + + "src\\core\\lib\\iomgr\\tcp_server_utils_posix_ifaddrs.cc " + + "src\\core\\lib\\iomgr\\tcp_server_utils_posix_noifaddrs.cc " + + "src\\core\\lib\\iomgr\\tcp_server_windows.cc " + + "src\\core\\lib\\iomgr\\tcp_uv.cc " + + "src\\core\\lib\\iomgr\\tcp_windows.cc " + + "src\\core\\lib\\iomgr\\time_averaged_stats.cc " + + "src\\core\\lib\\iomgr\\timer.cc " + + "src\\core\\lib\\iomgr\\timer_custom.cc " + + "src\\core\\lib\\iomgr\\timer_generic.cc " + + "src\\core\\lib\\iomgr\\timer_heap.cc " + + "src\\core\\lib\\iomgr\\timer_manager.cc " + + "src\\core\\lib\\iomgr\\timer_uv.cc " + + "src\\core\\lib\\iomgr\\udp_server.cc " + + "src\\core\\lib\\iomgr\\unix_sockets_posix.cc " + + "src\\core\\lib\\iomgr\\unix_sockets_posix_noop.cc " + + "src\\core\\lib\\iomgr\\wakeup_fd_eventfd.cc " + + "src\\core\\lib\\iomgr\\wakeup_fd_nospecial.cc " + + "src\\core\\lib\\iomgr\\wakeup_fd_pipe.cc " + + "src\\core\\lib\\iomgr\\wakeup_fd_posix.cc " + + "src\\core\\lib\\iomgr\\work_serializer.cc " + + "src\\core\\lib\\json\\json_reader.cc " + + "src\\core\\lib\\json\\json_writer.cc " + + "src\\core\\lib\\profiling\\basic_timers.cc " + + "src\\core\\lib\\profiling\\stap_timers.cc " + + "src\\core\\lib\\security\\context\\security_context.cc " + + "src\\core\\lib\\security\\credentials\\alts\\alts_credentials.cc " + + "src\\core\\lib\\security\\credentials\\alts\\check_gcp_environment.cc " + + "src\\core\\lib\\security\\credentials\\alts\\check_gcp_environment_linux.cc " + + "src\\core\\lib\\security\\credentials\\alts\\check_gcp_environment_no_op.cc " + + "src\\core\\lib\\security\\credentials\\alts\\check_gcp_environment_windows.cc " + + "src\\core\\lib\\security\\credentials\\alts\\grpc_alts_credentials_client_options.cc " + + "src\\core\\lib\\security\\credentials\\alts\\grpc_alts_credentials_options.cc " + + "src\\core\\lib\\security\\credentials\\alts\\grpc_alts_credentials_server_options.cc " + + "src\\core\\lib\\security\\credentials\\composite\\composite_credentials.cc " + + "src\\core\\lib\\security\\credentials\\credentials.cc " + + "src\\core\\lib\\security\\credentials\\credentials_metadata.cc " + + "src\\core\\lib\\security\\credentials\\fake\\fake_credentials.cc " + + "src\\core\\lib\\security\\credentials\\google_default\\credentials_generic.cc " + + "src\\core\\lib\\security\\credentials\\google_default\\google_default_credentials.cc " + + "src\\core\\lib\\security\\credentials\\iam\\iam_credentials.cc " + + "src\\core\\lib\\security\\credentials\\jwt\\json_token.cc " + + "src\\core\\lib\\security\\credentials\\jwt\\jwt_credentials.cc " + + "src\\core\\lib\\security\\credentials\\jwt\\jwt_verifier.cc " + + "src\\core\\lib\\security\\credentials\\local\\local_credentials.cc " + + "src\\core\\lib\\security\\credentials\\oauth2\\oauth2_credentials.cc " + + "src\\core\\lib\\security\\credentials\\plugin\\plugin_credentials.cc " + + "src\\core\\lib\\security\\credentials\\ssl\\ssl_credentials.cc " + + "src\\core\\lib\\security\\credentials\\tls\\grpc_tls_credentials_options.cc " + + "src\\core\\lib\\security\\credentials\\tls\\tls_credentials.cc " + + "src\\core\\lib\\security\\security_connector\\alts\\alts_security_connector.cc " + + "src\\core\\lib\\security\\security_connector\\fake\\fake_security_connector.cc " + + "src\\core\\lib\\security\\security_connector\\load_system_roots_fallback.cc " + + "src\\core\\lib\\security\\security_connector\\load_system_roots_linux.cc " + + "src\\core\\lib\\security\\security_connector\\local\\local_security_connector.cc " + + "src\\core\\lib\\security\\security_connector\\security_connector.cc " + + "src\\core\\lib\\security\\security_connector\\ssl\\ssl_security_connector.cc " + + "src\\core\\lib\\security\\security_connector\\ssl_utils.cc " + + "src\\core\\lib\\security\\security_connector\\ssl_utils_config.cc " + + "src\\core\\lib\\security\\security_connector\\tls\\tls_security_connector.cc " + + "src\\core\\lib\\security\\transport\\client_auth_filter.cc " + + "src\\core\\lib\\security\\transport\\secure_endpoint.cc " + + "src\\core\\lib\\security\\transport\\security_handshaker.cc " + + "src\\core\\lib\\security\\transport\\server_auth_filter.cc " + + "src\\core\\lib\\security\\transport\\target_authority_table.cc " + + "src\\core\\lib\\security\\transport\\tsi_error.cc " + + "src\\core\\lib\\security\\util\\json_util.cc " + + "src\\core\\lib\\slice\\b64.cc " + + "src\\core\\lib\\slice\\percent_encoding.cc " + + "src\\core\\lib\\slice\\slice.cc " + + "src\\core\\lib\\slice\\slice_buffer.cc " + + "src\\core\\lib\\slice\\slice_intern.cc " + + "src\\core\\lib\\slice\\slice_string_helpers.cc " + + "src\\core\\lib\\surface\\api_trace.cc " + + "src\\core\\lib\\surface\\byte_buffer.cc " + + "src\\core\\lib\\surface\\byte_buffer_reader.cc " + + "src\\core\\lib\\surface\\call.cc " + + "src\\core\\lib\\surface\\call_details.cc " + + "src\\core\\lib\\surface\\call_log_batch.cc " + + "src\\core\\lib\\surface\\channel.cc " + + "src\\core\\lib\\surface\\channel_init.cc " + + "src\\core\\lib\\surface\\channel_ping.cc " + + "src\\core\\lib\\surface\\channel_stack_type.cc " + + "src\\core\\lib\\surface\\completion_queue.cc " + + "src\\core\\lib\\surface\\completion_queue_factory.cc " + + "src\\core\\lib\\surface\\event_string.cc " + + "src\\core\\lib\\surface\\init.cc " + + "src\\core\\lib\\surface\\init_secure.cc " + + "src\\core\\lib\\surface\\lame_client.cc " + + "src\\core\\lib\\surface\\metadata_array.cc " + + "src\\core\\lib\\surface\\server.cc " + + "src\\core\\lib\\surface\\validate_metadata.cc " + + "src\\core\\lib\\surface\\version.cc " + + "src\\core\\lib\\transport\\bdp_estimator.cc " + + "src\\core\\lib\\transport\\byte_stream.cc " + + "src\\core\\lib\\transport\\connectivity_state.cc " + + "src\\core\\lib\\transport\\error_utils.cc " + + "src\\core\\lib\\transport\\metadata.cc " + + "src\\core\\lib\\transport\\metadata_batch.cc " + + "src\\core\\lib\\transport\\pid_controller.cc " + + "src\\core\\lib\\transport\\static_metadata.cc " + + "src\\core\\lib\\transport\\status_conversion.cc " + + "src\\core\\lib\\transport\\status_metadata.cc " + + "src\\core\\lib\\transport\\timeout_encoding.cc " + + "src\\core\\lib\\transport\\transport.cc " + + "src\\core\\lib\\transport\\transport_op_string.cc " + + "src\\core\\lib\\uri\\uri_parser.cc " + + "src\\core\\plugin_registry\\grpc_plugin_registry.cc " + + "src\\core\\tsi\\alts\\crypt\\aes_gcm.cc " + + "src\\core\\tsi\\alts\\crypt\\gsec.cc " + + "src\\core\\tsi\\alts\\frame_protector\\alts_counter.cc " + + "src\\core\\tsi\\alts\\frame_protector\\alts_crypter.cc " + + "src\\core\\tsi\\alts\\frame_protector\\alts_frame_protector.cc " + + "src\\core\\tsi\\alts\\frame_protector\\alts_record_protocol_crypter_common.cc " + + "src\\core\\tsi\\alts\\frame_protector\\alts_seal_privacy_integrity_crypter.cc " + + "src\\core\\tsi\\alts\\frame_protector\\alts_unseal_privacy_integrity_crypter.cc " + + "src\\core\\tsi\\alts\\frame_protector\\frame_handler.cc " + + "src\\core\\tsi\\alts\\handshaker\\alts_handshaker_client.cc " + + "src\\core\\tsi\\alts\\handshaker\\alts_shared_resource.cc " + + "src\\core\\tsi\\alts\\handshaker\\alts_tsi_handshaker.cc " + + "src\\core\\tsi\\alts\\handshaker\\alts_tsi_utils.cc " + + "src\\core\\tsi\\alts\\handshaker\\transport_security_common_api.cc " + + "src\\core\\tsi\\alts\\zero_copy_frame_protector\\alts_grpc_integrity_only_record_protocol.cc " + + "src\\core\\tsi\\alts\\zero_copy_frame_protector\\alts_grpc_privacy_integrity_record_protocol.cc " + + "src\\core\\tsi\\alts\\zero_copy_frame_protector\\alts_grpc_record_protocol_common.cc " + + "src\\core\\tsi\\alts\\zero_copy_frame_protector\\alts_iovec_record_protocol.cc " + + "src\\core\\tsi\\alts\\zero_copy_frame_protector\\alts_zero_copy_grpc_protector.cc " + + "src\\core\\tsi\\fake_transport_security.cc " + + "src\\core\\tsi\\local_transport_security.cc " + + "src\\core\\tsi\\ssl\\session_cache\\ssl_session_boringssl.cc " + + "src\\core\\tsi\\ssl\\session_cache\\ssl_session_cache.cc " + + "src\\core\\tsi\\ssl\\session_cache\\ssl_session_openssl.cc " + + "src\\core\\tsi\\ssl_transport_security.cc " + + "src\\core\\tsi\\transport_security.cc " + + "src\\core\\tsi\\transport_security_grpc.cc " + + "src\\php\\ext\\grpc\\byte_buffer.c " + + "src\\php\\ext\\grpc\\call.c " + + "src\\php\\ext\\grpc\\call_credentials.c " + + "src\\php\\ext\\grpc\\channel.c " + + "src\\php\\ext\\grpc\\channel_credentials.c " + + "src\\php\\ext\\grpc\\completion_queue.c " + + "src\\php\\ext\\grpc\\php_grpc.c " + + "src\\php\\ext\\grpc\\server.c " + + "src\\php\\ext\\grpc\\server_credentials.c " + + "src\\php\\ext\\grpc\\timeval.c " + + "third_party\\abseil-cpp\\absl\\base\\dynamic_annotations.cc " + + "third_party\\abseil-cpp\\absl\\base\\internal\\cycleclock.cc " + + "third_party\\abseil-cpp\\absl\\base\\internal\\raw_logging.cc " + + "third_party\\abseil-cpp\\absl\\base\\internal\\spinlock.cc " + + "third_party\\abseil-cpp\\absl\\base\\internal\\spinlock_wait.cc " + + "third_party\\abseil-cpp\\absl\\base\\internal\\sysinfo.cc " + + "third_party\\abseil-cpp\\absl\\base\\internal\\thread_identity.cc " + + "third_party\\abseil-cpp\\absl\\base\\internal\\throw_delegate.cc " + + "third_party\\abseil-cpp\\absl\\base\\internal\\unscaledcycleclock.cc " + + "third_party\\abseil-cpp\\absl\\base\\log_severity.cc " + + "third_party\\abseil-cpp\\absl\\numeric\\int128.cc " + + "third_party\\abseil-cpp\\absl\\strings\\ascii.cc " + + "third_party\\abseil-cpp\\absl\\strings\\charconv.cc " + + "third_party\\abseil-cpp\\absl\\strings\\escaping.cc " + + "third_party\\abseil-cpp\\absl\\strings\\internal\\charconv_bigint.cc " + + "third_party\\abseil-cpp\\absl\\strings\\internal\\charconv_parse.cc " + + "third_party\\abseil-cpp\\absl\\strings\\internal\\escaping.cc " + + "third_party\\abseil-cpp\\absl\\strings\\internal\\memutil.cc " + + "third_party\\abseil-cpp\\absl\\strings\\internal\\ostringstream.cc " + + "third_party\\abseil-cpp\\absl\\strings\\internal\\str_format\\arg.cc " + + "third_party\\abseil-cpp\\absl\\strings\\internal\\str_format\\bind.cc " + + "third_party\\abseil-cpp\\absl\\strings\\internal\\str_format\\extension.cc " + + "third_party\\abseil-cpp\\absl\\strings\\internal\\str_format\\float_conversion.cc " + + "third_party\\abseil-cpp\\absl\\strings\\internal\\str_format\\output.cc " + + "third_party\\abseil-cpp\\absl\\strings\\internal\\str_format\\parser.cc " + + "third_party\\abseil-cpp\\absl\\strings\\internal\\utf8.cc " + + "third_party\\abseil-cpp\\absl\\strings\\match.cc " + + "third_party\\abseil-cpp\\absl\\strings\\numbers.cc " + + "third_party\\abseil-cpp\\absl\\strings\\str_cat.cc " + + "third_party\\abseil-cpp\\absl\\strings\\str_replace.cc " + + "third_party\\abseil-cpp\\absl\\strings\\str_split.cc " + + "third_party\\abseil-cpp\\absl\\strings\\string_view.cc " + + "third_party\\abseil-cpp\\absl\\strings\\substitute.cc " + + "third_party\\abseil-cpp\\absl\\time\\civil_time.cc " + + "third_party\\abseil-cpp\\absl\\time\\clock.cc " + + "third_party\\abseil-cpp\\absl\\time\\duration.cc " + + "third_party\\abseil-cpp\\absl\\time\\format.cc " + + "third_party\\abseil-cpp\\absl\\time\\internal\\cctz\\src\\civil_time_detail.cc " + + "third_party\\abseil-cpp\\absl\\time\\internal\\cctz\\src\\time_zone_fixed.cc " + + "third_party\\abseil-cpp\\absl\\time\\internal\\cctz\\src\\time_zone_format.cc " + + "third_party\\abseil-cpp\\absl\\time\\internal\\cctz\\src\\time_zone_if.cc " + + "third_party\\abseil-cpp\\absl\\time\\internal\\cctz\\src\\time_zone_impl.cc " + + "third_party\\abseil-cpp\\absl\\time\\internal\\cctz\\src\\time_zone_info.cc " + + "third_party\\abseil-cpp\\absl\\time\\internal\\cctz\\src\\time_zone_libc.cc " + + "third_party\\abseil-cpp\\absl\\time\\internal\\cctz\\src\\time_zone_lookup.cc " + + "third_party\\abseil-cpp\\absl\\time\\internal\\cctz\\src\\time_zone_posix.cc " + + "third_party\\abseil-cpp\\absl\\time\\internal\\cctz\\src\\zone_info_source.cc " + + "third_party\\abseil-cpp\\absl\\time\\time.cc " + + "third_party\\abseil-cpp\\absl\\types\\bad_optional_access.cc " + + "third_party\\address_sorting\\address_sorting.c " + + "third_party\\address_sorting\\address_sorting_posix.c " + + "third_party\\address_sorting\\address_sorting_windows.c " + + "third_party\\boringssl-with-bazel\\err_data.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_bitstr.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_bool.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_d2i_fp.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_dup.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_enum.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_gentm.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_i2d_fp.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_int.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_mbstr.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_object.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_octet.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_print.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_strnid.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_time.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_type.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_utctm.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_utf8.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\asn1_lib.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\asn1_par.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\asn_pack.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\f_enum.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\f_int.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\f_string.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\tasn_dec.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\tasn_enc.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\tasn_fre.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\tasn_new.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\tasn_typ.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\tasn_utl.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\time_support.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\base64\\base64.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bio\\bio.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bio\\bio_mem.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bio\\connect.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bio\\fd.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bio\\file.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bio\\hexdump.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bio\\pair.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bio\\printf.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bio\\socket.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bio\\socket_helper.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bn_extra\\bn_asn1.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bn_extra\\convert.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\buf\\buf.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bytestring\\asn1_compat.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bytestring\\ber.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bytestring\\cbb.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bytestring\\cbs.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bytestring\\unicode.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\chacha\\chacha.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\cipher_extra.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\derive_key.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\e_aesccm.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\e_aesctrhmac.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\e_aesgcmsiv.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\e_chacha20poly1305.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\e_null.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\e_rc2.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\e_rc4.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\e_tls.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\tls_cbc.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cmac\\cmac.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\conf\\conf.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cpu-aarch64-fuchsia.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cpu-aarch64-linux.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cpu-arm-linux.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cpu-arm.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cpu-intel.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cpu-ppc64le.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\crypto.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\curve25519\\curve25519.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\curve25519\\spake25519.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\dh\\check.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\dh\\dh.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\dh\\dh_asn1.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\dh\\params.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\digest_extra\\digest_extra.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\dsa\\dsa.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\dsa\\dsa_asn1.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\ec_extra\\ec_asn1.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\ec_extra\\ec_derive.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\ec_extra\\hash_to_curve.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\ecdh_extra\\ecdh_extra.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\ecdsa_extra\\ecdsa_asn1.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\engine\\engine.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\err\\err.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\digestsign.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\evp.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\evp_asn1.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\evp_ctx.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_dsa_asn1.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_ec.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_ec_asn1.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_ed25519.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_ed25519_asn1.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_rsa.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_rsa_asn1.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_x25519.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_x25519_asn1.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\pbkdf.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\print.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\scrypt.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\sign.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\ex_data.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\fipsmodule\\bcm.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\fipsmodule\\fips_shared_support.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\fipsmodule\\is_fips.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\hkdf\\hkdf.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\hrss\\hrss.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\lhash\\lhash.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\mem.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\obj\\obj.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\obj\\obj_xref.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\pem\\pem_all.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\pem\\pem_info.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\pem\\pem_lib.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\pem\\pem_oth.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\pem\\pem_pk8.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\pem\\pem_pkey.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\pem\\pem_x509.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\pem\\pem_xaux.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\pkcs7\\pkcs7.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\pkcs7\\pkcs7_x509.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\pkcs8\\p5_pbev2.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\pkcs8\\pkcs8.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\pkcs8\\pkcs8_x509.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\poly1305\\poly1305.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\poly1305\\poly1305_arm.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\poly1305\\poly1305_vec.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\pool\\pool.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\rand_extra\\deterministic.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\rand_extra\\forkunsafe.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\rand_extra\\fuchsia.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\rand_extra\\rand_extra.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\rand_extra\\windows.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\rc4\\rc4.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\refcount_c11.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\refcount_lock.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\rsa_extra\\rsa_asn1.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\rsa_extra\\rsa_print.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\siphash\\siphash.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\stack\\stack.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\thread.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\thread_none.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\thread_pthread.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\thread_win.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\trust_token\\pmbtoken.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\trust_token\\trust_token.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\a_digest.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\a_sign.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\a_strex.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\a_verify.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\algorithm.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\asn1_gen.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\by_dir.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\by_file.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\i2d_pr.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\rsa_pss.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\t_crl.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\t_req.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\t_x509.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\t_x509a.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_att.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_cmp.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_d2.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_def.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_ext.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_lu.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_obj.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_r2x.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_req.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_set.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_trs.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_txt.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_v3.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_vfy.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_vpm.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509cset.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509name.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509rset.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509spki.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_algor.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_all.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_attrib.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_crl.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_exten.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_info.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_name.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_pkey.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_pubkey.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_req.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_sig.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_spki.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_val.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_x509.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_x509a.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\pcy_cache.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\pcy_data.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\pcy_lib.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\pcy_map.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\pcy_node.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\pcy_tree.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_akey.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_akeya.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_alt.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_bcons.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_bitst.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_conf.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_cpols.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_crld.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_enum.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_extku.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_genn.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_ia5.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_info.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_int.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_lib.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_ncons.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_ocsp.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_pci.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_pcia.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_pcons.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_pku.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_pmaps.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_prn.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_purp.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_skey.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_sxnet.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_utl.c " + + "third_party\\boringssl-with-bazel\\src\\ssl\\bio_ssl.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\d1_both.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\d1_lib.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\d1_pkt.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\d1_srtp.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\dtls_method.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\dtls_record.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\handoff.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\handshake.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\handshake_client.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\handshake_server.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\s3_both.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\s3_lib.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\s3_pkt.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_aead_ctx.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_asn1.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_buffer.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_cert.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_cipher.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_file.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_key_share.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_lib.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_privkey.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_session.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_stat.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_transcript.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_versions.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_x509.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\t1_enc.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\t1_lib.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\tls13_both.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\tls13_client.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\tls13_enc.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\tls13_server.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\tls_method.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\tls_record.cc " + + "third_party\\upb\\upb\\decode.c " + + "third_party\\upb\\upb\\encode.c " + + "third_party\\upb\\upb\\msg.c " + + "third_party\\upb\\upb\\port.c " + + "third_party\\upb\\upb\\table.c " + + "third_party\\upb\\upb\\upb.c " + + "third_party\\zlib\\adler32.c " + + "third_party\\zlib\\compress.c " + + "third_party\\zlib\\crc32.c " + + "third_party\\zlib\\deflate.c " + + "third_party\\zlib\\gzclose.c " + + "third_party\\zlib\\gzlib.c " + + "third_party\\zlib\\gzread.c " + + "third_party\\zlib\\gzwrite.c " + + "third_party\\zlib\\infback.c " + + "third_party\\zlib\\inffast.c " + + "third_party\\zlib\\inflate.c " + + "third_party\\zlib\\inftrees.c " + + "third_party\\zlib\\trees.c " + + "third_party\\zlib\\uncompr.c " + + "third_party\\zlib\\zutil.c " + + "" + , null, + "/DOPENSSL_NO_ASM /D_GNU_SOURCE /DWIN32_LEAN_AND_MEAN "+ + "/D_HAS_EXCEPTIONS=0 /DNOMINMAX /DGRPC_ARES=0 /D_WIN32_WINNT=0x600 "+ + "/I"+configure_module_dirname+" "+ + "/I"+configure_module_dirname+"\\include "+ + "/I"+configure_module_dirname+"\\src\\core\\ext\\upb-generated "+ + "/I"+configure_module_dirname+"\\src\\php\\ext\\grpc "+ + "/I"+configure_module_dirname+"\\third_party\\abseil-cpp "+ + "/I"+configure_module_dirname+"\\third_party\\address_sorting\\include "+ + "/I"+configure_module_dirname+"\\third_party\\boringssl-with-bazel\\src\\include "+ + "/I"+configure_module_dirname+"\\third_party\\upb "+ + "/I"+configure_module_dirname+"\\third_party\\zlib "); + + base_dir = get_define('BUILD_DIR'); + FSO.CreateFolder(base_dir+"\\ext"); + FSO.CreateFolder(base_dir+"\\ext\\grpc"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\census"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\health"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\lb_policy"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\lb_policy\\grpclb"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\lb_policy\\pick_first"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\lb_policy\\priority"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\lb_policy\\round_robin"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\lb_policy\\weighted_target"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\lb_policy\\xds"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\resolver"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\resolver\\dns"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\resolver\\dns\\c_ares"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\resolver\\dns\\native"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\resolver\\fake"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\resolver\\sockaddr"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\resolver\\xds"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\xds"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_idle"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\deadline"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\http"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\http\\client"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\http\\message_compress"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\http\\server"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\max_age"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\message_size"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\workarounds"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\transport"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\transport\\chttp2"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\transport\\chttp2\\alpn"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\transport\\chttp2\\client"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\transport\\chttp2\\client\\insecure"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\transport\\chttp2\\client\\secure"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\transport\\chttp2\\server"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\transport\\chttp2\\server\\insecure"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\transport\\chttp2\\server\\secure"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\transport\\chttp2\\transport"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\transport\\inproc"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\annotations"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\api"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\api\\v2"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\api\\v2\\auth"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\api\\v2\\cluster"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\api\\v2\\endpoint"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\api\\v2\\listener"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\api\\v2\\route"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\config"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\config\\filter"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\config\\filter\\accesslog"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\config\\filter\\accesslog\\v2"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\config\\filter\\network"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\config\\filter\\network\\http_connection_manager"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\config\\filter\\network\\http_connection_manager\\v2"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\config\\listener"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\config\\listener\\v2"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\config\\trace"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\config\\trace\\v2"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\service"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\service\\discovery"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\service\\discovery\\v2"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\service\\load_stats"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\service\\load_stats\\v2"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\type"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\type\\matcher"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\type\\metadata"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\type\\metadata\\v2"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\type\\tracing"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\type\\tracing\\v2"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\gogoproto"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\google"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\google\\api"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\google\\protobuf"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\google\\rpc"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\src"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\src\\proto"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\src\\proto\\grpc"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\src\\proto\\grpc\\gcp"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\src\\proto\\grpc\\health"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\src\\proto\\grpc\\health\\v1"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\src\\proto\\grpc\\lb"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\src\\proto\\grpc\\lb\\v1"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\udpa"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\udpa\\annotations"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\udpa\\data"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\udpa\\data\\orca"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\udpa\\data\\orca\\v1"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\validate"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\avl"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\backoff"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\channel"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\compression"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\debug"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\gpr"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\gprpp"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\http"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\iomgr"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\iomgr\\executor"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\iomgr\\poller"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\json"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\profiling"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\context"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\alts"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\composite"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\fake"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\google_default"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\iam"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\jwt"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\local"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\oauth2"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\plugin"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\ssl"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\tls"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\security_connector"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\security_connector\\alts"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\security_connector\\fake"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\security_connector\\local"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\security_connector\\ssl"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\security_connector\\tls"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\transport"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\util"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\slice"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\surface"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\transport"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\uri"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\plugin_registry"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\tsi"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\tsi\\alts"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\tsi\\alts\\crypt"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\tsi\\alts\\frame_protector"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\tsi\\alts\\handshaker"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\tsi\\alts\\zero_copy_frame_protector"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\tsi\\ssl"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\tsi\\ssl\\session_cache"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\php"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\php\\ext"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\php\\ext\\grpc"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\abseil-cpp"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\abseil-cpp\\absl"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\abseil-cpp\\absl\\base"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\abseil-cpp\\absl\\base\\internal"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\abseil-cpp\\absl\\numeric"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\abseil-cpp\\absl\\strings"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\abseil-cpp\\absl\\strings\\internal"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\abseil-cpp\\absl\\strings\\internal\\str_format"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\abseil-cpp\\absl\\time"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\abseil-cpp\\absl\\time\\internal"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\abseil-cpp\\absl\\time\\internal\\cctz"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\abseil-cpp\\absl\\time\\internal\\cctz\\src"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\abseil-cpp\\absl\\types"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\address_sorting"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\asn1"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\base64"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\bio"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\bn_extra"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\buf"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\bytestring"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\chacha"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\cmac"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\conf"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\curve25519"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\dh"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\digest_extra"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\dsa"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\ec_extra"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\ecdh_extra"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\ecdsa_extra"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\engine"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\err"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\evp"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\fipsmodule"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\hkdf"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\hrss"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\lhash"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\obj"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\pem"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\pkcs7"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\pkcs8"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\poly1305"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\pool"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\rand_extra"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\rc4"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\rsa_extra"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\siphash"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\stack"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\trust_token"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\x509"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\x509v3"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\ssl"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\upb"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\upb\\upb"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\zlib"); + _build_dirs = new Array(); + for (i = 0; i < build_dirs.length; i++) { + if (build_dirs[i].indexOf('grpc') == -1) { + _build_dirs[_build_dirs.length] = build_dirs[i]; + } + } + build_dirs = _build_dirs; +} diff --git a/doc/.gitignore b/doc/.gitignore new file mode 100644 index 00000000..95464d3e --- /dev/null +++ b/doc/.gitignore @@ -0,0 +1,2 @@ +build/ +src/ diff --git a/doc/PROTOCOL-HTTP2.md b/doc/PROTOCOL-HTTP2.md new file mode 100644 index 00000000..261e76f8 --- /dev/null +++ b/doc/PROTOCOL-HTTP2.md @@ -0,0 +1,259 @@ +# gRPC over HTTP2 + +## Introduction +This document serves as a detailed description for an implementation of gRPC carried over HTTP2 framing. It assumes familiarity with the HTTP2 specification. + +## Protocol +Production rules are using ABNF syntax. + +### Outline + +The following is the general sequence of message atoms in a GRPC request & response message stream + +* Request → Request-Headers \*Length-Prefixed-Message EOS +* Response → (Response-Headers \*Length-Prefixed-Message Trailers) / Trailers-Only + + +### Requests + +* Request → Request-Headers \*Length-Prefixed-Message EOS + +Request-Headers are delivered as HTTP2 headers in HEADERS + CONTINUATION frames. + +* **Request-Headers** → Call-Definition \*Custom-Metadata +* **Call-Definition** → Method Scheme Path TE [Authority] [Timeout] Content-Type [Message-Type] [Message-Encoding] [Message-Accept-Encoding] [User-Agent] +* **Method** → ":method POST" +* **Scheme** → ":scheme " ("http" / "https") +* **Path** → ":path" "/" Service-Name "/" {_method name_} # But see note below. +* **Service-Name** → {_IDL-specific service name_} +* **Authority** → ":authority" {_virtual host name of authority_} +* **TE** → "te" "trailers" # Used to detect incompatible proxies +* **Timeout** → "grpc-timeout" TimeoutValue TimeoutUnit +* **TimeoutValue** → {_positive integer as ASCII string of at most 8 digits_} +* **TimeoutUnit** → Hour / Minute / Second / Millisecond / Microsecond / Nanosecond + * **Hour** → "H" + * **Minute** → "M" + * **Second** → "S" + * **Millisecond** → "m" + * **Microsecond** → "u" + * **Nanosecond** → "n" +* **Content-Type** → "content-type" "application/grpc" [("+proto" / "+json" / {_custom_})] +* **Content-Coding** → "identity" / "gzip" / "deflate" / "snappy" / {_custom_} +* **Message-Encoding** → "grpc-encoding" Content-Coding +* **Message-Accept-Encoding** → "grpc-accept-encoding" Content-Coding \*("," Content-Coding) +* **User-Agent** → "user-agent" {_structured user-agent string_} +* **Message-Type** → "grpc-message-type" {_type name for message schema_} +* **Custom-Metadata** → Binary-Header / ASCII-Header +* **Binary-Header** → {Header-Name "-bin" } {_base64 encoded value_} +* **ASCII-Header** → Header-Name ASCII-Value +* **Header-Name** → 1\*( %x30-39 / %x61-7A / "\_" / "-" / ".") ; 0-9 a-z \_ - . +* **ASCII-Value** → 1\*( %x20-%x7E ) ; space and printable ASCII + + +HTTP2 requires that reserved headers, ones starting with ":" appear before all other headers. Additionally implementations should send **Timeout** immediately after the reserved headers and they should send the **Call-Definition** headers before sending **Custom-Metadata**. + +**Path** is case-sensitive. Some gRPC implementations may allow the **Path** +format shown above to be overridden, but this functionality is strongly +discouraged. gRPC does not go out of its way to break users that are using this +kind of override, but we do not actively support it, and some functionality +(e.g., service config support) will not work when the path is not of the form +shown above. + +If **Timeout** is omitted a server should assume an infinite timeout. Client implementations are free to send a default minimum timeout based on their deployment requirements. + +If **Content-Type** does not begin with "application/grpc", gRPC servers SHOULD respond with HTTP status of 415 (Unsupported Media Type). This will prevent other HTTP/2 clients from interpreting a gRPC error response, which uses status 200 (OK), as successful. + +**Custom-Metadata** is an arbitrary set of key-value pairs defined by the application layer. Header names starting with "grpc-" but not listed here are reserved for future GRPC use and should not be used by applications as **Custom-Metadata**. + +Note that HTTP2 does not allow arbitrary octet sequences for header values so binary header values must be encoded using Base64 as per https://tools.ietf.org/html/rfc4648#section-4. Implementations MUST accept padded and un-padded values and should emit un-padded values. Applications define binary headers by having their names end with "-bin". Runtime libraries use this suffix to detect binary headers and properly apply base64 encoding & decoding as headers are sent and received. + +**Custom-Metadata** header order is not guaranteed to be preserved except for +values with duplicate header names. Duplicate header names may have their values +joined with "," as the delimiter and be considered semantically equivalent. +Implementations must split **Binary-Header**s on "," before decoding the +Base64-encoded values. + +**ASCII-Value** should not have leading or trailing whitespace. If it contains +leading or trailing whitespace, it may be stripped. The **ASCII-Value** +character range defined is more strict than HTTP. Implementations must not error +due to receiving an invalid **ASCII-Value** that's a valid **field-value** in +HTTP, but the precise behavior is not strictly defined: they may throw the value +away or accept the value. If accepted, care must be taken to make sure that the +application is permitted to echo the value back as metadata. For example, if the +metadata is provided to the application as a list in a request, the application +should not trigger an error by providing that same list as the metadata in the +response. + +Servers may limit the size of **Request-Headers**, with a default of 8 KiB +suggested. Implementations are encouraged to compute total header size like +HTTP/2's `SETTINGS_MAX_HEADER_LIST_SIZE`: the sum of all header fields, for each +field the sum of the uncompressed field name and value lengths plus 32, with +binary values' lengths being post-Base64. + +The repeated sequence of **Length-Prefixed-Message** items is delivered in DATA frames + +* **Length-Prefixed-Message** → Compressed-Flag Message-Length Message +* **Compressed-Flag** → 0 / 1 # encoded as 1 byte unsigned integer +* **Message-Length** → {_length of Message_} # encoded as 4 byte unsigned integer (big endian) +* **Message** → \*{binary octet} + +A **Compressed-Flag** value of 1 indicates that the binary octet sequence of **Message** is compressed using the mechanism declared by the **Message-Encoding** header. A value of 0 indicates that no encoding of **Message** bytes has occurred. Compression contexts are NOT maintained over message boundaries, implementations must create a new context for each message in the stream. If the **Message-Encoding** header is omitted then the **Compressed-Flag** must be 0. + +For requests, **EOS** (end-of-stream) is indicated by the presence of the END_STREAM flag on the last received DATA frame. In scenarios where the **Request** stream needs to be closed but no data remains to be sent implementations MUST send an empty DATA frame with this flag set. + +### Responses + +* **Response** → (Response-Headers \*Length-Prefixed-Message Trailers) / Trailers-Only +* **Response-Headers** → HTTP-Status [Message-Encoding] [Message-Accept-Encoding] Content-Type \*Custom-Metadata +* **Trailers-Only** → HTTP-Status Content-Type Trailers +* **Trailers** → Status [Status-Message] \*Custom-Metadata +* **HTTP-Status** → ":status 200" +* **Status** → "grpc-status" 1\*DIGIT ; 0-9 +* **Status-Message** → "grpc-message" Percent-Encoded +* **Percent-Encoded** → 1\*(Percent-Byte-Unencoded / Percent-Byte-Encoded) +* **Percent-Byte-Unencoded** → 1\*( %x20-%x24 / %x26-%x7E ) ; space and VCHAR, except % +* **Percent-Byte-Encoded** → "%" 2HEXDIGIT ; 0-9 A-F + +**Response-Headers** & **Trailers-Only** are each delivered in a single HTTP2 HEADERS frame block. Most responses are expected to have both headers and trailers but **Trailers-Only** is permitted for calls that produce an immediate error. Status must be sent in **Trailers** even if the status code is OK. + +For responses end-of-stream is indicated by the presence of the END_STREAM flag on the last received HEADERS frame that carries **Trailers**. + +Implementations should expect broken deployments to send non-200 HTTP status codes in responses as well as a variety of non-GRPC content-types and to omit **Status** & **Status-Message**. Implementations must synthesize a **Status** & **Status-Message** to propagate to the application layer when this occurs. + +Clients may limit the size of **Response-Headers**, **Trailers**, and +**Trailers-Only**, with a default of 8 KiB each suggested. + +The value portion of **Status** is a decimal-encoded integer as an ASCII string, +without any leading zeros. + +The value portion of **Status-Message** is conceptually a Unicode string +description of the error, physically encoded as UTF-8 followed by +percent-encoding. Percent-encoding is specified in [RFC 3986 +§2.1](https://tools.ietf.org/html/rfc3986#section-2.1), although the form used +here has different restricted characters. When decoding invalid values, +implementations MUST NOT error or throw away the message. At worst, the +implementation can abort decoding the status message altogether such that the +user would received the raw percent-encoded form. Alternatively, the +implementation can decode valid portions while leaving broken %-encodings as-is +or replacing them with a replacement character (e.g., '?' or the Unicode +replacement character). + +#### Example + +Sample unary-call showing HTTP2 framing sequence + +**Request** + +``` +HEADERS (flags = END_HEADERS) +:method = POST +:scheme = http +:path = /google.pubsub.v2.PublisherService/CreateTopic +:authority = pubsub.googleapis.com +grpc-timeout = 1S +content-type = application/grpc+proto +grpc-encoding = gzip +authorization = Bearer y235.wef315yfh138vh31hv93hv8h3v + +DATA (flags = END_STREAM) + +``` +**Response** +``` +HEADERS (flags = END_HEADERS) +:status = 200 +grpc-encoding = gzip +content-type = application/grpc+proto + +DATA + + +HEADERS (flags = END_STREAM, END_HEADERS) +grpc-status = 0 # OK +trace-proto-bin = jher831yy13JHy3hc +``` + +#### User Agents + +While the protocol does not require a user-agent to function it is recommended that clients provide a structured user-agent string that provides a basic description of the calling library, version & platform to facilitate issue diagnosis in heterogeneous environments. The following structure is recommended to library developers +``` +User-Agent → "grpc-" Language ?("-" Variant) "/" Version ?( " (" *(AdditionalProperty ";") ")" ) +``` +E.g. + +``` +grpc-java/1.2.3 +grpc-ruby/1.2.3 +grpc-ruby-jruby/1.3.4 +grpc-java-android/0.9.1 (gingerbread/1.2.4; nexus5; tmobile) +``` + +#### Idempotency and Retries + +Unless explicitly defined to be, gRPC Calls are not assumed to be idempotent. Specifically: + +* Calls that cannot be proven to have started will not be retried. +* There is no mechanism for duplicate suppression as it is not necessary. +* Calls that are marked as idempotent may be sent multiple times. + + +#### HTTP2 Transport Mapping + +##### Stream Identification +All GRPC calls need to specify an internal ID. We will use HTTP2 stream-ids as call identifiers in this scheme. NOTE: These ids are contextual to an open HTTP2 session and will not be unique within a given process that is handling more than one HTTP2 session nor can they be used as GUIDs. + +##### Data Frames +DATA frame boundaries have no relation to **Length-Prefixed-Message** boundaries and implementations should make no assumptions about their alignment. + +##### Errors + +When an application or runtime error occurs during an RPC a **Status** and **Status-Message** are delivered in **Trailers**. + +In some cases it is possible that the framing of the message stream has become corrupt and the RPC runtime will choose to use an **RST_STREAM** frame to indicate this state to its peer. RPC runtime implementations should interpret RST_STREAM as immediate full-closure of the stream and should propagate an error up to the calling application layer. + +The following mapping from RST_STREAM error codes to GRPC error codes is applied. + +HTTP2 Code|GRPC Code +----------|----------- +NO_ERROR(0)|INTERNAL - An explicit GRPC status of OK should have been sent but this might be used to aggressively lameduck in some scenarios. +PROTOCOL_ERROR(1)|INTERNAL +INTERNAL_ERROR(2)|INTERNAL +FLOW_CONTROL_ERROR(3)|INTERNAL +SETTINGS_TIMEOUT(4)|INTERNAL +STREAM_CLOSED|No mapping as there is no open stream to propagate to. Implementations should log. +FRAME_SIZE_ERROR|INTERNAL +REFUSED_STREAM|UNAVAILABLE - Indicates that no processing occurred and the request can be retried, possibly elsewhere. +CANCEL(8)|Mapped to call cancellation when sent by a client.Mapped to CANCELLED when sent by a server. Note that servers should only use this mechanism when they need to cancel a call but the payload byte sequence is incomplete. +COMPRESSION_ERROR|INTERNAL +CONNECT_ERROR|INTERNAL +ENHANCE_YOUR_CALM|RESOURCE_EXHAUSTED ...with additional error detail provided by runtime to indicate that the exhausted resource is bandwidth. +INADEQUATE_SECURITY| PERMISSION_DENIED … with additional detail indicating that permission was denied as protocol is not secure enough for call. + + +##### Security + +The HTTP2 specification mandates the use of TLS 1.2 or higher when TLS is used with HTTP2. It also places some additional constraints on the allowed ciphers in deployments to avoid known-problems as well as requiring SNI support. It is also expected that HTTP2 will be used in conjunction with proprietary transport security mechanisms about which the specification can make no meaningful recommendations. + +##### Connection Management + +###### GOAWAY Frame +Sent by servers to clients to indicate that they will no longer accept any new streams on the associated connections. This frame includes the id of the last successfully accepted stream by the server. Clients should consider any stream initiated after the last successfully accepted stream as UNAVAILABLE and retry the call elsewhere. Clients are free to continue working with the already accepted streams until they complete or the connection is terminated. + +Servers should send GOAWAY before terminating a connection to reliably inform clients which work has been accepted by the server and is being executed. + +###### PING Frame +Both clients and servers can send a PING frame that the peer must respond to by precisely echoing what they received. This is used to assert that the connection is still live as well as providing a means to estimate end-to-end latency. If a server initiated PING does not receive a response within the deadline expected by the runtime all outstanding calls on the server will be closed with a CANCELLED status. An expired client initiated PING will cause all calls to be closed with an UNAVAILABLE status. Note that the frequency of PINGs is highly dependent on the network environment, implementations are free to adjust PING frequency based on network and application requirements. + +###### Connection failure +If a detectable connection failure occurs on the client all calls will be closed with an UNAVAILABLE status. For servers open calls will be closed with a CANCELLED status. + + +### Appendix A - GRPC for Protobuf + +The service interfaces declared by protobuf are easily mapped onto GRPC by +code generation extensions to protoc. The following defines the mapping +to be used. + +* **Service-Name** → ?( {_proto package name_} "." ) {_service name_} +* **Message-Type** → {_fully qualified proto message name_} +* **Content-Type** → "application/grpc+proto" diff --git a/doc/PROTOCOL-WEB.md b/doc/PROTOCOL-WEB.md new file mode 100644 index 00000000..66544543 --- /dev/null +++ b/doc/PROTOCOL-WEB.md @@ -0,0 +1,141 @@ +# gRPC Web + +gRPC-Web provides a JS client library that supports the same API +as gRPC-Node to access a gRPC service. Due to browser limitation, +the Web client library implements a different protocol than the +[native gRPC protocol](PROTOCOL-HTTP2.md). +This protocol is designed to make it easy for a proxy to translate +between the protocols as this is the most likely deployment model. + +This document lists the differences between the two protocols. +To help tracking future revisions, this document describes a delta +with the protocol details specified in the +[native gRPC protocol](PROTOCOL-HTTP2.md). + +# Design goals + +For the gRPC-Web protocol, we have decided on the following design goals: + +* adopt the same framing as “application/grpc” whenever possible +* decouple from HTTP/2 framing which is not, and will never, be directly +exposed by browsers +* support text streams (e.g. base64) in order to provide cross-browser +support (e.g. IE-10) + +While the new protocol will be published/reviewed publicly, we also +intend to keep the protocol as an internal detail to gRPC-Web. +More specifically, we expect the protocol to + +* evolve over time, mainly to optimize for browser clients or support +web-specific features such as CORS, XSRF +* become optional (in 1-2 years) when browsers are able to speak the native +gRPC protocol via the new [whatwg streams API](https://github.com/whatwg/streams) + +# Protocol differences vs [gRPC over HTTP2](PROTOCOL-HTTP2.md) + +Content-Type + +1. application/grpc-web + * e.g. application/grpc-web+[proto, json, thrift] + * the sender should always specify the message format, e.g. +proto, +json + * the receiver should assume the default is "+proto" when the message format is missing in Content-Type (as "application/grpc-web") +2. application/grpc-web-text + * text-encoded streams of “application/grpc-web” + * e.g. application/grpc-web-text+[proto, thrift] + +--- + +HTTP wire protocols + +1. support any HTTP/*, with no dependency on HTTP/2 specific framing +2. use lower-case header/trailer names +3. use EOF (end of body) to close the stream + +--- + +HTTP/2 related behavior (specified in [gRPC over HTTP2](PROTOCOL-HTTP2.md)) + +1. stream-id is not supported or used +2. go-away is not supported or used + +--- + +Message framing (vs. [http2-transport-mapping](PROTOCOL-HTTP2.md#http2-transport-mapping)) + +1. Response status encoded as part of the response body + * Key-value pairs encoded as a HTTP/1 headers block (without the terminating newline), per https://tools.ietf.org/html/rfc7230#section-3.2 + ``` + key1: foo\r\n + key2: bar\r\n + ``` +2. 8th (MSB) bit of the 1st gRPC frame byte + * 0: data + * 1: trailers + ``` + 10000000b: an uncompressed trailer (as part of the body) + 10000001b: a compressed trailer + ``` +3. Trailers must be the last message of the response, as enforced +by the implementation +4. Trailers-only responses: no change to the gRPC protocol spec. +Trailers may be sent together with response headers, with no message +in the body. + +--- + +User Agent + +* Do NOT use User-Agent header (which is to be set by browsers, by default) +* Use X-User-Agent: grpc-web-javascript/0.1 (follow the same format as specified in [gRPC over HTTP2](PROTOCOL-HTTP2.md)) + +--- + +Text-encoded (response) streams + +1. The client library should indicate to the server via the "Accept" header that +the response stream needs to be text encoded e.g. when XHR is used or due +to security policies with XHR + * Accept: application/grpc-web-text +2. The default text encoding is base64 + * Note that “Content-Transfer-Encoding: base64” should not be used. + Due to in-stream base64 padding when delimiting messages, the entire + response body is not necessarily a valid base64-encoded entity + * While the server runtime will always base64-encode and flush gRPC messages + atomically the client library should not assume base64 padding always + happens at the boundary of message frames. That is, the implementation may send base64-encoded "chunks" with potential padding whenever the runtime needs to flush a byte buffer. + +# Other features + +Retries, caching + +* Will spec out the support after their respective gRPC spec extensions +are finalized + * Safe retries: PUT + * Caching: header encoded request and/or a web specific spec + +--- + +Keep-alive + +* HTTP/2 PING is not supported or used +* Will not support send-beacon (GET) + +--- + +Bidi-streaming, with flow-control + +* Pending on [whatwg fetch/streams](https://github.com/whatwg/fetch) to be +finalized and implemented in modern browsers +* gRPC-Web client will support the native gRPC protocol with modern browsers + +--- + +Versioning + +* Special headers may be introduced to support features that may break compatibility. + +--- + +Browser-specific features + +* For features that are unique to browser or HTML clients, check the [spec doc](https://github.com/grpc/grpc-web/blob/master/BROWSER-FEATURES.md) published in the grpc/grpc-web repo. diff --git a/doc/binary-logging.md b/doc/binary-logging.md new file mode 100644 index 00000000..86b3f766 --- /dev/null +++ b/doc/binary-logging.md @@ -0,0 +1,59 @@ +# Binary Logging + +## Format + +The log format is described in [this proto file](/src/proto/grpc/binary_log/v1alpha/log.proto). It is intended that multiple parts of the call will be logged in separate files, and then correlated by analysis tools using the rpc\_id. + +## API + +The binary logger will be a separate library from gRPC, in each language that we support. The user will need to explicitly call into the library to generate logs. The library will provide the ability to log sending or receiving, as relevant, the following on both the client and the server: + + - Initial metadata + - Messages + - Status with trailing metadata from the server + - Additional key/value pairs that are associated with a call but not sent over the wire + +The following is an example of what such an API could look like in C++: + +```c++ +// The context provides the method_name, deadline, peer, and metadata contents. +// direction = CLIENT_SEND +LogRequestHeaders(ClientContext context); +// direction = SERVER_RECV +LogRequestHeaders(ServerContext context); + +// The context provides the metadata contents +// direction = CLIENT_RECV +LogResponseHeaders(ClientContext context); +// direction = SERVER_SEND +LogResponseHeaders(ServerContext context); + +// The context provides the metadata contents +// direction = CLIENT_RECV +LogStatus(ClientContext context, grpc_status_code code, string details); +// direction = SERVER_SEND +LogStatus(ServerContext context, grpc_status_code code, string details); + +// The context provides the user data contents +// direction = CLIENT_SEND +LogUserData(ClientContext context); +// direction = SERVER_SEND +LogUserData(ServerContext context); + +// direction = CLIENT_SEND +LogRequestMessage(ClientContext context, uint32_t length, T message); +// direction = SERVER_RECV +LogRequestMessage(ServerContext context, uint32_t length, T message); +// direction = CLIENT_RECV +LogResponseMessage(ClientContext context, uint32_t length, T message); +// direction = SERVER_SEND +LogResponseMessage(ServerContext context, uint32_t length, T message); +``` + +In all of those cases, the `rpc_id` is provided by the context, and each combination of method and context argument type implies a single direction, as noted in the comments. + +For the message log functions, the `length` argument indicates the length of the complete message, and the `message` argument may be only part of the complete message, stripped of sensitive material and/or shortened for efficiency. + +## Language differences + +In other languages, more or less data will need to be passed explicitly as separate arguments. In some languages, for example, the metadata will be separate from the context-like object and will need to be passed as a separate argument. diff --git a/doc/c-style-guide.md b/doc/c-style-guide.md new file mode 100644 index 00000000..2cfa41dd --- /dev/null +++ b/doc/c-style-guide.md @@ -0,0 +1,92 @@ +GRPC C STYLE GUIDE +===================== + +Background +---------- + +Here we document style rules for C usage in the gRPC Core library. + +General +------- + +- Layout rules are defined by clang-format, and all code should be passed + through clang-format. A (docker-based) script to do so is included in + [tools/distrib/clang\_format\_code.sh](../tools/distrib/clang_format_code.sh). + +Header Files +------------ + +- Public header files (those in the include/grpc tree) should compile as + pedantic C89. +- Public header files should be includable from C++ programs. That is, they + should include the following: + ```c + #ifdef __cplusplus + extern "C" { + # endif + + /* ... body of file ... */ + + #ifdef __cplusplus + } + # endif + ``` +- Header files should be self-contained and end in .h. +- All header files should have a `#define` guard to prevent multiple inclusion. + To guarantee uniqueness they should be based on the file's path. + + For public headers: `include/grpc/grpc.h` → `GRPC_GRPC_H` + + For private headers: + `src/core/lib/channel/channel_stack.h` → + `GRPC_CORE_LIB_CHANNEL_CHANNEL_STACK_H` + +Variable Initialization +----------------------- + +When declaring a (non-static) pointer variable, always initialize it to `NULL`. +Even in the case of static pointer variables, it's recommended to explicitly +initialize them to `NULL`. + + +C99 Features +------------ + +- Variable sized arrays are not allowed. +- Do not use the 'inline' keyword. +- Flexible array members are allowed + (https://en.wikipedia.org/wiki/Flexible_array_member). + +Comments +-------- + +Within public header files, only `/* */` comments are allowed. + +Within implementation files and private headers, either single line `//` +or multi line `/* */` comments are allowed. Only one comment style per file is +allowed however (i.e. if single line comments are used anywhere within a file, +ALL comments within that file must be single line comments). + +Symbol Names +------------ + +- Non-static functions must be prefixed by `grpc_` +- Static functions must *not* be prefixed by `grpc_` +- Typenames of `struct`s , `union`s, and `enum`s must be prefixed by `grpc_` if + they are declared in a header file. They must not be prefixed by `grpc_` if + they are declared in a source file. +- Enumeration values and `#define` names must be uppercase. All other values + must be lowercase. +- Enumeration values or `#define` names defined in a header file must be + prefixed with `GRPC_` (except for `#define` macros that are being used to + substitute functions; those should follow the general rules for + functions). Enumeration values or `#define`s defined in source files must not + be prefixed with `GRPC_`. +- Multiple word identifiers use underscore as a delimiter, *never* camel + case. E.g. `variable_name`. + +Functions +---------- + +- The use of [`atexit()`](http://man7.org/linux/man-pages/man3/atexit.3.html) is + in forbidden in libgrpc. diff --git a/doc/command_line_tool.md b/doc/command_line_tool.md new file mode 100644 index 00000000..786825fd --- /dev/null +++ b/doc/command_line_tool.md @@ -0,0 +1,209 @@ +# gRPC command line tool + +## Overview + +This document describes the command line tool that comes with gRPC repository. It is desirable to have command line +tools written in other languages roughly follow the same syntax and flags. + +At this point, the tool needs to be built from source, and it should be moved out to grpc-tools repository as a stand +alone application once it is mature enough. + +## Core functionality + +The command line tool can do the following things: + +- Send unary rpc. +- Attach metadata and display received metadata. +- Handle common authentication to server. +- Infer request/response types from server reflection result. +- Find the request/response types from a given proto file. +- Read proto request in text form. +- Read request in wire form (for protobuf messages, this means serialized binary form). +- Display proto response in text form. +- Write response in wire form to a file. + +The command line tool should support the following things: + +- List server services and methods through server reflection. +- Fine-grained auth control (such as, use this oauth token to talk to the server). +- Send streaming rpc. + +## Code location + +To use the tool, you need to get the grpc repository and make sure your system +has the prerequisites for building grpc from source, given in the [installation +instructions](../BUILDING.md). + +In order to build the grpc command line tool from a fresh clone of the grpc +repository, you need to run the following command to update submodules: + +``` +git submodule update --init +``` + +You also need to have the gflags library installed on your system. gflags can be +installed with the following command: +Linux: +``` +sudo apt-get install libgflags-dev +``` +Mac systems with Homebrew: +``` +brew install gflags +``` + +Once the prerequisites are satisfied, you can build with cmake: + +``` +$ mkdir -p cmake/build +$ cd cmake/build +$ cmake -DgRPC_BUILD_TESTS=ON ../.. +$ make grpc_cli +``` + +The main file can be found at +https://github.com/grpc/grpc/blob/master/test/cpp/util/grpc_cli.cc + +## Prerequisites + +Most `grpc_cli` commands need the server to support server reflection. See +guides for +[Java](https://github.com/grpc/grpc-java/blob/master/documentation/server-reflection-tutorial.md#enable-server-reflection) +, [C++](https://github.com/grpc/grpc/blob/master/doc/server_reflection_tutorial.md) +and [Go](https://github.com/grpc/grpc-go/blob/master/Documentation/server-reflection-tutorial.md) + +Local proto files can be used as an alternative. See instructions [below](#Call-a-remote-method). + +## Usage + +### List services + +`grpc_cli ls` command lists services and methods exposed at a given port + +- List all the services exposed at a given port + + ```sh + $ grpc_cli ls localhost:50051 + ``` + + output: + + ```none + helloworld.Greeter + grpc.reflection.v1alpha.ServerReflection + ``` + + The `localhost:50051` part indicates the server you are connecting to. + +- List one service with details + + `grpc_cli ls` command inspects a service given its full name (in the format + of \.\). It can print information with a long listing + format when `-l` flag is set. This flag can be used to get more details + about a service. + + ```sh + $ grpc_cli ls localhost:50051 helloworld.Greeter -l + ``` + + `helloworld.Greeter` is full name of the service. + + output: + + ```proto + filename: helloworld.proto + package: helloworld; + service Greeter { + rpc SayHello(helloworld.HelloRequest) returns (helloworld.HelloReply) {} + } + + ``` + +### List methods + +- List one method with details + + `grpc_cli ls` command also inspects a method given its full name (in the + format of \.\.\). + + ```sh + $ grpc_cli ls localhost:50051 helloworld.Greeter.SayHello -l + ``` + + `helloworld.Greeter.SayHello` is full name of the method. + + output: + + ```proto + rpc SayHello(helloworld.HelloRequest) returns (helloworld.HelloReply) {} + ``` + +### Inspect message types + +We can use `grpc_cli type` command to inspect request/response types given the +full name of the type (in the format of \.\). + +- Get information about the request type + + ```sh + $ grpc_cli type localhost:50051 helloworld.HelloRequest + ``` + + `helloworld.HelloRequest` is the full name of the request type. + + output: + + ```proto + message HelloRequest { + optional string name = 1; + } + ``` + +### Call a remote method + +We can send RPCs to a server and get responses using `grpc_cli call` command. + +- Call a unary method Send a rpc to a helloworld server at `localhost:50051`: + + ```sh + $ grpc_cli call localhost:50051 SayHello "name: 'gRPC CLI'" + ``` + + output: `sh message: "Hello gRPC CLI"` + + `SayHello` is (part of) the gRPC method string. Then `"name: 'world'"` is + the text format of the request proto message. For information on more flags, + look at the comments of `grpc_cli.cc`. + +- Use local proto files + + If the server does not have the server reflection service, you will need to + provide local proto files containing the service definition. The tool will + try to find request/response types from them. + + ```sh + $ grpc_cli call localhost:50051 SayHello "name: 'world'" \ + --protofiles=examples/protos/helloworld.proto + ``` + + If the proto file is not under the current directory, you can use + `--proto_path` to specify a new search root. + + Note that the tool will always attempt to use the reflection service first, + falling back to local proto files if the service is not found. Use + `--noremotedb` to avoid attempting to use the reflection service. + +- Send non-proto rpc + + For using gRPC with protocols other than protobuf, you will need the exact + method name string and a file containing the raw bytes to be sent on the + wire. + + ```bash + $ grpc_cli call localhost:50051 /helloworld.Greeter/SayHello \ + --input_binary_file=input.bin \ + --output_binary_file=output.bin + ``` + + On success, you will need to read or decode the response from the + `output.bin` file. diff --git a/doc/compression.md b/doc/compression.md new file mode 100644 index 00000000..7f0c3823 --- /dev/null +++ b/doc/compression.md @@ -0,0 +1,118 @@ +## gRPC Compression + +The keywords "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", +"SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be +interpreted as described in [RFC 2119](http://www.ietf.org/rfc/rfc2119.txt). + +### Intent + +Compression is used to reduce the amount of bandwidth used between peers. The +compression supported by gRPC acts _at the individual message level_, taking +_message_ [as defined in the wire format +document](PROTOCOL-HTTP2.md). + +The implementation supports different compression algorithms. A _default +compression level_, to be used in the absence of message-specific settings, MAY +be specified for during channel creation. + +The ability to control compression settings per call and to enable/disable +compression on a per message basis MAY be used to prevent CRIME/BEAST attacks. +It also allows for asymmetric compression communication, whereby a response MAY +be compressed differently, if at all. + +### Specification + +Compression MAY be configured by the Client Application by calling the +appropriate API method. There are two scenarios where compression MAY be +configured: + ++ At channel creation time, which sets the channel default compression and + therefore the compression that SHALL be used in the absence of per-RPC + compression configuration. ++ At response time, via: + + For unary RPCs, the {Client,Server}Context instance. + + For streaming RPCs, the {Client,Server}Writer instance. In this case, + configuration is reduced to disabling compression altogether. + +### Compression Method Asymmetry Between Peers + +A gRPC peer MAY choose to respond using a different compression method to that +of the request, including not performing any compression, regardless of channel +and RPC settings (for example, if compression would result in small or negative +gains). + +If a client message is compressed by an algorithm that is not supported +by a server, the message WILL result in an `UNIMPLEMENTED` error status on the +server. The server will then include a `grpc-accept-encoding` response +header which specifies the algorithms that the server accepts. If the client +message is compressed using one of the algorithms from the `grpc-accept-encoding` header +and an `UNIMPLEMENTED` error status is returned from the server, the cause of the error +MUST NOT be related to compression. If a server sent data which is compressed by an algorithm +that is not supported by the client, an `INTERNAL` error status will occur on the client side. + +Note that a peer MAY choose to not disclose all the encodings it supports. +However, if it receives a message compressed in an undisclosed but supported +encoding, it MUST include said encoding in the response's `grpc-accept-encoding` +header. + +For every message a server is requested to compress using an algorithm it knows +the client doesn't support (as indicated by the last `grpc-accept-encoding` +header received from the client), it SHALL send the message uncompressed. + +### Specific Disabling of Compression + +If the user (through the previously described mechanisms) requests to disable +compression the next message MUST be sent uncompressed. This is instrumental in +preventing BEAST/CRIME attacks. This applies to both the unary and streaming +cases. + +### Compression Levels and Algorithms + +The set of supported algorithm is implementation dependent. In order to simplify +the public API and to operate seamlessly across implementations (both in terms +of languages but also different version of the same one), we introduce the idea +of _compression levels_ (such as "low", "medium", "high"). + +Levels map to concrete algorithms and/or their settings (such as "low" mapping +to "gzip -3" and "high" mapping to "gzip -9") automatically depending on what a +peer is known to support. A server is always aware of what its clients support, +as clients disclose it in the Message-Accept-Encoding header as part of the +RPC. A client doesn't a priori (presently) know which algorithms a +server supports. This issue can be addressed with an initial negotiation of +capabilities or an automatic retry mechanism. These features will be implemented +in the future. Currently however, compression levels are only supported at the +server side, which is aware of the client's capabilities through the incoming +Message-Accept-Encoding header. + +### Propagation to child RPCs + +The inheritance of the compression configuration by child RPCs is left up to the +implementation. Note that in the absence of changes to the parent channel, its +configuration will be used. + +### Test cases + +1. When a compression level is not specified for either the channel or the +message, the default channel level _none_ is considered: data MUST NOT be +compressed. +1. When per-RPC compression configuration isn't present for a message, the +channel compression configuration MUST be used. +1. When a compression method (including no compression) is specified for an +outgoing message, the message MUST be compressed accordingly. +1. A message compressed by a client in a way not supported by its server MUST +fail with status `UNIMPLEMENTED`, its associated description indicating the +unsupported condition as well as the supported ones. The returned +`grpc-accept-encoding` header MUST NOT contain the compression method +(encoding) used. +1. A message compressed by a server in a way not supported by its client MUST +fail with status `INTERNAL`, its associated description indicating the +unsupported condition as well as the supported ones. The returned +`grpc-accept-encoding` header MUST NOT contain the compression method +(encoding) used. +1. An ill-constructed message with its [Compressed-Flag +bit](PROTOCOL-HTTP2.md#compressed-flag) +set but lacking a +[grpc-encoding](PROTOCOL-HTTP2.md#message-encoding) +entry different from _identity_ in its metadata MUST fail with `INTERNAL` +status, its associated description indicating the invalid Compressed-Flag +condition. diff --git a/doc/compression_cookbook.md b/doc/compression_cookbook.md new file mode 100644 index 00000000..c10a805f --- /dev/null +++ b/doc/compression_cookbook.md @@ -0,0 +1,133 @@ +# gRPC (Core) Compression Cookbook + +## Introduction + +This document describes compression as implemented by the gRPC C core. See [the +full compression specification](compression.md) for details. + +### Intended Audience + +Wrapped languages developers, for the purposes of supporting compression by +interacting with the C core. + +## Criteria for GA readiness + +1. Be able to set compression at [channel](#per-channel-settings), + [call](#per-call-settings) and [message](#per-message-settings) level. + In principle this API should be based on _compression levels_ as opposed to + algorithms. See the discussion [below](#level-vs-algorithms). +1. Have unit tests covering [the cases from the + spec](https://github.com/grpc/grpc/blob/master/doc/compression.md#test-cases). +1. Interop tests implemented and passing on Jenkins. The two relevant interop + test cases are + [large_compressed_unary](https://github.com/grpc/grpc/blob/master/doc/interop-test-descriptions.md#large_compressed_unary) + and + [server_compressed_streaming](https://github.com/grpc/grpc/blob/master/doc/interop-test-descriptions.md#server_compressed_streaming). + +## Summary Flowcharts + +The following flowcharts depict the evolution of a message, both _incoming_ and +_outgoing_, irrespective of the client/server character of the call. Aspects +still not symmetric between clients and servers (e.g. the [use of compression +levels](https://github.com/grpc/grpc/blob/master/doc/compression.md#compression-levels-and-algorithms)) +are explicitly marked. The in-detail textual description for the different +scenarios is described in subsequent sections. + +## Incoming Messages + +![image](images/compression_cookbook_incoming.png) + +## Outgoing Messages + +![image](images/compression_cookbook_outgoing.png) + +## Levels vs Algorithms + +As mentioned in [the relevant discussion on the spec +document](https://github.com/grpc/grpc/blob/master/doc/compression.md#compression-levels-and-algorithms), +compression _levels_ are the primary mechanism for compression selection _at the +server side_. In the future, it'll also be at the client side. The use of levels +abstracts away the intricacies of selecting a concrete algorithm supported by a +peer, on top of removing the burden of choice from the developer. +As of this writing (Q2 2016), clients can only specify compression _algorithms_. +Clients will support levels as soon as an automatic retry/negotiation mechanism +is in place. + +## Per Channel Settings + +Compression may be configured at channel creation. This is a convenience to +avoid having to repeatedly configure compression for every call. Note that any +compression setting on individual [calls](#per-call-settings) or +[messages](#per-message-settings) overrides channel settings. + +The following aspects can be configured at channel-creation time via channel arguments: + +#### Disable Compression _Algorithms_ + +Use the channel argument key +`GRPC_COMPRESSION_CHANNEL_ENABLED_ALGORITHMS_BITSET` (from +[`grpc/impl/codegen/compression_types.h`](https://github.com/grpc/grpc/blob/master/include/grpc/impl/codegen/compression_types.h)), +takes a 32 bit bitset value. A set bit means the algorithm with that enum value +according to `grpc_compression_algorithm` is _enabled_. +For example, `GRPC_COMPRESS_GZIP` currently has a numeric value of 2. To +enable/disable GZIP for a channel, one would set/clear the 3rd LSB (eg, 0b100 = +0x4). Note that setting/clearing 0th position, that corresponding to +`GRPC_COMPRESS_NONE`, has no effect, as no-compression (a.k.a. _identity_) is +always supported. +Incoming messages compressed (ie, encoded) with a disabled algorithm will result +in the call being closed with `GRPC_STATUS_UNIMPLEMENTED`. + +#### Default Compression _Level_ + +**(currently, Q2 2016, only applicable for server side channels. It's ignored +for clients.)** +Use the channel argument key `GRPC_COMPRESSION_CHANNEL_DEFAULT_LEVEL` (from +[`grpc/impl/codegen/compression_types.h`](https://github.com/grpc/grpc/blob/master/include/grpc/impl/codegen/compression_types.h)), +valued by an integer corresponding to a value from the `grpc_compression_level` +enum. + +#### Default Compression _Algorithm_ + +Use the channel argument key `GRPC_COMPRESSION_CHANNEL_DEFAULT_ALGORITHM` (from +[`grpc/impl/codegen/compression_types.h`](https://github.com/grpc/grpc/blob/master/include/grpc/impl/codegen/compression_types.h)), +valued by an integer corresponding to a value from the `grpc_compression_level` +enum. + +## Per Call Settings + +### Compression **Level** in Call Responses + +The server requests a compression level via initial metadata. The +`send_initial_metadata` `grpc_op` contains a `maybe_compression_level` field +with two fields, `is_set` and `compression_level`. The former must be set when +actively choosing a level to disambiguate the default value of zero (no +compression) from the proactive selection of no compression. + +The core will receive the request for the compression level and automatically +choose a compression algorithm based on its knowledge about the peer +(communicated by the client via the `grpc-accept-encoding` header. Note that the +absence of this header means no compression is supported by the client/peer). + +### Compression **Algorithm** in Call Responses + +**Server should avoid setting the compression algorithm directly**. Prefer +setting compression levels unless there's a _very_ compelling reason to choose +specific algorithms (benchmarking, testing). + +Selection of concrete compression algorithms is performed by adding a +`(GRPC_COMPRESS_REQUEST_ALGORITHM_KEY, )` key-value pair to the +initial metadata, where `GRPC_COMPRESS_REQUEST_ALGORITHM_KEY` is defined in +[`grpc/impl/codegen/compression_types.h`](https://github.com/grpc/grpc/blob/master/include/grpc/impl/codegen/compression_types.h)), +and `` is the human readable name of the algorithm as given in +[the HTTP2 spec](https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md) +for `Message-Encoding` (e.g. gzip, identity, etc.). See +[`grpc_compression_algorithm_name`](https://github.com/grpc/grpc/blob/master/src/core/lib/compression/compression.c) +for the mapping between the `grpc_compression_algorithm` enum values and their +textual representation. + +## Per Message Settings + +To disable compression for a specific message, the `flags` field of `grpc_op` +instances of type `GRPC_OP_SEND_MESSAGE` must have its `GRPC_WRITE_NO_COMPRESS` +bit set. Refer to +[`grpc/impl/codegen/compression_types.h`](https://github.com/grpc/grpc/blob/master/include/grpc/impl/codegen/compression_types.h)), diff --git a/doc/connection-backoff-interop-test-description.md b/doc/connection-backoff-interop-test-description.md new file mode 100644 index 00000000..eb59e250 --- /dev/null +++ b/doc/connection-backoff-interop-test-description.md @@ -0,0 +1,77 @@ +Connection Backoff Interop Test Descriptions +=============================================== + +This test is to verify the client is reconnecting the server with correct +backoffs as specified in +[the spec](https://github.com/grpc/grpc/blob/master/doc/connection-backoff.md). +The test server has a port (control_port) running a rpc service for controlling +the server and another port (retry_port) to close any incoming tcp connections. +The test has the following flow: + +1. The server starts listening on control_port. +2. The client calls Start rpc on server control_port. +3. The server starts listening on retry_port. +4. The client connects to server retry_port and retries with backoff for 540s, +which translates to about 13 retries. +5. The client calls Stop rpc on server control port. +6. The client checks the response to see whether the server thinks the backoffs +are conforming the spec or do its own check on the backoffs in the response. + +Client and server use +[test.proto](https://github.com/grpc/grpc/blob/master/src/proto/grpc/testing/test.proto). +Each language should implement its own client. The C++ server is shared among +languages. + +Client +------ + +Clients should accept these arguments: +* --server_control_port=PORT + * The server port to connect to for rpc. For example, "8080" +* --server_retry_port=PORT + * The server port to connect to for testing backoffs. For example, "8081" + +The client must connect to the control port without TLS. The client must connect +to the retry port with TLS. The client should either assert on the server +returned backoff status or check the returned backoffs on its own. + +Procedure of client: + +1. Calls Start on server control port with a large deadline or no deadline, +waits for its finish and checks it succeeded. +2. Initiates a channel connection to server retry port, which should perform +reconnections with proper backoffs. A convenient way to achieve this is to +call Start with a deadline of 540s. The rpc should fail with deadline exceeded. +3. Calls Stop on server control port and checks it succeeded. +4. Checks the response to see whether the server thinks the backoffs passed the + test. +5. Optionally, the client can do its own check on the returned backoffs. + + +Server +------ + +A C++ server can be used for the test. Other languages do NOT need to implement +a server. To minimize the network delay, the server binary should run on the +same machine or on a nearby machine (in terms of network distance) with the +client binary. + +A server implements the ReconnectService to its state. It also opens a +tcp server on the retry_port, which just shuts down all incoming tcp +connections to simulate connection failures. The server will keep a record of +all the reconnection timestamps and return the connection backoffs in the +response in milliseconds. The server also checks the backoffs to see whether +they conform the spec and returns whether the client passes the test. + +If the server receives a Start call when another client is being tested, it +finishes the call when the other client is done. If some other host connects +to the server retry_port when a client is being tested, the server will log an +error but likely would think the client fails the test. + +The server accepts these arguments: + +* --control_port=PORT + * The port to listen on for control rpcs. For example, "8080" +* --retry_port=PORT + * The tcp server port. For example, "8081" + diff --git a/doc/connection-backoff.md b/doc/connection-backoff.md new file mode 100644 index 00000000..0e83d9b9 --- /dev/null +++ b/doc/connection-backoff.md @@ -0,0 +1,56 @@ +GRPC Connection Backoff Protocol +================================ + +When we do a connection to a backend which fails, it is typically desirable to +not retry immediately (to avoid flooding the network or the server with +requests) and instead do some form of exponential backoff. + +We have several parameters: + 1. INITIAL_BACKOFF (how long to wait after the first failure before retrying) + 1. MULTIPLIER (factor with which to multiply backoff after a failed retry) + 1. JITTER (by how much to randomize backoffs). + 1. MAX_BACKOFF (upper bound on backoff) + 1. MIN_CONNECT_TIMEOUT (minimum time we're willing to give a connection to + complete) + +## Proposed Backoff Algorithm + +Exponentially back off the start time of connection attempts up to a limit of +MAX_BACKOFF, with jitter. + +``` +ConnectWithBackoff() + current_backoff = INITIAL_BACKOFF + current_deadline = now() + INITIAL_BACKOFF + while (TryConnect(Max(current_deadline, now() + MIN_CONNECT_TIMEOUT)) + != SUCCESS) + SleepUntil(current_deadline) + current_backoff = Min(current_backoff * MULTIPLIER, MAX_BACKOFF) + current_deadline = now() + current_backoff + + UniformRandom(-JITTER * current_backoff, JITTER * current_backoff) + +``` + +With specific parameters of +MIN_CONNECT_TIMEOUT = 20 seconds +INITIAL_BACKOFF = 1 second +MULTIPLIER = 1.6 +MAX_BACKOFF = 120 seconds +JITTER = 0.2 + +Implementations with pressing concerns (such as minimizing the number of wakeups +on a mobile phone) may wish to use a different algorithm, and in particular +different jitter logic. + +Alternate implementations must ensure that connection backoffs started at the +same time disperse, and must not attempt connections substantially more often +than the above algorithm. + +## Reset Backoff + +The back off should be reset to INITIAL_BACKOFF at some time point, so that the +reconnecting behavior is consistent no matter the connection is a newly started +one or a previously disconnected one. + +We choose to reset the Backoff when the SETTINGS frame is received, at that time +point, we know for sure that this connection was accepted by the server. diff --git a/doc/connectivity-semantics-and-api.md b/doc/connectivity-semantics-and-api.md new file mode 100644 index 00000000..48a84767 --- /dev/null +++ b/doc/connectivity-semantics-and-api.md @@ -0,0 +1,154 @@ +gRPC Connectivity Semantics and API +=================================== + +This document describes the connectivity semantics for gRPC channels and the +corresponding impact on RPCs. We then discuss an API. + +States of Connectivity +---------------------- + +gRPC Channels provide the abstraction over which clients can communicate with +servers.The client-side channel object can be constructed using little more +than a DNS name. Channels encapsulate a range of functionality including name +resolution, establishing a TCP connection (with retries and backoff) and TLS +handshakes. Channels can also handle errors on established connections and +reconnect, or in the case of HTTP/2 GO_AWAY, re-resolve the name and reconnect. + +To hide the details of all this activity from the user of the gRPC API (i.e., +application code) while exposing meaningful information about the state of a +channel, we use a state machine with five states, defined below: + +CONNECTING: The channel is trying to establish a connection and is waiting to +make progress on one of the steps involved in name resolution, TCP connection +establishment or TLS handshake. This may be used as the initial state for channels upon +creation. + +READY: The channel has successfully established a connection all the way through +TLS handshake (or equivalent) and protocol-level (HTTP/2, etc) handshaking, and +all subsequent attempt to communicate have succeeded (or are pending without any +known failure). + +TRANSIENT_FAILURE: There has been some transient failure (such as a TCP 3-way +handshake timing out or a socket error). Channels in this state will eventually +switch to the CONNECTING state and try to establish a connection again. Since +retries are done with exponential backoff, channels that fail to connect will +start out spending very little time in this state but as the attempts fail +repeatedly, the channel will spend increasingly large amounts of time in this +state. For many non-fatal failures (e.g., TCP connection attempts timing out +because the server is not yet available), the channel may spend increasingly +large amounts of time in this state. + +IDLE: This is the state where the channel is not even trying to create a +connection because of a lack of new or pending RPCs. New RPCs MAY be created +in this state. Any attempt to start an RPC on the channel will push the channel +out of this state to connecting. When there has been no RPC activity on a channel +for a specified IDLE_TIMEOUT, i.e., no new or pending (active) RPCs for this +period, channels that are READY or CONNECTING switch to IDLE. Additionally, +channels that receive a GOAWAY when there are no active or pending RPCs should +also switch to IDLE to avoid connection overload at servers that are attempting +to shed connections. We will use a default IDLE_TIMEOUT of 300 seconds (5 minutes). + +SHUTDOWN: This channel has started shutting down. Any new RPCs should fail +immediately. Pending RPCs may continue running till the application cancels them. +Channels may enter this state either because the application explicitly requested +a shutdown or if a non-recoverable error has happened during attempts to connect +communicate . (As of 6/12/2015, there are no known errors (while connecting or +communicating) that are classified as non-recoverable.) Channels that enter this +state never leave this state. + +The following table lists the legal transitions from one state to another and +corresponding reasons. Empty cells denote disallowed transitions. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
From/ToCONNECTINGREADYTRANSIENT_FAILUREIDLESHUTDOWN
CONNECTINGIncremental progress during connection establishmentAll steps needed to establish a connection succeededAny failure in any of the steps needed to establish connectionNo RPC activity on channel for IDLE_TIMEOUTShutdown triggered by application.
READYIncremental successful communication on established channel.Any failure encountered while expecting successful communication on + established channel.No RPC activity on channel for IDLE_TIMEOUT
OR
upon receiving a GOAWAY while there are no pending RPCs.
Shutdown triggered by application.
TRANSIENT_FAILUREWait time required to implement (exponential) backoff is over.Shutdown triggered by application.
IDLEAny new RPC activity on the channelShutdown triggered by application.
SHUTDOWN
+ + +Channel State API +----------------- + +All gRPC libraries will expose a channel-level API method to poll the current +state of a channel. In C++, this method is called GetState and returns an enum +for one of the five legal states. It also accepts a boolean `try_to_connect` to +transition to CONNECTING if the channel is currently IDLE. The boolean should +act as if an RPC occurred, so it should also reset IDLE_TIMEOUT. + +```cpp +grpc_connectivity_state GetState(bool try_to_connect); +``` + +All libraries should also expose an API that enables the application (user of +the gRPC API) to be notified when the channel state changes. Since state +changes can be rapid and race with any such notification, the notification +should just inform the user that some state change has happened, leaving it to +the user to poll the channel for the current state. + +The synchronous version of this API is: + +```cpp +bool WaitForStateChange(grpc_connectivity_state source_state, gpr_timespec deadline); +``` + +which returns `true` when the state is something other than the +`source_state` and `false` if the deadline expires. Asynchronous- and futures-based +APIs should have a corresponding method that allows the application to be +notified when the state of a channel changes. + +Note that a notification is delivered every time there is a transition from any +state to any *other* state. On the other hand the rules for legal state +transition, require a transition from CONNECTING to TRANSIENT_FAILURE and back +to CONNECTING for every recoverable failure, even if the corresponding +exponential backoff requires no wait before retry. The combined effect is that +the application may receive state change notifications that appear spurious. +e.g., an application waiting for state changes on a channel that is CONNECTING +may receive a state change notification but find the channel in the same +CONNECTING state on polling for current state because the channel may have +spent infinitesimally small amount of time in the TRANSIENT_FAILURE state. diff --git a/doc/core/combiner-explainer.md b/doc/core/combiner-explainer.md new file mode 100644 index 00000000..9e9d0772 --- /dev/null +++ b/doc/core/combiner-explainer.md @@ -0,0 +1,158 @@ +# Combiner Explanation +## Talk by ctiller, notes by vjpai + +Typical way of doing critical section + +``` +mu.lock() +do_stuff() +mu.unlock() +``` + +An alternative way of doing it is + +``` +class combiner { + run(f) { + mu.lock() + f() + mu.unlock() + } + mutex mu; +} + +combiner.run(do_stuff) +``` + +If you have two threads calling combiner, there will be some kind of +queuing in place. It's called `combiner` because you can pass in more +than one do_stuff at once and they will run under a common `mu`. + +The implementation described above has the issue that you're blocking a thread +for a period of time, and this is considered harmful because it's an application thread that you're blocking. + +Instead, get a new property: +* Keep things running in serial execution +* Don't ever sleep the thread +* But maybe allow things to end up running on a different thread from where they were started +* This means that `do_stuff` doesn't necessarily run to completion when `combiner.run` is invoked + +``` +class combiner { + mpscq q; // multi-producer single-consumer queue can be made non-blocking + state s; // is it empty or executing + + run(f) { + if (q.push(f)) { + // q.push returns true if it's the first thing + while (q.pop(&f)) { // modulo some extra work to avoid races + f(); + } + } + } +} +``` + +The basic idea is that the first one to push onto the combiner +executes the work and then keeps executing functions from the queue +until the combiner is drained. + +Our combiner does some additional work, with the motivation of write-batching. + +We have a second tier of `run` called `run_finally`. Anything queued +onto `run_finally` runs after we have drained the queue. That means +that there is essentially a finally-queue. This is not guaranteed to +be final, but it's best-effort. In the process of running the finally +item, we might put something onto the main combiner queue and so we'll +need to re-enter. + +`chttp2` runs all ops in the run state except if it sees a write it puts that into a finally. That way anything else that gets put into the combiner can add to that write. + +``` +class combiner { + mpscq q; // multi-producer single-consumer queue can be made non-blocking + state s; // is it empty or executing + queue finally; // you can only do run_finally when you are already running something from the combiner + + run(f) { + if (q.push(f)) { + // q.push returns true if it's the first thing + loop: + while (q.pop(&f)) { // modulo some extra work to avoid races + f(); + } + while (finally.pop(&f)) { + f(); + } + goto loop; + } + } +} +``` + +So that explains how combiners work in general. In gRPC, there is +`start_batch(..., tag)` and then work only gets activated by somebody +calling `cq::next` which returns a tag. This gives an API-level +guarantee that there will be a thread doing polling to actually make +work happen. However, some operations are not covered by a poller +thread, such as cancellation that doesn't have a completion. Other +callbacks that don't have a completion are the internal work that gets +done before the batch gets completed. We need a condition called +`covered_by_poller` that means that the item will definitely need some +thread at some point to call `cq::next` . This includes those +callbacks that directly cause a completion but also those that are +indirectly required before getting a completion. If we can't tell for +sure for a specific path, we have to assumed it is not covered by +poller. + +The above combiner has the problem that it keeps draining for a +potentially infinite amount of time and that can lead to a huge tail +latency for some operations. So we can tweak it by returning to the application +if we know that it is valid to do so: + +``` +while (q.pop(&f)) { + f(); + if (control_can_be_returned && some_still_queued_thing_is_covered_by_poller) { + offload_combiner_work_to_some_other_thread(); + } +} +``` + +`offload` is more than `break`; it does `break` but also causes some +other thread that is currently waiting on a poll to break out of its +poll. This is done by setting up a per-polling-island work-queue +(distributor) wakeup FD. The work-queue is the converse of the combiner; it +tries to spray events onto as many threads as possible to get as much concurrency as possible. + +So `offload` really does: + +``` + workqueue.run(continue_from_while_loop); + break; +``` + +This needs us to add another class variable for a `workqueue` +(which is really conceptually a distributor). + +``` +workqueue::run(f) { + q.push(f) + eventfd.wakeup() +} + +workqueue::readable() { + eventfd.consume(); + q.pop(&f); + f(); + if (!q.empty()) { + eventfd.wakeup(); // spray across as many threads as are waiting on this workqueue + } +} +``` + +In principle, `run_finally` could get starved, but this hasn't +happened in practice. If we were concerned about this, we could put a +limit on how many things come off the regular `q` before the `finally` +queue gets processed. + diff --git a/doc/core/epoll-polling-engine.md b/doc/core/epoll-polling-engine.md new file mode 100644 index 00000000..e660a709 --- /dev/null +++ b/doc/core/epoll-polling-engine.md @@ -0,0 +1,121 @@ +# `epoll`-based pollset implementation in gRPC + +Sree Kuchibhotla (sreek@) [May - 2016] +(Design input from Craig Tiller and David Klempner) + +> Status: As of June 2016, this change is implemented and merged. + +> * The bulk of the functionality is in: [ev_epollsig_linux.c](https://github.com/grpc/grpc/blob/master/src/core/lib/iomgr/ev_epollsig_linux.c) +> * Pull request: https://github.com/grpc/grpc/pull/6803 + +## 1. Introduction +The document talks about the proposed changes to `epoll`-based implementation of pollsets in gRPC. Section-2 gives an overview of the current implementation, Section-3 talks about the problems in the current implementation and finally Section-4 talks about the proposed changes. + +## 2. Current `epoll`-based implementation in gRPC + +![image](images/old_epoll_impl.png) + +**Figure 1: Current implementation** + +A gRPC client or a server can have more than one completion queue. Each completion queue creates a pollset. + +The gRPC core library does not create any threads[^1] on its own and relies on the application using the gRPC core library to provide the threads. A thread starts to poll for events by calling the gRPC core surface APIs `grpc_completion_queue_next()` or `grpc_completion_queue_pluck()`. More than one thread can call `grpc_completion_queue_next()`on the same completion queue[^2]. + +A file descriptor can be in more than one completion queue. There are examples in the next section that show how this can happen. + +When an event of interest happens in a pollset, multiple threads are woken up and there are no guarantees on which thread actually ends up performing the work i.e executing the callbacks associated with that event. The thread that performs the work finally queues a completion event `grpc_cq_completion` on the appropriate completion queue and "kicks" (i.e wakes ups) the thread that is actually interested in that event (which can be itself - in which case there is no thread hop) + +For example, in **Figure 1**, if `fd1` becomes readable, any one of the threads i.e *Threads 1* to *Threads K* or *Thread P*, might be woken up. Let's say *Thread P* was calling a `grpc_completion_queue_pluck()` and was actually interested in the event on `fd1` but *Thread 1* woke up. In this case, *Thread 1* executes the callbacks and finally kicks *Thread P* by signalling `event_fd_P`. *Thread P* wakes up, realizes that there is a new completion event for it and returns from `grpc_completion_queue_pluck()` to its caller. + +## 3. Issues in the current architecture + +### _Thundering Herds_ + +If multiple threads concurrently call `epoll_wait()`, we are guaranteed that only one thread is woken up if one of the `fds` in the set becomes readable/writable. However, in our current implementation, the threads do not directly call a blocking `epoll_wait()`[^3]. Instead, they call `poll()` on the set containing `[event_fd`[^4]`, epoll_fd]`. **(see Figure 1)** + +Considering the fact that an `fd` can be in multiple `pollsets` and that each `pollset` might have multiple poller threads, it means that whenever an `fd` becomes readable/writable, all the threads in all the `pollsets` (in which that `fd` is present) are woken up. + +The performance impact of this would be more conspicuous on the server side. Here are a two examples of thundering herds on the server side. + +Example 1: Listening fds on server + +* A gRPC server can have multiple server completion queues (i.e completion queues which are used to listen for incoming channels). +* A gRPC server can also listen on more than one TCP-port. +* A listening socket is created for each port the gRPC server would be listening on. +* Every listening socket's fd is added to all the server completion queues' pollsets. (Currently we do not do any sharding of the listening fds across these pollsets). + +This means that for every incoming new channel, all the threads waiting on all the pollsets are woken up. + +Example 2: New Incoming-channel fds on server + +* Currently, every new incoming channel's `fd` (i.e the socket `fd` that is returned by doing an `accept()` on the new incoming channel) is added to all the server completion queues' pollsets [^5]). +* Clearly, this would also cause all thundering herd problem for every read onthat fd + +There are other scenarios especially on the client side where an fd can end up being on multiple pollsets which would cause thundering herds on the clients. + + +## 4. Proposed changes to the current `epoll`-based polling implementation: + +The main idea in this proposal is to group 'related' `fds` into a single epoll-based set. This would ensure that only one thread wakes up in case of an event on one of the `fds` in the epoll set. + +To accomplish this, we introduce a new abstraction called `polling_island` which will have an epoll set underneath (See **Figure 2** below). A `polling_island` contains the following: + +* `epoll_fd`: The file descriptor of the underlying epoll set +* `fd_set`: The set of 'fds' in the pollset island i.e in the epoll set (The pollset island merging operation described later requires the list of fds in the pollset island and currently there is no API available to enumerate all the fds in an epoll set) +* `event_fd`: A level triggered _event fd_ that is used to wake up all the threads waiting on this epoll set (Note: This `event_fd` is added to the underlying epoll set during pollset island creation. This is useful in the pollset island merging operation described later) +* `merged_to`: The polling island into which this one merged. See section 4.2 (case 2) for more details on this. Also note that if `merged_to` is set, all the other fields in this polling island are not used anymore + +In this new model, only one thread wakes up whenever an event of interest happens in an epoll set. + +![drawing](images/new_epoll_impl.png) + +**Figure 2: Proposed changes** + +### 4.1 Relation between `fd`, `pollset` and `polling_island:` + +* An `fd` may belong to multiple `pollsets` but belongs to exactly one `polling_island` +* A `pollset` belongs to exactly one `polling_island` +* An `fd` and the `pollset(s`) it belongs to, have same `polling_island` + +### 4.2 Algorithm to add an `fd` to a `pollset` + +There are two cases to check here: + +* **Case 1:** Both `fd` and `pollset` already belong to the same `polling_island` + * This is straightforward and nothing really needs to be done here +* **Case 2:** The `fd `and `pollset` point to different `polling_islands`: In this case we _merge_ both the polling islands i.e: + * Add all the `fds` from the smaller `polling_island `to the larger `polling_island` and update the `merged_to` pointer on the smaller island to point to the larger island. + * Wake up all the threads waiting on the smaller `polling_island`'s `epoll_fd` (by signaling the `event_fd` on that island) and make them now wait on the larger `polling_island`'s `epoll_fd` + * Update `fd` and `pollset` to now point to the larger `polling_island` + +### 4.3 Directed wakeups: + +The new implementation, just like the current implementation, does not provide us any guarantees that the thread that is woken up is the thread that is actually interested in the event. So the thread that woke up executes the callbacks and finally has to 'kick' the appropriate polling thread interested in the event. + +In the current implementation, every polling thread also had a `event_fd` on which it was listening to and hence waking it up was as simple as signaling that `event_fd`. However, using an `event_fd` also meant that every thread has to use a `poll()` (on `event_fd` and `epoll_fd`) instead of doing an `epoll_wait()` and this resulted in the thundering herd problems described above. + +The proposal here is to use signals and kicking a thread would just be sending a signal to that thread. Unfortunately there are only a few signals available on POSIX systems and most of them have pre-determined behavior leaving only a few signals `SIGUSR1`, `SIGUSR2` and `SIGRTx (SIGRTMIN to SIGRTMAX)` for custom use. + +The calling application might have registered other signal handlers for these signals. `We will provide a new API where the applications can "give a signal number" to gRPC library to use for this purpose. + +``` +void grpc_use_signal(int signal_num) +``` + +If the calling application does not provide a signal number, then the gRPC library will relegate to using a model similar to the current implementation (where every thread does a blocking `poll()` on its `wakeup_fd` and the `epoll_fd`). The function` psi_wait() `in figure 2 implements this logic. + +**>> **(**NOTE**: Or alternatively, we can implement a turnstile polling (i.e having only one thread calling `epoll_wait()` on the epoll set at any time - which all other threads call poll on their `wakeup_fds`) +in case of not getting a signal number from the applications. + + +## Notes + +[^1]: Only exception is in case of name-resolution + +[^2]: However, a `grpc_completion_queue_next()` and `grpc_completion_queue_pluck()` must not be called in parallel on the same completion queue + +[^3]: The threads first do a blocking` poll()` with `[wakeup_fd, epoll_fd]`. If the `poll()` returns due to an event of interest in the epoll set, they then call a non-blocking i.e a zero-timeout `epoll_wait()` on the `epoll_fd` + +[^4]: `event_fd` is the linux platform specific implementation of `grpc_wakeup_fd`. A `wakeup_fd` is used to wake up polling threads typically when the event for which the polling thread is waiting is already completed by some other thread. It is also used to wake up the polling threads in case of shutdowns or to re-evaluate the poller's interest in the fds to poll (the last scenario is only in case of `poll`-based (not `epoll`-based) implementation of `pollsets`). + +[^5]: See more details about the issue here https://github.com/grpc/grpc/issues/5470 and for a proposed fix here: https://github.com/grpc/grpc/pull/6149 diff --git a/doc/core/grpc-client-server-polling-engine-usage.md b/doc/core/grpc-client-server-polling-engine-usage.md new file mode 100644 index 00000000..f66dcf09 --- /dev/null +++ b/doc/core/grpc-client-server-polling-engine-usage.md @@ -0,0 +1,32 @@ +# Polling Engine Usage on gRPC client and Server + +_Author: Sree Kuchibhotla (@sreecha) - Sep 2018_ + + +This document talks about how polling engine is used in gRPC core (both on client and server code paths). + +## gRPC client + +### Relation between Call, Channel (sub-channels), Completion queue, `grpc_pollset` +- A gRPC Call is tied to a channel (more specifically a sub-channel) and a completion queue for the lifetime of the call. +- Once a _sub-channel_ is picked for the call, the file-descriptor (socket fd in case of TCP channels) is added to the pollset corresponding to call's completion queue. (Recall that as per [grpc-cq](grpc-cq.md), a completion queue has a pollset by default) + +![image](../images/grpc-call-channel-cq.png) + + +### Making progress on Async `connect()` on sub-channels (`grpc_pollset_set` usecase) +- A gRPC channel is created between a client and a 'target'. The 'target' may resolve in to one or more backend servers. +- A sub-channel is the 'connection' from a client to the backend server +- While establishing sub-channels (i.e connections) to the backends, gRPC issues async [`connect()`](https://github.com/grpc/grpc/blob/v1.15.1/src/core/lib/iomgr/tcp_client_posix.cc#L296) calls which may not complete right away. When the `connect()` eventually succeeds, the socket fd is make 'writable' + - This means that the polling engine must be monitoring all these sub-channel `fd`s for writable events and we need to make sure there is a polling thread that monitors all these fds + - To accomplish this, the `grpc_pollset_set` is used the following way (see picture below) + +![image](../images/grpc-client-lb-pss.png) + +## gRPC server + +- The listening fd (i.e., the socket fd corresponding to the server listening port) is added to each of the server completion queues. Note that in gRPC we use SO_REUSEPORT option and create multiple listening fds but all of them map to the same listening port +- A new incoming channel is assigned to some server completion queue picked randomly (note that we currently [round-robin](https://github.com/grpc/grpc/blob/v1.15.1/src/core/lib/iomgr/tcp_server_posix.cc#L231) over the server completion queues) + +![image](../images/grpc-server-cq-fds.png) + diff --git a/doc/core/grpc-cq.md b/doc/core/grpc-cq.md new file mode 100644 index 00000000..b485c354 --- /dev/null +++ b/doc/core/grpc-cq.md @@ -0,0 +1,64 @@ +# gRPC Completion Queue + +_Author: Sree Kuchibhotla (@sreecha) - Sep 2018_ + +Code: [completion_queue.cc](https://github.com/grpc/grpc/blob/v1.15.1/src/core/lib/surface/completion_queue.cc) + +This document gives an overview of completion queue architecture and focuses mainly on the interaction between completion queue and the Polling engine layer. + +## Completion queue attributes +Completion queue has two attributes + + - Completion_type: + - GRPC_CQ_NEXT: grpc_completion_queue_next() can be called (but not grpc_completion_queue_pluck()) + - GRPC_CQ_PLUCK: grpc_completion_queue_pluck() can be called (but not grpc_completion_queue_next()) + - GRPC_CQ_CALLBACK: The tags in the queue are function pointers to callbacks. Also, neither next() nor pluck() can be called on this + + - Polling_type: + - GRPC_CQ_NON_POLLING: Threads calling completion_queue_next/pluck do not do any polling + - GRPC_CQ_DEFAULT_POLLING: Threads calling completion_queue_next/pluck do polling + - GRPC_CQ_NON_LISTENING: Functionally similar to default polling except for a boolean attribute that states that the cq is non-listening. This is used by the grpc-server code to not associate any listening sockets with this completion-queue’s pollset + + +## Details + +![image](../images/grpc-cq.png) + + +### **grpc\_completion\_queue\_next()** & **grpc_completion_queue_pluck()** APIS + + +``` C++ +grpc_completion_queue_next(cq, deadline)/pluck(cq, deadline, tag) { + while(true) { + \\ 1. If an event is queued in the completion queue, dequeue and return + \\ (in case of pluck() dequeue only if the tag is the one we are interested in) + + \\ 2. If completion queue shutdown return + + \\ 3. In case of pluck, add (tag, worker) pair to the tag<->worker map on the cq + + \\ 4. Call grpc_pollset_work(cq’s-pollset, deadline) to do polling + \\ Note that if this function found some fds to be readable/writable/error, + \\ it would have scheduled those closures (which may queue completion events + \\ on SOME completion queue - not necessarily this one) + } +} +``` + +### Queuing a completion event (i.e., "tag") + +``` C++ +grpc_cq_end_op(cq, tag) { + \\ 1. Queue the tag in the event queue + + \\ 2. Find the pollset corresponding to the completion queue + \\ (i) If the cq is of type GRPC_CQ_NEXT, then KICK ANY worker + \\ i.e., call grpc_pollset_kick(pollset, nullptr) + \\ (ii) If the cq is of type GRPC_CQ_PLUCK, then search the tag<->worker + \\ map on the completion queue to find the worker. Then specifically + \\ kick that worker i.e call grpc_pollset_kick(pollset, worker) +} + +``` + diff --git a/doc/core/grpc-error.md b/doc/core/grpc-error.md new file mode 100644 index 00000000..105a6482 --- /dev/null +++ b/doc/core/grpc-error.md @@ -0,0 +1,160 @@ +# gRPC Error + +## Background + +`grpc_error` is the c-core's opaque representation of an error. It holds a +collection of integers, strings, timestamps, and child errors that related to +the final error. + +always present are: + +* GRPC_ERROR_STR_FILE and GRPC_ERROR_INT_FILE_LINE - the source location where + the error was generated +* GRPC_ERROR_STR_DESCRIPTION - a human readable description of the error +* GRPC_ERROR_TIME_CREATED - a timestamp indicating when the error happened + +An error can also have children; these are other errors that are believed to +have contributed to this one. By accumulating children, we can begin to root +cause high level failures from low level failures, without having to derive +execution paths from log lines. + +grpc_errors are refcounted objects, which means they need strict ownership +semantics. An extra ref on an error can cause a memory leak, and a missing ref +can cause a crash. + +This document serves as a detailed overview of grpc_error's ownership rules. It +should help people use the errors, as well as help people debug refcount related +errors. + +## Clarification of Ownership + +If a particular function is said to "own" an error, that means it has the +responsibility of calling unref on the error. A function may have access to an +error without ownership of it. + +This means the function may use the error, but must not call unref on it, since +that will be done elsewhere in the code. A function that does not own an error +may explicitly take ownership of it by manually calling GRPC_ERROR_REF. + +## Ownership Rules + +There are three rules of error ownership, which we will go over in detail. + +* If `grpc_error` is returned by a function, the caller owns a ref to that + instance. +* If a `grpc_error` is passed to a `grpc_closure` callback function, then that + function does not own a ref to the error. +* if a `grpc_error` is passed to *any other function*, then that function + takes ownership of the error. + +### Rule 1 + +> If `grpc_error` is returned by a function, the caller owns a ref to that +> instance.* + +For example, in the following code block, error1 and error2 are owned by the +current function. + +```C +grpc_error* error1 = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Some error occurred"); +grpc_error* error2 = some_operation_that_might_fail(...); +``` + +The current function would have to explicitly call GRPC_ERROR_UNREF on the +errors, or pass them along to a function that would take over the ownership. + +### Rule 2 + +> If a `grpc_error` is passed to a `grpc_closure` callback function, then that +> function does not own a ref to the error. + +A `grpc_closure` callback function is any function that has the signature: + +```C +void (*cb)(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error); +``` + +This means that the error ownership is NOT transferred when a functions calls: + +```C +c->cb(exec_ctx, c->cb_arg, err); +``` + +The caller is still responsible for unref-ing the error. + +However, the above line is currently being phased out! It is safer to invoke +callbacks with `GRPC_CLOSURE_RUN` and `GRPC_CLOSURE_SCHED`. These functions are +not callbacks, so they will take ownership of the error passed to them. + +```C +grpc_error* error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Some error occurred"); +GRPC_CLOSURE_RUN(exec_ctx, cb, error); +// current function no longer has ownership of the error +``` + +If you schedule or run a closure, but still need ownership of the error, then +you must explicitly take a reference. + +```C +grpc_error* error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Some error occurred"); +GRPC_CLOSURE_RUN(exec_ctx, cb, GRPC_ERROR_REF(error)); +// do some other things with the error +GRPC_ERROR_UNREF(error); +``` + +Rule 2 is more important to keep in mind when **implementing** `grpc_closure` +callback functions. You must keep in mind that you do not own the error, and +must not unref it. More importantly, you cannot pass it to any function that +would take ownership of the error, without explicitly taking ownership yourself. +For example: + +```C +void on_some_action(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) { + // this would cause a crash, because some_function will unref the error, + // and the caller of this callback will also unref it. + some_function(error); + + // this callback function must take ownership, so it can give that + // ownership to the function it is calling. + some_function(GRPC_ERROR_REF(error)); +} +``` + +### Rule 3 + +> if a `grpc_error` is passed to *any other function*, then that function takes +> ownership of the error. + +Take the following example: + +```C +grpc_error* error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Some error occurred"); +// do some things +some_function(error); +// can't use error anymore! might be gone. +``` + +When some_function is called, it takes over the ownership of the error, and it +will eventually unref it. So the caller can no longer safely use the error. + +If the caller needed to keep using the error (or passing it to other functions), +if would have to take on a reference to it. This is a common pattern seen. + +```C +void func() { + grpc_error* error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Some error"); + some_function(GRPC_ERROR_REF(error)); + // do things + some_other_function(GRPC_ERROR_REF(error)); + // do more things + some_last_function(error); +} +``` + +The last call takes ownership and will eventually give the error its final +unref. + +When **implementing** a function that takes an error (and is not a +`grpc_closure` callback function), you must ensure the error is unref-ed either +by doing it explicitly with GRPC_ERROR_UNREF, or by passing the error to a +function that takes over the ownership. diff --git a/doc/core/grpc-polling-engines.md b/doc/core/grpc-polling-engines.md new file mode 100644 index 00000000..e5b700c0 --- /dev/null +++ b/doc/core/grpc-polling-engines.md @@ -0,0 +1,152 @@ +# Polling Engines + +_Author: Sree Kuchibhotla (@sreecha) - Sep 2018_ + + +## Why do we need a 'polling engine' ? + +Polling engine component was created for the following reasons: + +- gRPC code deals with a bunch of file descriptors on which events like descriptor being readable/writable/error have to be monitored +- gRPC code knows the actions to perform when such events happen + - For example: + - `grpc_endpoint` code calls `recvmsg` call when the fd is readable and `sendmsg` call when the fd is writable + - ` tcp_client` connect code issues async `connect` and finishes creating the client once the fd is writable (i.e when the `connect` actually finished) +- gRPC needed some component that can "efficiently" do the above operations __using the threads provided by the applications (i.e., not create any new threads)__. Also by "efficiently" we mean optimized for latency and throughput + + +## Polling Engine Implementations in gRPC +There are multiple polling engine implementations depending on the OS and the OS version. Fortunately all of them expose the same interface + +- Linux: + + - **`epollex`** (default but requires kernel version >= 4.5), + - `epoll1` (If `epollex` is not available and glibc version >= 2.9) + - `poll` (If kernel does not have epoll support) +- Mac: **`poll`** (default) +- Windows: (no name) +- One-off polling engines: + - NodeJS : `libuv` polling engine implementation (requires different compile `#define`s) + +## Polling Engine Interface + +### Opaque Structures exposed by the polling engine +The following are the **Opaque** structures exposed by Polling Engine interface (NOTE: Different polling engine implementations have different definitions of these structures) + +- **grpc_fd:** Structure representing a file descriptor +- **grpc_pollset:** A set of one or more grpc_fds that are ‘polled’ for readable/writable/error events. One grpc_fd can be in multiple `grpc_pollset`s +- **grpc_pollset_worker:** Structure representing a ‘polling thread’ - more specifically, the thread that calls `grpc_pollset_work()` API +- **grpc_pollset_set:** A group of `grpc_fd`s, `grpc_pollset`s and `grpc_pollset_set`s (yes, a `grpc_pollset_set` can contain other `grpc_pollset_set`s) + +### Polling engine API + +#### grpc_fd +- **grpc\_fd\_notify\_on\_[read|write|error]** + - Signature: `grpc_fd_notify_on_(grpc_fd* fd, grpc_closure* closure)` + - Register a [closure](https://github.com/grpc/grpc/blob/v1.15.1/src/core/lib/iomgr/closure.h#L67) to be called when the fd becomes readable/writable or has an error (In grpc parlance, we refer to this act as “arming the fd”) + - The closure is called exactly once per event. I.e once the fd becomes readable (or writable or error), the closure is fired and the fd is ‘unarmed’. To be notified again, the fd has to be armed again. + +- **grpc_fd_shutdown** + - Signature: `grpc_fd_shutdown(grpc_fd* fd)` + - Any current (or future) closures registered for readable/writable/error events are scheduled immediately with an error + +- **grpc_fd_orphan** + - Signature: `grpc_fd_orphan(grpc_fd* fd, grpc_closure* on_done, int* release_fd, char* reason)` + - Release the `grpc_fd` structure and call `on_done` closure when the operation is complete + - If `release_fd` is set to `nullptr`, then `close()` the underlying fd as well. If not, put the underlying fd in `release_fd` (and do not call `close()`) + - `release_fd` set to non-null in cases where the underlying fd is NOT owned by grpc core (like for example the fds used by C-Ares DNS resolver ) + +#### grpc_pollset + +- **grpc_pollset_add_fd** + - Signature: `grpc_pollset_add_fd(grpc_pollset* ps, grpc_fd *fd)` + - Add fd to pollset + > **NOTE**: There is no `grpc_pollset_remove_fd`. This is because calling `grpc_fd_orphan()` will effectively remove the fd from all the pollsets it’s a part of + +- **grpc_pollset_work** + - Signature: `grpc_pollset_work(grpc_pollset* ps, grpc_pollset_worker** worker, grpc_millis deadline)` + > **NOTE**: `grpc_pollset_work()` requires the pollset mutex to be locked before calling it. Shortly after calling `grpc_pollset_work()`, the function populates the `*worker` pointer (among other things) and releases the mutex. Once `grpc_pollset_work()` returns, the `*worker` pointer is **invalid** and should not be used anymore. See the code in `completion_queue.cc` to see how this is used. + - Poll the fds in the pollset for events AND return when ANY of the following is true: + - Deadline expired + - Some fds in the pollset were found to be readable/writable/error and those associated closures were ‘scheduled’ (but not necessarily executed) + - worker is “kicked” (see `grpc_pollset_kick` for more details) + +- **grpc_pollset_kick** + - Signature: `grpc_pollset_kick(grpc_pollset* ps, grpc_pollset_worker* worker)` + - “Kick the worker” i.e Force the worker to return from grpc_pollset_work() + - If `worker == nullptr`, kick ANY worker active on that pollset + +#### grpc_pollset_set + +- **grpc\_pollset\_set\_[add|del]\_fd** + - Signature: `grpc_pollset_set_[add|del]_fd(grpc_pollset_set* pss, grpc_fd *fd)` + - Add/Remove fd to the `grpc_pollset_set` + +- **grpc\_pollset\_set_[add|del]\_pollset** + - Signature: `grpc_pollset_set_[add|del]_pollset(grpc_pollset_set* pss, grpc_pollset* ps)` + - What does adding a pollset to a pollset_set mean ? + - It means that calling `grpc_pollset_work()` on the pollset will also poll all the fds in the pollset_set i.e semantically, it is similar to adding all the fds inside pollset_set to the pollset. + - This guarantee is no longer true once the pollset is removed from the pollset_set + +- **grpc\_pollset\_set_[add|del]\_pollset\_set** + - Signature: `grpc_pollset_set_[add|del]_pollset_set(grpc_pollset_set* bag, grpc_pollset_set* item)` + - Semantically, this is similar to adding all the fds in the ‘bag’ pollset_set to the ‘item’ pollset_set + + +#### Recap: + +__Relation between grpc_pollset_worker, grpc_pollset and grpc_fd:__ + +![image](../images/grpc-ps-pss-fd.png) + +__grpc_pollset_set__ + +![image](../images/grpc-pss.png) + + +## Polling Engine Implementations + +### epoll1 + +![image](../images/grpc-epoll1.png) + +Code at `src/core/lib/iomgr/ev_epoll1_posix.cc` + +- The logic to choose a designated poller is quite complicated. Pollsets are internally sharded into what are called `pollset_neighborhood` (a structure internal to `epoll1` polling engine implementation). `grpc_pollset_workers` that call `grpc_pollset_work` on a given pollset are all queued in a linked-list against the `grpc_pollset`. The head of the linked list is called "root worker" + +- There are as many neighborhoods as the number of cores. A pollset is put in a neighborhood based on the CPU core of the root worker thread. When picking the next designated poller, we always try to find another worker on the current pollset. If there are no more workers in the current pollset, a `pollset_neighborhood` listed is scanned to pick the next pollset and worker that could be the new designated poller. + - NOTE: There is room to tune this implementation. All we really need is good way to maintain a list of `grpc_pollset_workers` with a way to group them per-pollset (needed to implement `grpc_pollset_kick` semantics) and a way randomly select a new designated poller + +- See [`begin_worker()`](https://github.com/grpc/grpc/blob/v1.15.1/src/core/lib/iomgr/ev_epoll1_linux.cc#L729) function to see how a designated poller is chosen. Similarly [`end_worker()`](https://github.com/grpc/grpc/blob/v1.15.1/src/core/lib/iomgr/ev_epoll1_linux.cc#L916) function is called by the worker that was just out of `epoll_wait()` and will have to choose a new designated poller) + + +### epollex + +![image](../images/grpc-epollex.png) + +Code at `src/core/lib/iomgr/ev_epollex_posix.cc` + +- FDs are added to multiple epollsets with EPOLLEXCLUSIVE flag. This prevents multiple worker threads from waking up from polling whenever the fd is readable/writable + +- A few observations: + + - If multiple pollsets are pointing to the same `Pollable`, then the `pollable` MUST be either empty or of type `PO_FD` (i.e single-fd) + - A multi-pollable has one-and-only-one incoming link from a pollset + - The same FD can be in multiple `Pollable`s (even if one of the `Pollable`s is of type PO_FD) + - There cannot be two `Pollable`s of type PO_FD for the same fd + +- Why do we need `Pollable` of type PO_FD and PO_EMPTY ? + - The main reason is the Sync client API + - We create one new completion queue per call. If we didn’t have PO_EMPTY and PO_FD type pollables, then every call on a given channel will effectively have to create a `Pollable` and hence an epollset. This is because every completion queue automatically creates a pollset and the channel fd will have to be put in that pollset. This clearly requires an epollset to put that fd. Creating an epollset per call (even if we delete the epollset once the call is completed) would mean a lot of sys calls to create/delete epoll fds. This is clearly not a good idea. + - With these new types of `Pollable`s, all pollsets (corresponding to the new per-call completion queue) will initially point to PO_EMPTY global epollset. Then once the channel fd is added to the pollset, the pollset will point to the `Pollable` of type PO_FD containing just that fd (i.e it will reuse the existing `Pollable`). This way, the epoll fd creation/deletion churn is avoided. + + +### Other polling engine implementations (poll and windows polling engine) +- **poll** polling engine: gRPC's `poll` polling engine is quite complicated. It uses the `poll()` function to do the polling (and hence it is for platforms like osx where epoll is not available) + - The implementation is further complicated by the fact that poll() is level triggered (just keep this in mind in case you wonder why the code at `src/core/lib/iomgr/ev_poll_posix.cc` is written a certain/seemingly complicated way :)) + +- **Polling engine on Windows**: Windows polling engine looks nothing like other polling engines + - Unlike the grpc polling engines for Unix systems (epollex, epoll1 and poll) Windows endpoint implementation and polling engine implementations are very closely tied together + - Windows endpoint read/write API implementations use the Windows IO API which require specifying an [I/O completion port](https://docs.microsoft.com/en-us/windows/desktop/fileio/i-o-completion-ports) + - In Windows polling engine’s grpc_pollset_work() implementation, ONE of the threads is chosen to wait on the I/O completion port while other threads wait on a condition variable (much like the turnstile polling in epollex/epoll1) + diff --git a/doc/core/images/new_epoll_impl.png b/doc/core/images/new_epoll_impl.png new file mode 100644 index 0000000000000000000000000000000000000000..9ca1f49cbdb290eca0493a491fef57f608c1962a GIT binary patch literal 53699 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 literal 0 HcmV?d00001 diff --git a/doc/core/images/old_epoll_impl.png b/doc/core/images/old_epoll_impl.png new file mode 100644 index 0000000000000000000000000000000000000000..7ac3df83674c1f22631c12cf9d9bf78a2585610f GIT binary patch literal 45342 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. Use `grpc_core::Thread`. + - ``. Use `grpc_core::CondVar`. + - ``. Use `grpc_core::Mutex`, `grpc_core::MutexLock`, and `grpc_core::ReleasableMutexLock`. + - `` + - `` + - `` + - `` +- `grpc_core::Atomic` is prefered over `std::atomic` in gRPC library because it provides + additional debugging information. + +## Roadmap + +- What should be the phases of getting code converted to idiomatic C++ + - Opportunistically do leaf code that other parts don't depend on + - Spend a little time deciding how to do non-leaf stuff that isn't central or polymorphic (e.g., timer, call combiner) + - For big central or polymorphic interfaces, actually do an API review (for things like transport, filter API, endpoint, closure, exec_ctx, ...) . + - Core internal changes don't need a gRFC, but core surface changes do + - But an API review should include at least a PR with the header change and tests to use it before it gets used more broadly + - iomgr polling for POSIX is a gray area whether it's a leaf or central +- What is the schedule? + - In Q4 2017, if some stuff happens opportunistically, great; otherwise ¯\\\_(ツ)\_/¯ + - More updates as team time becomes available and committed to this project + +## Implications for C++ API and wrapped languages + +- For C++ structs, switch to `using` when possible (e.g., Slice, +ByteBuffer, ...) +- The C++ API implementation might directly start using +`grpc_transport_stream_op_batch` rather than the core surface `grpc_op`. diff --git a/doc/core/pending_api_cleanups.md b/doc/core/pending_api_cleanups.md new file mode 100644 index 00000000..970bcd08 --- /dev/null +++ b/doc/core/pending_api_cleanups.md @@ -0,0 +1,18 @@ +There are times when we make changes that include a temporary shim for +backward-compatibility (e.g., a macro or some other function to preserve +the original API) to avoid having to bump the major version number in +the next release. However, when we do eventually want to release a +feature that does change the API in a non-backward-compatible way, we +will wind up bumping the major version number anyway, at which point we +can take the opportunity to clean up any pending backward-compatibility +shims. + +This file lists all pending backward-compatibility changes that should +be cleaned up the next time we are going to bump the major version +number: + +- remove `GRPC_ARG_MAX_MESSAGE_LENGTH` channel arg from + `include/grpc/impl/codegen/grpc_types.h` (commit `af00d8b`) + (cannot be done until after next grpc release, so that TensorFlow can + use the same code both internally and externally) +- require a C++ runtime for all languages wrapping core. diff --git a/doc/core/transport_explainer.md b/doc/core/transport_explainer.md new file mode 100644 index 00000000..665fcdcb --- /dev/null +++ b/doc/core/transport_explainer.md @@ -0,0 +1,197 @@ +# Transport Explainer + +@vjpai + +## Existing Transports + +[gRPC +transports](https://github.com/grpc/grpc/tree/master/src/core/ext/transport) +plug in below the core API (one level below the C++ or other wrapped-language +API). You can write your transport in C or C++ though; currently (Nov 2017) all +the transports are nominally written in C++ though they are idiomatically C. The +existing transports are: + +* [HTTP/2](https://github.com/grpc/grpc/tree/master/src/core/ext/transport/chttp2) +* [Cronet](https://github.com/grpc/grpc/tree/master/src/core/ext/transport/cronet) +* [In-process](https://github.com/grpc/grpc/tree/master/src/core/ext/transport/inproc) + +Among these, the in-process is likely the easiest to understand, though arguably +also the least similar to a "real" sockets-based transport since it is only used +in a single process. + +## Transport stream ops + +In the gRPC core implementation, a fundamental struct is the +`grpc_transport_stream_op_batch` which represents a collection of stream +operations sent to a transport. (Note that in gRPC, _stream_ and _RPC_ are used +synonymously since all RPCs are actually streams internally.) The ops in a batch +can include: + +* send\_initial\_metadata + - Client: initiate an RPC + - Server: supply response headers +* recv\_initial\_metadata + - Client: get response headers + - Server: accept an RPC +* send\_message (zero or more) : send a data buffer +* recv\_message (zero or more) : receive a data buffer +* send\_trailing\_metadata + - Client: half-close indicating that no more messages will be coming + - Server: full-close providing final status for the RPC +* recv\_trailing\_metadata: get final status for the RPC + - Server extra: This op shouldn't actually be considered complete until the + server has also sent trailing metadata to provide the other side with final + status +* cancel\_stream: Attempt to cancel an RPC +* collect\_stats: Get stats + +The fundamental responsibility of the transport is to transform between this +internal format and an actual wire format, so the processing of these operations +is largely transport-specific. + +One or more of these ops are grouped into a batch. Applications can start all of +a call's ops in a single batch, or they can split them up into multiple +batches. Results of each batch are returned asynchronously via a completion +queue. + +Internally, we use callbacks to indicate completion. The surface layer creates a +callback when starting a new batch and sends it down the filter stack along with +the batch. The transport must invoke this callback when the batch is complete, +and then the surface layer returns an event to the application via the +completion queue. Each batch can have up to 3 callbacks: + +* recv\_initial\_metadata\_ready (called by the transport when the + recv\_initial\_metadata op is complete) +* recv\_message\_ready (called by the transport when the recv_message op is + complete) +* on\_complete (called by the transport when the entire batch is complete) + +## Timelines of transport stream op batches + +The transport's job is to sequence and interpret various possible interleavings +of the basic stream ops. For example, a sample timeline of batches would be: + +1. Client send\_initial\_metadata: Initiate an RPC with a path (method) and authority +1. Server recv\_initial\_metadata: accept an RPC +1. Client send\_message: Supply the input proto for the RPC +1. Server recv\_message: Get the input proto from the RPC +1. Client send\_trailing\_metadata: This is a half-close indicating that the + client will not be sending any more messages +1. Server recv\_trailing\_metadata: The server sees this from the client and + knows that it will not get any more messages. This won't complete yet though, + as described above. +1. Server send\_initial\_metadata, send\_message, send\_trailing\_metadata: A + batch can contain multiple ops, and this batch provides the RPC response + headers, response content, and status. Note that sending the trailing + metadata will also complete the server's receive of trailing metadata. +1. Client recv\_initial\_metadata: The number of ops in one side of the batch + has no relation with the number of ops on the other side of the batch. In + this case, the client is just collecting the response headers. +1. Client recv\_message, recv\_trailing\_metadata: Get the data response and + status + + +There are other possible sample timelines. For example, for client-side streaming, a "typical" sequence would be: + +1. Server: recv\_initial\_metadata + - At API-level, that would be the server requesting an RPC +1. Server: recv\_trailing\_metadata + - This is for when the server wants to know the final completion of the RPC + through an `AsyncNotifyWhenDone` API in C++ +1. Client: send\_initial\_metadata, recv\_message, recv\_trailing\_metadata + - At API-level, that's a client invoking a client-side streaming call. The + send\_initial\_metadata is the call invocation, the recv\_message collects + the final response from the server, and the recv\_trailing\_metadata gets + the `grpc::Status` value that will be returned from the call +1. Client: send\_message / Server: recv\_message + - Repeat the above step numerous times; these correspond to a client issuing + `Write` in a loop and a server doing `Read` in a loop until `Read` fails +1. Client: send\_trailing\_metadata / Server: recv\_message that indicates doneness (NULL) + - These correspond to a client issuing `WritesDone` which causes the server's + `Read` to fail +1. Server: send\_message, send\_trailing\_metadata + - These correspond to the server doing `Finish` + +The sends on one side will call their own callbacks when complete, and they will +in turn trigger actions that cause the other side's recv operations to +complete. In some transports, a send can sometimes complete before the recv on +the other side (e.g., in HTTP/2 if there is sufficient flow-control buffer space +available) + +## Other transport duties + +In addition to these basic stream ops, the transport must handle cancellations +of a stream at any time and pass their effects to the other side. For example, +in HTTP/2, this triggers a `RST_STREAM` being sent on the wire. The transport +must perform operations like pings and statistics that are used to shape +transport-level characteristics like flow control (see, for example, their use +in the HTTP/2 transport). + +## Putting things together with detail: Sending Metadata + +* API layer: `map` that is specific to this RPC +* Core surface layer: array of `{slice, slice}` pairs where each slice + references an underlying string +* [Core transport + layer](https://github.com/grpc/grpc/tree/master/src/core/lib/transport): list + of `{slice, slice}` pairs that includes the above plus possibly some general + metadata (e.g., Method and Authority for initial metadata) +* [Specific transport + layer](https://github.com/grpc/grpc/tree/master/src/core/ext/transport): + - Either send it to the other side using transport-specific API (e.g., Cronet) + - Or have it sent through the [iomgr/endpoint + layer](https://github.com/grpc/grpc/tree/master/src/core/lib/iomgr) (e.g., + HTTP/2) + - Or just manipulate pointers to get it from one side to the other (e.g., + In-process) + +## Requirements for any transport + +Each transport implements several operations in a vtbl (may change to actual +virtual functions as transport moves to idiomatic C++). + +The most important and common one is `perform_stream_op`. This function +processes a single stream op batch on a specific stream that is associated with +a specific transport: + +* Gets the 6 ops/cancel passed down from the surface +* Pass metadata from one side to the other as described above +* Transform messages between slice buffer structure and stream of bytes to pass + to other side + - May require insertion of extra bytes (e.g., per-message headers in HTTP/2) +* React to metadata to preserve expected orderings (*) +* Schedule invocation of completion callbacks + +There are other functions in the vtbl as well. + +* `perform_transport_op` + - Configure the transport instance for the connectivity state change notifier + or the server-side accept callback + - Disconnect transport or set up a goaway for later streams +* `init_stream` + - Starts a stream from the client-side + - (*) Server-side of the transport must call `accept_stream_cb` when a new + stream is available + * Triggers request-matcher +* `destroy_stream`, `destroy_transport` + - Free up data related to a stream or transport +* `set_pollset`, `set_pollset_set`, `get_endpoint` + - Map each specific instance of the transport to FDs being used by iomgr (for + HTTP/2) + - Get a pointer to the endpoint structure that actually moves the data + (wrapper around a socket for HTTP/2) + +## Book-keeping responsibilities of the transport layer + +A given transport must keep all of its transport and streams ref-counted. This +is essential to make sure that no struct disappears before it is done being +used. + +A transport must also preserve relevant orders for the different categories of +ops on a stream, as described above. A transport must also make sure that all +relevant batch operations have completed before scheduling the `on_complete` +closure for a batch. Further examples include the idea that the server logic +expects to not complete recv\_trailing\_metadata until after it actually sends +trailing metadata since it would have already found this out by seeing a NULL’ed +recv\_message. This is considered part of the transport's duties in preserving +orders. diff --git a/doc/cpp-style-guide.md b/doc/cpp-style-guide.md new file mode 100644 index 00000000..8211703d --- /dev/null +++ b/doc/cpp-style-guide.md @@ -0,0 +1,8 @@ +GRPC C++ STYLE GUIDE +===================== + +The majority of gRPC's C++ requirements are drawn from the [Google C++ style +guide] (https://google.github.io/styleguide/cppguide.html). Additionally, +as in C, layout rules are defined by clang-format, and all code +should be passed through clang-format. A (docker-based) script to do +so is included in [tools/distrib/clang_format_code.sh](../tools/distrib/clang_format_code.sh). diff --git a/doc/cpp/pending_api_cleanups.md b/doc/cpp/pending_api_cleanups.md new file mode 100644 index 00000000..5c231eda --- /dev/null +++ b/doc/cpp/pending_api_cleanups.md @@ -0,0 +1,22 @@ +There are times when we make changes that include a temporary shim for +backward-compatibility (e.g., a macro or some other function to preserve +the original API) to avoid having to bump the major version number in +the next release. However, when we do eventually want to release a +feature that does change the API in a non-backward-compatible way, we +will wind up bumping the major version number anyway, at which point we +can take the opportunity to clean up any pending backward-compatibility +shims. + +This file lists all pending backward-compatibility changes that should +be cleaned up the next time we are going to bump the major version +number: + +- remove `ServerBuilder::SetMaxMessageSize()` method from + `include/grpc++/server_builder.h` (commit `6980362`) +- remove `ClientContext::set_fail_fast()` method from + `include/grpc++/impl/codegen/client_context.h` (commit `9477724`) +- remove directory `include/grpc++` and all headers in it + (commit `eb06572`) +- make all `Request` and `Mark` methods in `grpc::Service` take a + `size_t` argument for `index` rather than `int` (since that is only + used as a vector index) diff --git a/doc/cpp/perf_notes.md b/doc/cpp/perf_notes.md new file mode 100644 index 00000000..c8755755 --- /dev/null +++ b/doc/cpp/perf_notes.md @@ -0,0 +1,29 @@ +# C++ Performance Notes + +## Streaming write buffering + +Generally, each write operation (Write(), WritesDone()) implies a syscall. +gRPC will try to batch together separate write operations from different +threads, but currently cannot automatically infer batching in a single stream. + +If message k+1 in a stream does not rely on responses from message k, it's +possible to enable write batching by passing a WriteOptions argument to Write +with the buffer_hint set: + +~~~{.cpp} +stream_writer->Write(message, WriteOptions().set_buffer_hint()); +~~~ + +The write will be buffered until one of the following is true: +- the per-stream buffer is filled (controllable with the channel argument + GRPC_ARG_HTTP2_WRITE_BUFFER_SIZE) - this prevents infinite buffering leading + to OOM +- a subsequent Write without buffer_hint set is posted +- the call is finished for writing (WritesDone() called on the client, + or Finish() called on an async server stream, or the service handler returns + for a sync server stream) + +## Completion Queues and Threading in the Async API + +Right now, the best performance trade-off is having numcpu's threads and one +completion queue per thread. diff --git a/doc/csharp/server_reflection.md b/doc/csharp/server_reflection.md new file mode 100644 index 00000000..7827cbb2 --- /dev/null +++ b/doc/csharp/server_reflection.md @@ -0,0 +1,54 @@ +# gRPC C# Server Reflection + +This document shows how to use gRPC Server Reflection in gRPC C#. +Please see [C++ Server Reflection Tutorial](../server_reflection_tutorial.md) +for general information and more examples how to use server reflection. + +## Enable server reflection in C# servers + +C# Server Reflection is an add-on library. +To use it, first install the [Grpc.Reflection](https://www.nuget.org/packages/Grpc.Reflection/) +Nuget package into your project. + +Note that with C# you need to manually register the service +descriptors with the reflection service implementation when creating a server +(this isn't necessary with e.g. C++ or Java) +```csharp +// the reflection service will be aware of "Greeter" and "ServerReflection" services. +var reflectionServiceImpl = new ReflectionServiceImpl(Greeter.Descriptor, ServerReflection.Descriptor); +server = new Server() +{ + Services = + { + // the server will serve 2 services, the Greeter and the ServerReflection + ServerReflection.BindService(new GreeterImpl()), + ServerReflection.BindService(reflectionServiceImpl) + }, + Ports = { { "localhost", 50051, ServerCredentials.Insecure } } +}; +server.Start(); +``` + +After starting the server, you can verify that the server reflection +is working properly by using the [`grpc_cli` command line +tool](https://github.com/grpc/grpc/blob/master/doc/command_line_tool.md): + + ```sh + $ grpc_cli ls localhost:50051 + ``` + + output: + ```sh + helloworld.Greeter + grpc.reflection.v1alpha.ServerReflection + ``` + + For more examples and instructions how to use the `grpc_cli` tool, + please refer to the [`grpc_cli` documentation](../command_line_tool.md) + and the [C++ Server Reflection Tutorial](../server_reflection_tutorial.md). + +## Additional Resources + +The [Server Reflection Protocol](../server-reflection.md) provides detailed +information about how the server reflection works and describes the server reflection +protocol in detail. diff --git a/doc/environment_variables.md b/doc/environment_variables.md new file mode 100644 index 00000000..ec1b4f86 --- /dev/null +++ b/doc/environment_variables.md @@ -0,0 +1,165 @@ +gRPC environment variables +-------------------------- + +gRPC C core based implementations (those contained in this repository) expose +some configuration as environment variables that can be set. + +* grpc_proxy, https_proxy, http_proxy + The URI of the proxy to use for HTTP CONNECT support. These variables are + checked in order, and the first one that has a value is used. + +* no_grpc_proxy, no_proxy + A comma separated list of hostnames to connect to without using a proxy even + if a proxy is set. These variables are checked in order, and the first one + that has a value is used. + +* GRPC_ABORT_ON_LEAKS + A debugging aid to cause a call to abort() when gRPC objects are leaked past + grpc_shutdown(). Set to 1 to cause the abort, if unset or 0 it does not + abort the process. + +* GOOGLE_APPLICATION_CREDENTIALS + The path to find the credentials to use when Google credentials are created + +* GRPC_SSL_CIPHER_SUITES + A colon separated list of cipher suites to use with OpenSSL + Defaults to: + ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384 + +* GRPC_DEFAULT_SSL_ROOTS_FILE_PATH + PEM file to load SSL roots from + +* GRPC_POLL_STRATEGY [posix-style environments only] + Declares which polling engines to try when starting gRPC. + This is a comma-separated list of engines, which are tried in priority order + first -> last. + Available polling engines include: + - epoll (linux-only) - a polling engine based around the epoll family of + system calls + - poll - a portable polling engine based around poll(), intended to be a + fallback engine when nothing better exists + - legacy - the (deprecated) original polling engine for gRPC + +* GRPC_TRACE + A comma separated list of tracers that provide additional insight into how + gRPC C core is processing requests via debug logs. Available tracers include: + - api - traces api calls to the C core + - bdp_estimator - traces behavior of bdp estimation logic + - call_error - traces the possible errors contributing to final call status + - cares_resolver - traces operations of the c-ares based DNS resolver + - cares_address_sorting - traces operations of the c-ares based DNS + resolver's resolved address sorter + - cds_lb - traces cds LB policy + - channel - traces operations on the C core channel stack + - client_channel_call - traces client channel call batch activity + - client_channel_routing - traces client channel call routing, including + resolver and load balancing policy interaction + - compression - traces compression operations + - connectivity_state - traces connectivity state changes to channels + - cronet - traces state in the cronet transport engine + - eds_lb - traces eds LB policy + - executor - traces grpc's internal thread pool ('the executor') + - glb - traces the grpclb load balancer + - handshaker - traces handshaking state + - health_check_client - traces health checking client code + - http - traces state in the http2 transport engine + - http2_stream_state - traces all http2 stream state mutations. + - http1 - traces HTTP/1.x operations performed by gRPC + - inproc - traces the in-process transport + - http_keepalive - traces gRPC keepalive pings + - flowctl - traces http2 flow control + - lrs_lb - traces lrs LB policy + - op_failure - traces error information when failure is pushed onto a + completion queue + - pick_first - traces the pick first load balancing policy + - plugin_credentials - traces plugin credentials + - pollable_refcount - traces reference counting of 'pollable' objects (only + in DEBUG) + - priority_lb - traces priority LB policy + - resource_quota - trace resource quota objects internals + - round_robin - traces the round_robin load balancing policy + - queue_pluck + - server_channel - lightweight trace of significant server channel events + - secure_endpoint - traces bytes flowing through encrypted channels + - subchannel - traces the connectivity state of subchannel + - subchannel_pool - traces subchannel pool + - timer - timers (alarms) in the grpc internals + - timer_check - more detailed trace of timer logic in grpc internals + - transport_security - traces metadata about secure channel establishment + - tcp - traces bytes in and out of a channel + - tsi - traces tsi transport security + - weighted_target_lb - traces weighted_target LB policy + - xds_client - traces xds client + - xds_resolver - traces xds resolver + + The following tracers will only run in binaries built in DEBUG mode. This is + accomplished by invoking `CONFIG=dbg make ` + - alarm_refcount - refcounting traces for grpc_alarm structure + - metadata - tracks creation and mutation of metadata + - combiner - traces combiner lock state + - call_combiner - traces call combiner state + - closure - tracks closure creation, scheduling, and completion + - fd_trace - traces fd create(), shutdown() and close() calls for channel fds. + Also traces epoll fd create()/close() calls in epollex polling engine + traces epoll-fd creation/close calls for epollex polling engine + - pending_tags - traces still-in-progress tags on completion queues + - polling - traces the selected polling engine + - polling_api - traces the api calls to polling engine + - subchannel_refcount + - queue_refcount + - error_refcount + - stream_refcount + - workqueue_refcount + - fd_refcount + - cq_refcount + - auth_context_refcount + - security_connector_refcount + - resolver_refcount + - lb_policy_refcount + - chttp2_refcount + + 'all' can additionally be used to turn all traces on. + Individual traces can be disabled by prefixing them with '-'. + + 'refcount' will turn on all of the tracers for refcount debugging. + + if 'list_tracers' is present, then all of the available tracers will be + printed when the program starts up. + + Example: + export GRPC_TRACE=all,-pending_tags + +* GRPC_VERBOSITY + Default gRPC logging verbosity - one of: + - DEBUG - log all gRPC messages + - INFO - log INFO and ERROR message + - ERROR - log only errors + +* GRPC_TRACE_FUZZER + if set, the fuzzers will output trace (it is usually suppressed). + +* GRPC_DNS_RESOLVER + Declares which DNS resolver to use. The default is ares if gRPC is built with + c-ares support. Otherwise, the value of this environment variable is ignored. + Available DNS resolver include: + - ares (default on most platforms except iOS, Android or Node)- a DNS + resolver based around the c-ares library + - native - a DNS resolver based around getaddrinfo(), creates a new thread to + perform name resolution + +* GRPC_CLIENT_CHANNEL_BACKUP_POLL_INTERVAL_MS + Default: 5000 + Declares the interval between two backup polls on client channels. These polls + are run in the timer thread so that gRPC can process connection failures while + there is no active polling thread. They help reconnect disconnected client + channels (mostly due to idleness), so that the next RPC on this channel won't + fail. Set to 0 to turn off the backup polls. + +* GRPC_EXPERIMENTAL_DISABLE_FLOW_CONTROL + if set, flow control will be effectively disabled. Max out all values and + assume the remote peer does the same. Thus we can ignore any flow control + bookkeeping, error checking, and decision making + +* grpc_cfstream + set to 1 to turn on CFStream experiment. With this experiment gRPC uses CFStream API to make TCP + connections. The option is only available on iOS platform and when macro GRPC_CFSTREAM is defined. diff --git a/doc/fail_fast.md b/doc/fail_fast.md new file mode 100644 index 00000000..ff3d2353 --- /dev/null +++ b/doc/fail_fast.md @@ -0,0 +1 @@ +Moved to [wait-for-ready.md](wait-for-ready.md) diff --git a/doc/fork_support.md b/doc/fork_support.md new file mode 100644 index 00000000..d0f59f25 --- /dev/null +++ b/doc/fork_support.md @@ -0,0 +1,46 @@ +# Background # + +In Python, multithreading is ineffective at concurrency for CPU bound tasks +due to the GIL (global interpreter lock). Extension modules can release +the GIL in CPU bound tasks, but that isn't an option in pure Python. +Users use libraries such as multiprocessing, subprocess, concurrent.futures.ProcessPoolExecutor, +etc, to work around the GIL. These modules call ```fork()``` underneath the hood. Various issues have +been reported when using these modules with gRPC Python. gRPC Python wraps +gRPC core, which uses multithreading for performance, and hence doesn't support ```fork()```. +Historically, we didn't support forking in gRPC, but some users seemed +to be doing fine until their code started to break on version 1.6. This was +likely caused by the addition of background c-threads and a background +Python thread. + +# Current Status # + +## 1.11 ## +The background Python thread was removed entirely. This allows forking +after creating a channel. However, the channel must not have issued any +RPCs prior to the fork. Attempting to fork with an active channel that +has been used can result in deadlocks/corrupted wire data. + +## 1.9 ## +A regression was noted in cases where users are doing fork/exec. This +was due to ```pthread_atfork()``` handler that was added in 1.7 to partially +support forking in gRPC. A deadlock can happen when pthread_atfork +handler is running, and an application thread is calling into gRPC. +We have provided a workaround for this issue by allowing users to turn +off the handler using env flag ```GRPC_ENABLE_FORK_SUPPORT=False```. +This should be set whenever a user expects to always call exec +immediately following fork. It will disable the fork handlers. + +## 1.7 ## +A ```pthread_atfork()``` handler was added in 1.7 to automatically shut down +the background c-threads when fork was called. This does not shut down the +background Python thread, so users could not have any open channels when +forking. + +# Future Work # + +## 1.13 ## +The workaround when using fork/exec by setting +```GRPC_ENABLE_FORK_SUPPORT=False``` should no longer be needed. Following +[this PR](https://github.com/grpc/grpc/pull/14647), fork +handlers will not automatically run when multiple threads are calling +into gRPC. diff --git a/doc/g_stands_for.md b/doc/g_stands_for.md new file mode 100644 index 00000000..35ea308b --- /dev/null +++ b/doc/g_stands_for.md @@ -0,0 +1,32 @@ +'g' stands for something different every gRPC release: + +- 1.0 'g' stands for ['gRPC'](https://github.com/grpc/grpc/tree/v1.0.x) +- 1.1 'g' stands for ['good'](https://github.com/grpc/grpc/tree/v1.1.x) +- 1.2 'g' stands for ['green'](https://github.com/grpc/grpc/tree/v1.2.x) +- 1.3 'g' stands for ['gentle'](https://github.com/grpc/grpc/tree/v1.3.x) +- 1.4 'g' stands for ['gregarious'](https://github.com/grpc/grpc/tree/v1.4.x) +- 1.6 'g' stands for ['garcia'](https://github.com/grpc/grpc/tree/v1.6.x) +- 1.7 'g' stands for ['gambit'](https://github.com/grpc/grpc/tree/v1.7.x) +- 1.8 'g' stands for ['generous'](https://github.com/grpc/grpc/tree/v1.8.x) +- 1.9 'g' stands for ['glossy'](https://github.com/grpc/grpc/tree/v1.9.x) +- 1.10 'g' stands for ['glamorous'](https://github.com/grpc/grpc/tree/v1.10.x) +- 1.11 'g' stands for ['gorgeous'](https://github.com/grpc/grpc/tree/v1.11.x) +- 1.12 'g' stands for ['glorious'](https://github.com/grpc/grpc/tree/v1.12.x) +- 1.13 'g' stands for ['gloriosa'](https://github.com/grpc/grpc/tree/v1.13.x) +- 1.14 'g' stands for ['gladiolus'](https://github.com/grpc/grpc/tree/v1.14.x) +- 1.15 'g' stands for ['glider'](https://github.com/grpc/grpc/tree/v1.15.x) +- 1.16 'g' stands for ['gao'](https://github.com/grpc/grpc/tree/v1.16.x) +- 1.17 'g' stands for ['gizmo'](https://github.com/grpc/grpc/tree/v1.17.x) +- 1.18 'g' stands for ['goose'](https://github.com/grpc/grpc/tree/v1.18.x) +- 1.19 'g' stands for ['gold'](https://github.com/grpc/grpc/tree/v1.19.x) +- 1.20 'g' stands for ['godric'](https://github.com/grpc/grpc/tree/v1.20.x) +- 1.21 'g' stands for ['gandalf'](https://github.com/grpc/grpc/tree/v1.21.x) +- 1.22 'g' stands for ['gale'](https://github.com/grpc/grpc/tree/v1.22.x) +- 1.23 'g' stands for ['gangnam'](https://github.com/grpc/grpc/tree/v1.23.x) +- 1.24 'g' stands for ['ganges'](https://github.com/grpc/grpc/tree/v1.24.x) +- 1.25 'g' stands for ['game'](https://github.com/grpc/grpc/tree/v1.25.x) +- 1.26 'g' stands for ['gon'](https://github.com/grpc/grpc/tree/v1.26.x) +- 1.27 'g' stands for ['guantao'](https://github.com/grpc/grpc/tree/v1.27.x) +- 1.28 'g' stands for ['galactic'](https://github.com/grpc/grpc/tree/v1.28.x) +- 1.29 'g' stands for ['gringotts'](https://github.com/grpc/grpc/tree/v1.29.x) +- 1.30 'g' stands for ['gradius'](https://github.com/grpc/grpc/tree/v1.30.x) diff --git a/doc/grpc_release_schedule.md b/doc/grpc_release_schedule.md new file mode 100644 index 00000000..78da4cc6 --- /dev/null +++ b/doc/grpc_release_schedule.md @@ -0,0 +1,32 @@ +# gRPC Release Schedule + +Below is the release schedule for gRPC [Java](https://github.com/grpc/grpc-java/releases), [Go](https://github.com/grpc/grpc-go/releases) and [Core](https://github.com/grpc/grpc/releases) and its dependent languages C++, C#, Objective-C, PHP, Python and Ruby. + +Releases are scheduled every six weeks on Tuesdays on a best effort basis. In some unavoidable situations a release may be delayed or a language may skip a release altogether and do the next release to catch up with other languages. See the past releases in the links above. A six-week cycle gives us a good balance between delivering new features/fixes quickly and keeping the release overhead low. + +Releases are cut from release branches. For Core and Java repos, the release branch is cut two weeks before the scheduled release date. For Go, the branch is cut just before the release. An RC (release candidate) is published for Core and its dependent languages just after the branch cut. This RC is later promoted to release version if no further changes are made to the release branch. We do our best to keep head of master branch stable at all times regardless of release schedule. Daily build packages from master branch for C#, PHP, Python, Ruby and Protoc plugins are published on [packages.grpc.io](https://packages.grpc.io/). If you depend on gRPC in production we recommend to set up your CI system to test the RCs and, if possible, the daily builds. + +Names of gRPC releases are [here](https://github.com/grpc/grpc/blob/master/doc/g_stands_for.md). + +Release |Scheduled Branch Cut|Scheduled Release Date +--------|--------------------|------------- +v1.17.0 |Nov 19, 2018 |Dec 4, 2018 +v1.18.0 |Jan 2, 2019 |Jan 15, 2019 +v1.19.0 |Feb 12, 2019 |Feb 26, 2019 +v1.20.0 |Mar 26, 2019 |Apr 9, 2019 +v1.21.0 |May 7, 2019 |May 21, 2019 +v1.22.0 |Jun 18, 2019 |Jul 2, 2019 +v1.23.0 |Jul 30, 2019 |Aug 13, 2019 +v1.24.0 |Sept 10, 2019 |Sept 24, 2019 +v1.25.0 |Oct 22, 2019 |Nov 5, 2019 +v1.26.0 |Dec 3, 2019 |Dec 17, 2019 +v1.27.0 |Jan 14, 2020 |Jan 28, 2020 +v1.28.0 |Feb 25, 2020 |Mar 10, 2020 +v1.29.0 |Apr 7, 2020 |Apr 21, 2020 +v1.30.0 |May 19, 2020 |Jun 2, 2020 +v1.31.0 |Jun 30, 2020 |Jul 14, 2020 +v1.32.0 |Aug 11, 2020 |Aug 25, 2020 +v1.33.0 |Sept 22, 2020 |Oct 6, 2020 +v1.34.0 |Nov 3, 2020 |Nov 17, 2020 +v1.35.0 |Dec 15, 2020 |Dec 29, 2020 +v1.36.0 |Jan 26, 2021 |Feb 9, 2021 diff --git a/doc/grpc_security_audit.pdf b/doc/grpc_security_audit.pdf new file mode 100644 index 0000000000000000000000000000000000000000..fe0219f7b925f7447496f173d6ec5f71da7f86d7 GIT binary patch literal 177282 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ή#nY1#A=Oju{*%gwe!U;J-~We%ov=?qE8&aD5dfc60>Y z$3%!HIH_PpP84-obrHGe)GNsRjva2oBAIU5#?Cegy0LP=_z7`Y+DX+?<@eMgC1jFke%F^^xP zS<}#VEJng!Lr34=Gii00{qEi(Gv=Uftqzd9OKt61<%(6zXXSXvliDkwD(|b@XGb&e-to}`^*B&MuWNu>c*PZMP)C31?5!4i(Sn%FNVg1aG*6BU-8fTP^E}RJcW4<`U86Zll zna#p_o1jxnBn`(#%Xb+0Br#}nE@i}N@x4v7bvl@?(5cDigR^egFt@BP15Wt*prpP2WUJGd?8_ zHu=fyMCIXhh^Cd!A+KerDUAWsd+j)_j&#mmW(|0x+&`n12KJojNRm#@GTDl@{g^GC zovTqk+&LQ*e2w zudf-1YGF$`DBWF)CenK!0`MXSrQ%_Vv3ljW8G84^cQmW7L7#{WmE6!e_N31b%_;-x z{BNLl3+QG#E`_>@I4i`zWo@II5D}iE%0Zih-E;0F3V<(q>nb`98GaA{MoyNO5x?B; zieyB}Hds)SLu}5lyibp0z>_N+*pH-Q$J*X04p8U}761#8Lg>J?Lqf9(LTl1asS^?k!i-TjkQ{sd1Ff4s4 zk##;fjqwWX>?b41t9=pRE%ymz==)GP%}_a&3z_E;_EZktXwU!2H$&5km=dWG@0#`( zWEK6@e6VZVRkuH3fNS@slQ0)kP6mVxO|l9IMAHvk3MiVNx$+r3o_}@CmV#E2^UMA= z^~lC+fUmaha1V59NU+_pdTUXie`~gITI+;dZ09+{Uupj<+4hTC5k_llY4dr|B6dAf zeU*!zmLYMelYydpzQZKQM&Ci%YSKaaw7YmdxnP0z@oju@O|P%ba)HY^gIzqwQG6}M zf6d9o2mdjv#hq4q>a5-Re#ZD=F(N#t;@raAuJfit2nWZf_2+zZYzZ9p!@T_Dn`*A& z%}aH4vk;o*!9(|Dfd9?6^V|L(2r3@fyf{4B)#Prh=0_WnaUx=sQ7Q*@>TiG3%h$81VO&R!A7P)z~Mjr z1|98(#rK#1jpoDqE3jsR(hZ3p%@V)?&=htc6v}4(t<8hv_UNfWlE#}U5k=3O`<-)y zE{3_cK++NsOOJi;`}48q2%6hzIpn2z4M?lz+4nNYY8dpJyIx2+X7oDN{K{()(*AwN zm7>^s^@q+QV}zJ`w%R)yVWNQS?jf!3HhWfm6%$(J57W-M()f{gaUS`rbNeehJK=!C z0xRv^Y}Hm4cWhZ@GBYwWG_4L6P@HXi`Ia_ZVF_HD2_eViJyxz$f*2j+1nU-%?#vwU zNxdTd;26EGUWIaj2Jkx!e0iOYKWDT~%w++>oz2zFG9`=7R=@!?rxnc=B_r(m0lPT) zAd#O9%{F}M==SW;=&?@oxOEZCSgJdDp{fwd+3AFixCcXd1HII%BD&Ff1XYm{5l9~} z-W>;B9J<1dK$I7k-8($L)>`<#?HP3_OFue)r) z@>$#jsN{{7w(2-52^$%i_7DQFae^C7wQQ|gRGlQbi$Rg;B}-FPjNM$50HUO&(Xja0 zk2)Kr?M@iCa_MeNfR|9ff~^WUA~^*Sm%fUyq)VWJIg|bHVSg}7w%FK&7ce0=CB|8r z2Zou;H@SbaWGxM2G1|Xr58*I7l15xpt`X6XUkv{}EFnNV?5JW7ucEbiKRY|H`5shj zVZDf-Q)5~wMNwaIRWT)Z+h(J+`3RUQvpr6g$z#@2R4Aa|=h-nn=RQranW&m!t;SnC zTlq8)5bzD{=deYYkEF5T9ya~h-)~%zS1|UJ4KhhOFoAKs`GLP+fRzGdV@6F9ap6P> zmxu-8U*h5zqRSD#ly|WbFyOi~nn4T;#8^e(k$4A>DI=+Ok-pRJe8=4*oJSR>-KrF z*4pb?UULz^-q!QvavZYR)s+pb?UFRXN2_$eUq~QpR2S|9o(f>B;jW?Jgdez#;76BS zYH+fldXuNB7r7s9bWb>A=RTA#5Cbp9Jcf5pBf)f#032f`2JE`8dnG6K!T#S@Txd6| zN(oThWb;Zzk-W`rC)dib%9)Ti=2t7=HLXwhd88R4v!%(soRQa>20qrW>M!LlCcoh| ztu3jitkm65E{RA+cG(4F)xRBo5V{nT&la0OGe7D>PVEoKI}ZbX&O7a41( z{VGsbWpP1*BfZ$XK(6>rLT%>S-Wk1_OImyU=#8t+*0AJFK^oCDy!}Cd4)IX=;2bY+Wz8oz{JBSpTE`dN`dvp?bon3 zr8jldW3WYc*?kTQeS}IgK{G+a+^-v$75bHsC^v}&A9G|PM(isx;D~pGB&i~ccFbgU z!hON2_WQ60f|+m^4hTPYRLuOf21`Axzl-j2TD0BwcGj7EJ1kva*5g--otSHgwZNOf z-l!jze zRjJ5&sRI{oBIlAdC=OVxikU-pZ5p%O;j4M_J1B85^sYV8x6Y^VNbw@B%aIavplW1l z4p4?gyi{4-OAMWgrvisJ9Ff8&wmqZ?I^E!wd)P)nxz+*KJ@u*^$7A19#2D0f11jC>B7g%rABP*zGLg{17g9y=mJlB_fp zQYp$RWX}dNB3fi+lo6qX%>Oy}^XT)S|9A9zeZJpsuUDS?x$ZNr@jll%=ep1J++Kp+ zp5_kOsr>h6((dzmu77P_XPJA)>sZjebbI}Ms4~`P8TK*BTgtZhX&fvPksR6{%bMph zg~C6PXZ8JFaen`I6~=2KUa}t532| z91NL?2>9->I;Uf6YE6^}=e0sYUUW(3GGoVQ8-t=%GUASA3<*^5u*Lf=yBNP=#Cp%; z!;v>`uNV`aaR}_f->s! zxy!aZRCxHhQ}g78AJW+}yUg`?hWfW>NVnK!I)(cb*CaMf)m4k#PPXB=b^TC&wsSYZ z+TA+vVI|MB)7tmAP5Y`E8)U}nj|k@HO<$Kzd2P~;Jt+N<;~72RpyP4n6Z?d+UDE90zux*9td{-3{9a}Hll|l%vsX49Y^jwN zWe%T8zclr`9CwuqyyH+Zq!(gcKZuQY@U;8UU(+f%bU-&zLHSTaSLWqaOZOes>PptR zlJ)djYh!_t-?mA^{SzqzDTP1kk64!8NxdiP+MeC?`umTNPlX=~LdqFK?m3OW*OaJ! zJM%8$J&B^Ie_)SXYk_o11z49|FS=b&QEV+Lsg&~d5?3u@c-$QdK<1KfQWkOR*83e(TjI^Wn8!Kc%ms5dM>q2y%uROt zVsY+?#`gyXNx4&H`pn)^lPhvvY7$Qz4rtB$UOi|jtl#}mtwZnV&jP8dXTonY>Tcf9 zgyRuci7Aq+HT+f;(CNtqvcE+#l|q$xs%-@%{}*=j}@-EmeEc zIPY0#e_mN3XLW&5k2 zk2j}(v??F7+`RN#@r|yESa)}BCF3B2Hx170V(J<@E{HvM=ySn3$uG%&waGy&Hr%HR zr-$0^)SVHoU0QX4n>WrO;rfplD?;Sb5Zik$!ih$Ka&N&zDpRs zGxE{*L$jabr?E={o7Obf8BNCY2D9nwd3)P+pAuQhmK&1I>dmQhfwC!3EGY>bTiu4VSQ2E8G;x>QWNe{k(%`E`2*8FIpfd6o&R z&(hcff^OwjceWkMNMW9c=2Tvi`9kVqsi5O=LNKog<*t`^yK;Nz^VmSoJ3AU2&~jU6 z-dbR+Vm_VsX}@sFnw>-TeWLP8Q@`DsZ}wl|7k;W~{7Ltz(6g}E2RA=VReWVkd6&wQ zE#_Hsv+=3EzZBgHYc;Qda5&AN_$vGM{=j_!!kTYMl27wF?ye-JQ+*A z>>RVThtwKp#QvmVFkI(hcXZXNDu3U@mj?E4e6DEBG;*~A<$A8ta$g3wpkH~rW!?6Q zLi?$+H_b1XlvL<-YQB}MBMAn-$n~mGW*!i*(+C_`W3VIZNxy!fup;ASxiNX4CF?ls zHG8Bp-J5UgX^)-Cj85Ytnm<)z<%nmhdL|m>m-gV~l7V-TUp>vH#*L*m^bWYWx;1yEfb1lduY#r= zFBQ$o3m)g&JP-;m9J@4Fc7V__yfs4Kdp#TP!w2p=Cj(CKx``a==JD<+^zh1W=x>=c zE;W|^77?=3>_U!7$WHx-yNfI;HuASWQZhD_^1o&;Laf2JmkA%PuCRT?9u}#z6{V~d zxKCrh-mAD!W=Dmk2Rqr#?O#rb?0XtofVYy%GB62kVODC-wlhu&_Qz^J(>_-@>8YLm z%)2n{+s%*=HVZbbcUMl7uU0-%pZlSp_tp5f8;u8oDIU`!jBTSk?x_@{M4lHDxmlvv z5W>MdTrk)&*sSw1>){I<8{tjUdZ;{1S-wHzp~%IzliwyE@SicdzwzkBfg{>6ezDZZGi;eUlorP3w)orYAFF>SjJDT! zP32X-q!>^9s4v{)5*}*pL%tE-Y2tC#tKQ%d9g<&5zguoxkG(zM_8=H%D(eFDOSu3D)>~+wKuidXDh+mT~#mh9H&#l*5w`l3%+S8*+RMG9Tt#;l|0;Gjdo?ecNk79MikSddvRmVh)qrI=A+mxv=ZR@>c?g$i&I>4XZ5bM!BX>*^Wq`h@k|b$=~L;K6jpJ+y&XXm>R9=fe^5^N2?u5- zYJX`-M7!MGrsJ2nDNL8o2uSBCJmpJ$%u}qkLB=o1Ubm8EhPaIL+T%)*mZog`4V}|c zS>4~JwXeFAPN#3Hj>>xXGVh4T>ccIs>v>n`I9#+qZ;yBu7rOp)aW&Z>b!?RZYO7yZ zf^bb<>b3nRl#D%>gir#XT)!`(gW6>hRQ9Z?Dp~KSlZJIoQzsN*%hQk=Ka_c`#s?5XKT%xZ@#r!Ce||thnrM>2$yDj z>ddo=_TGE_N0LoXeaglQmnW77iVa5B%xsPMto>NCFU2js-IG!OAj2B%o%%ywjPJD= zA{;aqWoUi8y!iHcEJxS&>}MRW4yC618trxr4txH=sM$tdoh%e&&Sa*i>69iNWNdEA z82$`%Oh)LW&e&%1%lup)**KfKDA~jv@iWy!*DrTRH}5Vyf0y8Zj_d1P9A6W8@|n-k zp=TQ?r%;Oc__z|;ET;*!J!5NDiao53+&44A-}ufzRa-}+^S+qxCmWuW>oOI6HlMMV zO*ua3tZY!;mT{wZZ$|eIwceF)%NEH?NPIY&Bzkwo{XXtf=VZM~{Wd| z!!FnU;F84jP#veO@^O-g6^{R<$kf&{mTr;IjRH||j~=n!G;Xy_z#AEMvXqNFKfZLx z<{i`LMS}xljq3I%S;hu`4tflDvwBHPuC;ivQrqDZM@sv*#HRWy5BUSaryjnvh?V?? zCktHJ#Zt`DFDb@>@{%uGCK(dpZsaI@Mv-ymqkWv*PIldmgSJKvxsFLjOc`n9xUp3K zwshSFSFR=o|F-5qmoZ~qw}QdaEAefIv#n3YvPrUfNslNi*1gyohFO2-+0lL$OZy`$ zCi@;~-8GIEG$_8klV`O*#jmN=QB=Gr;e}uSiK#`W3>lcCw*JKOO8cc6O~0wqkJ(L$ zz;l$Ft14>OywkL_nyl1JW;;%})~M*Dox861f`RHSW~(A4dCX+FmNn+UtB+v<27@|SO5j5NwKNT2w* z-Bi~5`Z1%A>N!?wZ??;8g??I^D(cw&aA?ARZQE&kt%$Wtqs}t!?wl$P^kVzzwIxl0 zUB{QZ6_Y9+y8TjW!{&m~Z?@WAN)oCYay~sx`QEmtCSWwCY-HWR0E*FsRqxdk_kWO% z3`=eXKb3Z?BYM)+i+2Vkak$%UMbX99V%c)pn#AqwgI^{m@(p%JvD`C}x_YWg|Fh!e zT)p^#*I^IHRrtoLJMr)n7@VR{27?`26 z!?7z|=;XeorJI_CZ;w%DNNF^+(2Tl0HR=0|# z4)5KXaAU2{X4V5i=8DHQH7I0pvAVDHwwGRAVHeJ%b>hTCEK@=vW#_(vA@(0DPJjJU zZO(CP9e>K(3hfQX>-98cI=J#=E~lldS5z^#>7S|m*)_IDd~_%*O7`LN0}pRG%!IyA z`z~3}Ut`}ZZ(*TyvvpwH0SPly(X^s@~DRyVOIjRZ>)s-CW`8IY;|4%^-m- zcq1W^?cW}`9lo3NRW1CGl|H-A+FP}~N?VJiCr>Qj$jZ&EW~p~M%f>eQ=)|IRf&^K& z!=4O+m5h%<{F1I%g;xt}b?%XqQV0!s zVpX+*R2`WK&(Pa!x11o=v83bQu~Ares}}04@~USDXk%pEb+vB8uCZ+gj;+6(Tx1>4 zRejFrPKAl3`C&`&OUCj2_j9ks>x(;$|8~X$78EhP-9X(hXS{lKKD{u?5N=DA;@*jRmC}E=}R`ZyZ&r1)h#Lq z_A2sOYbEyptk2nU6Tp#uHlyP)Ro*;J0V!V z<&@@~sg;|~-#Z#;w)esGeyejs`!rSf6hVCE5;$jp!wk~>lpZ~3Z#<^PV zYhSNrn<@Dn>~J+6$sWdx=r31Rue8FbJ-WEwl_dsd~HVj;-gqnR3Tuyd^^6(&}B-`+^&o))X6z z@sHf&87+)0+_FO6$Nfj>;Ms5KBxsPlf$9A2$sN+BH%Jm++~wi`1Zf-~4@w354q+da0{whw*t>C*T5`EBlX@!|>cfYRWvX#Ue$gyEZ^(9jsic~@c*;G4k#$_c zOQe+C2GnL4&+{LTxf4_iUiKMu^OT%$U#_Fmlit3k`Axn%ih>#whcm9Se#HmBQ>feF zVNtN}_?q>a*zFY$NE{Y8NgbwmXLD!gfYru3MR9F5rGDqFKd-uFXNDHmRZs0;$n=@M zsuHN4D-g-n!e(H%wD0rL8$6+(9OGs05(|`yCdP~QKRk)$5g59^#3t`(bvtQyY@dfZ zYp%`qtn&$OMJuj7ODnw3u#3+NFXTDhq!1W*?0h9gw6WG~d2Lqw@izUzWz*qE$N! zAZKJdv{7(}kVm){CT_!J$zZ(;k3Sv{8%^of4Rhm|94&X$N_o6? zt5Q;zx`1rLx9c^i8Ur3pvZXO@t;E_&{oOb8s=m0(S*rcu1E@Y`VISfqO1%*zezP_G_vTna&6Fx+vlQ0LUHSRN3X&$}wV-c^@<*@DN< z)6Nd}GW=)MM%C|I1M;MAa4K&fg{|r|g~eLpf1a5TzVYtD#%b-^$I2RvGB@6Z=lF`< z2<1;a1KXWcB5hXvQl6aPVXd@Sx9lv)ifMElceLG{l~LjKa?)>U1F@eYCqU^GI`;# zWA|o!`TI(8Z+{#s=2{$Z*0$e2*+27h%aBi-gYJNRQF6akNnD0?!1ywDgVy4DH;FA_ z!E3fOej$dfVw?yVKVtplX=1?xZtfMq3JpBG^%w))Iw=_$){WeoH}bBja>}tQ{Q3E5 zi?AbaJLgD6zW*6&B@X8Eetn2TvxhW ztx$}FGBED+Q}*uPC7Z^{wLwSr6;Y3b$*gwy{^~5h_L-JfgOcy@nBaYnqi6JNqj>iy zpSBS+HaV9h;Aaw5ue`cPAZKjkquhJd3RFh$$_rke#0z@QUzEMsf(bt2A8~XSp*^Nw zl4Z9b@$>+LC*@!-rmEzKHU9&7s};%{;v$z%@PJ>F94PVF2r_d{oVIy7%GGfC(b}|; zfy^SVFAooXFcg$OCmVb(IbwrS?h16#T5IuQXI`UKqHoGrV|TT64ZO`bo;+0)ly&S0 zvtEg?+;qew%if`DbrJW}2lXEhw_Z|LSpS86dk0JZ^3NCK@;0H5awM67A2Y1YuKV!F z_w9(F7{M^eI#uRUH@-^7e}wc|;PM`nG}o1plW97sVSGkuC(}=@FsjslvnstD{kS5$ zW^a%~mZGIo;9_2Fo8T*}w&yIm9?&eLd^oo8%Bx41)e&b1`tQrm*-T$uHGcVo$yVEZpVhB-c%B! z`WtiH#@ZW#o(|MBCKXBPn@)W^mieQ#T2rS+Ybtk&sCjJSVLV^|k$Z15b}?D@@iE2_ z@=fz|t{=Lvt!r!ixL3)`Bjpo=Dus39)dvnG%T8Ec&FJd)qr{wyG=9jst-9c)SIYOQ z#&RdmF`4O1!aMVb#d`_GD`YFuDr&mK2g_^X%_riD#ied0rd#_UMX`+n!Trji-&BF9r=p?N1o8 zdm1UgG|2qIJuT|el`rX=T{b0ymwgITNG#tD7IX?6V7&R^C;N%74^$4+3dIPg%G5@g zN;7jRKlv&kB~s(l=3y`^0c! zH+WRDU3OIp;n=+xO*J}GUZuGf@L4-E?e1_O67=T1-cSe;cG?C zU2-~g{heZ=iM3yiU2>V)%-aCDMdikJM4#Ku-RQ@M`1*I5B^@%5G+R4ldO2~>)}*Ke zd(?(AOVFS#`K*;+>!WAI8&-n zx0zh64`l9$+8el|Z)GS`8Ih?>An34=f`$nv>qYqTsA(lcq*?n z__v7zvo8omqe*x&T@uZ|`ifAw-zL$>QEW_RQ)ob~G$gNdK0^cdypz9QZOJ9vyBL-p$oIO3K{))2ygDz_7Ztqkhw5lA3&X zY*A=dy}QeB7r)7e`(E9jO$BF~??tEWe7pJU`v(1yHe8C9&NR0Fc$b^@nlD~E$0<6~ z0wXf3+mbeW*{-%cm96@k*L%oNOYt3e$#ndiuH@*#to1P}Z#xPPG(Pk6-Y+<_n0K^X zRKQyGie2B7iH>w&-b#6u^hq$hS=-)CO^V{ zym(#PUa`g3`g6<^wd|`^>l%Dwu7^+FsKJl<@5tEjZFRosH1lLd7l+%PvytL2IQP%+ zxT|`nGrTUkymD&OxW%}x;ka)3tD>jU7UNRx>!+eky7k-Ca8uEpJrw^Qii5bSchGmM zaosmO<5Hvz*{GfMH zhGmqxV9^0DzmKB7h55hvveAEt>fdL_0OZnMHVU(2V8#i|KEaa6vso+1C(KNN|7SB} zU^)05$$o*^DQFau9Rq2zZNTf3Zo6pdQ&s!}wH?p>uyFjo#*0KBIZ14O4@ z!BiXCC613syN%}~(`W=fGL1$ATrU{YfHxE$O!(Wm6LBw~G1wzW&QW)y7#}iq)|F6K zP?9)o>gIf$1&r%o>4AS$JM3<6Dxq#@4*xj9lszJ~YYkH;ii@MMsS_U>=|w|A)zrk& z5c)6JDFKZZClk>GJQk0`Vu9#H@?64kiQRT~6lW)07A)e6_;3hkAgc*7$cKmdiQoff z^??thPd+@gBpyi<;seG)?jdRgcBFozwnCt`0`d=G5n!J^juaPrpoK#chaEuzqdk*dr&gm(SVJ#Z*Q{LLPWxAgU7|(mS1A=yI0+e!bwR(t>Qt|C0=e zvgl->bMyZJ8K{QCQH?{STIG+;fwV#=3O&641F}%Dh@;|-Km{6+O8jGy(1>;EWr7-` z4cY&IOjK~;s6&ZBHPfF9gCLe(nE4B&ztxf8XoH?=pg)%asZTEjH1&VXBv_gUqnhN8 zrNAJ{ppyd3v;Rpcs89lv{Qt>$VG#d8FU9Oq9Qg9Te|TVNW1Z@W|J)XcE$O9z+WF5R ziV7th)fNP*Oa60V5PZ@JgM~iiKPL=LivOeE#Ul0Tq(CE{m?nli#RaT%&~W$T=maj% zNNI`vhJSsTvs^;%&#jC3RTt4Wtu6*Z5{txPOJ^I?ol1&IN+=Y_<3{A0-Z0IOc2T(E&sk-s2r#ys4U0=5h@o*jVKqg2I-2wWeE#} z{~b%}j;5}FC8{ZD{2@S`qZT^f^gFfS0S}N5#E8Hk1pF)yh@1Ik06b=%0jO%B@qnmB zg2uyq$AU&f${Zd21w?8uG!P^Hc^(jF%|+7{1QQMb2!a#Q9f`_2Vpga_dD?dXLgFtl z&5;F%C;lT@5EahKGT*PD(XgpGvdpzN1U=Y(%^45~*mqM00>V4Ej|?n`0eB5~M&zQ| zVHTnY4Ymc#K|KJR{K5-_GV!;z!eTJufJ-_EBNmwz2~qMKh|oFy-$LYfA_3m8vm(uB z8<+xeZ|5sbHBl?#bXq!Ho z)4-B&;z05RdZ1wz!NeRr&@HKG&UV&cQWq|>{t{Wm%!Mi9U1{TA$D+l-xS|8!0#||#KX_S8+3tC9gs~LtB5)vZlG#t zxI)}I6rHAWh*MpIVmc^QlXSIk$4FgBgWn<6pdn^)2@FA`Yve*#XF>BX=pQch=EzQ~JF6>1pHRni`hhY-oxytuD4|~9Sfm?| zNIhs%aDkKuZ6M{LO=-44^a*VB%MP?Ykh;(=v-e>8G+AJK$bHxbU4Ka5boQ9V(*NI1 zw6RK?bZ}tuowHJ<*@-&oP|MC4CvfTXkL(2X3iSlB2(KZoAO_(zl#O=pugL*}Oz^XV znD7r5ZVToEB#=sD=hs%&iA7>TWR>Nw&?*oBiLJtLDhz9?SeiKL@*y(~AF?pyL#A2~ z=LO|7zz&A`fy_&MXawcpx2F&yhPsiWiol0#;*dxwZ8}ENX%30d(sPQ0ZY2)67&*h} z@P11>YY91uqlu{_68i<7Si{uVSr>=K1N#t&(6!-!Zt#2r5>cE4BEPen_ua zl-1PO3;zpSI6K=rNlHimaUAe$SDg4S z_xfi(ln4VHMDT2r4@1C;gJ;JeruDDPaLyEpjgz>gsk50l#nD{C!r9hF!qLna{JtSd zz#cqq6+>g@O?}8iw0~bMXdGky zadtE{m2gFiV{qbb^Ev!Ohl_(N1Po{p2lzyZWB4#wJcP?XUnfAe#4RZjhDH<@=lN>| zJ$1*ZdGuLK-~Fu2C?VF9u* zv%OMxgY(wC^u7L>C#CgD!tmk1-~k6Q$T)Fu)`&Vxf4e85@AJ=GCRM#;G5{i)j0ZyF zz)=D46T!dfbaq!v-|3$@N2;JWu(1Q8lHj%h2O_=r*r0xb0J#7|XdD!n0D_dWq9PlE*&WMl*p9x}KXZe$UI|3t z@-fI-A4ep^wLT&%vMKr1DJ^D7-|3$%8man4LXT*$%K(y+ftG*Q=WHCBzRy2%R!EI#^)22?ebEYg32kcGl zsBuE-IR!pszO!?&vEf7hpg6`2xQz~dY{b750EG0j6F^x;D^hR%)1 zJDM6gQygcHVSs2g68Q#^UL?8=Bfl8%xCR`RHE}UEoh^rh5o;I?1|e;vJSc~Qk>S~B zI=lxX#()l^-eC7YJ$iuxZ6RHPkf(y7v#GFxBnE{hgWt=?qp?^Vjx3782%%6yaMGMT zi0kHPYQ};BD-9wGXo~iaj{r_i;Q7q>5E`0*#loY%@E@NYl?Jb2v={#Si$+AjEhIe+ z)Fr?}fAlmU6_9Tp4Qzy9$^d;iP?toQM+2gupjqk5p)eRCJX=FgLxV>`1mHpGX|NnT zl{1HiMUi3fnVtsfVu5D$PmKzbUeivzh8b7-&}JjF?04u!)J$n(m9 zx&*LMnqLl_ah^v5D<=3d68iQ)T@q;?FW_7c*z(RThr*N5FcLqvF4zyww-G1@&qULg z1AxO|=amEJuQ9~=`~ezVi_WP_#NzPtbPDR?Nb`6Bk3xP!0}!4k2O10zfY3R802-RO zupAaXqoC&nlmib77SMpi3uxfM%mNx|K6cSyT*GtqbNV2HSIf-9A1H?*&C?a2;pXER z(D3td4`>Up0chY^_JV%Na7{j!7jV36z7B}MQ7zyFjfGhO^Xh`F$O0Mxo}8Ii4p?ph zjkG||L^OG!{xB%gg7yH$7qo`~r_1K|fx*om(`X_F0Bb=xfQ|(;(n6jwWRRCJPc|%i zVZT@qjayI-IGqJFJj^?ot1B#lJRg5Vp!)fECSu9+$0Yzb8b0Tn(;k6Dg2!O#Y2a}+ zG84_Ak-&kcdHkUO4JLTZD+f;ZEuay|3+pcE7tA$4lDTyuZ2>01?17)JXW-cvU;`W` zgb^`%{y-#v1W)SCr(x&u2a;VD&PON`%nO=VmxN!y9|nV6fN?;Bk6GsQi^1R*Uic|OEM*S1sq9EUQUMPpBI6L3KS^D z@)oAX)=n OkaQ|2sCYn$<^KT|e&(M5 literal 0 HcmV?d00001 diff --git a/doc/health-checking.md b/doc/health-checking.md new file mode 100644 index 00000000..22b6e1b4 --- /dev/null +++ b/doc/health-checking.md @@ -0,0 +1,77 @@ +GRPC Health Checking Protocol +================================ + +Health checks are used to probe whether the server is able to handle rpcs. The +client-to-server health checking can happen from point to point or via some +control system. A server may choose to reply “unhealthy” because it +is not ready to take requests, it is shutting down or some other reason. +The client can act accordingly if the response is not received within some time +window or the response says unhealthy in it. + + +A GRPC service is used as the health checking mechanism for both simple +client-to-server scenario and other control systems such as load-balancing. +Being a high +level service provides some benefits. Firstly, since it is a GRPC service +itself, doing a health check is in the same format as a normal rpc. Secondly, +it has rich semantics such as per-service health status. Thirdly, as a GRPC +service, it is able reuse all the existing billing, quota infrastructure, etc, +and thus the server has full control over the access of the health checking +service. + +## Service Definition + +The server should export a service defined in the following proto: + +``` +syntax = "proto3"; + +package grpc.health.v1; + +message HealthCheckRequest { + string service = 1; +} + +message HealthCheckResponse { + enum ServingStatus { + UNKNOWN = 0; + SERVING = 1; + NOT_SERVING = 2; + } + ServingStatus status = 1; +} + +service Health { + rpc Check(HealthCheckRequest) returns (HealthCheckResponse); + + rpc Watch(HealthCheckRequest) returns (stream HealthCheckResponse); +} +``` + +A client can query the server’s health status by calling the `Check` method, and +a deadline should be set on the rpc. The client can optionally set the service +name it wants to query for health status. The suggested format of service name +is `package_names.ServiceName`, such as `grpc.health.v1.Health`. + +The server should register all the services manually and set +the individual status, including an empty service name and its status. For each +request received, if the service name can be found in the registry, +a response must be sent back with an `OK` status and the status field should be +set to `SERVING` or `NOT_SERVING` accordingly. If the service name is not +registered, the server returns a `NOT_FOUND` GRPC status. + +The server should use an empty string as the key for server's +overall health status, so that a client not interested in a specific service can +query the server's status with an empty request. The server can just do exact +matching of the service name without support of any kind of wildcard matching. +However, the service owner has the freedom to implement more complicated +matching semantics that both the client and server agree upon. + +A client can declare the server as unhealthy if the rpc is not finished after +some amount of time. The client should be able to handle the case where server +does not have the Health service. + +A client can call the `Watch` method to perform a streaming health-check. +The server will immediately send back a message indicating the current +serving status. It will then subsequently send a new message whenever +the service's serving status changes. diff --git a/doc/http-grpc-status-mapping.md b/doc/http-grpc-status-mapping.md new file mode 100644 index 00000000..928fe544 --- /dev/null +++ b/doc/http-grpc-status-mapping.md @@ -0,0 +1,30 @@ +# HTTP to gRPC Status Code Mapping + +Since intermediaries are a common part of HTTP infrastructure some responses to +gRPC requests may be received that do not include the grpc-status header. In +some cases mapping error codes from an intermediary allows the gRPC client to +behave more appropriately to the error situation without overloading the +semantics of either error code. + +This table is to be used _only_ for clients that received a response that did +not include grpc-status. If grpc-status was provided, it _must_ be used. Servers +_must not_ use this table to determine an HTTP status code to use; the mappings +are neither symmetric nor 1-to-1. + +| HTTP Status Code | gRPC Status Code | +|----------------------------|--------------------| +| 400 Bad Request | INTERNAL | +| 401 Unauthorized | UNAUTHENTICATED | +| 403 Forbidden | PERMISSION\_DENIED | +| 404 Not Found | UNIMPLEMENTED | +| 429 Too Many Requests | UNAVAILABLE | +| 502 Bad Gateway | UNAVAILABLE | +| 503 Service Unavailable | UNAVAILABLE | +| 504 Gateway Timeout | UNAVAILABLE | +| _All other codes_ | UNKNOWN | + +Technically, 1xx should have the entire header skipped and a subsequent header +be read. See RFC 7540 §8.1. + +200 is UNKNOWN because there should be a grpc-status in case of truly OK +response. diff --git a/doc/http2-interop-test-descriptions.md b/doc/http2-interop-test-descriptions.md new file mode 100644 index 00000000..435a8de7 --- /dev/null +++ b/doc/http2-interop-test-descriptions.md @@ -0,0 +1,271 @@ +Negative HTTP/2 Interop Test Case Descriptions +======================================= + +Client and server use +[test.proto](../src/proto/grpc/testing/test.proto). + +Server +------ +The code for the custom http2 server can be found +[here](https://github.com/grpc/grpc/tree/master/test/http2_test). +It is responsible for handling requests and sending responses, and also for +fulfilling the behavior of each particular test case. + +Server should accept these arguments: +* --port=PORT + * The port the server will run on. For example, "8080" +* --test_case=TESTCASE + * The name of the test case to execute. For example, "goaway" + +Client +------ + +Clients implement test cases that test certain functionality. Each client is +provided the test case it is expected to run as a command-line parameter. Names +should be lowercase and without spaces. + +Clients should accept these arguments: +* --server_host=HOSTNAME + * The server host to connect to. For example, "localhost" or "127.0.0.1" +* --server_port=PORT + * The server port to connect to. For example, "8080" +* --test_case=TESTCASE + * The name of the test case to execute. For example, "goaway" + +Note +----- + +Note that the server and client must be invoked with the same test case or else +the test will be meaningless. For convenience, we provide a shell script wrapper +that invokes both server and client at the same time, with the same test_case. +This is the preferred way to run these tests. + +## Test Cases + +### goaway + +This test verifies that the client correctly responds to a goaway sent by the +server. The client should handle the goaway by switching to a new stream without +the user application having to do a thing. + +Client Procedure: + 1. Client sends two UnaryCall requests (and sleeps for 1 second in-between). + TODO: resolve [9300](https://github.com/grpc/grpc/issues/9300) and remove the 1 second sleep + + ``` + { + response_size: 314159 + payload:{ + body: 271828 bytes of zeros + } + } + ``` + +Client asserts: +* Both calls are successful. +* Response payload body is 314159 bytes in size. + +Server Procedure: + 1. Server sends a GOAWAY after receiving the first UnaryCall. + +Server asserts: +* Two different connections were used from the client. + +### rst_after_header + +This test verifies that the client fails correctly when the server sends a +RST_STREAM immediately after sending headers to the client. + +Procedure: + 1. Client sends UnaryCall with: + + ``` + { + response_size: 314159 + payload:{ + body: 271828 bytes of zeros + } + } + ``` + +Client asserts: +* Call was not successful. + +Server Procedure: + 1. Server sends a RST_STREAM with error code 0 after sending headers to the client. + +*At the moment the error code and message returned are not standardized throughout all +languages. Those checks will be added once all client languages behave the same way. [#9142](https://github.com/grpc/grpc/issues/9142) is in flight.* + +### rst_during_data + +This test verifies that the client fails "correctly" when the server sends a +RST_STREAM halfway through sending data to the client. + +Procedure: + 1. Client sends UnaryCall with: + + ``` + { + response_size: 314159 + payload:{ + body: 271828 bytes of zeros + } + } + ``` + +Client asserts: +* Call was not successful. + +Server Procedure: + 1. Server sends a RST_STREAM with error code 0 after sending half of + the requested data to the client. + +### rst_after_data + +This test verifies that the client fails "correctly" when the server sends a +RST_STREAM after sending all of the data to the client. + +Procedure: + 1. Client sends UnaryCall with: + + ``` + { + response_size: 314159 + payload:{ + body: 271828 bytes of zeros + } + } + ``` + +Client asserts: +* Call was not successful. + +Server Procedure: + 1. Server sends a RST_STREAM with error code 0 after sending all of the + data to the client. + +*Certain client languages allow the data to be accessed even though a RST_STREAM +was encountered. Once all client languages behave this way, checks will be added on +the incoming data.* + +### ping + +This test verifies that the client correctly acknowledges all pings it gets from the +server. + +Procedure: + 1. Client sends UnaryCall with: + + ``` + { + response_size: 314159 + payload:{ + body: 271828 bytes of zeros + } + } + ``` + +Client asserts: +* call was successful. +* response payload body is 314159 bytes in size. + +Server Procedure: + 1. Server tracks the number of outstanding pings (i.e. +1 when it sends a ping, and -1 + when it receives an ack from the client). + 2. Server sends pings before and after sending headers, also before and after sending data. + +Server Asserts: +* Number of outstanding pings is 0 when the connection is lost. + +### max_streams + +This test verifies that the client observes the MAX_CONCURRENT_STREAMS limit set by the server. + +Client Procedure: + 1. Client sends initial UnaryCall to allow the server to update its MAX_CONCURRENT_STREAMS settings. + 2. Client concurrently sends 10 UnaryCalls. + +Client Asserts: +* All UnaryCalls were successful, and had the correct type and payload size. + +Server Procedure: + 1. Sets MAX_CONCURRENT_STREAMS to one after the connection is made. + +*The assertion that the MAX_CONCURRENT_STREAMS limit is upheld occurs in the http2 library we used.* + +### data_frame_padding + +This test verifies that the client can correctly receive padded http2 data +frames. It also stresses the client's flow control (there is a high chance +that the sender will deadlock if the client's flow control logic doesn't +correctly account for padding). + +Client Procedure: +(Note this is the same procedure as in the "large_unary" gRPC interop tests. +Clients should use their "large_unary" gRPC interop test implementations.) +Procedure: + 1. Client calls UnaryCall with: + + ``` + { + response_size: 314159 + payload:{ + body: 271828 bytes of zeros + } + } + ``` + +Client asserts: +* call was successful +* response payload body is 314159 bytes in size +* clients are free to assert that the response payload body contents are zero + and comparing the entire response message against a golden response + +Server Procedure: + 1. Reply to the client's request with a `SimpleResponse`, with a payload + body length of `SimpleRequest.response_size`. But send it across specific + http2 data frames as follows: + * Each http2 data frame contains a 5 byte payload and 255 bytes of padding. + + * Note the 5 byte payload and 255 byte padding are partly arbitrary, + and other numbers are also ok. With 255 bytes of padding for each 5 bytes of + payload containing actual gRPC message, the 300KB response size will + multiply into around 15 megabytes of flow control debt, which should stress + flow control accounting. + +### no_df_padding_sanity_test + +This test verifies that the client can correctly receive a series of small +data frames. Note that this test is intentionally a slight variation of +"data_frame_padding", with the only difference being that this test doesn't use data +frame padding when the response is sent. This test is primarily meant to +prove correctness of the http2 server implementation and highlight failures +of the "data_frame_padding" test. + +Client Procedure: +(Note this is the same procedure as in the "large_unary" gRPC interop tests. +Clients should use their "large_unary" gRPC interop test implementations.) +Procedure: + 1. Client calls UnaryCall with: + + ``` + { + response_size: 314159 + payload:{ + body: 271828 bytes of zeros + } + } + ``` + +Client asserts: +* call was successful +* response payload body is 314159 bytes in size +* clients are free to assert that the response payload body contents are zero + and comparing the entire response message against a golden response + +Server Procedure: + 1. Reply to the client's request with a `SimpleResponse`, with a payload + body length of `SimpleRequest.response_size`. But send it across series of + http2 data frames that contain 5 bytes of "payload" and zero bytes of + "padding" (the padding flags on the data frames should not be set). diff --git a/doc/images/compression_cookbook_incoming.png b/doc/images/compression_cookbook_incoming.png new file mode 100644 index 0000000000000000000000000000000000000000..84d6f558b623cc708777504d783fe2e427886bc2 GIT binary patch literal 91427 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ᚼu?N0M#sW`mgqC`gp=Qe$rcco32$?%GL(@&! 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%0DjCo~H3?5Br9|}O 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 literal 0 HcmV?d00001 diff --git a/doc/images/grpc-call-channel-cq.png b/doc/images/grpc-call-channel-cq.png new file mode 100644 index 0000000000000000000000000000000000000000..d73b987ee927277b4ecff934db115e4859487165 GIT binary patch literal 46078 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

sDJ#JwJ|>T3zhjB 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%0DBkKNx| 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

g03@P*_{%Rr*y14+H`9T0G z@yOWabG@V1jl(rE%^YYY))*p*=ZH~?Zu?yn2^u5=0@oy;&p&aoO+2HnSDOF0Ivv zY3p@BwM$yqr&s4=9UE@}nRIVV%!{M7D?o}U zbL6@q&s+(YWOfb~WEyUFBMCDy@|555Ey=792$QOwwti6kpRylAsLs@S*geqDk3W~b zFSjFZFgdc4mJ{A29=Y7TT~F_eS4&YJEgFd~YBS}SsQbA?P}k2_10?!+QV&jF147P# zbuX<&fLvSAQSB#;i4UuPi9YxwEyMXNs;zHM;ydkgGiv0CmK2z$Z4#NA`KXXW%kzR> z12*Pw^!3hL^^(H~Sa+^1EbD3(V0uRHh#s?g5DQ8YpaosuJd#%}i-_8*6K|rxFjB^>3TTxYqwD z2>$uap<>~zcLxZ~*0z25Hy8r36NzTbPzmq*LrDLK0Xlx_|*#q2F6 zdyb(ChI6!Xnv#1H2#BOE3S{7*Yw zrvytrOcPA9u6LTap-$E#rF**R0_&sh_kGp%=lC}qaQ(IaiQ;QpdT*zKJbL8+|M&mB e75Hqtd2n=@_XDr>Q|zO|>1(L#s-aY^-u_=IgJW+1 literal 0 HcmV?d00001 diff --git a/doc/images/grpc-ps-pss-fd.png b/doc/images/grpc-ps-pss-fd.png new file mode 100644 index 0000000000000000000000000000000000000000..790af7f1bc12d94327bd3297cee296969a6cc1cb GIT binary patch literal 24969 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 literal 0 HcmV?d00001 diff --git a/doc/images/grpc-server-cq-fds.png b/doc/images/grpc-server-cq-fds.png new file mode 100644 index 0000000000000000000000000000000000000000..e52bfac81c7064dbb601a89f8bd9cb915c527e55 GIT binary patch literal 42096 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 a0So4-!>_Fs2c5%{(AP21uDSQ%*?$3Bmsnc> literal 0 HcmV?d00001 diff --git a/doc/images/load-balancing.png b/doc/images/load-balancing.png new file mode 100644 index 0000000000000000000000000000000000000000..7c70465e653dcf732875e96ab80e65331ff7c67d GIT binary patch literal 28073 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எ zovxofG6*vO=hi6X6wBzzQ)1kAT33g+Wv!i9Iv@lm476@HDZkg!OjcS>qWR1eK?#5RSML$IyG z2uyvO!4AY|XRKqWe#fzLY_1`rmC8DI#D3OY+l%QnND@|4ILAr%6Y-1vY`DRWtI2l} zx-|NHf!ClW^BQRw@MS-{%umF`h0!GNsCf`G;;7r4@psYx>Gmz-E%;x$0R;bcQ)2vw z%wGn^N2nVpW&>pZZw$59lUKiI0uwv>@N76z@n1eXVgc}%45#yCN_Ic`^4!0UOm`=F zf<9XSK=1FEk4C1g=(1t{-~SEPkN#&XG5#e3%%L5m#He*ZpzhZjy{%__qvE>DqyGYX>j7;5 literal 0 HcmV?d00001 diff --git a/doc/images/load-balancing.svg b/doc/images/load-balancing.svg new file mode 100644 index 00000000..18d836d3 --- /dev/null +++ b/doc/images/load-balancing.svg @@ -0,0 +1,4 @@ + + + + diff --git a/doc/images/stress_test_framework.png b/doc/images/stress_test_framework.png new file mode 100644 index 0000000000000000000000000000000000000000..a5f49f8e1064a36d73bdca40ef25df58bc203068 GIT binary patch literal 63744 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 literal 0 HcmV?d00001 diff --git a/doc/internationalization.md b/doc/internationalization.md new file mode 100644 index 00000000..1b614cbd --- /dev/null +++ b/doc/internationalization.md @@ -0,0 +1,45 @@ +gRPC Internationalization +========================= + +As a universal RPC framework, gRPC needs to be fully usable within/across different international environments. +This document describes gRPC API and behavior specifics when used in a non-english environment. + +## API Concepts + +While some API elements need to be able to represent non-english content, some are intentionally left as ASCII-only +for simplicity & performance reasons. + +### Method name (in RPC Invocation) +Method names are ASCII-only and may only contain characters allowed by HTTP/2 text header values. That should not +be very limiting as most gRPC services will use protobuf which only allows method names from an even more restricted ASCII subset. +Also, handling method names is a very hot code path so any additional encoding/decoding step is to be avoided. + +Recommended representation in language-specific APIs: string type. + +### Host name (in RPC Invocation) +Host names are punycode encoded, but the user is responsible for providing the punycode-encoded string if she wishes to use an internationalized host name. + +Recommended representation in language-specific APIs: string/unicode string. + +NOTE: overriding host name when invoking RPCs is only supported by C-core based gRPC implementations. + +### Status detail/message (accompanies RPC status code) + +Status messages are expected to contain national-alphabet characters. +Allowed values are unicode strings (content will be percent-encoded on the wire). + +Recommended representation in language-specific APIs: unicode string. + +### Metadata key +Allowed values are defined by HTTP/2 standard (metadata keys are represented as HTTP/2 header/trailer names). + +Recommended representation in language-specific APIs: string. + +### Metadata value (text-valued metadata) +Allowed values are defined by HTTP/2 standard (metadata values are represented as HTTP/2 header/trailer text values). + +Recommended representation in language-specific APIs: string. + +### Channel target (in channel creation) + +TBD diff --git a/doc/interop-test-descriptions.md b/doc/interop-test-descriptions.md new file mode 100755 index 00000000..978c422d --- /dev/null +++ b/doc/interop-test-descriptions.md @@ -0,0 +1,1228 @@ +Interoperability Test Case Descriptions +======================================= + +Client and server use +[test.proto](../src/proto/grpc/testing/test.proto) +and the [gRPC over HTTP/2 v2 protocol](./PROTOCOL-HTTP2.md). + +Client +------ + +Clients implement test cases that test certain functionally. Each client is +provided the test case it is expected to run as a command-line parameter. Names +should be lowercase and without spaces. + +Clients should accept these arguments: +* --server_host=HOSTNAME + * The server host to connect to. For example, "localhost" or "127.0.0.1" +* --server_host_override=HOSTNAME + * The server host to claim to be connecting to, for use in TLS and HTTP/2 + :authority header. If unspecified, the value of --server_host will be + used +* --server_port=PORT + * The server port to connect to. For example, "8080" +* --test_case=TESTCASE + * The name of the test case to execute. For example, "empty_unary" +* --use_tls=BOOLEAN + * Whether to use a plaintext or encrypted connection +* --use_test_ca=BOOLEAN + * Whether to replace platform root CAs with + [ca.pem](https://github.com/grpc/grpc/blob/master/src/core/tsi/test_creds/ca.pem) + as the CA root +* --default_service_account=ACCOUNT_EMAIL + * Email of the GCE default service account. +* --oauth_scope=SCOPE + * OAuth scope. For example, "https://www.googleapis.com/auth/xapi.zoo" +* --service_account_key_file=PATH + * The path to the service account JSON key file generated from GCE developer + console. + +Clients must support TLS with ALPN. Clients must not disable certificate +checking. + +### empty_unary + +This test verifies that implementations support zero-size messages. Ideally, +client implementations would verify that the request and response were zero +bytes serialized, but this is generally prohibitive to perform, so is not +required. + +Server features: +* [EmptyCall][] + +Procedure: + 1. Client calls EmptyCall with the default Empty message + +Client asserts: +* call was successful +* response is non-null + +*It may be possible to use UnaryCall instead of EmptyCall, but it is harder to +ensure that the proto serialized to zero bytes.* + +### cacheable_unary + +This test verifies that gRPC requests marked as cacheable use GET verb instead +of POST, and that server sets appropriate cache control headers for the response +to be cached by a proxy. This test requires that the server is behind +a caching proxy. Use of current timestamp in the request prevents accidental +cache matches left over from previous tests. + +Server features: +* [CacheableUnaryCall][] + +Procedure: + 1. Client calls CacheableUnaryCall with `SimpleRequest` request with payload + set to current timestamp. Timestamp format is irrelevant, and resolution is + in nanoseconds. + Client adds a `x-user-ip` header with value `1.2.3.4` to the request. + This is done since some proxys such as GFE will not cache requests from + localhost. + Client marks the request as cacheable by setting the cacheable flag in the + request context. Longer term this should be driven by the method option + specified in the proto file itself. + 2. Client calls CacheableUnaryCall again immediately with the same request and + configuration as the previous call. + +Client asserts: +* Both calls were successful +* The payload body of both responses is the same. + +### large_unary + +This test verifies unary calls succeed in sending messages, and touches on flow +control (even if compression is enabled on the channel). + +Server features: +* [UnaryCall][] + +Procedure: + 1. Client calls UnaryCall with: + + ``` + { + response_size: 314159 + payload:{ + body: 271828 bytes of zeros + } + } + ``` + +Client asserts: +* call was successful +* response payload body is 314159 bytes in size +* clients are free to assert that the response payload body contents are zero + and comparing the entire response message against a golden response + +### client_compressed_unary + +This test verifies the client can compress unary messages by sending two unary +calls, for compressed and uncompressed payloads. It also sends an initial +probing request to verify whether the server supports the [CompressedRequest][] +feature by checking if the probing call fails with an `INVALID_ARGUMENT` status. + +Server features: +* [UnaryCall][] +* [CompressedRequest][] + +Procedure: + 1. Client calls UnaryCall with the feature probe, an *uncompressed* message: + ``` + { + expect_compressed:{ + value: true + } + response_size: 314159 + payload:{ + body: 271828 bytes of zeros + } + } + ``` + + 1. Client calls UnaryCall with the *compressed* message: + + ``` + { + expect_compressed:{ + value: true + } + response_size: 314159 + payload:{ + body: 271828 bytes of zeros + } + } + ``` + + 1. Client calls UnaryCall with the *uncompressed* message: + + ``` + { + expect_compressed:{ + value: false + } + response_size: 314159 + payload:{ + body: 271828 bytes of zeros + } + } + ``` + + Client asserts: + * First call failed with `INVALID_ARGUMENT` status. + * Subsequent calls were successful. + * Response payload body is 314159 bytes in size. + * Clients are free to assert that the response payload body contents are + zeros and comparing the entire response message against a golden response. + + +### server_compressed_unary + +This test verifies the server can compress unary messages. It sends two unary +requests, expecting the server's response to be compressed or not according to +the `response_compressed` boolean. + +Whether compression was actually performed is determined by the compression bit +in the response's message flags. *Note that some languages may not have access +to the message flags, in which case the client will be unable to verify that +the `response_compressed` boolean is obeyed by the server*. + + +Server features: +* [UnaryCall][] +* [CompressedResponse][] + +Procedure: + 1. Client calls UnaryCall with `SimpleRequest`: + + ``` + { + response_compressed:{ + value: true + } + response_size: 314159 + payload:{ + body: 271828 bytes of zeros + } + } + ``` + + ``` + { + response_compressed:{ + value: false + } + response_size: 314159 + payload:{ + body: 271828 bytes of zeros + } + } + ``` + Client asserts: + * call was successful + * if supported by the implementation, when `response_compressed` is true, + the response MUST have the compressed message flag set. + * if supported by the implementation, when `response_compressed` is false, + the response MUST NOT have the compressed message flag set. + * response payload body is 314159 bytes in size in both cases. + * clients are free to assert that the response payload body contents are + zero and comparing the entire response message against a golden response + + +### client_streaming + +This test verifies that client-only streaming succeeds. + +Server features: +* [StreamingInputCall][] + +Procedure: + 1. Client calls StreamingInputCall + 2. Client sends: + + ``` + { + payload:{ + body: 27182 bytes of zeros + } + } + ``` + + 3. Client then sends: + + ``` + { + payload:{ + body: 8 bytes of zeros + } + } + ``` + + 4. Client then sends: + + ``` + { + payload:{ + body: 1828 bytes of zeros + } + } + ``` + + 5. Client then sends: + + ``` + { + payload:{ + body: 45904 bytes of zeros + } + } + ``` + + 6. Client half-closes + +Client asserts: +* call was successful +* response aggregated_payload_size is 74922 + + +### client_compressed_streaming + +This test verifies the client can compress requests on per-message basis by +performing a two-request streaming call. It also sends an initial probing +request to verify whether the server supports the [CompressedRequest][] feature +by checking if the probing call fails with an `INVALID_ARGUMENT` status. + +Procedure: + 1. Client calls `StreamingInputCall` and sends the following feature-probing + *uncompressed* `StreamingInputCallRequest` message + + ``` + { + expect_compressed:{ + value: true + } + payload:{ + body: 27182 bytes of zeros + } + } + ``` + If the call does not fail with `INVALID_ARGUMENT`, the test fails. + Otherwise, we continue. + + 1. Client calls `StreamingInputCall` again, sending the *compressed* message + + ``` + { + expect_compressed:{ + value: true + } + payload:{ + body: 27182 bytes of zeros + } + } + ``` + + 1. And finally, the *uncompressed* message + ``` + { + expect_compressed:{ + value: false + } + payload:{ + body: 45904 bytes of zeros + } + } + ``` + + 1. Client half-closes + +Client asserts: +* First call fails with `INVALID_ARGUMENT`. +* Next calls succeeds. +* Response aggregated payload size is 73086. + + +### server_streaming + +This test verifies that server-only streaming succeeds. + +Server features: +* [StreamingOutputCall][] + +Procedure: + 1. Client calls StreamingOutputCall with `StreamingOutputCallRequest`: + + ``` + { + response_parameters:{ + size: 31415 + } + response_parameters:{ + size: 9 + } + response_parameters:{ + size: 2653 + } + response_parameters:{ + size: 58979 + } + } + ``` + +Client asserts: +* call was successful +* exactly four responses +* response payload bodies are sized (in order): 31415, 9, 2653, 58979 +* clients are free to assert that the response payload body contents are zero + and comparing the entire response messages against golden responses + +### server_compressed_streaming + +This test verifies that the server can compress streaming messages and disable +compression on individual messages, expecting the server's response to be +compressed or not according to the `response_compressed` boolean. + +Whether compression was actually performed is determined by the compression bit +in the response's message flags. *Note that some languages may not have access +to the message flags, in which case the client will be unable to verify that the +`response_compressed` boolean is obeyed by the server*. + +Server features: +* [StreamingOutputCall][] +* [CompressedResponse][] + + +Procedure: + 1. Client calls StreamingOutputCall with `StreamingOutputCallRequest`: + + ``` + { + response_parameters:{ + compressed: { + value: true + } + size: 31415 + } + response_parameters:{ + compressed: { + value: false + } + size: 92653 + } + } + ``` + + Client asserts: + * call was successful + * exactly two responses + * if supported by the implementation, when `response_compressed` is false, + the response's messages MUST NOT have the compressed message flag set. + * if supported by the implementation, when `response_compressed` is true, + the response's messages MUST have the compressed message flag set. + * response payload bodies are sized (in order): 31415, 92653 + * clients are free to assert that the response payload body contents are + zero and comparing the entire response messages against golden responses + +### ping_pong + +This test verifies that full duplex bidi is supported. + +Server features: +* [FullDuplexCall][] + +Procedure: + 1. Client calls FullDuplexCall with: + + ``` + { + response_parameters:{ + size: 31415 + } + payload:{ + body: 27182 bytes of zeros + } + } + ``` + + 2. After getting a reply, it sends: + + ``` + { + response_parameters:{ + size: 9 + } + payload:{ + body: 8 bytes of zeros + } + } + ``` + + 3. After getting a reply, it sends: + + ``` + { + response_parameters:{ + size: 2653 + } + payload:{ + body: 1828 bytes of zeros + } + } + ``` + + 4. After getting a reply, it sends: + + ``` + { + response_parameters:{ + size: 58979 + } + payload:{ + body: 45904 bytes of zeros + } + } + ``` + + 5. After getting a reply, client half-closes + +Client asserts: +* call was successful +* exactly four responses +* response payload bodies are sized (in order): 31415, 9, 2653, 58979 +* clients are free to assert that the response payload body contents are zero + and comparing the entire response messages against golden responses + +### empty_stream + +This test verifies that streams support having zero-messages in both +directions. + +Server features: +* [FullDuplexCall][] + +Procedure: + 1. Client calls FullDuplexCall and then half-closes + +Client asserts: +* call was successful +* exactly zero responses + +### compute_engine_creds + +This test is only for cloud-to-prod path. + +This test verifies unary calls succeed in sending messages while using Service +Credentials from GCE metadata server. The client instance needs to be created +with desired oauth scope. + +The test uses `--default_service_account` with GCE service account email and +`--oauth_scope` with the OAuth scope to use. For testing against +grpc-test.sandbox.googleapis.com, "https://www.googleapis.com/auth/xapi.zoo" +should +be passed in as `--oauth_scope`. + +Server features: +* [UnaryCall][] +* [Echo Authenticated Username][] +* [Echo OAuth Scope][] + +Procedure: + 1. Client configures channel to use GCECredentials + 2. Client calls UnaryCall on the channel with: + + ``` + { + response_size: 314159 + payload:{ + body: 271828 bytes of zeros + } + fill_username: true + fill_oauth_scope: true + } + ``` + +Client asserts: +* call was successful +* received SimpleResponse.username equals the value of + `--default_service_account` flag +* received SimpleResponse.oauth_scope is in `--oauth_scope` +* response payload body is 314159 bytes in size +* clients are free to assert that the response payload body contents are zero + and comparing the entire response message against a golden response + +### jwt_token_creds + +This test is only for cloud-to-prod path. + +This test verifies unary calls succeed in sending messages while using JWT +token (created by the project's key file) + +Test caller should set flag `--service_account_key_file` with the +path to json key file downloaded from +https://console.developers.google.com. Alternately, if using a +usable auth implementation, she may specify the file location in the environment +variable GOOGLE_APPLICATION_CREDENTIALS. + +Server features: +* [UnaryCall][] +* [Echo Authenticated Username][] +* [Echo OAuth Scope][] + +Procedure: + 1. Client configures the channel to use JWTTokenCredentials + 2. Client calls UnaryCall with: + + ``` + { + response_size: 314159 + payload:{ + body: 271828 bytes of zeros + } + fill_username: true + } + ``` + +Client asserts: +* call was successful +* received SimpleResponse.username is not empty and is in the json key file used +by the auth library. The client can optionally check the username matches the +email address in the key file or equals the value of `--default_service_account` +flag. +* response payload body is 314159 bytes in size +* clients are free to assert that the response payload body contents are zero + and comparing the entire response message against a golden response + +### oauth2_auth_token + +This test is only for cloud-to-prod path and some implementations may run +in GCE only. + +This test verifies unary calls succeed in sending messages using an OAuth2 token +that is obtained out of band. For the purpose of the test, the OAuth2 token is +actually obtained from a service account credentials or GCE credentials via the +language-specific authorization library. + +The difference between this test and the other auth tests is that it +first uses the authorization library to obtain an authorization token. + +The test +- uses the flag `--service_account_key_file` with the path to a json key file +downloaded from https://console.developers.google.com. Alternately, if using a +usable auth implementation, it may specify the file location in the environment +variable GOOGLE_APPLICATION_CREDENTIALS, *OR* if GCE credentials is used to +fetch the token, `--default_service_account` can be used to pass in GCE service +account email. +- uses the flag `--oauth_scope` for the oauth scope. For testing against +grpc-test.sandbox.googleapis.com, "https://www.googleapis.com/auth/xapi.zoo" +should be passed as the `--oauth_scope`. + +Server features: +* [UnaryCall][] +* [Echo Authenticated Username][] +* [Echo OAuth Scope][] + +Procedure: + 1. Client uses the auth library to obtain an authorization token + 2. Client configures the channel to use AccessTokenCredentials with the access + token obtained in step 1 + 3. Client calls UnaryCall with the following message + + ``` + { + fill_username: true + fill_oauth_scope: true + } + ``` + +Client asserts: +* call was successful +* received SimpleResponse.username is valid. Depending on whether a service +account key file or GCE credentials was used, client should check against the +json key file or GCE default service account email. +* received SimpleResponse.oauth_scope is in `--oauth_scope` + +### per_rpc_creds + +Similar to the other auth tests, this test is only for cloud-to-prod path. + +This test verifies unary calls succeed in sending messages using a JWT or a +service account credentials set on the RPC. + +The test +- uses the flag `--service_account_key_file` with the path to a json key file +downloaded from https://console.developers.google.com. Alternately, if using a +usable auth implementation, it may specify the file location in the environment +variable GOOGLE_APPLICATION_CREDENTIALS +- optionally uses the flag `--oauth_scope` for the oauth scope if implementer +wishes to use service account credential instead of JWT credential. For testing +against grpc-test.sandbox.googleapis.com, oauth scope +"https://www.googleapis.com/auth/xapi.zoo" should be used. + +Server features: +* [UnaryCall][] +* [Echo Authenticated Username][] +* [Echo OAuth Scope][] + +Procedure: + 1. Client configures the channel with just SSL credentials + 2. Client calls UnaryCall, setting per-call credentials to + JWTTokenCredentials. The request is the following message + + ``` + { + fill_username: true + } + ``` + +Client asserts: +* call was successful +* received SimpleResponse.username is not empty and is in the json key file used +by the auth library. The client can optionally check the username matches the +email address in the key file. + +### google_default_credentials + +Similar to the other auth tests, this test should only be run against prod +servers. Different from some of the other auth tests however, this test +may be also run from outside of GCP. + +This test verifies unary calls succeed when the client uses +GoogleDefaultCredentials. The path to a service account key file in the +GOOGLE_APPLICATION_CREDENTIALS environment variable may or may not be +provided by the test runner. For example, the test runner might set +this environment when outside of GCP but keep it unset when on GCP. + +The test uses `--default_service_account` with GCE service account email. + +Server features: +* [UnaryCall][] +* [Echo Authenticated Username][] + +Procedure: + 1. Client configures the channel to use GoogleDefaultCredentials + * Note: the term `GoogleDefaultCredentials` within the context + of this test description refers to an API which encapsulates + both "transport credentials" and "call credentials" and which + is capable of transport creds auto-selection (including ALTS). + Similar APIs involving only auto-selection of OAuth mechanisms + might work for this test but aren't the intended subjects. + 2. Client calls UnaryCall with: + + ``` + { + fill_username: true + } + ``` + +Client asserts: +* call was successful +* received SimpleResponse.username matches the value of + `--default_service_account` + +### compute_engine_channel_credentials + +Similar to the other auth tests, this test should only be run against prod +servers. Note that this test may only be ran on GCP. + +This test verifies unary calls succeed when the client uses +ComputeEngineChannelCredentials. All that is needed by the test environment +is for the client to be running on GCP. + +The test uses `--default_service_account` with GCE service account email. This +email must identify the default service account of the GCP VM that the test +is running on. + +Server features: +* [UnaryCall][] +* [Echo Authenticated Username][] + +Procedure: + 1. Client configures the channel to use ComputeEngineChannelCredentials + * Note: the term `ComputeEngineChannelCredentials` within the context + of this test description refers to an API which encapsulates + both "transport credentials" and "call credentials" and which + is capable of transport creds auto-selection (including ALTS). + The exact name of the API may vary per language. + 2. Client calls UnaryCall with: + + ``` + { + fill_username: true + } + ``` + +Client asserts: +* call was successful +* received SimpleResponse.username matches the value of + `--default_service_account` + +### custom_metadata + +This test verifies that custom metadata in either binary or ascii format can be +sent as initial-metadata by the client and as both initial- and trailing-metadata +by the server. + +Server features: +* [UnaryCall][] +* [FullDuplexCall][] +* [Echo Metadata][] + +Procedure: + 1. The client attaches custom metadata with the following keys and values: + + ``` + key: "x-grpc-test-echo-initial", value: "test_initial_metadata_value" + key: "x-grpc-test-echo-trailing-bin", value: 0xababab + ``` + + to a UnaryCall with request: + + ``` + { + response_size: 314159 + payload:{ + body: 271828 bytes of zeros + } + } + ``` + + 2. The client attaches custom metadata with the following keys and values: + + ``` + key: "x-grpc-test-echo-initial", value: "test_initial_metadata_value" + key: "x-grpc-test-echo-trailing-bin", value: 0xababab + ``` + + to a FullDuplexCall with request: + + ``` + { + response_parameters:{ + size: 314159 + } + payload:{ + body: 271828 bytes of zeros + } + } + ``` + + and then half-closes + +Client asserts: +* call was successful +* metadata with key `"x-grpc-test-echo-initial"` and value + `"test_initial_metadata_value"`is received in the initial metadata for calls + in Procedure steps 1 and 2. +* metadata with key `"x-grpc-test-echo-trailing-bin"` and value `0xababab` is + received in the trailing metadata for calls in Procedure steps 1 and 2. + + + +### status_code_and_message + +This test verifies unary calls succeed in sending messages, and propagate back +status code and message sent along with the messages. + +Server features: +* [UnaryCall][] +* [FullDuplexCall][] +* [Echo Status][] + +Procedure: + 1. Client calls UnaryCall with: + + ``` + { + response_status:{ + code: 2 + message: "test status message" + } + } + ``` + + 2. Client calls FullDuplexCall with: + + ``` + { + response_status:{ + code: 2 + message: "test status message" + } + } + ``` + + and then half-closes + + +Client asserts: +* received status code is the same as the sent code for both Procedure steps 1 + and 2 +* received status message is the same as the sent message for both Procedure + steps 1 and 2 + +### special_status_message + +This test verifies Unicode and whitespace is correctly processed in status +message. "\t" is horizontal tab. "\r" is carriage return. "\n" is line feed. + +Server features: +* [UnaryCall][] +* [Echo Status][] + +Procedure: + 1. Client calls UnaryCall with: + + ``` + { + response_status:{ + code: 2 + message: "\t\ntest with whitespace\r\nand Unicode BMP ☺ and non-BMP 😈\t\n" + } + } + ``` + +Client asserts: +* received status code is the same as the sent code for Procedure step 1 +* received status message is the same as the sent message for Procedure step 1, + including all whitespace characters + +### unimplemented_method + +This test verifies that calling an unimplemented RPC method returns the +UNIMPLEMENTED status code. + +Server features: +N/A + +Procedure: +* Client calls `grpc.testing.TestService/UnimplementedCall` with an empty + request (defined as `grpc.testing.Empty`): + + ``` + { + } + ``` + +Client asserts: +* received status code is 12 (UNIMPLEMENTED) + +### unimplemented_service + +This test verifies calling an unimplemented server returns the UNIMPLEMENTED +status code. + +Server features: +N/A + +Procedure: +* Client calls `grpc.testing.UnimplementedService/UnimplementedCall` with an + empty request (defined as `grpc.testing.Empty`) + +Client asserts: +* received status code is 12 (UNIMPLEMENTED) + +### cancel_after_begin + +This test verifies that a request can be cancelled after metadata has been sent +but before payloads are sent. + +Server features: +* [StreamingInputCall][] + +Procedure: + 1. Client starts StreamingInputCall + 2. Client immediately cancels request + +Client asserts: +* Call completed with status CANCELLED + +### cancel_after_first_response + +This test verifies that a request can be cancelled after receiving a message +from the server. + +Server features: +* [FullDuplexCall][] + +Procedure: + 1. Client starts FullDuplexCall with + + ``` + { + response_parameters:{ + size: 31415 + } + payload:{ + body: 27182 bytes of zeros + } + } + ``` + + 2. After receiving a response, client cancels request + +Client asserts: +* Call completed with status CANCELLED + +### timeout_on_sleeping_server + +This test verifies that an RPC request whose lifetime exceeds its configured +timeout value will end with the DeadlineExceeded status. + +Server features: +* [FullDuplexCall][] + +Procedure: + 1. Client calls FullDuplexCall with the following request and sets its timeout + to 1ms + + ``` + { + payload:{ + body: 27182 bytes of zeros + } + } + ``` + + 2. Client waits + +Client asserts: +* Call completed with status DEADLINE_EXCEEDED. + +### concurrent_large_unary + +Status: TODO + +Client performs 1000 large_unary tests in parallel on the same channel. + +### Flow control. Pushback at client for large messages (TODO: fix name) + +Status: TODO + +This test verifies that a client sending faster than a server can drain sees +pushback (i.e., attempts to send succeed only after appropriate delays). + +### Experimental Tests + +These tests are not yet standardized, and are not yet implemented in all +languages. Therefore they are not part of our interop matrix. + +#### rpc_soak + +The client performs many large_unary RPCs in sequence over the same channel. +The number of RPCs is configured by the experimental flag, `soak_iterations`. + +#### channel_soak + +The client performs many large_unary RPCs in sequence. Before each RPC, it +tears down and rebuilds the channel. The number of RPCs is configured by +the experimental flag, `soak_iterations`. + +This tests puts stress on several gRPC components; the resolver, the load +balancer, and the RPC hotpath. + +#### long_lived_channel + +The client performs a number of large_unary RPCs over a single long-lived +channel with a fixed but configurable interval between each RPC. + +### TODO Tests + +#### High priority: + +Propagation of status code and message (yangg) + +Multiple thousand simultaneous calls on same Channel (ctiller) + +Metadata: client headers, server headers + trailers, binary+ascii + +#### Normal priority: + +Cancel before start (ctiller) + +Cancel after sent first message (ctiller) + +Cancel after received headers (ctiller) + +Timeout but completed before expire (zhaoq) + +Multiple thousand simultaneous calls timeout on same Channel (ctiller) + +#### Lower priority: + +Flow control. Pushback at client for large messages (abhishek) + +Flow control. Pushback at server for large messages (abhishek) + +Going over max concurrent streams doesn't fail (client controls itself) +(abhishek) + +RPC method not implemented (yangg) + +Multiple thousand simultaneous calls on different Channels (ctiller) + +Failed TLS hostname verification (ejona?) + +Large amount of headers to cause CONTINUATIONs; 63K of 'X's, all in one header. + +#### To priorize: + +Start streaming RPC but don't send any requests, server responds + +### Postponed Tests + +Resilience to buggy servers: These tests would verify that a client application +isn't affected negatively by the responses put on the wire by a buggy server +(e.g. the client library won't make the application crash). + +Reconnect after transport failure + +Reconnect backoff + +Fuzz testing + + +Server +------ + +Servers implement various named features for clients to test with. Server +features are orthogonal. If a server implements a feature, it is always +available for clients. Names are simple descriptions for developer +communication and tracking. + +Servers should accept these arguments: + +* --port=PORT + + * The port to listen on. For example, "8080" + +* --use_tls=BOOLEAN + + * Whether to use a plaintext or encrypted connection + +Servers must support TLS with ALPN. They should use +[server1.pem](https://github.com/grpc/grpc/blob/master/src/core/tsi/test_creds/server1.pem) +for their certificate. + +### EmptyCall +[EmptyCall]: #emptycall + +Server implements EmptyCall which immediately returns the empty message. + +### UnaryCall +[UnaryCall]: #unarycall + +Server implements UnaryCall which immediately returns a SimpleResponse with a +payload body of size `SimpleRequest.response_size` bytes and type as appropriate +for the `SimpleRequest.response_type`. If the server does not support the +`response_type`, then it should fail the RPC with `INVALID_ARGUMENT`. + +### CacheableUnaryCall +[CacheableUnaryCall]: #cacheableunarycall + +Server gets the default SimpleRequest proto as the request. The content of the +request is ignored. It returns the SimpleResponse proto with the payload set +to current timestamp. The timestamp is an integer representing current time +with nanosecond resolution. This integer is formatted as ASCII decimal in the +response. The format is not really important as long as the response payload +is different for each request. In addition it adds + 1. cache control headers such that the response can be cached by proxies in + the response path. Server should be behind a caching proxy for this test + to pass. Currently we set the max-age to 60 seconds. + +### CompressedResponse +[CompressedResponse]: #compressedresponse + +When the client sets `response_compressed` to true, the server's response is +sent back compressed. Note that `response_compressed` is present on both +`SimpleRequest` (unary) and `StreamingOutputCallRequest` (streaming). + +### CompressedRequest +[CompressedRequest]: #compressedrequest + +When the client sets `expect_compressed` to true, the server expects the client +request to be compressed. If it's not, it fails the RPC with `INVALID_ARGUMENT`. +Note that `response_compressed` is present on both `SimpleRequest` (unary) and +`StreamingOutputCallRequest` (streaming). + +### StreamingInputCall +[StreamingInputCall]: #streaminginputcall + +Server implements StreamingInputCall which upon half close immediately returns +a StreamingInputCallResponse where aggregated_payload_size is the sum of all +request payload bodies received. + +### StreamingOutputCall +[StreamingOutputCall]: #streamingoutputcall + +Server implements StreamingOutputCall by replying, in order, with one +StreamingOutputCallResponse for each ResponseParameters in +StreamingOutputCallRequest. Each StreamingOutputCallResponse should have a +payload body of size ResponseParameters.size bytes, as specified by its +respective ResponseParameters. After sending all responses, it closes with OK. + +### FullDuplexCall +[FullDuplexCall]: #fullduplexcall + +Server implements FullDuplexCall by replying, in order, with one +StreamingOutputCallResponse for each ResponseParameters in each +StreamingOutputCallRequest. Each StreamingOutputCallResponse should have a +payload body of size ResponseParameters.size bytes, as specified by its +respective ResponseParameters. After receiving half close and sending all +responses, it closes with OK. + +### Echo Status +[Echo Status]: #echo-status +When the client sends a response_status in the request payload, the server closes +the stream with the status code and message contained within said response_status. +The server will not process any further messages on the stream sent by the client. +This can be used by clients to verify correct handling of different status codes and +associated status messages end-to-end. + +### Echo Metadata +[Echo Metadata]: #echo-metadata +When the client sends metadata with the key `"x-grpc-test-echo-initial"` with its +request, the server sends back exactly this key and the corresponding value back to +the client as part of initial metadata. When the client sends metadata with the key +`"x-grpc-test-echo-trailing-bin"` with its request, the server sends back exactly this +key and the corresponding value back to the client as trailing metadata. + +### Observe ResponseParameters.interval_us +[Observe ResponseParameters.interval_us]: #observe-responseparametersinterval_us + +In StreamingOutputCall and FullDuplexCall, server delays sending a +StreamingOutputCallResponse by the ResponseParameters' `interval_us` for that +particular response, relative to the last response sent. That is, `interval_us` +acts like a sleep *before* sending the response and accumulates from one +response to the next. + +Interaction with flow control is unspecified. + +### Echo Auth Information + +Status: Pending + +#### Echo Authenticated Username +[Echo Authenticated Username]: #echo-authenticated-username + +If a SimpleRequest has fill_username=true and that request was successfully +authenticated, then the SimpleResponse should have username filled with the +canonical form of the authenticated source. The canonical form is dependent on +the authentication method, but is likely to be a base 10 integer identifier or +an email address. + +#### Echo OAuth scope +[Echo OAuth Scope]: #echo-oauth-scope + +If a SimpleRequest has `fill_oauth_scope=true` and that request was successfully +authenticated via OAuth, then the SimpleResponse should have oauth_scope filled +with the scope of the method being invoked. + +Although a general server-side feature, most test servers won't implement this +feature. The TLS server `grpc-test.sandbox.googleapis.com:443` supports this +feature. It requires at least the OAuth scope +`https://www.googleapis.com/auth/xapi.zoo` for authentication to succeed. + +Discussion: + +Ideally, this would be communicated via metadata and not in the +request/response, but we want to use this test in code paths that don't yet +fully communicate metadata. diff --git a/doc/keepalive.md b/doc/keepalive.md new file mode 100644 index 00000000..ad461e71 --- /dev/null +++ b/doc/keepalive.md @@ -0,0 +1,52 @@ +# Keepalive User Guide for gRPC Core (and dependents) + +The keepalive ping is a way to check if a channel is currently working by sending HTTP2 pings over the transport. It is sent periodically, and if the ping is not acknowledged by the peer within a certain timeout period, the transport is disconnected. + +This guide documents the knobs within gRPC core to control the current behavior of the keepalive ping. + +The keepalive ping is controlled by two important channel arguments - + +* **GRPC_ARG_KEEPALIVE_TIME_MS** + * This channel argument controls the period (in milliseconds) after which a keepalive ping is sent on the transport. +* **GRPC_ARG_KEEPALIVE_TIMEOUT_MS** + * This channel argument controls the amount of time (in milliseconds) the sender of the keepalive ping waits for an acknowledgement. If it does not receive an acknowledgment within this time, it will close the connection. + +The above two channel arguments should be sufficient for most users, but the following arguments can also be useful in certain use cases. + +* **GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS** + * This channel argument if set to 1 (0 : false; 1 : true), allows keepalive pings to be sent even if there are no calls in flight. +* **GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA** + * This channel argument controls the maximum number of pings that can be sent when there is no data/header/window_update frame to be sent. GRPC Core will not continue sending pings if we run over the limit. Setting it to 0 allows sending pings without such a restriction. +* **GRPC_ARG_HTTP2_MIN_SENT_PING_INTERVAL_WITHOUT_DATA_MS** + * If there are no data/header/window_update frames being received on the transport, this channel argument controls the minimum time (in milliseconds) gRPC Core will wait between successive pings. +* **GRPC_ARG_HTTP2_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS** + * If there are no data/header/window_update frames being sent on the transport, this channel argument on the server side controls the minimum time (in milliseconds) that gRPC Core would expect between receiving successive pings. If the time between successive pings is less that than this time, then the ping will be considered a bad ping from the peer. Such a ping counts as a ‘ping strike’. +On the client side, this does not have any effect. +* **GRPC_ARG_HTTP2_MAX_PING_STRIKES** + * This arg controls the maximum number of bad pings that the server will tolerate before sending an HTTP2 GOAWAY frame and closing the transport. Setting it to 0 allows the server to accept any number of bad pings. + +### Defaults Values + +Channel Argument| Client|Server +----------------|-------|------ +GRPC_ARG_KEEPALIVE_TIME_MS|INT_MAX (disabled)|7200000 (2 hours) +GRPC_ARG_KEEPALIVE_TIMEOUT_MS|20000 (20 seconds)|20000 (20 seconds) +GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS|0 (false)|0 (false) +GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA|2|2 +GRPC_ARG_HTTP2_MIN_SENT_PING_INTERVAL_WITHOUT_DATA_MS|300000 (5 minutes)|300000 (5 minutes) +GRPC_ARG_HTTP2_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS|N/A|300000 (5 minutes) +GRPC_ARG_HTTP2_MAX_PING_STRIKES|N/A|2 + +### FAQ +* When is the keepalive timer started? + * The keepalive timer is started when a transport is done connecting (after handshake). +* What happens when the keepalive timer fires? + * When the keepalive timer fires, gRPC Core will try to send a keepalive ping on the transport. This ping can be blocked if - + * there is no active call on that transport and GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS is false. + * the number of pings already sent on the transport without any data has already exceeded GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA. + * the time elapsed since the previous ping is less than GRPC_ARG_HTTP2_MIN_SENT_PING_INTERVAL_WITHOUT_DATA_MS. + * If a keepalive ping is not blocked and is sent on the transport, then the keepalive watchdog timer is started which will close the transport if the ping is not acknowledged before it fires. +* Why am I receiving a GOAWAY with error code ENHANCE_YOUR_CALM? + * A server sends a GOAWAY with ENHANCE_YOUR_CALM if the client sends too many misbehaving pings. For example - + * if a server has GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS set to false and the client sends pings without there being any call in flight. + * if the client's GRPC_ARG_HTTP2_MIN_SENT_PING_INTERVAL_WITHOUT_DATA_MS setting is lower than the server's GRPC_ARG_HTTP2_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS. diff --git a/doc/load-balancing.md b/doc/load-balancing.md new file mode 100644 index 00000000..8ff94075 --- /dev/null +++ b/doc/load-balancing.md @@ -0,0 +1,146 @@ +Load Balancing in gRPC +====================== + +# Scope + +This document explains the design for load balancing within gRPC. + +# Background + +## Per-Call Load Balancing + +It is worth noting that load-balancing within gRPC happens on a per-call +basis, not a per-connection basis. In other words, even if all requests +come from a single client, we still want them to be load-balanced across +all servers. + +## Approaches to Load Balancing + +Prior to any gRPC specifics, we explore some usual ways to approach load +balancing. + +### Proxy Model + +Using a proxy provides a solid trustable client that can report load to the load +balancing system. Proxies typically require more resources to operate since they +have temporary copies of the RPC request and response. This model also increases +latency to the RPCs. + +The proxy model was deemed inefficient when considering request heavy services +like storage. + +### Balancing-aware Client + +This thicker client places more of the load balancing logic in the client. For +example, the client could contain many load balancing policies (Round Robin, +Random, etc) used to select servers from a list. In this model, a list of +servers would be either statically configured in the client, provided by the +name resolution system, an external load balancer, etc. In any case, the client +is responsible for choosing the preferred server from the list. + +One of the drawbacks of this approach is writing and maintaining the load +balancing policies in multiple languages and/or versions of the clients. These +policies can be fairly complicated. Some of the algorithms also require client +to server communication so the client would need to get thicker to support +additional RPCs to get health or load information in addition to sending RPCs +for user requests. + +It would also significantly complicate the client's code: the new design hides +the load balancing complexity of multiple layers and presents it as a simple +list of servers to the client. + +### External Load Balancing Service + +The client load balancing code is kept simple and portable, implementing +well-known algorithms (e.g., Round Robin) for server selection. +Complex load balancing algorithms are instead provided by the load +balancer. The client relies on the load balancer to provide _load +balancing configuration_ and _the list of servers_ to which the client +should send requests. The balancer updates the server list as needed +to balance the load as well as handle server unavailability or health +issues. The load balancer will make any necessary complex decisions and +inform the client. The load balancer may communicate with the backend +servers to collect load and health information. + +# Requirements + +## Simple API and client + +The gRPC client load balancing code must be simple and portable. The +client should only contain simple algorithms (e.g., Round Robin) for +server selection. For complex algorithms, the client should rely on +a load balancer to provide load balancing configuration and the list of +servers to which the client should send requests. The balancer will update +the server list as needed to balance the load as well as handle server +unavailability or health issues. The load balancer will make any necessary +complex decisions and inform the client. The load balancer may communicate +with the backend servers to collect load and health information. + +## Security + +The load balancer may be separate from the actual server backends and a +compromise of the load balancer should only lead to a compromise of the +loadbalancing functionality. In other words, a compromised load balancer should +not be able to cause a client to trust a (potentially malicious) backend server +any more than in a comparable situation without loadbalancing. + +# Architecture + +## Overview + +The primary mechanism for load-balancing in gRPC is external +load-balancing, where an external load balancer provides simple clients +with an up-to-date list of servers. + +The gRPC client does support an API for built-in load balancing policies. +However, there are only a small number of these (one of which is the +`grpclb` policy, which implements external load balancing), and users +are discouraged from trying to extend gRPC by adding more. Instead, new +load balancing policies should be implemented in external load balancers. + +## Workflow + +Load-balancing policies fit into the gRPC client workflow in between +name resolution and the connection to the server. Here's how it all +works: + +![image](images/load-balancing.png) + +1. On startup, the gRPC client issues a [name resolution](naming.md) request + for the server name. The name will resolve to one or more IP addresses, + each of which will indicate whether it is a server address or + a load balancer address, and a [service config](service_config.md) + that indicates which client-side load-balancing policy to use (e.g., + `round_robin` or `grpclb`). +2. The client instantiates the load balancing policy. + - Note: If any one of the addresses returned by the resolver is a balancer + address, then the client will use the `grpclb` policy, regardless + of what load-balancing policy was requested by the service config. + Otherwise, the client will use the load-balancing policy requested + by the service config. If no load-balancing policy is requested + by the service config, then the client will default to a policy + that picks the first available server address. +3. The load balancing policy creates a subchannel to each server address. + - For all policies *except* `grpclb`, this means one subchannel for each + address returned by the resolver. Note that these policies + ignore any balancer addresses returned by the resolver. + - In the case of the `grpclb` policy, the workflow is as follows: + 1. The policy opens a stream to one of the balancer addresses returned + by the resolver. It asks the balancer for the server addresses to + use for the server name originally requested by the client (i.e., + the same one originally passed to the name resolver). + - Note: In the `grpclb` policy, the non-balancer addresses returned + by the resolver are used as a fallback in case no balancers can be + contacted when the LB policy is started. + 2. The gRPC servers to which the load balancer is directing the client + may report load to the load balancers, if that information is needed + by the load balancer's configuration. + 3. The load balancer returns a server list to the gRPC client's `grpclb` + policy. The `grpclb` policy will then create a subchannel to each of + server in the list. +4. For each RPC sent, the load balancing policy decides which + subchannel (i.e., which server) the RPC should be sent to. + - In the case of the `grpclb` policy, the client will send requests + to the servers in the order in which they were returned by the load + balancer. If the server list is empty, the call will block until a + non-empty one is received. diff --git a/doc/naming.md b/doc/naming.md new file mode 100644 index 00000000..42045fd8 --- /dev/null +++ b/doc/naming.md @@ -0,0 +1,77 @@ +# gRPC Name Resolution + +## Overview + +gRPC supports DNS as the default name-system. A number of alternative +name-systems are used in various deployments. We support an API that is +general enough to support a range of name-systems and the corresponding +syntax for names. The gRPC client library in various languages will +provide a plugin mechanism so resolvers for different name-systems can +be plugged in. + +## Detailed Design + +### Name Syntax + +A fully qualified, self contained name used for gRPC channel construction +uses URI syntax as defined in [RFC 3986](https://tools.ietf.org/html/rfc3986). + +The URI scheme indicates what resolver plugin to use. If no scheme +prefix is specified or the scheme is unknown, the `dns` scheme is used +by default. + +The URI path indicates the name to be resolved. + +Most gRPC implementations support the following URI schemes: + +- `dns:[//authority/]host[:port]` -- DNS (default) + - `host` is the host to resolve via DNS. + - `port` is the port to return for each address. If not specified, + 443 is used (but some implementations default to 80 for insecure + channels). + - `authority` indicates the DNS server to use, although this is only + supported by some implementations. (In C-core, the default DNS + resolver does not support this, but the c-ares based resolver + supports specifying this in the form "IP:port".) + +- `unix:path` or `unix://absolute_path` -- Unix domain sockets (Unix systems only) + - `path` indicates the location of the desired socket. + - In the first form, the path may be relative or absolute; in the + second form, the path must be absolute (i.e., there will actually be + three slashes, two prior to the path and another to begin the + absolute path). + +The following schemes are supported by the gRPC C-core implementation, +but may not be supported in other languages: + +- `ipv4:address[:port][,address[:port],...]` -- IPv4 addresses + - Can specify multiple comma-delimited addresses of the form `address[:port]`: + - `address` is the IPv4 address to use. + - `port` is the port to use. If not specified, 443 is used. + +- `ipv6:address[:port][,address[:port],...]` -- IPv6 addresses + - Can specify multiple comma-delimited addresses of the form `address[:port]`: + - `address` is the IPv6 address to use. To use with a `port` the `address` + must enclosed in literal square brackets (`[` and `]`). Example: + `ipv6:[2607:f8b0:400e:c00::ef]:443` or `ipv6:[::]:1234` + - `port` is the port to use. If not specified, 443 is used. + +In the future, additional schemes such as `etcd` could be added. + +### Resolver Plugins + +The gRPC client library will use the specified scheme to pick the right +resolver plugin and pass it the fully qualified name string. + +Resolvers should be able to contact the authority and get a resolution +that they return back to the gRPC client library. The returned contents +include: + +- A list of resolved addresses (both IP address and port). Each address + may have a set of arbitrary attributes (key/value pairs) associated with + it, which can be used to communicate information from the resolver to the + [load balancing](load-balancing.md) policy. +- A [service config](service_config.md). + +The plugin API allows the resolvers to continuously watch an endpoint +and return updated resolutions as needed. diff --git a/doc/python/server_reflection.md b/doc/python/server_reflection.md new file mode 100644 index 00000000..8bffdaa5 --- /dev/null +++ b/doc/python/server_reflection.md @@ -0,0 +1,66 @@ +# gRPC Python Server Reflection + +This document shows how to use gRPC Server Reflection in gRPC Python. +Please see [C++ Server Reflection Tutorial] for general information +and more examples how to use server reflection. + +## Enable server reflection in Python servers + +gRPC Python Server Reflection is an add-on library. To use it, first install +the [grpcio-reflection] PyPI package into your project. + +Note that with Python you need to manually register the service +descriptors with the reflection service implementation when creating a server +(this isn't necessary with e.g. C++ or Java) +```python +# add the following import statement to use server reflection +from grpc_reflection.v1alpha import reflection +# ... +def serve(): + server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) + helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server) + # the reflection service will be aware of "Greeter" and "ServerReflection" services. + SERVICE_NAMES = ( + helloworld_pb2.DESCRIPTOR.services_by_name['Greeter'].full_name, + reflection.SERVICE_NAME, + ) + reflection.enable_server_reflection(SERVICE_NAMES, server) + server.add_insecure_port('[::]:50051') + server.start() +``` + +Please see [greeter_server_with_reflection.py] in the examples directory for the full +example, which extends the gRPC [Python `Greeter` example] on a reflection-enabled server. + +After starting the server, you can verify that the server reflection +is working properly by using the [`grpc_cli` command line tool]: + + ```sh + $ grpc_cli ls localhost:50051 + ``` + + output: + ```sh + grpc.reflection.v1alpha.ServerReflection + helloworld.Greeter + ``` + + For more examples and instructions how to use the `grpc_cli` tool, + please refer to the [`grpc_cli` documentation] and the + [C++ Server Reflection Tutorial]. + +## Additional Resources + +The [Server Reflection Protocol] provides detailed +information about how the server reflection works and describes the server reflection +protocol in detail. + + +[C++ Server Reflection Tutorial]: ../server_reflection_tutorial.md +[grpcio-reflection]: https://pypi.org/project/grpcio-reflection/ +[greeter_server_with_reflection.py]: https://github.com/grpc/grpc/blob/master/examples/python/helloworld/greeter_server_with_reflection.py +[Python `Greeter` example]: https://github.com/grpc/grpc/tree/master/examples/python/helloworld +[`grpc_cli` command line tool]: https://github.com/grpc/grpc/blob/master/doc/command_line_tool.md +[`grpc_cli` documentation]: ../command_line_tool.md +[C++ Server Reflection Tutorial]: ../server_reflection_tutorial.md +[Server Reflection Protocol]: ../server-reflection.md diff --git a/doc/python/sphinx/_static/custom.css b/doc/python/sphinx/_static/custom.css new file mode 100644 index 00000000..d961c389 --- /dev/null +++ b/doc/python/sphinx/_static/custom.css @@ -0,0 +1,3 @@ +dl.field-list > dt { + word-break: keep-all !important; +} diff --git a/doc/python/sphinx/conf.py b/doc/python/sphinx/conf.py new file mode 100644 index 00000000..6e4bfab7 --- /dev/null +++ b/doc/python/sphinx/conf.py @@ -0,0 +1,110 @@ +# Copyright 2018 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# -- Path setup -------------------------------------------------------------- + +import os +import sys +PYTHON_FOLDER = os.path.join(os.path.dirname(os.path.realpath(__file__)), '..', + '..', '..', 'src', 'python') +sys.path.insert(0, os.path.join(PYTHON_FOLDER, 'grpcio')) +sys.path.insert(0, os.path.join(PYTHON_FOLDER, 'grpcio_channelz')) +sys.path.insert(0, os.path.join(PYTHON_FOLDER, 'grpcio_health_checking')) +sys.path.insert(0, os.path.join(PYTHON_FOLDER, 'grpcio_reflection')) +sys.path.insert(0, os.path.join(PYTHON_FOLDER, 'grpcio_status')) +sys.path.insert(0, os.path.join(PYTHON_FOLDER, 'grpcio_testing')) + +# -- Project information ----------------------------------------------------- + +project = 'gRPC Python' +copyright = '2020, The gRPC Authors' +author = 'The gRPC Authors' + +# Import generated grpc_version after the path been modified +import grpc_version +version = '.'.join(grpc_version.VERSION.split('.')[:3]) +release = grpc_version.VERSION +if 'dev' in grpc_version.VERSION: + branch = 'master' +else: + branch = 'v%s.%s.x' % tuple(grpc_version.VERSION.split('.')[:2]) + +# -- General configuration --------------------------------------------------- + +templates_path = ['_templates'] +source_suffix = ['.rst', '.md'] +master_doc = 'index' +language = 'en' +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] +pygments_style = None + +# --- Extensions Configuration ----------------------------------------------- + +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.viewcode', + 'sphinx.ext.todo', + 'sphinx.ext.napoleon', + 'sphinx.ext.coverage', + 'sphinx.ext.autodoc.typehints', +] + +napoleon_google_docstring = True +napoleon_numpy_docstring = True +napoleon_include_special_with_doc = True + +autodoc_default_options = { + 'members': None, +} + +autodoc_mock_imports = [] + +autodoc_typehints = 'description' + +# -- HTML Configuration ------------------------------------------------- + +html_theme = 'alabaster' +html_theme_options = { + 'fixed_sidebar': True, + 'page_width': '1140px', + 'show_related': True, + 'analytics_id': 'UA-60127042-1', + 'description': grpc_version.VERSION, + 'show_powered_by': False, +} +html_static_path = ["_static"] + +# -- Options for manual page output ------------------------------------------ + +man_pages = [(master_doc, 'grpcio', 'grpcio Documentation', [author], 1)] + +# -- Options for Texinfo output ---------------------------------------------- + +texinfo_documents = [ + (master_doc, 'grpcio', 'grpcio Documentation', author, 'grpcio', + 'One line description of project.', 'Miscellaneous'), +] + +# -- Options for Epub output ------------------------------------------------- + +epub_title = project +epub_exclude_files = ['search.html'] + +# -- Options for todo extension ---------------------------------------------- + +todo_include_todos = True + +# -- Options for substitutions ----------------------------------------------- + +rst_epilog = '.. |grpc_types_link| replace:: https://github.com/grpc/grpc/blob/%s/include/grpc/impl/codegen/grpc_types.h' % branch diff --git a/doc/python/sphinx/glossary.rst b/doc/python/sphinx/glossary.rst new file mode 100644 index 00000000..a4daa31d --- /dev/null +++ b/doc/python/sphinx/glossary.rst @@ -0,0 +1,50 @@ +Glossary +================ + +.. glossary:: + + metadatum + A key-value pair included in the HTTP header. It is a + 2-tuple where the first entry is the key and the + second is the value, i.e. (key, value). The metadata key is an ASCII str, + and must be a valid HTTP header name. The metadata value can be + either a valid HTTP ASCII str, or bytes. If bytes are provided, + the key must end with '-bin', i.e. + ``('binary-metadata-bin', b'\\x00\\xFF')`` + + metadata + A sequence of metadatum. + + serializer + A callable function that encodes an object into bytes. Applications are + allowed to provide any customized serializer, so there isn't a restriction + for the input object (i.e. even ``None``). On the server-side, the + serializer is invoked with server handler's return value; on the + client-side, the serializer is invoked with outbound message objects. + + deserializer + A callable function that decodes bytes into an object. Same as serializer, + the returned object doesn't have restrictions (i.e. ``None`` allowed). The + deserializer is invoked with inbound message bytes on both the server side + and the client-side. + + wait_for_ready + If an RPC is issued but the channel is in the TRANSIENT_FAILURE or SHUTDOWN + states, the library cannot transmit the RPC at the moment. By default, the + gRPC library will fail such RPCs immediately. This is known as "fail fast." + RPCs will not fail as a result of the channel being in other states + (CONNECTING, READY, or IDLE). + + When the wait_for_ready option is specified, the library will queue RPCs + until the channel is READY. Any submitted RPCs may still fail before the + READY state is reached for other reasons, e.g., the client channel has been + shut down or the RPC's deadline has been reached. + + channel_arguments + A list of key-value pairs to configure the underlying gRPC Core channel or + server object. Channel arguments are meant for advanced usages and contain + experimental API (some may not labeled as experimental). Full list of + available channel arguments and documentation can be found under the + "grpc_arg_keys" section of "grpc_types.h" header file (|grpc_types_link|). + For example, if you want to disable TCP port reuse, you may construct + channel arguments like: ``options = (('grpc.so_reuseport', 0),)``. diff --git a/doc/python/sphinx/grpc.rst b/doc/python/sphinx/grpc.rst new file mode 100644 index 00000000..67867a68 --- /dev/null +++ b/doc/python/sphinx/grpc.rst @@ -0,0 +1,188 @@ +gRPC +============= + +.. module:: grpc + +Tutorial +-------- + +If you want to see gRPC in action first, visit the `Python Quickstart `_. +Or, if you would like dive in with more extensive usage of gRPC Python, check `gRPC Basics - Python `_ out. + + +Example +------- + +Go to `gRPC Python Examples `_ + + +Module Contents +--------------- + +Version +^^^^^^^ + +The version string is available as :code:`grpc.__version__`. + +Create Client +^^^^^^^^^^^^^ + +.. autofunction:: insecure_channel +.. autofunction:: secure_channel +.. autofunction:: intercept_channel + + +Create Client Credentials +^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. autofunction:: ssl_channel_credentials +.. autofunction:: metadata_call_credentials +.. autofunction:: access_token_call_credentials +.. autofunction:: composite_call_credentials +.. autofunction:: composite_channel_credentials +.. autofunction:: local_channel_credentials(local_connect_type=grpc.LocalConnectionType.LOCAL_TCP) + + +Create Server +^^^^^^^^^^^^^ + +.. autofunction:: server + + +Create Server Credentials +^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. autofunction:: ssl_server_credentials +.. autofunction:: ssl_server_certificate_configuration +.. autofunction:: dynamic_ssl_server_credentials +.. autofunction:: local_server_credentials(local_connect_type=grpc.LocalConnectionType.LOCAL_TCP) + + +Local Connection Type +^^^^^^^^^^^^^^^^^^^^^ + +.. autoclass:: LocalConnectionType + + +RPC Method Handlers +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. autofunction:: unary_unary_rpc_method_handler +.. autofunction:: unary_stream_rpc_method_handler +.. autofunction:: stream_unary_rpc_method_handler +.. autofunction:: stream_stream_rpc_method_handler +.. autofunction:: method_handlers_generic_handler + + +Channel Ready Future +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. autofunction:: channel_ready_future + + +Channel Connectivity +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. autoclass:: ChannelConnectivity + + +gRPC Status Code +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. autoclass:: StatusCode + + +Channel Object +^^^^^^^^^^^^^^ + +.. autoclass:: Channel + + +Server Object +^^^^^^^^^^^^^ + +.. autoclass:: Server + + +Authentication & Authorization Objects +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. autoclass:: ChannelCredentials +.. autoclass:: CallCredentials +.. autoclass:: AuthMetadataContext +.. autoclass:: AuthMetadataPluginCallback +.. autoclass:: AuthMetadataPlugin +.. autoclass:: ServerCredentials +.. autoclass:: ServerCertificateConfiguration + + +gRPC Exceptions +^^^^^^^^^^^^^^^ + +.. autoexception:: RpcError + + +Shared Context +^^^^^^^^^^^^^^ + +.. autoclass:: RpcContext + + +Client-Side Context +^^^^^^^^^^^^^^^^^^^^^^^ + +.. autoclass:: Call + + +Client-Side Interceptor +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. autoclass:: ClientCallDetails +.. autoclass:: UnaryUnaryClientInterceptor +.. autoclass:: UnaryStreamClientInterceptor +.. autoclass:: StreamUnaryClientInterceptor +.. autoclass:: StreamStreamClientInterceptor + + +Service-Side Context +^^^^^^^^^^^^^^^^^^^^ + +.. autoclass:: ServicerContext + + +Service-Side Handler +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. autoclass:: RpcMethodHandler +.. autoclass:: HandlerCallDetails +.. autoclass:: GenericRpcHandler +.. autoclass:: ServiceRpcHandler + + +Service-Side Interceptor +^^^^^^^^^^^^^^^^^^^^^^^^ + +.. autoclass:: ServerInterceptor + + +Multi-Callable Interfaces +^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. autoclass:: UnaryUnaryMultiCallable +.. autoclass:: UnaryStreamMultiCallable +.. autoclass:: StreamUnaryMultiCallable +.. autoclass:: StreamStreamMultiCallable + + +Future Interfaces +^^^^^^^^^^^^^^^^^ + +.. autoexception:: FutureTimeoutError +.. autoexception:: FutureCancelledError +.. autoclass:: Future + + +Compression +^^^^^^^^^^^ + +.. autoclass:: Compression diff --git a/doc/python/sphinx/grpc_asyncio.rst b/doc/python/sphinx/grpc_asyncio.rst new file mode 100644 index 00000000..16267d94 --- /dev/null +++ b/doc/python/sphinx/grpc_asyncio.rst @@ -0,0 +1,132 @@ +gRPC AsyncIO API +================ + +.. module:: grpc.experimental.aio + +Overview +-------- + +gRPC AsyncIO API is the **new version** of gRPC Python whose architecture is +tailored to AsyncIO. Underlying, it utilizes the same C-extension, gRPC C-Core, +as existing stack, and it replaces all gRPC IO operations with methods provided +by the AsyncIO library. + +This stack currently is under active development. Feel free to offer +suggestions by opening issues on our GitHub repo `grpc/grpc `_. + +The design doc can be found here as `gRFC `_. + + +Caveats +------- + +gRPC Async API objects may only be used on the thread on which they were +created. AsyncIO doesn't provide thread safety for most of its APIs. + + +Module Contents +--------------- + +Enable AsyncIO in gRPC +^^^^^^^^^^^^^^^^^^^^^^ + +.. function:: init_grpc_aio + + Enable AsyncIO for gRPC Python. + + This function is idempotent and it should be invoked before creation of + AsyncIO stack objects. Otherwise, the application might deadlock. + + This function configurates the gRPC C-Core to invoke AsyncIO methods for IO + operations (e.g., socket read, write). The configuration applies to the + entire process. + + After invoking this function, making blocking function calls in coroutines + or in the thread running event loop will block the event loop, potentially + starving all RPCs in the process. Refer to the Python language + documentation on AsyncIO for more details (`running-blocking-code `_). + + +Create Channel +^^^^^^^^^^^^^^ + +Channels are the abstraction of clients, where most of networking logic +happens, for example, managing one or more underlying connections, name +resolution, load balancing, flow control, etc.. If you are using ProtoBuf, +Channel objects works best when further encapsulate into stub objects, then the +application can invoke remote functions as if they are local functions. + +.. autofunction:: insecure_channel +.. autofunction:: secure_channel + + +Channel Object +^^^^^^^^^^^^^^ + +.. autoclass:: Channel + + +Create Server +^^^^^^^^^^^^^ + +.. autofunction:: server + + +Server Object +^^^^^^^^^^^^^ + +.. autoclass:: Server + + +gRPC Exceptions +^^^^^^^^^^^^^^^ + +.. autoexception:: BaseError +.. autoexception:: UsageError +.. autoexception:: AbortError +.. autoexception:: InternalError +.. autoexception:: AioRpcError + + +Shared Context +^^^^^^^^^^^^^^^^^^^^ + +.. autoclass:: RpcContext + + +Client-Side Context +^^^^^^^^^^^^^^^^^^^^^^^ + +.. autoclass:: Call +.. autoclass:: UnaryUnaryCall +.. autoclass:: UnaryStreamCall +.. autoclass:: StreamUnaryCall +.. autoclass:: StreamStreamCall + + +Server-Side Context +^^^^^^^^^^^^^^^^^^^^^^^ + +.. autoclass:: ServicerContext + + +Client-Side Interceptor +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. autoclass:: ClientCallDetails +.. autoclass:: InterceptedUnaryUnaryCall +.. autoclass:: UnaryUnaryClientInterceptor + +.. Service-Side Context +.. ^^^^^^^^^^^^^^^^^^^^ + +.. .. autoclass:: ServicerContext + + +Multi-Callable Interfaces +^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. autoclass:: UnaryUnaryMultiCallable +.. autoclass:: UnaryStreamMultiCallable() +.. autoclass:: StreamUnaryMultiCallable() +.. autoclass:: StreamStreamMultiCallable() diff --git a/doc/python/sphinx/grpc_channelz.rst b/doc/python/sphinx/grpc_channelz.rst new file mode 100644 index 00000000..f65793a0 --- /dev/null +++ b/doc/python/sphinx/grpc_channelz.rst @@ -0,0 +1,12 @@ +gRPC Channelz +==================== + +What is gRPC Channelz? +--------------------------------------------- + +Design Document `gRPC Channelz `_ + +Module Contents +--------------- + +.. automodule:: grpc_channelz.v1.channelz diff --git a/doc/python/sphinx/grpc_health_checking.rst b/doc/python/sphinx/grpc_health_checking.rst new file mode 100644 index 00000000..b344e34a --- /dev/null +++ b/doc/python/sphinx/grpc_health_checking.rst @@ -0,0 +1,7 @@ +gRPC Health Checking +==================== + +Module Contents +--------------- + +.. autoclass:: grpc_health.v1.health.HealthServicer diff --git a/doc/python/sphinx/grpc_reflection.rst b/doc/python/sphinx/grpc_reflection.rst new file mode 100644 index 00000000..043f2edb --- /dev/null +++ b/doc/python/sphinx/grpc_reflection.rst @@ -0,0 +1,19 @@ +gRPC Reflection +==================== + +What is gRPC reflection? +--------------------------------------------- + +Check this out `gRPC Python Server Reflection `_ + + +Example +------- + +Refer to the GitHub `reflection example `_ + + +Module Contents +--------------- + +.. automodule:: grpc_reflection.v1alpha.reflection diff --git a/doc/python/sphinx/grpc_status.rst b/doc/python/sphinx/grpc_status.rst new file mode 100644 index 00000000..2b9a324e --- /dev/null +++ b/doc/python/sphinx/grpc_status.rst @@ -0,0 +1,7 @@ +gRPC Status +==================== + +Module Contents +--------------- + +.. automodule:: grpc_status.rpc_status diff --git a/doc/python/sphinx/grpc_testing.rst b/doc/python/sphinx/grpc_testing.rst new file mode 100644 index 00000000..adfeb8b3 --- /dev/null +++ b/doc/python/sphinx/grpc_testing.rst @@ -0,0 +1,7 @@ +gRPC Testing +==================== + +Module Contents +--------------- + +.. automodule:: grpc_testing diff --git a/doc/python/sphinx/index.rst b/doc/python/sphinx/index.rst new file mode 100644 index 00000000..c033542c --- /dev/null +++ b/doc/python/sphinx/index.rst @@ -0,0 +1,27 @@ +Welcome to gRPC Python's documentation! +======================================= + +Version: |version| Release: |release| + +API Reference +============= + +.. toctree:: + :caption: Contents: + + grpc + grpc_asyncio + grpc_channelz + grpc_health_checking + grpc_reflection + grpc_status + grpc_testing + glossary + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/doc/security_audit.md b/doc/security_audit.md new file mode 100644 index 00000000..313a9e6b --- /dev/null +++ b/doc/security_audit.md @@ -0,0 +1,70 @@ +# gRPC Security Audit + +A third-party security audit of gRPC C++ stack was performed by [Cure53](https://cure53.de) in October 2019. The full report can be found [here](https://github.com/grpc/grpc/tree/master/doc/grpc_security_audit.pdf). + +# Addressing grpc_security_audit + +The following describes how gRPC team has or will address each of the security issues pointed out in the report. + +## GRP-01-001 DoS through uninitialized pointer dereference + +GRP-01-001 was fixed in version 1.24.0 and above with https://github.com/grpc/grpc/pull/20351. The fix was also patched in version 1.23.1. + +## GRP-01-002 Refs to freed memory not automatically nulled +GRP-01-002 describes a programming pattern in gRPC Core where `gpr_free` is called and then the pointer is nulled afterwards. GRP-01-002 can be split into two concerns: 1) dangling pointer bugs and 2) the potential vulnerability of leveraging other bugs to access data through a freed pointer. + +Regarding 1), gRPC uses a suite of sanitizer tests (asan, tsan, etc) to detect and fix any memory-related bugs. gRPC is also in the process of moving to c++ and the standard library, enabling the use of smart pointers in Core and thus making it harder to generate memory-related bugs. There are also plans to remove `gpr_free` in general. + +Regarding 2), moving to smart pointers (in particular, unique_ptr) will help this issue as well. In addition, gRPC has continuous fuzzing tests to find and resolve security issues, and the pen test did not discover any concrete vulnerabilities in this area. + +Below is a list of alternatives that gRPC team considered. + + +### Alternative #1: Rewrite gpr_free to take void\*\* +One solution is to change the API of `gpr_free` so that it automatically nulls the given pointer after freeing it. + +``` +gpr_free (void** ptr) { + ... + *ptr = nullptr; +} +``` + +This defensive programming pattern would help protect gRPC from the potential exploits and latent dangling pointer bugs mentioned in the security report. + +However, performance would be a significant concern as we are now unconditionally adding a store to every gpr_free call, and there are potentially hundreds of these per RPC. At the RPC layer, this can add up to prohibitive costs. + +Maintainability is also an issue since this approach impacts use of `*const`. Member pointers that are set in the initialization list of a constructor and not changed thereafter can be declared `*const`. This is a useful compile-time check if the member is taking ownership of something that was passed in by argument or allocated through a helper function called by the constructor initializer list. If this thing needs to be `gpr_free`'d using the proposed syntax, it can no longer be `*const` and we lose these checks (or we have to const_cast it which is also error-prone). + +Another concern is readability - this `gpr_free` interface is less intuitive than the current one. + +Yet another concern is that the use of non-smart pointers doesn’t imply ownership - it doesn’t protect against spare copies of the same pointers. + +### Alternative #2: Add another gpr_free to the Core API +Adding an alternative `gpr_free` that nulls the given pointer is undesirable because we cannot enforce that we’re using this version of `gpr_free` everywhere we need to. It doesn’t solve the original problem because it doesn’t reduce the chance of programmer error. + +Like alternative #1, this solution doesn’t protect against spare copies of the same pointers and is subject to the same maintainability concerns. + +### Alternative #3: Rewrite gpr_free to take void\*& +``` +gpr_free (void*& ptr) { + ... + ptr = nullptr; +} +``` +This falls into the same pitfalls as solution #1 and furthermore is C89 non-compliant, which is a current requirement for `gpr_free`. Moreover, Google’s style guide discourages non-const reference parameters, so this is even less desirable than solution #1. + + +### Conclusion +Because of performance and maintainability concerns, GRP-01-002 will be addressed through the ongoing work to move gRPC Core to C++ and smart pointers and the future work of removing `gpr_free` in general. We will continue to leverage our sanitizer and fuzzing tests to help expose vulnerabilities. + +## GRP-01-003 Calls to malloc suffer from potential integer overflows +The vulnerability, as defined by the report, is that calls to `gpr_malloc` in the C-core codebase may suffer from potential integer overflow in cases where we multiply the array element size by the size of the array. The penetration testers did not identify a concrete place where this occurred, but rather emphasized that the coding pattern itself had potential to lead to vulnerabilities. The report’s suggested solution for GRP-01-003 was to create a `calloc(size_t nmemb, size_t size)` wrapper that contains integer overflow checks. + +However, gRPC team firmly believes that gRPC Core should only use integer overflow checks in the places where they’re needed; for example, any place where remote input influences the input to `gpr_malloc` in an unverified way. This is because bounds-checking is very expensive at the RPC layer. + +Determining exactly where bounds-checking is needed requires an audit of tracing each `gpr_malloc` (or `gpr_realloc` or `gpr_zalloc`) call up the stack to determine if the sufficient bounds-checking was performed. This kind of audit, done manually, is fairly expensive engineer-wise. + +### Conclusion +GRP-01-003 will be addressed through leveraging gRPC Core fuzzer tests to actively identify and resolve any integer overflow issues. If any issues are identified, we may create a `gpr_safe_malloc(size_t nmemb, size_t size)` wrapper to consolidate bounds-checking in one place. This function will *not* zero out memory because of performance concerns, and so will not be a calloc-style wrapper. + diff --git a/doc/server-reflection.md b/doc/server-reflection.md new file mode 100644 index 00000000..0cc30a4e --- /dev/null +++ b/doc/server-reflection.md @@ -0,0 +1,197 @@ +GRPC Server Reflection Protocol +=============================== + +This document describes server reflection as an optional extension for servers +to assist clients in runtime construction of requests without having stub +information precompiled into the client. + +The primary usecase for server reflection is to write (typically) command line +debugging tools for talking to a grpc server. In particular, such a tool will +take in a method and a payload (in human readable text format) send it to the +server (typically in binary proto wire format), and then take the response and +decode it to text to present to the user. + +This broadly involves two problems: determining what formats (which protobuf +messages) a server’s method uses, and determining how to convert messages +between human readable format and the (likely binary) wire format. + +## Method reflection + +We want to be able to answer the following queries: + 1. What methods does a server export? + 2. For a particular method, how do we call it? +Specifically, what are the names of the methods, are those methods unary or +streaming, and what are the types of the argument and result? + +``` +#TODO(dklempner): link to an actual .proto later. +package grpc.reflection.v1alpha; + +message ListApisRequest { +} + +message ListApisResponse { + repeated google.protobuf.Api apis = 1; +} + +message GetMethodRequest { + string method = 1; +} +message GetMethodResponse { + google.protobuf.Method method = 1; +} + +service ServerReflection { + rpc ListApis (ListApisRequest) returns (ListApisResponse); + rpc GetMethod (GetMethodRequest) returns (GetMethodResponse); +} +``` + +Note that a server is under no obligation to return a complete list of all +methods it supports. For example, a reverse proxy may support server reflection +for methods implemented directly on the proxy but not enumerate all methods +supported by its backends. + + +### Open questions on method reflection + * Consider how to extend this protocol to support non-protobuf methods. + +## Argument reflection +The second half of the problem is converting between the human readable +input/output of a debugging tool and the binary format understood by the +method. + +This is obviously dependent on protocol type. At one extreme, if both the +server and the debugging tool accept JSON, there may be no need for such a +conversion in the first place. At the opposite extreme, a server using a custom +binary format has no hope of being supported by a generic system. The +intermediate interesting common case is a server which speaks binary-proto and +a debugging client which speaks either ascii-proto or json-proto. + +One approach would be to require servers directly support human readable input. +In the future method reflection may be extended to document such support, +should it become widespread or standardized. + +## Protobuf descriptors + +A second would be for the server to export its +google::protobuf::DescriptorDatabase over the wire. This is very easy to +implement in C++, and Google implementations of a similar protocol already +exist in C++, Go, and Java. + +This protocol mostly returns FileDescriptorProtos, which are a proto encoding +of a parsed .proto file. It supports four queries: + 1. The FileDescriptorProto for a given file name + 2. The FileDescriptorProto for the file with a given symbol + 3. The FileDescriptorProto for the file with a given extension + 4. The list of known extension tag numbers of a given type + +These directly correspond to the methods of +google::protobuf::DescriptorDatabase. Note that this protocol includes support +for extensions, which have been removed from proto3 but are still in widespread +use in Google’s codebase. + +Because most usecases will require also requesting the transitive dependencies +of requested files, the queries will also return all transitive dependencies of +the returned file. Should interesting usecases for non-transitive queries turn +up later, we can easily extend the protocol to support them. + +### Reverse proxy traversal + +One potential issue with naive reverse proxies is that, while any individual +server will have a consistent and valid picture of the proto DB which is +sufficient to handle incoming requests, incompatibilities will arise if the +backend servers have a mix of builds. For example, if a given message is moved +from foo.proto to bar.proto, and the client requests foo.proto from an old +server and bar.proto from a new server, the resulting database will have a +double definition. + +To solve this problem, the protocol is structured as a bidirectional stream, +ensuring all related requests go to a single server. This has the additional +benefit that overlapping recursive requests don’t require sending a lot of +redundant information, because there is a single stream to maintain context +between queries. + +``` +package grpc.reflection.v1alpha; +message DescriptorDatabaseRequest { + string host = 1; + oneof message_request { + string files_for_file_name = 3; + string files_for_symbol_name = 4; + FileContainingExtensionRequest file_containing_extension = 5; + string list_all_extensions_of_type = 6; + } +} + +message FileContainingExtensionRequest { + string base_message = 1; + int64 extension_id = 2; +} + +message DescriptorDatabaseResponse { + string valid_host = 1; + DescriptorDatabaseRequest original_request = 2; + oneof message_response { + // These are proto2 type google.protobuf.FileDescriptorProto, but + // we avoid taking a dependency on descriptor.proto, which uses + // proto2 only features, by making them opaque + // bytes instead + repeated bytes fd_proto = 4; + ListAllExtensionsResponse extensions_response = 5; + // Notably includes error code 5, NOT FOUND + int32 error_code = 6; + } +} + +message ListAllExtensionsResponse { + string base_type_name; + repeated int64 extension_number; +} + +service ProtoDescriptorDatabase { + rpc DescriptorDatabaseInfo(stream DescriptorDatabaseRequest) returns (stream DescriptorDatabaseResponse); +} +``` + +Any given request must either result in an error code or an answer, usually in +the form of a series of FileDescriptorProtos with the requested file itself +and all previously unsent transitive imports of that file. Servers may track +which FileDescriptorProtos have been sent on a given stream, for a given value +of valid_host, and avoid sending them repeatedly for overlapping requests. + +| message_request message | Result | +| --------------------------- | ----------------------------------------------- | +| files_for_file_name | transitive closure of file name | +| files_for_symbol_name | transitive closure file containing symbol | +| file_containing_extension | transitive closure of file containing a given extension number of a given symbol | +| list_all_extensions_of_type | ListAllExtensionsResponse containing all known extension numbers of a given type | + +At some point it would make sense to additionally also support any.proto’s +format. Note that known any.proto messages can be queried by symbol using this +protocol even without any such support, by parsing the url and extracting the +symbol name from it. + +## Language specific implementation thoughts +All of the information needed to implement Proto reflection is available to the +code generator, but I’m not certain we actually generate this in every +language. If the proto implementation in the language doesn’t have something +like google::protobuf::DescriptorPool the grpc implementation for that language +will need to index those FileDescriptorProtos by file and symbol and imports. + +One issue is that some grpc implementations are very loosely coupled with +protobufs; in such implementations it probably makes sense to split apart these +reflection APIs so as not to take an additional proto dependency. + +## Known Implementations + +Enabling server reflection differs language-to-language. Here are links to docs relevant to +each language: + +- [Java](https://github.com/grpc/grpc-java/blob/master/documentation/server-reflection-tutorial.md#enable-server-reflection) +- [Go](https://github.com/grpc/grpc-go/blob/master/Documentation/server-reflection-tutorial.md#enable-server-reflection) +- [C++](https://grpc.io/grpc/cpp/md_doc_server_reflection_tutorial.html) +- [C#](https://github.com/grpc/grpc/blob/master/doc/csharp/server_reflection.md) +- [Python](https://github.com/grpc/grpc/blob/master/doc/python/server_reflection.md) +- Ruby: not yet implemented [#2567](https://github.com/grpc/grpc/issues/2567) +- Node: not yet implemented [#2568](https://github.com/grpc/grpc/issues/2568) diff --git a/doc/server_reflection_tutorial.md b/doc/server_reflection_tutorial.md new file mode 100644 index 00000000..ccad0605 --- /dev/null +++ b/doc/server_reflection_tutorial.md @@ -0,0 +1,189 @@ +# gRPC Server Reflection Tutorial + +gRPC Server Reflection provides information about publicly-accessible gRPC +services on a server, and assists clients at runtime to construct RPC +requests and responses without precompiled service information. It is used by +gRPC CLI, which can be used to introspect server protos and send/receive test +RPCs. + +## Enable Server Reflection + +### Enable server reflection in C++ servers + +C++ Server Reflection is an add-on library, `libgrpc++_reflection`. To enable C++ +server reflection, you can link this library to your server binary. + +Some platforms (e.g. Ubuntu 11.10 onwards) only link in libraries that directly +contain symbols used by the application. On these platforms, LD flag +`--no-as-needed` is needed for dynamic linking and `--whole-archive` is +needed for static linking. + +This [Makefile](../examples/cpp/helloworld/Makefile#L37#L45) demonstrates +enabling c++ server reflection on Linux and MacOS. + +## Test services using Server Reflection + +After enabling Server Reflection in a server application, you can use gRPC CLI +to test its services. + +Instructions on how to use gRPC CLI can be found at +[command_line_tool.md](command_line_tool.md), or using `grpc_cli help` command. + +Here we use `examples/cpp/helloworld` as an example to show the use of gRPC +Server Reflection and gRPC CLI. First, we need to build gRPC CLI and setup an +example server with Server Reflection enabled. + +- Setup an example server + + Server Reflection has already been enabled in the + [Makefile](../examples/cpp/helloworld/Makefile) of the helloworld example. We + can simply make it and run the greeter_server. + + ```sh + $ make -C examples/cpp/helloworld + $ examples/cpp/helloworld/greeter_server & + ``` + +- Build gRPC CLI + + ```sh + make grpc_cli + cd bins/opt + ``` + + gRPC CLI binary `grpc_cli` can be found at `bins/opt/` folder. This tool is + still new and does not have a `make install` target yet. + +### List services + +`grpc_cli ls` command lists services and methods exposed at a given port + +- List all the services exposed at a given port + + ```sh + $ grpc_cli ls localhost:50051 + ``` + + output: + ```sh + helloworld.Greeter + grpc.reflection.v1alpha.ServerReflection + ``` + +- List one service with details + + `grpc_cli ls` command inspects a service given its full name (in the format of + \.\). It can print information with a long listing format + when `-l` flag is set. This flag can be used to get more details about a + service. + + ```sh + $ grpc_cli ls localhost:50051 helloworld.Greeter -l + ``` + + output: + ```sh + filename: helloworld.proto + package: helloworld; + service Greeter { + rpc SayHello(helloworld.HelloRequest) returns (helloworld.HelloReply) {} + } + + ``` + +### List methods + +- List one method with details + + `grpc_cli ls` command also inspects a method given its full name (in the + format of \.\.\). + + ```sh + $ grpc_cli ls localhost:50051 helloworld.Greeter.SayHello -l + ``` + + output: + ```sh + rpc SayHello(helloworld.HelloRequest) returns (helloworld.HelloReply) {} + ``` + +### Inspect message types + +We can use`grpc_cli type` command to inspect request/response types given the +full name of the type (in the format of \.\). + +- Get information about the request type + + ```sh + $ grpc_cli type localhost:50051 helloworld.HelloRequest + ``` + + output: + ```sh + message HelloRequest { + optional string name = 1; + } + ``` + +### Call a remote method + +We can send RPCs to a server and get responses using `grpc_cli call` command. + +- Call a unary method + + ```sh + $ grpc_cli call localhost:50051 SayHello "name: 'gRPC CLI'" + ``` + + output: + ```sh + message: "Hello gRPC CLI" + ``` + +## Use Server Reflection in a C++ client + +Server Reflection can be used by clients to get information about gRPC services +at runtime. We've provided a descriptor database called +[grpc::ProtoReflectionDescriptorDatabase](../test/cpp/util/proto_reflection_descriptor_database.h) +which implements the +[google::protobuf::DescriptorDatabase](https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.descriptor_database#DescriptorDatabase) +interface. It manages the communication between clients and reflection services +and the storage of received information. Clients can use it as using a local +descriptor database. + +- To use Server Reflection with grpc::ProtoReflectionDescriptorDatabase, first + initialize an instance with a grpc::Channel. + + ```c++ + std::shared_ptr channel = + grpc::CreateChannel(server_address, server_cred); + grpc::ProtoReflectionDescriptorDatabase reflection_db(channel); + ``` + +- Then use this instance to feed a + [google::protobuf::DescriptorPool](https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.descriptor#DescriptorPool). + + ```c++ + google::protobuf::DescriptorPool desc_pool(&reflection_db); + ``` + +- Example usage of this descriptor pool + + * Get Service/method descriptors. + + ```c++ + const google::protobuf::ServiceDescriptor* service_desc = + desc_pool->FindServiceByName("helloworld.Greeter"); + const google::protobuf::MethodDescriptor* method_desc = + desc_pool->FindMethodByName("helloworld.Greeter.SayHello"); + ``` + + * Get message type descriptors and create messages dynamically. + + ```c++ + const google::protobuf::Descriptor* request_desc = + desc_pool->FindMessageTypeByName("helloworld.HelloRequest"); + google::protobuf::DynamicMessageFactory dmf; + google::protobuf::Message* request = dmf.GetPrototype(request_desc)->New(); + ``` + diff --git a/doc/server_side_auth.md b/doc/server_side_auth.md new file mode 100644 index 00000000..5905626f --- /dev/null +++ b/doc/server_side_auth.md @@ -0,0 +1,61 @@ +Server-side API for Authenticating Clients +========================================== + +NOTE: This document describes how server-side authentication works in C-core based gRPC implementations only. In gRPC Java and Go, server side authentication is handled differently. +NOTE2: `CallCredentials` class is only valid for secure channels in C-Core. So, for connections under insecure channels, features below might not be available. + +## AuthContext + +To perform server-side authentication, gRPC exposes the *authentication context* for each call. The context exposes important authentication-related information about the RPC such as the type of security/authentication type being used and the peer identity. + +The authentication context is structured as a multi-map of key-value pairs - the *auth properties*. In addition to that, for authenticated RPCs, the set of properties corresponding to a selected key will represent the verified identity of the caller - the *peer identity*. + +The contents of the *auth properties* are populated by an *auth interceptor*. The interceptor also chooses which property key will act as the peer identity (e.g. for client certificate authentication this property will be `"x509_common_name"` or `"x509_subject_alternative_name"`). + +WARNING: AuthContext is the only reliable source of truth when it comes to authenticating RPCs. Using any other call/context properties for authentication purposes is wrong and inherently unsafe. + +#### Example AuthContext contents + +For secure channel using mutual TLS authentication with both client and server certificates (test certificates from this repository are used). + +Populated auth properties: +``` +"transport_security_type": "ssl" # connection is secured using TLS/SSL +"x509_common_name": "*.test.google.com" # from client's certificate +"x509_pem_cert": "-----BEGIN CERTIFICATE-----\n..." # client's PEM encoded certificate +"x509_subject_alternative_name": "*.test.google.fr" +"x509_subject_alternative_name": "waterzooi.test.google.be" +"x509_subject_alternative_name": "*.test.youtube.com" +"x509_subject_alternative_name": "192.168.1.3" +``` + +The peer identity is set of all properties named `"x509_subject_alternative_name"`: +``` +peer_identity_property_name = "x509_subject_alternative_name" +``` + +## AuthProperty + +Auth properties are elements of the AuthContext. They have a name (a key of type string) and a value which can be a string or binary data. + +## Auth Interceptors + +Auth interceptors are gRPC components that populate contents of the auth context based on gRPC's internal state and/or call metadata. +gRPC comes with some basic "interceptors" already built-in. + +WARNING: While there is a public API that allows anyone to write their own custom interceptor, please think twice before using it. +There are legitimate uses for custom interceptors but you should keep in mind that as auth interceptors essentially decide which RPCs are authenticated and which are not, their code is very sensitive from the security perspective and getting things wrong might have serious consequences. If unsure, we strongly recommend to rely on official & proven interceptors that come with gRPC. + +#### Available auth interceptors +- TLS/SSL certificate authentication (built into gRPC's security layer, automatically used whenever you use a secure connection) +- (coming soon) JWT auth token authentication +- more will be added over time + +## Status (by language) +C-core exposes low level API to access auth context contents and to implement an auth interceptor. +In C++, the auth interceptor API is exposed as `AuthMetadataProcessor`. + +A high level API to access AuthContext contents is available in these languages: +- C++ +- C# (implementation in-progress) +- other languages coming soon diff --git a/doc/service_config.md b/doc/service_config.md new file mode 100644 index 00000000..928f27bc --- /dev/null +++ b/doc/service_config.md @@ -0,0 +1,92 @@ +Service Config in gRPC +====================== + +# Objective + +The service config is a mechanism that allows service owners to publish +parameters to be automatically used by all clients of their service. + +# Format + +The format of the service config is defined by the +[`grpc.service_config.ServiceConfig` protocol buffer +message](https://github.com/grpc/grpc-proto/blob/master/grpc/service_config/service_config.proto). +Note that new fields may be added in the future as new functionality is +introduced. + +# Architecture + +A service config is associated with a server name. The [name +resolver](naming.md) plugin, when asked to resolve a particular server +name, will return both the resolved addresses and the service config. + +The name resolver returns the service config to the gRPC client in JSON form. +Individual resolver implementations determine where and in what format the +service config is stored. If the resolver implemention obtains the +service config in protobuf form, it must convert it to JSON using the +normal [protobuf to JSON translation +rules](https://developers.google.com/protocol-buffers/docs/proto3#json). +Alternatively, a resolver implementation may obtain the service config +already in JSON form, in which case it may return it directly. + +For details of how the DNS resolver plugin supports service configs, see +[gRFC A2: Service Config via +DNS](https://github.com/grpc/proposal/blob/master/A2-service-configs-in-dns.md). + +# Example + +Here is an example service config in protobuf form: + +``` +{ + // Use round_robin LB policy. + load_balancing_config: { round_robin: {} } + // This method config applies to method "foo/bar" and to all methods + // of service "baz". + method_config: { + name: { + service: "foo" + method: "bar" + } + name: { + service: "baz" + } + // Default timeout for matching methods. + timeout: { + seconds: 1 + nanos: 1 + } + } +} +``` + +Here is the same example service config in JSON form: + +``` +{ + "loadBalancingConfig": [ { "round_robin": {} } ], + "methodConfig": [ + { + "name": [ + { "service": "foo", "method": "bar" }, + { "service": "baz" } + ], + "timeout": "1.0000000001s" + } + ] +} +``` + +# APIs + +The service config is used in the following APIs: + +- In the resolver API, used by resolver plugins to return the service + config to the gRPC client. +- In the gRPC client API, where users can query the channel to obtain + the service config associated with the channel (for debugging + purposes). +- In the gRPC client API, where users can set the service config + explicitly. This can be used to set the config in unit tests. It can + also be used to set the default config that will be used if the + resolver plugin does not return a service config. diff --git a/doc/ssl-performance.md b/doc/ssl-performance.md new file mode 100644 index 00000000..20fe3cef --- /dev/null +++ b/doc/ssl-performance.md @@ -0,0 +1,41 @@ +# SSL in gRPC and performance + +The SSL requirement of gRPC isn't necessarily making it easy to integrate. The HTTP/2 protocol requires ALPN support, which is a fairly new handshake protocol only supported by recent implementations. + +As a result, we've tried hard to provide a smooth experience to our users when compiling and distributing gRPC, but this may come at performance costs due to this. More specifically, we will sometime build the SSL library by disabling assembly code +(by setting the `OPENSSL_NO_ASM` option), which can impact performance by an order of magnitude when processing encrypted streams. + +## gRPC C++: Building from Source + +Build system | Condition | Platform | Uses assembly optimizations +---|---|---|-- +Makefile | with OpenSSL 1.0.2 development files | all | :heavy_check_mark: +Makefile | all other cases | all | :x: +Bazel | | Linux | :heavy_check_mark: +Bazel | | MacOS | :heavy_check_mark: +Bazel | | Windows | :x: +CMake | boringssl from submodule (default) | Linux or MacOS | :heavy_check_mark: +CMake | boringssl from submodule (default), generator=Ninja | Windows | :heavy_check_mark: +CMake | boringssl from submodule (default), generator=Visual Studio | Windows | :x: +CMake | pre-installed OpenSSL 1.0.2+ (`gRPC_SSL_PROVIDER=package`) | all | :heavy_check_mark: + +## Other Languages: Binary/Source Packages + +In addition, we are shipping packages for language implementations. These packages are source packages, but also have pre-built binaries being distributed. Building packages from source may give a different result in some cases. + +Language | From source | Platform | Uses assembly optimizations +---|---|---|--- +C# | n/a | Linux, 64bit | :heavy_check_mark: +C# | n/a | Linux, 32bit | :x: +C# | n/a | MacOS | :heavy_check_mark: +C# | n/a | Windows | :heavy_check_mark: +Node.JS | n/a | Linux | :heavy_check_mark: +Node.JS | n/a | MacOS | :heavy_check_mark: +Node.JS | n/a | Windows | :x: +Electron | n/a | all | :heavy_check_mark: +ObjC | Yes | iOS | :x: +PHP | Yes | all | Same as the `Makefile` case from above +PHP | No | all | :x: +Python | n/a | all | :x: +Ruby | No | all | :x: + diff --git a/doc/status_ordering.md b/doc/status_ordering.md new file mode 100644 index 00000000..fccfa863 --- /dev/null +++ b/doc/status_ordering.md @@ -0,0 +1,16 @@ +Ordering Status and Reads in the gRPC API +----------------------------------------- + +Rules for implementors: +1. Reads and Writes Must not succeed after Status has been delivered. +2. OK Status is only delivered after all buffered messages are read. +3. Reads May continue to succeed after a failing write. + However, once a write fails, all subsequent writes Must fail, + and similarly, once a read fails, all subsequent reads Must fail. +4. When an error status is known to the library, if the user asks for status, + the library Should discard messages received in the library but not delivered + to the user and then deliver the status. If the user does not ask for status + but continues reading, the library Should deliver buffered messages before + delivering status. The library MAY choose to implement the stricter version + where errors cause all buffered messages to be dropped, but this is not a + requirement. diff --git a/doc/statuscodes.md b/doc/statuscodes.md new file mode 100644 index 00000000..ac34da59 --- /dev/null +++ b/doc/statuscodes.md @@ -0,0 +1,74 @@ +# Status codes and their use in gRPC + +gRPC uses a set of well defined status codes as part of the RPC API. These +statuses are defined as such: + +| Code | Number | Description | +|------------------|--------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| OK | 0 | Not an error; returned on success. | +| CANCELLED | 1 | The operation was cancelled, typically by the caller. | +| UNKNOWN | 2 | Unknown error. For example, this error may be returned when a `Status` value received from another address space belongs to an error space that is not known in this address space. Also errors raised by APIs that do not return enough error information may be converted to this error. | +| INVALID_ARGUMENT | 3 | The client specified an invalid argument. Note that this differs from `FAILED_PRECONDITION`. `INVALID_ARGUMENT` indicates arguments that are problematic regardless of the state of the system (e.g., a malformed file name). | +| DEADLINE_EXCEEDED | 4 | The deadline expired before the operation could complete. For operations that change the state of the system, this error may be returned even if the operation has completed successfully. For example, a successful response from a server could have been delayed long | +| NOT_FOUND | 5 | Some requested entity (e.g., file or directory) was not found. Note to server developers: if a request is denied for an entire class of users, such as gradual feature rollout or undocumented whitelist, `NOT_FOUND` may be used. If a request is denied for some users within a class of users, such as user-based access control, `PERMISSION_DENIED` must be used. | +| ALREADY_EXISTS | 6 | The entity that a client attempted to create (e.g., file or directory) already exists. | +| PERMISSION_DENIED | 7 | The caller does not have permission to execute the specified operation. `PERMISSION_DENIED` must not be used for rejections caused by exhausting some resource (use `RESOURCE_EXHAUSTED` instead for those errors). `PERMISSION_DENIED` must not be used if the caller can not be identified (use `UNAUTHENTICATED` instead for those errors). This error code does not imply the request is valid or the requested entity exists or satisfies other pre-conditions. | +| UNAUTHENTICATED | 16 | The request does not have valid authentication credentials for the operation. | +| RESOURCE_EXHAUSTED | 8 | Some resource has been exhausted, perhaps a per-user quota, or perhaps the entire file system is out of space. | +| FAILED_PRECONDITION | 9 | The operation was rejected because the system is not in a state required for the operation's execution. For example, the directory to be deleted is non-empty, an rmdir operation is applied to a non-directory, etc. Service implementors can use the following guidelines to decide between `FAILED_PRECONDITION`, `ABORTED`, and `UNAVAILABLE`: (a) Use `UNAVAILABLE` if the client can retry just the failing call. (b) Use `ABORTED` if the client should retry at a higher level (e.g., when a client-specified test-and-set fails, indicating the client should restart a read-modify-write sequence). (c) Use `FAILED_PRECONDITION` if the client should not retry until the system state has been explicitly fixed. E.g., if an "rmdir" fails because the directory is non-empty, `FAILED_PRECONDITION` should be returned since the client should not retry unless the files are deleted from the directory. | +| ABORTED | 10 | The operation was aborted, typically due to a concurrency issue such as a sequencer check failure or transaction abort. See the guidelines above for deciding between `FAILED_PRECONDITION`, `ABORTED`, and `UNAVAILABLE`. | +| OUT_OF_RANGE | 11 | The operation was attempted past the valid range. E.g., seeking or reading past end-of-file. Unlike `INVALID_ARGUMENT`, this error indicates a problem that may be fixed if the system state changes. For example, a 32-bit file system will generate `INVALID_ARGUMENT` if asked to read at an offset that is not in the range [0,2^32-1], but it will generate `OUT_OF_RANGE` if asked to read from an offset past the current file size. There is a fair bit of overlap between `FAILED_PRECONDITION` and `OUT_OF_RANGE`. We recommend using `OUT_OF_RANGE` (the more specific error) when it applies so that callers who are iterating through a space can easily look for an `OUT_OF_RANGE` error to detect when they are done. | +| UNIMPLEMENTED | 12 | The operation is not implemented or is not supported/enabled in this service. | +| INTERNAL | 13 | Internal errors. This means that some invariants expected by the underlying system have been broken. This error code is reserved for serious errors. | +| UNAVAILABLE | 14 | The service is currently unavailable. This is most likely a transient condition, which can be corrected by retrying with a backoff. Note that it is not always safe to retry non-idempotent operations. | +| DATA_LOSS | 15 | Unrecoverable data loss or corruption. | + +All RPCs started at a client return a `status` object composed of an integer +`code` and a string `message`. The server-side can choose the status it +returns for a given RPC. + +The gRPC client and server-side implementations may also generate and +return `status` on their own when errors happen. Only a subset of +the pre-defined status codes are generated by the gRPC libraries. This +allows applications to be sure that any other code it sees was actually +returned by the application (although it is also possible for the +server-side to return one of the codes generated by the gRPC libraries). + +The following table lists the codes that may be returned by the gRPC +libraries (on either the client-side or server-side) and summarizes the +situations in which they are generated. + +| Case | Code | Generated at Client or Server | +| ------------- |:-------------| :-----:| +| Client Application cancelled the request | CANCELLED | Both | +| Deadline expires before server returns status | DEADLINE_EXCEEDED | Both | +| Method not found at server | UNIMPLEMENTED | Server| +| Server shutting down | UNAVAILABLE | Server| +| Server side application throws an exception (or does something other than returning a Status code to terminate an RPC) | UNKNOWN | Server| +| No response received before Deadline expires. This may occur either when the client is unable to send the request to the server or when the server fails to respond in time. | DEADLINE_EXCEEDED | Both| +| Some data transmitted (e.g., request metadata written to TCP connection) before connection breaks | UNAVAILABLE | Client | +| Could not decompress, but compression algorithm supported (Client -> Server) | INTERNAL | Server | +| Could not decompress, but compression algorithm supported (Server -> Client) | INTERNAL | Client | +| Compression mechanism used by client not supported at server | UNIMPLEMENTED | Server | +| Server temporarily out of resources (e.g., Flow-control resource limits reached) | RESOURCE_EXHAUSTED | Server| +| Client does not have enough memory to hold the server response | RESOURCE_EXHAUSTED | Client | +| Flow-control protocol violation | INTERNAL | Both | +| Error parsing returned status | UNKNOWN | Client | +| Incorrect Auth metadata ( Credentials failed to get metadata, Incompatible credentials set on channel and call, Invalid host set in `:authority` metadata, etc.) | UNAUTHENTICATED | Both | +| Request cardinality violation (method requires exactly one request but client sent some other number of requests) | UNIMPLEMENTED | Server| +| Response cardinality violation (method requires exactly one response but server sent some other number of responses) | UNIMPLEMENTED | Client| +| Error parsing response proto | INTERNAL | Client| +| Error parsing request proto | INTERNAL | Server| +| Sent or received message was larger than configured limit | RESOURCE_EXHAUSTED | Both | +| Keepalive watchdog times out | UNAVAILABLE | Both | + +The following status codes are never generated by the library: +- INVALID_ARGUMENT +- NOT_FOUND +- ALREADY_EXISTS +- FAILED_PRECONDITION +- ABORTED +- OUT_OF_RANGE +- DATA_LOSS + +Applications that may wish to [retry](https://github.com/grpc/proposal/blob/master/A6-client-retries.md) failed RPCs must decide which status codes on which to retry. As shown in the table above, the gRPC library can generate the same status code for different cases. Server applications can also return those same status codes. Therefore, there is no fixed list of status codes on which it is appropriate to retry in all applications. As a result, individual applications must make their own determination as to which status codes should cause an RPC to be retried. diff --git a/doc/unit_testing.md b/doc/unit_testing.md new file mode 100644 index 00000000..c301e7d4 --- /dev/null +++ b/doc/unit_testing.md @@ -0,0 +1,175 @@ +# How to write unit tests for gRPC C client. + +tl;dr: [Example code](https://github.com/grpc/grpc/blob/master/test/cpp/end2end/mock_test.cc). + +To unit-test client-side logic via the synchronous API, gRPC provides a mocked Stub based on googletest(googlemock) that can be programmed upon and easily incorporated in the test code. + +For instance, consider an EchoService like this: + + +```proto +service EchoTestService { + rpc Echo(EchoRequest) returns (EchoResponse); + rpc BidiStream(stream EchoRequest) returns (stream EchoResponse); +} +``` + +The code generated would look something like this: + +```c +class EchoTestService final { + public: + class StubInterface { + virtual ::grpc::Status Echo(::grpc::ClientContext* context, const ::grpc::testing::EchoRequest& request, ::grpc::testing::EchoResponse* response) = 0; + … + std::unique_ptr< ::grpc::ClientReaderWriterInterface< ::grpc::testing::EchoRequest, ::grpc::testing::EchoResponse>> BidiStream(::grpc::ClientContext* context) { + return std::unique_ptr< ::grpc::ClientReaderWriterInterface< ::grpc::testing::EchoRequest, ::grpc::testing::EchoResponse>>(BidiStreamRaw(context)); + } + … + private: + virtual ::grpc::ClientReaderWriterInterface< ::grpc::testing::EchoRequest, ::grpc::testing::EchoResponse>* BidiStreamRaw(::grpc::ClientContext* context) = 0; + … + } // End StubInterface +… +} // End EchoTestService +``` + + +If we mock the StubInterface and set expectations on the pure-virtual methods we can test client-side logic without having to make any rpcs. + +A mock for this StubInterface will look like this: + + +```c +class MockEchoTestServiceStub : public EchoTestService::StubInterface { + public: + MOCK_METHOD3(Echo, ::grpc::Status(::grpc::ClientContext* context, const ::grpc::testing::EchoRequest& request, ::grpc::testing::EchoResponse* response)); + MOCK_METHOD1(BidiStreamRaw, ::grpc::ClientReaderWriterInterface< ::grpc::testing::EchoRequest, ::grpc::testing::EchoResponse>*(::grpc::ClientContext* context)); +}; +``` + + +**Generating mock code:** + +Such a mock can be auto-generated by: + + + +1. Setting flag(generate_mock_code=true) on grpc plugin for protoc, or +1. Setting an attribute(generate_mocks) in your bazel rule. + +Protoc plugin flag: + +```sh +protoc -I . --grpc_out=generate_mock_code=true:. --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` echo.proto +``` + +Bazel rule: + +```py +grpc_proto_library( + name = "echo_proto", + srcs = ["echo.proto"], + generate_mocks = True, +) +``` + + +By adding such a flag now a header file `echo_mock.grpc.pb.h` containing the mocked stub will also be generated. + +This header file can then be included in test files along with a gmock dependency. + +**Writing tests with mocked Stub.** + +Consider the following client a user might have: + +```c +class FakeClient { + public: + explicit FakeClient(EchoTestService::StubInterface* stub) : stub_(stub) {} + + void DoEcho() { + ClientContext context; + EchoRequest request; + EchoResponse response; + request.set_message("hello world"); + Status s = stub_->Echo(&context, request, &response); + EXPECT_EQ(request.message(), response.message()); + EXPECT_TRUE(s.ok()); + } + + void DoBidiStream() { + EchoRequest request; + EchoResponse response; + ClientContext context; + grpc::string msg("hello"); + + std::unique_ptr> + stream = stub_->BidiStream(&context); + + request.set_message(msg "0"); + EXPECT_TRUE(stream->Write(request)); + EXPECT_TRUE(stream->Read(&response)); + EXPECT_EQ(response.message(), request.message()); + + request.set_message(msg "1"); + EXPECT_TRUE(stream->Write(request)); + EXPECT_TRUE(stream->Read(&response)); + EXPECT_EQ(response.message(), request.message()); + + request.set_message(msg "2"); + EXPECT_TRUE(stream->Write(request)); + EXPECT_TRUE(stream->Read(&response)); + EXPECT_EQ(response.message(), request.message()); + + stream->WritesDone(); + EXPECT_FALSE(stream->Read(&response)); + + Status s = stream->Finish(); + EXPECT_TRUE(s.ok()); + } + + void ResetStub(EchoTestService::StubInterface* stub) { stub_ = stub; } + + private: + EchoTestService::StubInterface* stub_; +}; +``` + +A test could initialize this FakeClient with a mocked stub having set expectations on it: + +Unary RPC: + +```c +MockEchoTestServiceStub stub; +EchoResponse resp; +resp.set_message("hello world"); +EXPECT_CALL(stub, Echo(_,_,_)).Times(AtLeast(1)).WillOnce(DoAll(SetArgPointee<2>(resp), Return(Status::OK))); +FakeClient client(stub); +client.DoEcho(); +``` + +Streaming RPC: + +```c +ACTION_P(copy, msg) { + arg0->set_message(msg->message()); +} + + +auto rw = new MockClientReaderWriter(); +EchoRequest msg; +EXPECT_CALL(*rw, Write(_, _)).Times(3).WillRepeatedly(DoAll(SaveArg<0>(&msg), Return(true))); +EXPECT_CALL(*rw, Read(_)). + WillOnce(DoAll(WithArg<0>(copy(&msg)), Return(true))). + WillOnce(DoAll(WithArg<0>(copy(&msg)), Return(true))). + WillOnce(DoAll(WithArg<0>(copy(&msg)), Return(true))). + WillOnce(Return(false)); + +MockEchoTestServiceStub stub; +EXPECT_CALL(stub, BidiStreamRaw(_)).Times(AtLeast(1)).WillOnce(Return(rw)); + +FakeClient client(stub); +client.DoBidiStream(); +``` + diff --git a/doc/versioning.md b/doc/versioning.md new file mode 100644 index 00000000..79f57352 --- /dev/null +++ b/doc/versioning.md @@ -0,0 +1,45 @@ +# gRPC Versioning Guide + +## Versioning Overview + +All gRPC implementations use a three-part version number (`vX.Y.Z`) and follow [semantic versioning](https://semver.org/), which defines the semantics of major, minor and patch components of the version number. In addition to that, gRPC versions evolve according to these rules: +- **Major version bumps** only happen on rare occasions. In order to qualify for a major version bump, certain criteria described later in this document need to be met. Most importantly, a major version increase must not break wire compatibility with other gRPC implementations so that existing gRPC libraries remain fully interoperable. +- **Minor version bumps** happen approx. every 6 weeks as part of the normal release cycle as defined by the gRPC release process. A new release branch named vMAJOR.MINOR.PATCH) is cut every 6 weeks based on the [release schedule](https://github.com/grpc/grpc/blob/master/doc/grpc_release_schedule.md). +- **Patch version bump** corresponds to bugfixes done on release branch. + +There are a few situations where we don't adhere to the Semantic Versioning 2.0.0 strictly: +- A **minor** version will not necessarily add new functionality. This follows from the fact that we cut minor releases on a regular schedule, so we can't guarantee there will always be new features in each of the supported languages. +- Backward compatibility can be broken by a **minor** release if the API affected by the change was marked as EXPERIMENTAL upon its introduction. + +There are also a few extra rules regarding adding new gRPC implementations (e.g. adding support for a new language) +- New implementations start at v0.x.y version and until they reach 1.0, they are considered not ready for production workloads. Breaking API changes are allowed in the 0.x releases as the library is not considered stable yet. +- The "1.0" release has semantics of GA (generally available) and being production ready. Requirements to reach this milestone are at least these + - basic RPC features are feature complete and tested + - implementation is tested for interoperability with other languages + - Public API is declared stable +- Once a gRPC library reaches 1.0 (or higher version), the normal rules for versioning apply. + +## Policy for updating the major version number + +To avoid user confusion and simplify reasoning, the gRPC releases in different languages try to stay synchronized in terms of major and minor version (all languages follow the same release schedule). Nevertheless, because we also strictly follow semantic versioning, there are circumstances in which a gRPC implementation needs to break the version synchronicity and do a major version bump independently of other languages. + +### Situations when it's ok to do a major version bump +- **change forced by the language ecosystem:** when the language itself or its standard libraries that we depend on make a breaking change (something which is out of our control), reacting with updating gRPC APIs may be the only adequate response. +- **voluntary change:** Even in non-forced situations, there might be circumstances in which a breaking API change makes sense and represents a net win, but as a rule of thumb breaking changes are very disruptive for users, cause user fragmentation and incur high maintenance costs. Therefore, breaking API changes should be very rare events that need to be considered with extreme care and the bar for accepting such changes is intentionally set very high. + Example scenarios where a breaking API change might be adequate: + - fixing a security problem which requires changes to API (need to consider the non-breaking alternatives first) + - the change leads to very significant gains to security, usability or development velocity. These gains need to be clearly documented and claims need to be supported by evidence (ideally by numbers). Costs to the ecosystem (impact on users, dev team etc.) need to be taken into account and the change still needs to be a net positive after subtracting the costs. + + All proposals to make a breaking change need to be documented as a gRFC document (in the grpc/proposal repository) that covers at least these areas: + - Description of the proposal including an explanation why the proposed change is one of the very rare events where a breaking change is introduced. + - Migration costs (= what does it mean for the users to migrate to the new API, what are the costs and risks associated with it) + - Pros of the change (what is gained and how) + - Cons of the change (e.g. user confusion, lost users and user trust, work needed, added maintenance costs) + - Plan for supporting users still using the old major version (in case migration to the new major version is not trivial or not everyone can migrate easily) + +Note that while major version bump allows changing APIs used by the users, it must not impact the interoperability of the implementation with other gRPC implementations and the previous major version released. That means that **no backward incompatible protocol changes are allowed**: old clients must continue interoperating correctly with new servers and new servers with old clients. + +### Situations that DON'T warrant a major version bump +- Because other languages do so. This is not a good enough reason because +doing a major version bump has high potential for disturbing and confusing the users of that language and fragmenting the user base and that is a bigger threat than having language implementations at different major version (provided the state is well documented). Having some languages at different major version seems to be unavoidable anyway (due to forced version bumps), unless we bump some languages artificially. +- "I don't like this API": In retrospect, some API decisions made in the past necessarily turn out more lucky than others, but without strong reasons that would be in favor of changing the API and without enough supporting evidence (see previous section), other strategy than making a breaking API change needs to be used. Possible options: Expand the API to make it useful again; mark API as deprecated while keeping its functionality and providing a new better API. diff --git a/doc/wait-for-ready.md b/doc/wait-for-ready.md new file mode 100644 index 00000000..c08f20c1 --- /dev/null +++ b/doc/wait-for-ready.md @@ -0,0 +1,14 @@ +gRPC Wait for Ready Semantics +============================= + +If an RPC is issued but the channel is in `TRANSIENT_FAILURE` or `SHUTDOWN` +states, the RPC is unable to be transmitted promptly. By default, gRPC +implementations SHOULD fail such RPCs immediately. This is known as "fail fast," +but usage of the term is historical. RPCs SHOULD NOT fail as a result of the +channel being in other states (`CONNECTING`, `READY`, or `IDLE`). + +gRPC implementations MAY provide a per-RPC option to not fail RPCs as a result +of the channel being in `TRANSIENT_FAILURE` state. Instead, the implementation +queues the RPCs until the channel is `READY`. This is known as "wait for ready." +The RPCs SHOULD still fail before `READY` if there are unrelated reasons, such +as the channel is `SHUTDOWN` or the RPC's deadline is reached. diff --git a/doc/workarounds.md b/doc/workarounds.md new file mode 100644 index 00000000..9b7f2f13 --- /dev/null +++ b/doc/workarounds.md @@ -0,0 +1,19 @@ +# gRPC Server Backward Compatibility Issues and Workarounds Management + +## Introduction +This document lists the workarounds implemented on gRPC servers for record and reference when users need to enable a certain workaround. + +## Workaround List + +### Cronet Compression + +**Workaround ID:** WORKAROUND\_ID\_CRONET\_COMPRESSION + +**Date added:** May 06, 2017 + +**Status:** Implemented in C core and C++ + +**Issue:** Before version v1.3.0-dev, gRPC iOS client's Cronet transport did not implement compression. However the clients still claim to support compression. As a result, a client fails to parse received message when the message is compressed. +The problem above was resolved in gRPC v1.3.0-dev. For backward compatibility, a server must forcingly disable compression for gRPC clients of version lower than or equal to v1.3.0-dev. + +**Workaround Description:** Implemented as a server channel filter in C core. The filter identifies the version of peer client with incoming `user-agent` header of each call. If the client's gRPC version is lower that or equal to v1.3.x, a flag GRPC_WRITE_NO_COMPRESS is marked for all send_message ops which prevents compression of the messages to be sent out. diff --git a/doc/xds-test-descriptions.md b/doc/xds-test-descriptions.md new file mode 100644 index 00000000..46414384 --- /dev/null +++ b/doc/xds-test-descriptions.md @@ -0,0 +1,293 @@ +# xDS (Load-Balancing) Interop Test Case Descriptions + +Client and server use [test.proto](../src/proto/grpc/testing/test.proto). + +## Server + +The code for the xDS test server can be found at: +[Java](https://github.com/grpc/grpc-java/blob/master/interop-testing/src/main/java/io/grpc/testing/integration/XdsTestServer.java) (other language implementations are in progress). + +Server should accept these arguments: + +* --port=PORT + * The port the server will run on. + +## Client + +The base behavior of the xDS test client is to send a constant QPS of unary +messages and record the remote-peer distribution of the responses. Further, the +client must expose an implementation of the `LoadBalancerStatsService` gRPC +service to allow the test driver to validate the load balancing behavior for a +particular test case (see below for more details). + +The code for the xDS test client can be at: +[Java](https://github.com/grpc/grpc-java/blob/master/interop-testing/src/main/java/io/grpc/testing/integration/XdsTestClient.java) (other language implementations are in progress). + +Clients should accept these arguments: + +* --fail_on_failed_rpcs=BOOL + * If true, the client should exit with a non-zero return code if any RPCs + fail. Default is false. +* --num_channels=CHANNELS + * The number of channels to create to the server. +* --qps=QPS + * The QPS per channel. +* --server=HOSTNAME:PORT + * The server host to connect to. For example, "localhost:8080" +* --stats_port=PORT + * The port for to expose the client's `LoadBalancerStatsService` + implementation. + +## Test Driver + +Note that, unlike our other interop tests, neither the client nor the server has +any notion of which of the following test scenarios is under test. Instead, a +separate test driver is responsible for configuring the load balancer and the +server backends, running the client, and then querying the client's +`LoadBalancerStatsService` to validate load balancer behavior for each of the +tests described below. + +## LoadBalancerStatsService + +The service is defined as: + +``` +message LoadBalancerStatsRequest { + // Request stats for the next num_rpcs sent by client. + int32 num_rpcs = 1; + // If num_rpcs have not completed within timeout_sec, return partial results. + int32 timeout_sec = 2; +} + +message LoadBalancerStatsResponse { + // The number of completed RPCs for each peer. + map rpcs_by_peer = 1; + // The number of RPCs that failed to record a remote peer. + int32 num_failures = 2; +} + +service LoadBalancerStatsService { + // Gets the backend distribution for RPCs sent by a test client. + rpc GetClientStats(LoadBalancerStatsRequest) + returns (LoadBalancerStatsResponse) {} +} +``` + +Note that the `LoadBalancerStatsResponse` contains the remote peer distribution +of the next `num_rpcs` *sent* by the client after receiving the +`LoadBalancerStatsRequest`. It is important that the remote peer distribution be +recorded for a block of consecutive outgoing RPCs, to validate the intended +distribution from the load balancer, rather than just looking at the next +`num_rpcs` responses received from backends, as different backends may respond +at different rates. + +## Test Cases + +### ping_pong + +This test verifies that every backend receives traffic. + +Client parameters: + +1. --num_channels=1 +1. --qps=10 +1. --fail_on_failed_rpc=true + +Load balancer configuration: + +1. 4 backends are created in a single managed instance group (MIG). + +Test driver asserts: + +1. All backends receive at least one RPC + +### round_robin + +This test verifies that RPCs are evenly routed according to an unweighted round +robin policy. + +Client parameters: + +1. --num_channels=1 +1. --qps=10 +1. --fail_on_failed_rpc=true + +Load balancer configuration: + +1. 4 backends are created in a single MIG. + +Test driver asserts that: + +1. Once all backends receive at least one RPC, the following 100 RPCs are + evenly distributed across the 4 backends. + +### backends_restart + +This test verifies that the load balancer will resume sending traffic to a set +of backends that is stopped and then resumed. + +Client parameters: + +1. --num_channels=1 +1. --qps=10 + +Load balancer configuration: + +1. 4 backends are created in a single MIG. + +Test driver asserts: + +1. All backends receive at least one RPC. + +The test driver records the peer distribution for a subsequent block of 100 RPCs +then stops the backends. + +Test driver asserts: + +1. No RPCs from the client are successful. + +The test driver resumes the backends. + +Test driver asserts: + +1. Once all backends receive at least one RPC, the distribution for a block of + 100 RPCs is the same as the distribution recorded prior to restart. + +### secondary_locality_gets_requests_on_primary_failure + +This test verifies that backends in a secondary locality receive traffic when +all backends in the primary locality fail. + +Client parameters: + +1. --num_channels=1 +1. --qps=10 + +Load balancer configuration: + +1. The primary MIG with 2 backends in the same zone as the client +1. The secondary MIG with 2 backends in a different zone + +Test driver asserts: + +1. All backends in the primary locality receive at least 1 RPC. +1. No backends in the secondary locality receive RPCs. + +The test driver stops the backends in the primary locality. + +Test driver asserts: + +1. All backends in the secondary locality receive at least 1 RPC. + +The test driver resumes the backends in the primary locality. + +Test driver asserts: + +1. All backends in the primary locality receive at least 1 RPC. +1. No backends in the secondary locality receive RPCs. + +### secondary_locality_gets_no_requests_on_partial_primary_failure + +This test verifies that backends in a failover locality do not receive traffic +when at least one of the backends in the primary locality remain healthy. + +**Note:** Future TD features may change the expected behavior and require +changes to this test case. + +Client parameters: + +1. --num_channels=1 +1. --qps=10 + +Load balancer configuration: + +1. The primary MIG with 2 backends in the same zone as the client +1. The secondary MIG with 2 backends in a different zone + +Test driver asserts: + +1. All backends in the primary locality receive at least 1 RPC. +1. No backends in the secondary locality receive RPCs. + +The test driver stops one of the backends in the primary locality. + +Test driver asserts: + +1. All backends in the primary locality receive at least 1 RPC. +1. No backends in the secondary locality receive RPCs. + +### new_instance_group_receives_traffic + +This test verifies that new instance groups added to a backend service in the +same zone receive traffic. + +Client parameters: + +1. --num_channels=1 +1. --qps=10 +1. --fail_on_failed_rpc=true + +Load balancer configuration: + +1. One MIG with two backends, using rate balancing mode. + +Test driver asserts: + +1. All backends receive at least one RPC. + +The test driver adds a new MIG with two backends in the same zone. + +Test driver asserts: + +1. All backends in each MIG receive at least one RPC. + +### remove_instance_group + +This test verifies that a remaining instance group can successfully serve RPCs +after removal of another instance group in the same zone. + +Client parameters: + +1. --num_channels=1 +1. --qps=10 + +Load balancer configuration: + +1. Two MIGs with two backends each, using rate balancing mode. + +Test driver asserts: + +1. All backends receive at least one RPC. + +The test driver removes one MIG. + +Test driver asserts: + +1. All RPCs are directed to the two remaining backends (no RPC failures). + +### change_backend_service + +This test verifies that the backend service can be replaced and traffic routed +to the new backends. + +Client parameters: + +1. --num_channels=1 +1. --qps=10 +1. --fail_on_failed_rpc=true + +Load balancer configuration: + +1. One MIG with two backends + +Test driver asserts: + +1. All backends receive at least one RPC. + +The test driver creates a new backend service containing a MIG with two backends +and changes the TD URL map to point to this new backend service. + +Test driver asserts: + +1. All RPCs are directed to the new backend service. + diff --git a/etc/README.md b/etc/README.md new file mode 100644 index 00000000..87af44f7 --- /dev/null +++ b/etc/README.md @@ -0,0 +1,4 @@ +The roots.pem file is periodically generated from: +https://hg.mozilla.org/mozilla-central/raw-file/tip/security/nss/lib/ckfw/builtins/certdata.txt +using +https://github.com/agl/extract-nss-root-certs diff --git a/etc/roots.pem b/etc/roots.pem new file mode 100644 index 00000000..0b384746 --- /dev/null +++ b/etc/roots.pem @@ -0,0 +1,4644 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Label: "GlobalSign Root CA" +# Serial: 4835703278459707669005204 +# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a +# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c +# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG +A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv +b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw +MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i +YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT +aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ +jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp +xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp +1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG +snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ +U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 +9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B +AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz +yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE +38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP +AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad +DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME +HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 +# Label: "GlobalSign Root CA - R2" +# Serial: 4835703278459682885658125 +# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30 +# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe +# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 +MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL +v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 +eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq +tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd +C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa +zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB +mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH +V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n +bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG +3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs +J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO +291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS +ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd +AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Label: "Verisign Class 3 Public Primary Certification Authority - G3" +# Serial: 206684696279472310254277870180966723415 +# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09 +# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6 +# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44 +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b +N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t +KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu +kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm +CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ +Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu +imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te +2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe +DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p +F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt +TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Label: "Entrust.net Premium 2048 Secure Server CA" +# Serial: 946069240 +# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90 +# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31 +# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77 +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 +MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq +K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe +sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX +MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT +XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ +HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH +4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub +j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo +U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b +u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ +bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er +fF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- + +# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Label: "Baltimore CyberTrust Root" +# Serial: 33554617 +# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 +# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 +# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX +DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y +ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy +VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr +mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr +IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK +mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu +XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy +dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye +jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 +BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 +DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 +9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 +Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz +ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS +R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network +# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network +# Label: "AddTrust External Root" +# Serial: 1 +# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f +# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68 +# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2 +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs +IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 +MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h +bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt +H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 +uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX +mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX +a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN +E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 +WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD +VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 +Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU +cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx +IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN +AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH +YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC +Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX +c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a +mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Label: "Entrust Root Certification Authority" +# Serial: 1164660820 +# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 +# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 +# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 +Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW +KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw +NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw +NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy +ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV +BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo +Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 +4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 +KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI +rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi +94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB +sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi +gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo +kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE +vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t +O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua +AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP +9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ +eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m +0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc. +# Subject: CN=GeoTrust Global CA O=GeoTrust Inc. +# Label: "GeoTrust Global CA" +# Serial: 144470 +# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5 +# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12 +# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg +R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 +9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq +fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv +iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU +1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ +bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW +MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA +ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l +uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn +Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS +tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF +PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un +hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV +5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc. +# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc. +# Label: "GeoTrust Universal CA" +# Serial: 1 +# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48 +# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79 +# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12 +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy +c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 +IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV +VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 +cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT +QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh +F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v +c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w +mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd +VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX +teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ +f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe +Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ +nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB +/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY +MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG +9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX +IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn +ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z +uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN +Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja +QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW +koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 +ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt +DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm +bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. +# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. +# Label: "GeoTrust Universal CA 2" +# Serial: 1 +# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7 +# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79 +# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy +c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD +VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 +c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 +WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG +FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq +XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL +se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb +KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd +IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 +y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt +hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc +QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 +Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV +HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ +KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ +L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr +Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo +ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY +T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz +GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m +1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV +OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH +6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX +QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- + +# Issuer: CN=AAA Certificate Services O=Comodo CA Limited +# Subject: CN=AAA Certificate Services O=Comodo CA Limited +# Label: "Comodo AAA Services root" +# Serial: 1 +# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 +# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 +# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj +YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM +GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua +BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe +3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 +YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR +rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm +ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU +oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v +QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t +b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF +AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q +GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 +G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi +l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 +smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority +# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority +# Label: "QuoVadis Root CA" +# Serial: 985026699 +# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24 +# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9 +# SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73 +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz +MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw +IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR +dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp +li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D +rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ +WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug +F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU +xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC +Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv +dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw +ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl +IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh +c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy +ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI +KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T +KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq +y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p +dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD +VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL +MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk +fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 +7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R +cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y +mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW +xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK +SnQ2+Q== +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2" +# Serial: 1289 +# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b +# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 +# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa +GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg +Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J +WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB +rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp ++ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 +ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i +Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz +PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og +/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH +oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI +yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud +EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 +A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL +MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f +BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn +g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl +fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K +WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha +B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc +hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR +TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD +mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z +ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y +4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza +8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3" +# Serial: 1478 +# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf +# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 +# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM +V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB +4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr +H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd +8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv +vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT +mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe +btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc +T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt +WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ +c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A +4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD +VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG +CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 +aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu +dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw +czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G +A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg +Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 +7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem +d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd ++LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B +4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN +t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x +DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 +k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s +zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j +Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT +mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK +4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1 +# Subject: O=SECOM Trust.net OU=Security Communication RootCA1 +# Label: "Security Communication Root CA" +# Serial: 0 +# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a +# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7 +# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY +MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t +dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 +WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD +VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 +9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ +DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 +Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N +QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ +xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G +A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG +kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr +Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 +Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU +JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot +RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== +-----END CERTIFICATE----- + +# Issuer: CN=Sonera Class2 CA O=Sonera +# Subject: CN=Sonera Class2 CA O=Sonera +# Label: "Sonera Class 2 Root CA" +# Serial: 29 +# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb +# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27 +# SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27 +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP +MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx +MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV +BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o +Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt +5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s +3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej +vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu +8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw +DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG +MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil +zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ +3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD +FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 +Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 +ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M +-----END CERTIFICATE----- + +# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Label: "XRamp Global CA Root" +# Serial: 107108908803651509692980124233745014957 +# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1 +# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6 +# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2 +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB +gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk +MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY +UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx +NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 +dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy +dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 +38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP +KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q +DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 +qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa +JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi +PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P +BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs +jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 +eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR +vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa +IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy +i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ +O+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Label: "Go Daddy Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 +# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 +# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh +MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE +YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 +MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo +ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg +MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN +ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA +PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w +wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi +EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY +avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ +YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE +sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h +/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 +IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy +OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P +TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER +dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf +ReYNnyicsbkqWletNw+vHX/bvZ8= +-----END CERTIFICATE----- + +# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Label: "Starfield Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 +# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a +# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl +MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp +U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw +NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE +ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp +ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 +DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf +8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN ++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 +X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa +K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA +1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G +A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR +zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 +YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD +bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w +DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 +L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D +eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp +VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY +WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +# Issuer: O=Government Root Certification Authority +# Subject: O=Government Root Certification Authority +# Label: "Taiwan GRCA" +# Serial: 42023070807708724159991140556527066870 +# MD5 Fingerprint: 37:85:44:53:32:45:1f:20:f0:f3:95:e1:25:c4:43:4e +# SHA1 Fingerprint: f4:8b:11:bf:de:ab:be:94:54:20:71:e6:41:de:6b:be:88:2b:40:b9 +# SHA256 Fingerprint: 76:00:29:5e:ef:e8:5b:9e:1f:d6:24:db:76:06:2a:aa:ae:59:81:8a:54:d2:77:4c:d4:c0:b2:c0:11:31:e1:b3 +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ +MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow +PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR +IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q +gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy +yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts +F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 +jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx +ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC +VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK +YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH +EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN +Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud +DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE +MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK +UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf +qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK +ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE +JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 +hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 +EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm +nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX +udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz +ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe +LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl +pYYsfPQS +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root CA" +# Serial: 17154717934120587862167794914071425081 +# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 +# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 +# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c +JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP +mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ +wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 +VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ +AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB +AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun +pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC +dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf +fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm +NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx +H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root CA" +# Serial: 10944719598952040374951832963794454346 +# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e +# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 +# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert High Assurance EV Root CA" +# Serial: 3553400076410547919724730734378100087 +# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a +# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 +# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K +-----END CERTIFICATE----- + +# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co. +# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co. +# Label: "DST Root CA X3" +# Serial: 91299735575339953335919266965803778155 +# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5 +# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13 +# SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39 +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ +MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT +DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow +PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD +Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O +rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq +OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b +xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw +7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD +aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG +SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 +ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr +AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz +R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 +JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo +Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Label: "SwissSign Gold CA - G2" +# Serial: 13492815561806991280 +# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 +# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 +# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG +# Label: "SwissSign Silver CA - G2" +# Serial: 5700383053117599563 +# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13 +# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb +# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5 +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. +# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. +# Label: "GeoTrust Primary Certification Authority" +# Serial: 32798226551256963324313806436981982369 +# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf +# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96 +# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY +MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo +R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx +MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 +AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA +ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 +7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W +kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI +mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ +KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 +6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl +4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K +oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj +UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU +AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA" +# Serial: 69529181992039203566298953787712940909 +# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12 +# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81 +# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB +qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV +BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw +NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j +LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG +A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs +W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta +3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk +6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 +Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J +NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP +r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU +DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz +YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 +/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ +LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 +jVaMaA== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Class 3 Public Primary Certification Authority - G5" +# Serial: 33037644167568058970164719475676101450 +# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c +# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5 +# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW +ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 +nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex +t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz +SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG +BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ +rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ +NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E +BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH +BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv +MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE +p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y +5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK +WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ +4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N +hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- + +# Issuer: CN=SecureTrust CA O=SecureTrust Corporation +# Subject: CN=SecureTrust CA O=SecureTrust Corporation +# Label: "SecureTrust CA" +# Serial: 17199774589125277788362757014266862032 +# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 +# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 +# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz +MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv +cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz +Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO +0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao +wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj +7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS +8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT +BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg +JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 +6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ +3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm +D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS +CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +# Issuer: CN=Secure Global CA O=SecureTrust Corporation +# Subject: CN=Secure Global CA O=SecureTrust Corporation +# Label: "Secure Global CA" +# Serial: 9751836167731051554232119481456978597 +# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de +# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b +# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx +MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg +Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ +iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa +/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ +jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI +HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 +sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w +gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw +KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG +AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L +URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO +H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm +I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY +iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO Certification Authority O=COMODO CA Limited +# Label: "COMODO Certification Authority" +# Serial: 104350513648249232941998508985834464573 +# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 +# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b +# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB +gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV +BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw +MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl +YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P +RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 +UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI +2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 +Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp ++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ +DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O +nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW +/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g +PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u +QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY +SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv +IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 +zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd +BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB +ZQ== +-----END CERTIFICATE----- + +# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +# Label: "Network Solutions Certificate Authority" +# Serial: 116697915152937497490437556386812487904 +# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e +# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce +# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi +MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp +dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV +UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO +ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz +c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP +OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl +mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF +BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 +qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw +gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu +bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp +dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 +6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ +h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH +/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN +pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Label: "COMODO ECC Certification Authority" +# Serial: 41578283867086692638256921589707938090 +# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 +# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 +# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT +IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw +MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy +ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N +T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR +FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J +cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW +BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm +fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv +GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GA CA" +# Serial: 86718877871133159090080555911823548314 +# MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93 +# SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9 +# SHA256 Fingerprint: 41:c9:23:86:6a:b4:ca:d6:b7:ad:57:80:81:58:2e:02:07:97:a6:cb:df:4f:ff:78:ce:83:96:b3:89:37:d7:f5 +-----BEGIN CERTIFICATE----- +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB +ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly +aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w +NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G +A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD +VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX +SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR +VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 +w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF +mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg +4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 +4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw +EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx +SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 +ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 +vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi +Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ +/L7fCg0= +-----END CERTIFICATE----- + +# Issuer: CN=Certigna O=Dhimyotis +# Subject: CN=Certigna O=Dhimyotis +# Label: "Certigna" +# Serial: 18364802974209362175 +# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff +# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 +# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV +BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X +DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ +BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 +QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny +gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw +zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q +130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 +JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw +ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT +AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj +AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG +9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h +bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc +fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu +HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w +t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc +# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc +# Label: "Cybertrust Global Root" +# Serial: 4835703278459682877484360 +# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1 +# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6 +# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3 +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG +A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh +bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE +ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS +b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 +7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS +J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y +HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP +t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz +FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY +XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ +MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw +hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js +MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA +A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj +Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx +XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o +omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc +A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V +-----END CERTIFICATE----- + +# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Label: "ePKI Root Certification Authority" +# Serial: 28956088682735189655030529057352760477 +# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 +# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 +# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe +MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 +ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw +IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL +SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH +SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh +ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X +DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 +TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ +fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA +sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU +WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS +nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH +dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip +NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC +AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF +MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB +uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl +PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP +JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ +gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 +j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 +5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB +o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS +/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z +Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE +W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D +hNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +# Issuer: O=certSIGN OU=certSIGN ROOT CA +# Subject: O=certSIGN OU=certSIGN ROOT CA +# Label: "certSIGN ROOT CA" +# Serial: 35210227249154 +# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 +# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b +# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT +AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD +QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP +MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do +0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ +UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d +RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ +OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv +JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C +AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O +BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ +LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY +MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ +44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I +Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw +i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN +9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only +# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only +# Label: "GeoTrust Primary Certification Authority - G3" +# Serial: 28809105769928564313984085209975885599 +# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05 +# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd +# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4 +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB +mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT +MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ +BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 +BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz ++uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm +hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn +5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W +JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL +DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC +huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw +HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB +AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB +zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN +kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH +SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G +spki4cErx5z481+oghLrGREt +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA - G2" +# Serial: 71758320672825410020661621085256472406 +# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f +# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12 +# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57 +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp +IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi +BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw +MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig +YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v +dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ +BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 +papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K +DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 +KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox +XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA - G3" +# Serial: 127614157056681299805556476275995414779 +# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31 +# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2 +# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB +rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV +BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa +Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl +LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u +MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm +gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 +YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf +b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 +9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S +zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk +OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV +HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA +2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW +oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c +KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM +m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu +MdRAGmI0Nj81Aa6sY6A= +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only +# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only +# Label: "GeoTrust Primary Certification Authority - G2" +# Serial: 80682863203381065782177908751794619243 +# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a +# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0 +# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66 +-----BEGIN CERTIFICATE----- +MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL +MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj +KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 +MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw +NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV +BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH +MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL +So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal +tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG +CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT +qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz +rD6ogRLQy7rQkgu2npaqBA+K +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Universal Root Certification Authority" +# Serial: 85209574734084581917763752644031726877 +# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19 +# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54 +# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c +-----BEGIN CERTIFICATE----- +MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB +vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W +ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 +IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y +IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh +bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF +9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH +H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H +LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN +/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT +rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw +WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs +exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud +DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 +sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ +seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz +4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ +BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR +lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 +7M2CYfE45k+XmCpajQ== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Class 3 Public Primary Certification Authority - G4" +# Serial: 63143484348153506665311985501458640051 +# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41 +# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a +# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79 +-----BEGIN CERTIFICATE----- +MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp +U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg +SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln +biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm +GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve +fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ +aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj +aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW +kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC +4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga +FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== +-----END CERTIFICATE----- + +# Issuer: CN=NetLock Arany (Class Gold) Főtanúsítvány O=NetLock Kft. OU=Tanúsítványkiadók (Certification Services) +# Subject: CN=NetLock Arany (Class Gold) Főtanúsítvány O=NetLock Kft. OU=Tanúsítványkiadók (Certification Services) +# Label: "NetLock Arany (Class Gold) Főtanúsítvány" +# Serial: 80544274841616 +# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 +# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 +# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG +EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 +MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl +cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR +dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB +pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM +b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm +aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz +IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT +lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz +AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 +VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG +ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 +BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG +AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M +U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh +bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C ++C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F +uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 +XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden +# Label: "Staat der Nederlanden Root CA - G2" +# Serial: 10000012 +# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a +# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16 +# SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f +-----BEGIN CERTIFICATE----- +MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX +DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl +ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv +b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 +qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp +uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU +Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE +pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp +5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M +UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN +GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy +5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv +6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK +eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 +B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ +BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov +L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG +SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS +CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen +5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 +IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK +gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL ++63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL +vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm +bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk +N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC +Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z +ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== +-----END CERTIFICATE----- + +# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post +# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post +# Label: "Hongkong Post Root CA 1" +# Serial: 1000 +# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca +# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58 +# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2 +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx +FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg +Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG +A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr +b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ +jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn +PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh +ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 +nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h +q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED +MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC +mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 +7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB +oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs +EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO +fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi +AmvZWg== +-----END CERTIFICATE----- + +# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. +# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. +# Label: "SecureSign RootCA11" +# Serial: 1 +# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26 +# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3 +# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12 +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr +MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG +A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 +MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp +Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD +QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz +i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 +h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV +MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 +UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni +8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC +h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD +VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB +AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm +KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ +X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr +QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 +pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN +QSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Label: "Microsec e-Szigno Root CA 2009" +# Serial: 14014712776195784473 +# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 +# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e +# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD +VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 +ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G +CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y +OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx +FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp +Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP +kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc +cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U +fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 +N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC +xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 ++rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM +Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG +SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h +mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk +ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c +2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t +HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Label: "GlobalSign Root CA - R3" +# Serial: 4835703278459759426209954 +# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 +# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad +# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 +MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 +RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT +gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm +KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd +QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ +XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o +LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU +RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp +jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK +6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX +mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs +Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH +WD9f +-----END CERTIFICATE----- + +# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" +# Serial: 6047274297262753887 +# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3 +# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa +# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE +BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h +cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy +MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg +Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 +thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM +cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG +L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i +NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h +X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b +m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy +Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja +EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T +KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF +6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh +OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD +VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv +ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl +AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF +661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 +am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 +ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 +PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS +3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k +SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF +3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM +ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g +StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz +Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB +jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- + +# Issuer: CN=Izenpe.com O=IZENPE S.A. +# Subject: CN=Izenpe.com O=IZENPE S.A. +# Label: "Izenpe.com" +# Serial: 917563065490389241595536686991402621 +# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 +# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 +# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. +# Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. +# Label: "Chambers of Commerce Root - 2008" +# Serial: 11806822484801597146 +# MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7 +# SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c +# SHA256 Fingerprint: 06:3e:4a:fa:c4:91:df:d3:32:f3:08:9b:85:42:e9:46:17:d8:93:d7:fe:94:4e:10:a7:93:7e:e2:9d:96:93:c0 +-----BEGIN CERTIFICATE----- +MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD +VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz +IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz +MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj +dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw +EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp +MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9 +28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq +VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q +DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR +5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL +ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a +Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl +UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s ++12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5 +Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj +ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx +hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV +HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1 ++HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN +YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t +L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy +ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt +IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV +HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w +DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW +PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF +5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1 +glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH +FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2 +pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD +xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG +tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq +jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De +fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg +OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ +d0jQ +-----END CERTIFICATE----- + +# Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. +# Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. +# Label: "Global Chambersign Root - 2008" +# Serial: 14541511773111788494 +# MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3 +# SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c +# SHA256 Fingerprint: 13:63:35:43:93:34:a7:69:80:16:a0:d3:24:de:72:28:4e:07:9d:7b:52:20:bb:8f:bd:74:78:16:ee:be:ba:ca +-----BEGIN CERTIFICATE----- +MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD +VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD +aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx +MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy +cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG +A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl +BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed +KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7 +G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2 +zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4 +ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG +HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2 +Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V +yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e +beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r +6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh +wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog +zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW +BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr +ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp +ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk +cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt +YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC +CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow +KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI +hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ +UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz +X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x +fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz +a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd +Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd +SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O +AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso +M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge +v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z +09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B +-----END CERTIFICATE----- + +# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Label: "Go Daddy Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 +# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b +# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT +EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp +ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz +NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH +EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE +AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD +E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH +/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy +DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh +GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR +tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA +AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX +WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu +9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr +gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo +2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI +4uJEvlz36hz1 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 +# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e +# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs +ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw +MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj +aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp +Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg +nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 +HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N +Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN +dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 +HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G +CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU +sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 +4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg +8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 +mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Services Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 +# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f +# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs +ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD +VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy +ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy +dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p +OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 +8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K +Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe +hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk +6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q +AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI +bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB +ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z +qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn +0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN +sSi6 +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Commercial O=AffirmTrust +# Subject: CN=AffirmTrust Commercial O=AffirmTrust +# Label: "AffirmTrust Commercial" +# Serial: 8608355977964138876 +# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 +# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 +# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP +Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr +ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL +MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 +yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr +VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ +nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG +XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj +vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt +Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g +N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC +nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Networking O=AffirmTrust +# Subject: CN=AffirmTrust Networking O=AffirmTrust +# Label: "AffirmTrust Networking" +# Serial: 8957382827206547757 +# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f +# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f +# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y +YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua +kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL +QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp +6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG +yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i +QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO +tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu +QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ +Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u +olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 +x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium O=AffirmTrust +# Subject: CN=AffirmTrust Premium O=AffirmTrust +# Label: "AffirmTrust Premium" +# Serial: 7893706540734352110 +# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 +# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 +# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz +dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG +A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U +cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf +qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ +JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ ++jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS +s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 +HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 +70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG +V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S +qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S +5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia +C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX +OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE +FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 +KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B +8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ +MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc +0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ +u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF +u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH +YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 +GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO +RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e +KeC2uAloGRwYQw== +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust +# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust +# Label: "AffirmTrust Premium ECC" +# Serial: 8401224907861490260 +# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d +# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb +# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC +VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ +cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ +BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt +VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D +0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 +ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G +A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs +aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I +flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA" +# Serial: 279744 +# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 +# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e +# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM +MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D +ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU +cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 +WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg +Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw +IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH +UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM +TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU +BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM +kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x +AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV +HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y +sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL +I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 +J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY +VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Label: "TWCA Root Certification Authority" +# Serial: 1 +# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 +# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 +# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES +MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU +V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz +WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO +LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE +AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH +K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX +RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z +rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx +3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq +hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC +MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls +XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D +lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn +aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ +YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Label: "Security Communication RootCA2" +# Serial: 0 +# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 +# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 +# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl +MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe +U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX +DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy +dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj +YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV +OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr +zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM +VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ +hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO +ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw +awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs +OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF +coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc +okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 +t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy +1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ +SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +# Issuer: CN=EC-ACC O=Agencia Catalana de Certificacio (NIF Q-0801176-I) OU=Serveis Publics de Certificacio/Vegeu https://www.catcert.net/verarrel (c)03/Jerarquia Entitats de Certificacio Catalanes +# Subject: CN=EC-ACC O=Agencia Catalana de Certificacio (NIF Q-0801176-I) OU=Serveis Publics de Certificacio/Vegeu https://www.catcert.net/verarrel (c)03/Jerarquia Entitats de Certificacio Catalanes +# Label: "EC-ACC" +# Serial: -23701579247955709139626555126524820479 +# MD5 Fingerprint: eb:f5:9d:29:0d:61:f9:42:1f:7c:c2:ba:6d:e3:15:09 +# SHA1 Fingerprint: 28:90:3a:63:5b:52:80:fa:e6:77:4c:0b:6d:a7:d6:ba:a6:4a:f2:e8 +# SHA256 Fingerprint: 88:49:7f:01:60:2f:31:54:24:6a:e2:8c:4d:5a:ef:10:f1:d8:7e:bb:76:62:6f:4a:e0:b7:f9:5b:a7:96:87:99 +-----BEGIN CERTIFICATE----- +MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB +8zELMAkGA1UEBhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2Vy +dGlmaWNhY2lvIChOSUYgUS0wODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1 +YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYDVQQLEyxWZWdldSBodHRwczovL3d3 +dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UECxMsSmVyYXJxdWlh +IEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMTBkVD +LUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQG +EwJFUzE7MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8g +KE5JRiBRLTA4MDExNzYtSSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBD +ZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZlZ2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQu +bmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJhcnF1aWEgRW50aXRhdHMg +ZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUNDMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R +85iKw5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm +4CgPukLjbo73FCeTae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaV +HMf5NLWUhdWZXqBIoH7nF2W4onW4HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNd +QlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0aE9jD2z3Il3rucO2n5nzbcc8t +lGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw0JDnJwIDAQAB +o4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4 +opvpXY0wfwYDVR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBo +dHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidW +ZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAwDQYJKoZIhvcN +AQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJlF7W2u++AVtd0x7Y +/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNaAl6k +SBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhy +Rp/7SNVel+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOS +Agu+TGbrIP65y7WZf+a2E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xl +nJ2lYJU6Un/10asIbvPuW/mIPX64b24D5EI= +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions RootCA 2011" +# Serial: 0 +# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9 +# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d +# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71 +-----BEGIN CERTIFICATE----- +MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix +RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p +YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw +NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK +EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl +cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz +dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ +fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns +bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD +75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP +FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV +HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp +5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu +b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA +A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p +6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 +TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 +dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys +Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI +l7WdmplNsDz4SgCbZN2fOUvRJ9e4 +-----END CERTIFICATE----- + +# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Label: "Actalis Authentication Root CA" +# Serial: 6271844772424770508 +# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 +# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac +# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 +-----BEGIN CERTIFICATE----- +MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE +BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w +MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 +IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC +SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 +ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv +UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX +4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 +KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ +gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb +rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ +51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F +be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe +KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F +v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn +fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 +jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz +ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt +ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL +e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 +jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz +WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V +SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j +pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX +X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok +fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R +K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU +ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU +LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT +LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== +-----END CERTIFICATE----- + +# Issuer: O=Trustis Limited OU=Trustis FPS Root CA +# Subject: O=Trustis Limited OU=Trustis FPS Root CA +# Label: "Trustis FPS Root CA" +# Serial: 36053640375399034304724988975563710553 +# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d +# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04 +# SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d +-----BEGIN CERTIFICATE----- +MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF +MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL +ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx +MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc +MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+ +AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH +iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj +vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA +0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB +OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/ +BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E +FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01 +GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW +zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4 +1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE +f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F +jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN +ZetX2fNXlrtIzYE= +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 2 Root CA" +# Serial: 2 +# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 +# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 +# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr +6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV +L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 +1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx +MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ +QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB +arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr +Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi +FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS +P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN +9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz +uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h +9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t +OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo ++fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 +KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 +DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us +H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ +I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 +5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h +3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz +Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 3 Root CA" +# Serial: 2 +# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec +# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 +# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y +ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E +N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 +tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX +0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c +/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X +KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY +zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS +O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D +34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP +K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv +Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj +QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS +IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 +HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa +O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv +033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u +dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE +kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 +3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD +u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq +4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 3" +# Serial: 1 +# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef +# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 +# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN +8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ +RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 +hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 +ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM +EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 +A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy +WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ +1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 +6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT +91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p +TpPDpFQUWw== +-----END CERTIFICATE----- + +# Issuer: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus +# Subject: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus +# Label: "EE Certification Centre Root CA" +# Serial: 112324828676200291871926431888494945866 +# MD5 Fingerprint: 43:5e:88:d4:7d:1a:4a:7e:fd:84:2e:52:eb:01:d4:6f +# SHA1 Fingerprint: c9:a8:b9:e7:55:80:5e:58:e3:53:77:a7:25:eb:af:c3:7b:27:cc:d7 +# SHA256 Fingerprint: 3e:84:ba:43:42:90:85:16:e7:75:73:c0:99:2f:09:79:ca:08:4e:46:85:68:1f:f1:95:cc:ba:8a:22:9b:8a:76 +-----BEGIN CERTIFICATE----- +MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1 +MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1 +czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG +CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy +MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl +ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS +b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy +euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO +bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw +WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d +MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE +1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/ +zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB +BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF +BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV +v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG +E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u +uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW +iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v +GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 2009" +# Serial: 623603 +# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f +# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 +# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha +ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM +HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 +UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 +tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R +ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM +lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp +/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G +A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G +A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy +MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl +cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js +L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL +BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni +acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K +zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 +PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y +Johw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 EV 2009" +# Serial: 623604 +# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 +# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 +# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw +NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV +BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn +ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 +3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z +qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR +p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 +HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw +ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea +HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw +Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh +c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E +RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt +dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku +Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp +3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF +CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na +xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX +KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +# Issuer: CN=CA Disig Root R2 O=Disig a.s. +# Subject: CN=CA Disig Root R2 O=Disig a.s. +# Label: "CA Disig Root R2" +# Serial: 10572350602393338211 +# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 +# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 +# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV +BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu +MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy +MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx +EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe +NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH +PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I +x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe +QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR +yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO +QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 +H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ +QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD +i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs +nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 +rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI +hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf +GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb +lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka ++elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal +TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i +nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 +gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr +G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os +zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x +L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Label: "ACCVRAIZ1" +# Serial: 6828503384748696800 +# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02 +# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17 +# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13 +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE +AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw +CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ +BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND +VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb +qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY +HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo +G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA +lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr +IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ +0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH +k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 +4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO +m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa +cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl +uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI +KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls +ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG +AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT +VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG +CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA +cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA +QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA +7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA +cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA +QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA +czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu +aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt +aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud +DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF +BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp +D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU +JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m +AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD +vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms +tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH +7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA +h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF +d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H +pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Label: "TWCA Global Root CA" +# Serial: 3262 +# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96 +# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65 +# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx +EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT +VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 +NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT +B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF +10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz +0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh +MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH +zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc +46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 +yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi +laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP +oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA +BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE +qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm +4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL +1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF +H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo +RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ +nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh +15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW +6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW +nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j +wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz +aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy +KwbQBM0= +-----END CERTIFICATE----- + +# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Label: "TeliaSonera Root CA v1" +# Serial: 199041966741090107964904287217786801558 +# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c +# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 +# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw +NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv +b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD +VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F +VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 +7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X +Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ +/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs +81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm +dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe +Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu +sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 +pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs +slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ +arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD +VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG +9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl +dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj +TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed +Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 +Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI +OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 +vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW +t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn +HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx +SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + +# Issuer: CN=E-Tugra Certification Authority O=E-Tuğra EBG Bilişim Teknolojileri ve Hizmetleri A.Ş. OU=E-Tugra Sertifikasyon Merkezi +# Subject: CN=E-Tugra Certification Authority O=E-Tuğra EBG Bilişim Teknolojileri ve Hizmetleri A.Ş. OU=E-Tugra Sertifikasyon Merkezi +# Label: "E-Tugra Certification Authority" +# Serial: 7667447206703254355 +# MD5 Fingerprint: b8:a1:03:63:b0:bd:21:71:70:8a:6f:13:3a:bb:79:49 +# SHA1 Fingerprint: 51:c6:e7:08:49:06:6e:f3:92:d4:5c:a0:0d:6d:a3:62:8f:c3:52:39 +# SHA256 Fingerprint: b0:bf:d5:2b:b0:d7:d9:bd:92:bf:5d:4d:c1:3d:a2:55:c0:2c:54:2f:37:83:65:ea:89:39:11:f5:5e:55:f2:3c +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV +BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC +aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV +BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1 +Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz +MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+ +BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp +em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN +ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY +B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH +D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF +Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo +q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D +k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH +fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut +dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM +ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8 +zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn +rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX +U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6 +Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5 +XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF +Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR +HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY +GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c +77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3 ++GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK +vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6 +FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl +yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P +AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD +y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d +NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA== +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 2" +# Serial: 1 +# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a +# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 +# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd +AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC +FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi +1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq +jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ +wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ +WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy +NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC +uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw +IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 +g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP +BSeOE6Fuwg== +-----END CERTIFICATE----- + +# Issuer: CN=Atos TrustedRoot 2011 O=Atos +# Subject: CN=Atos TrustedRoot 2011 O=Atos +# Label: "Atos TrustedRoot 2011" +# Serial: 6643877497813316402 +# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 +# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 +# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE +AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG +EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM +FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC +REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp +Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM +VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ +SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ +4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L +cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi +eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG +A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 +DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j +vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP +DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc +maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D +lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv +KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 1 G3" +# Serial: 687049649626669250736271037606554624078720034195 +# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab +# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67 +# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 +MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV +wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe +rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 +68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh +4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp +UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o +abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc +3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G +KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt +hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO +Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt +zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD +ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC +MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 +cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN +qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 +YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv +b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 +8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k +NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj +ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp +q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt +nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2 G3" +# Serial: 390156079458959257446133169266079962026824725800 +# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06 +# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36 +# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 +MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf +qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW +n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym +c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ +O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 +o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j +IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq +IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz +8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh +vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l +7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG +cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD +ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 +AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC +roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga +W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n +lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE ++V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV +csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd +dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg +KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM +HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 +WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3 G3" +# Serial: 268090761170461462463995952157327242137089239581 +# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7 +# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d +# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 +MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR +/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu +FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR +U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c +ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR +FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k +A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw +eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl +sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp +VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q +A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ +ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD +ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px +KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI +FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv +oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg +u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP +0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf +3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl +8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ +DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN +PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ +ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G2" +# Serial: 15385348160840213938643033620894905419 +# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d +# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f +# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 +-----BEGIN CERTIFICATE----- +MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA +n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc +biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp +EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA +bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu +YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB +AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW +BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI +QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I +0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni +lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 +B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv +ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +IhNzbM8m9Yop5w== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G3" +# Serial: 15459312981008553731928384953135426796 +# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb +# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 +# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 +-----BEGIN CERTIFICATE----- +MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg +RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf +Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q +RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD +AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY +JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv +6pZjamVFkpUBtA== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G2" +# Serial: 4293743540046975378534879503202253541 +# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 +# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 +# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH +MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI +2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx +1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ +q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz +tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ +vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV +5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY +1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 +NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG +Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 +8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe +pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G3" +# Serial: 7089244469030293291760083333884364146 +# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca +# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e +# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe +Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw +EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x +IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF +K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG +fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO +Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd +BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx +AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ +oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 +sycX +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Trusted Root G4" +# Serial: 7451500558977370777930084869016614236 +# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 +# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 +# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 +-----BEGIN CERTIFICATE----- +MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg +RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y +ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If +xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV +ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO +DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ +jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ +CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi +EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM +fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY +uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK +chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t +9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 +SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd ++SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc +fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa +sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N +cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N +0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie +4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI +r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 +/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm +gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ +-----END CERTIFICATE----- + +# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Label: "COMODO RSA Certification Authority" +# Serial: 101909084537582093308941363524873193117 +# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 +# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 +# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 +-----BEGIN CERTIFICATE----- +MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB +hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV +BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT +EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR +6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X +pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC +9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV +/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf +Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z ++pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w +qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah +SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC +u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf +Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq +crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E +FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB +/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl +wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM +4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV +2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna +FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ +CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK +boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke +jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL +S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb +QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl +0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB +NVOFBkpdn627G190 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Label: "USERTrust RSA Certification Authority" +# Serial: 2645093764781058787591871645665788717 +# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 +# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e +# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 +-----BEGIN CERTIFICATE----- +MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB +iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl +cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV +BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw +MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV +BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B +3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY +tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ +Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 +VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT +79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 +c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT +Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l +c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee +UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE +Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd +BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G +A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF +Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO +VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 +ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs +8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR +iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze +Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ +XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ +qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB +VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB +L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG +jjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Label: "USERTrust ECC Certification Authority" +# Serial: 123013823720199481456569720443997572134 +# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 +# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 +# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a +-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl +eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT +JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT +Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg +VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo +I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng +o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G +A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB +zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW +RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Label: "GlobalSign ECC Root CA - R4" +# Serial: 14367148294922964480859022125800977897474 +# MD5 Fingerprint: 20:f0:27:68:d1:7e:a0:9d:0e:e6:2a:ca:df:5c:89:8e +# SHA1 Fingerprint: 69:69:56:2e:40:80:f4:24:a1:e7:19:9f:14:ba:f3:ee:58:ab:6a:bb +# SHA256 Fingerprint: be:c9:49:11:c2:95:56:76:db:6c:0a:55:09:86:d7:6e:3b:a0:05:66:7c:44:2c:97:62:b4:fb:b7:73:de:22:8c +-----BEGIN CERTIFICATE----- +MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk +MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH +bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX +DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD +QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ +FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F +uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX +kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs +ewv4n4Q= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Label: "GlobalSign ECC Root CA - R5" +# Serial: 32785792099990507226680698011560947931244 +# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 +# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa +# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 +-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk +MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH +bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX +DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD +QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc +8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke +hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI +KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg +515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO +xwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden +# Label: "Staat der Nederlanden Root CA - G3" +# Serial: 10003001 +# MD5 Fingerprint: 0b:46:67:07:db:10:2f:19:8c:35:50:60:d1:0b:f4:37 +# SHA1 Fingerprint: d8:eb:6b:41:51:92:59:e0:f3:e7:85:00:c0:3d:b6:88:97:c9:ee:fc +# SHA256 Fingerprint: 3c:4f:b0:b9:5a:b8:b3:00:32:f4:32:b8:6f:53:5f:e1:72:c1:85:d0:fd:39:86:58:37:cf:36:18:7f:a6:f4:28 +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloX +DTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl +ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv +b3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4yolQP +cPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WW +IkYFsO2tx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqX +xz8ecAgwoNzFs21v0IJyEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFy +KJLZWyNtZrVtB0LrpjPOktvA9mxjeM3KTj215VKb8b475lRgsGYeCasH/lSJEULR +9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUurmkVLoR9BvUhTFXFkC4az +5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU51nus6+N8 +6U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7 +Ngzp07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHP +bMk7ccHViLVlvMDoFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXt +BznaqB16nzaeErAMZRKQFWDZJkBE41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTt +XUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMBAAGjQjBAMA8GA1UdEwEB/wQF +MAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleuyjWcLhL75Lpd +INyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD +U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwp +LiniyMMB8jPqKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8 +Ipf3YF3qKS9Ysr1YvY2WTxB1v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixp +gZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA8KCWAg8zxXHzniN9lLf9OtMJgwYh +/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b8KKaa8MFSu1BYBQw +0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0rmj1A +fsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq +4BZ+Extq1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR +1VmiiXTTn74eS9fGbbeIJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/ +QFH1T/U67cjF68IeHRaVesd+QnGTbksVtzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM +94B7IWcnMFk= +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden +# Label: "Staat der Nederlanden EV Root CA" +# Serial: 10000013 +# MD5 Fingerprint: fc:06:af:7b:e8:1a:f1:9a:b4:e8:d2:70:1f:c0:f5:ba +# SHA1 Fingerprint: 76:e2:7e:c1:4f:db:82:c1:c0:a6:75:b5:05:be:3d:29:b4:ed:db:bb +# SHA256 Fingerprint: 4d:24:91:41:4c:fe:95:67:46:ec:4c:ef:a6:cf:6f:72:e2:8a:13:29:43:2f:9d:8a:90:7a:c4:cb:5d:ad:c1:5a +-----BEGIN CERTIFICATE----- +MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y +MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg +TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS +b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS +M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC +UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d +Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p +rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l +pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb +j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC +KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS +/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X +cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH +1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP +px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7 +MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI +eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u +2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS +v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC +wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy +CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e +vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6 +Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa +Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL +eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8 +FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc +7uzXLg== +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Label: "IdenTrust Commercial Root CA 1" +# Serial: 13298821034946342390520003877796839426 +# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7 +# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25 +# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu +VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw +MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw +JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT +3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU ++ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp +S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 +bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi +T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL +vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK +Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK +dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT +c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv +l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N +iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD +ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH +6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt +LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 +nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 ++wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK +W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT +AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq +l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG +4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ +mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A +7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Label: "IdenTrust Public Sector Root CA 1" +# Serial: 13298821034946342390521976156843933698 +# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba +# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd +# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu +VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN +MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 +MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 +ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy +RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS +bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF +/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R +3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw +EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy +9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V +GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ +2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV +WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD +W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN +AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj +t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV +DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 +TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G +lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW +mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df +WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 ++bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ +tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA +GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv +8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - G2" +# Serial: 1246989352 +# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2 +# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4 +# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39 +-----BEGIN CERTIFICATE----- +MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 +cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs +IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz +dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy +NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu +dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt +dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 +aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T +RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN +cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW +wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 +U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 +jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN +BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ +jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ +Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v +1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R +nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH +VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - EC1" +# Serial: 51543124481930649114116133369 +# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc +# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47 +# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5 +-----BEGIN CERTIFICATE----- +MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG +A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 +d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu +dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq +RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy +MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD +VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 +L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g +Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi +A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt +ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH +Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC +R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX +hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G +-----END CERTIFICATE----- + +# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority +# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority +# Label: "CFCA EV ROOT" +# Serial: 407555286 +# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30 +# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83 +# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD +TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y +aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx +MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j +aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP +T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 +sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL +TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 +/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp +7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz +EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt +hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP +a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot +aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg +TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV +PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv +cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL +tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd +BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB +ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT +ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL +jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS +ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy +P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 +xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d +Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN +5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe +/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z +AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ +5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GB CA" +# Serial: 157768595616588414422159278966750757568 +# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d +# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed +# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6 +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt +MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg +Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i +YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x +CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG +b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh +bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3 +HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx +WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX +1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk +u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P +99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r +M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB +BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh +cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5 +gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO +ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf +aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic +Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= +-----END CERTIFICATE----- + +# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +# Label: "SZAFIR ROOT CA2" +# Serial: 357043034767186914217277344587386743377558296292 +# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99 +# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de +# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL +BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6 +ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw +NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L +cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg +Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN +QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT +3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw +3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6 +3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5 +BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN +XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF +AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw +8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG +nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP +oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy +d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg +LvWpCz/UXeHPhJ/iGcJfitYgHuNztw== +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA 2" +# Serial: 44979900017204383099463764357512596969 +# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2 +# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92 +# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04 +-----BEGIN CERTIFICATE----- +MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB +gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu +QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG +A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz +OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ +VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3 +b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA +DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn +0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB +OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE +fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E +Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m +o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i +sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW +OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez +Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS +adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n +3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ +F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf +CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29 +XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm +djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/ +WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb +AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq +P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko +b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj +XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P +5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi +DrW5viSP +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions RootCA 2015" +# Serial: 0 +# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce +# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6 +# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36 +-----BEGIN CERTIFICATE----- +MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix +DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k +IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT +N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v +dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG +A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh +ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx +QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA +4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0 +AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10 +4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C +ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV +9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD +gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6 +Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq +NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko +LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc +Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd +ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I +XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI +M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot +9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V +Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea +j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh +X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ +l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf +bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4 +pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK +e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0 +vm9qp/UsQu0yrbYhnr68 +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015" +# Serial: 0 +# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef +# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66 +# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33 +-----BEGIN CERTIFICATE----- +MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN +BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl +bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv +b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ +BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj +YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5 +MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0 +dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg +QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa +jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi +C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep +lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof +TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR +-----END CERTIFICATE----- + +# Issuer: CN=ISRG Root X1 O=Internet Security Research Group +# Subject: CN=ISRG Root X1 O=Internet Security Research Group +# Label: "ISRG Root X1" +# Serial: 172886928669790476064670243504169061120 +# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e +# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8 +# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6 +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 +WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu +ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc +h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ +0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U +A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW +T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH +B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC +B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv +KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn +OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn +jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw +qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI +rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq +hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ +3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK +NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 +ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur +TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC +jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc +oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq +4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA +mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d +emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- + +# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +# Label: "AC RAIZ FNMT-RCM" +# Serial: 485876308206448804701554682760554759 +# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d +# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20 +# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx +CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ +WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ +BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG +Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/ +yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf +BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz +WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF +tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z +374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC +IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL +mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7 +wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS +MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2 +ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet +UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H +YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3 +LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD +nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1 +RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM +LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf +77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N +JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm +fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp +6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp +1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B +9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok +RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv +uu8wd+RU4riEmViAqhOLUTpPSPaLtrM= +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 1 O=Amazon +# Subject: CN=Amazon Root CA 1 O=Amazon +# Label: "Amazon Root CA 1" +# Serial: 143266978916655856878034712317230054538369994 +# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6 +# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16 +# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e +-----BEGIN CERTIFICATE----- +MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj +ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM +9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw +IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6 +VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L +93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm +jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA +A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI +U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs +N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv +o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU +5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy +rqXRfboQnoZsG4q5WTP468SQvvG5 +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 2 O=Amazon +# Subject: CN=Amazon Root CA 2 O=Amazon +# Label: "Amazon Root CA 2" +# Serial: 143266982885963551818349160658925006970653239 +# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66 +# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a +# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4 +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK +gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ +W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg +1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K +8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r +2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me +z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR +8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj +mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz +7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6 ++XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI +0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB +Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm +UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2 +LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY ++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS +k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl +7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm +btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl +urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+ +fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63 +n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE +76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H +9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT +4PsJYGw= +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 3 O=Amazon +# Subject: CN=Amazon Root CA 3 O=Amazon +# Label: "Amazon Root CA 3" +# Serial: 143266986699090766294700635381230934788665930 +# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87 +# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e +# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4 +-----BEGIN CERTIFICATE----- +MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl +ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr +ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr +BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM +YyRIHN8wfdVoOw== +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 4 O=Amazon +# Subject: CN=Amazon Root CA 4 O=Amazon +# Label: "Amazon Root CA 4" +# Serial: 143266989758080763974105200630763877849284878 +# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd +# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be +# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92 +-----BEGIN CERTIFICATE----- +MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi +9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk +M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB +MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw +CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW +1KyLa2tJElMzrdfkviT8tQp21KW8EA== +-----END CERTIFICATE----- + +# Issuer: CN=LuxTrust Global Root 2 O=LuxTrust S.A. +# Subject: CN=LuxTrust Global Root 2 O=LuxTrust S.A. +# Label: "LuxTrust Global Root 2" +# Serial: 59914338225734147123941058376788110305822489521 +# MD5 Fingerprint: b2:e1:09:00:61:af:f7:f1:91:6f:c4:ad:8d:5e:3b:7c +# SHA1 Fingerprint: 1e:0e:56:19:0a:d1:8b:25:98:b2:04:44:ff:66:8a:04:17:99:5f:3f +# SHA256 Fingerprint: 54:45:5f:71:29:c2:0b:14:47:c4:18:f9:97:16:8f:24:c5:8f:c5:02:3b:f5:da:5b:e2:eb:6e:1d:d8:90:2e:d5 +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" +# Serial: 1 +# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49 +# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca +# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16 +-----BEGIN CERTIFICATE----- +MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx +GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp +bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w +KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0 +BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy +dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG +EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll +IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU +QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT +TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg +LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7 +a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr +LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr +N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X +YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/ +iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f +AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH +V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh +AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf +IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4 +lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c +8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf +lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= +-----END CERTIFICATE----- + +# Issuer: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. +# Subject: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. +# Label: "GDCA TrustAUTH R5 ROOT" +# Serial: 9009899650740120186 +# MD5 Fingerprint: 63:cc:d9:3d:34:35:5c:6f:53:a3:e2:08:70:48:1f:b4 +# SHA1 Fingerprint: 0f:36:38:5b:81:1a:25:c3:9b:31:4e:83:ca:e9:34:66:70:cc:74:b4 +# SHA256 Fingerprint: bf:ff:8f:d0:44:33:48:7d:6a:8a:a6:0c:1a:29:76:7a:9f:c2:bb:b0:5e:42:0f:71:3a:13:b9:92:89:1d:38:93 +-----BEGIN CERTIFICATE----- +MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE +BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ +IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0 +MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV +BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w +HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj +Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj +TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u +KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj +qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm +MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12 +ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP +zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk +L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC +jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA +HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC +AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg +p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm +DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5 +COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry +L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf +JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg +IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io +2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV +09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ +XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq +T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe +MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor RootCert CA-1" +# Serial: 15752444095811006489 +# MD5 Fingerprint: 6e:85:f1:dc:1a:00:d3:22:d5:b2:b2:ac:6b:37:05:45 +# SHA1 Fingerprint: ff:bd:cd:e7:82:c8:43:5e:3c:6f:26:86:5c:ca:a8:3a:45:5b:c3:0a +# SHA256 Fingerprint: d4:0e:9c:86:cd:8f:e4:68:c1:77:69:59:f4:9e:a7:74:fa:54:86:84:b6:c4:06:f3:90:92:61:f4:dc:e2:57:5c +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYD +VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk +MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U +cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29y +IFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkxMjMxMTcyMzE2WjCB +pDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFuYW1h +IENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUG +A1UECwweVHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZU +cnVzdENvciBSb290Q2VydCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAv463leLCJhJrMxnHQFgKq1mqjQCj/IDHUHuO1CAmujIS2CNUSSUQIpid +RtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4pQa81QBeCQryJ3pS/C3V +seq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0JEsq1pme +9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CV +EY4hgLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorW +hnAbJN7+KIor0Gqw/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/ +DeOxCbeKyKsZn3MzUOcwHwYDVR0jBBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD +ggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5mDo4Nvu7Zp5I +/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf +ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZ +yonnMlo2HD6CqFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djts +L1Ac59v2Z3kf9YKVmgenFK+P3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdN +zl/HHk484IkzlQsPpTLWPFp5LBk= +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor RootCert CA-2" +# Serial: 2711694510199101698 +# MD5 Fingerprint: a2:e1:f8:18:0b:ba:45:d5:c7:41:2a:bb:37:52:45:64 +# SHA1 Fingerprint: b8:be:6d:cb:56:f1:55:b9:63:d4:12:ca:4e:06:34:c7:94:b2:1c:c0 +# SHA256 Fingerprint: 07:53:e9:40:37:8c:1b:d5:e3:83:6e:39:5d:ae:a5:cb:83:9e:50:46:f1:bd:0e:ae:19:51:cf:10:fe:c7:c9:65 +-----BEGIN CERTIFICATE----- +MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNV +BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw +IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy +dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEfMB0GA1UEAwwWVHJ1c3RDb3Ig +Um9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEyMzExNzI2MzlaMIGk +MQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEg +Q2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYD +VQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRy +dXN0Q29yIFJvb3RDZXJ0IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCnIG7CKqJiJJWQdsg4foDSq8GbZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+ +QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9NkRvRUqdw6VC0xK5mC8tkq +1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1oYxOdqHp +2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nK +DOObXUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hape +az6LMvYHL1cEksr1/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF +3wP+TfSvPd9cW436cOGlfifHhi5qjxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88 +oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQPeSghYA2FFn3XVDjxklb9tTNM +g9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+CtgrKAmrhQhJ8Z3 +mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh +8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAd +BgNVHQ4EFgQU2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6U +nrybPZx9mCAZ5YwwYrIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYw +DQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/hOsh80QA9z+LqBrWyOrsGS2h60COX +dKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnpkpfbsEZC89NiqpX+ +MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv2wnL +/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RX +CI/hOWB3S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYa +ZH9bDTMJBzN7Bj8RpFxwPIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW +2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dvDDqPys/cA8GiCcjl/YBeyGBCARsaU1q7 +N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYURpFHmygk71dSTlxCnKr3 +Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANExdqtvArB +As8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp +5KeXRKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu +1uwJ +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor ECA-1" +# Serial: 9548242946988625984 +# MD5 Fingerprint: 27:92:23:1d:0a:f5:40:7c:e9:e6:6b:9d:d8:f5:e7:6c +# SHA1 Fingerprint: 58:d1:df:95:95:67:6b:63:c0:f0:5b:1c:17:4d:8b:84:0b:c8:78:bd +# SHA256 Fingerprint: 5a:88:5d:b1:9c:01:d9:12:c5:75:93:88:93:8c:af:bb:df:03:1a:b2:d4:8e:91:ee:15:58:9b:42:97:1d:03:9c +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYD +VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk +MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U +cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFzAVBgNVBAMMDlRydXN0Q29y +IEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3MjgwN1owgZwxCzAJBgNV +BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw +IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy +dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3Ig +RUNBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb +3w9U73NjKYKtR8aja+3+XzP4Q1HpGjORMRegdMTUpwHmspI+ap3tDvl0mEDTPwOA +BoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23xFUfJ3zSCNV2HykVh0A5 +3ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmcp0yJF4Ou +owReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/ +wZ0+fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZF +ZtS6mFjBAgMBAAGjYzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAf +BgNVHSMEGDAWgBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/ +MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEABT41XBVwm8nHc2Fv +civUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u/ukZMjgDfxT2 +AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F +hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50 +soIipX1TH0XsJ5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BI +WJZpTdwHjFGTot+fDz2LYLSCjaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1Wi +tJ/X5g== +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation +# Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation +# Label: "SSL.com Root Certification Authority RSA" +# Serial: 8875640296558310041 +# MD5 Fingerprint: 86:69:12:c0:70:f1:ec:ac:ac:c2:d5:bc:a5:5b:a1:29 +# SHA1 Fingerprint: b7:ab:33:08:d1:ea:44:77:ba:14:80:12:5a:6f:bd:a9:36:49:0c:bb +# SHA256 Fingerprint: 85:66:6a:56:2e:e0:be:5c:e9:25:c1:d8:89:0a:6f:76:a8:7e:c1:6d:4d:7d:5f:29:ea:74:19:cf:20:12:3b:69 +-----BEGIN CERTIFICATE----- +MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE +BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK +DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz +OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv +dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv +bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN +AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R +xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX +qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC +C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3 +6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh +/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF +YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E +JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc +US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8 +ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm ++Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi +M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G +A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV +cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc +Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs +PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/ +q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0 +cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr +a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I +H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y +K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu +nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf +oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY +Ic2wBlX7Jz9TkHCpBB5XJ7k= +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com Root Certification Authority ECC O=SSL Corporation +# Subject: CN=SSL.com Root Certification Authority ECC O=SSL Corporation +# Label: "SSL.com Root Certification Authority ECC" +# Serial: 8495723813297216424 +# MD5 Fingerprint: 2e:da:e4:39:7f:9c:8f:37:d1:70:9f:26:17:51:3a:8e +# SHA1 Fingerprint: c3:19:7c:39:24:e6:54:af:1b:c4:ab:20:95:7a:e2:c3:0e:13:02:6a +# SHA256 Fingerprint: 34:17:bb:06:cc:60:07:da:1b:96:1c:92:0b:8a:b4:ce:3f:ad:82:0e:4a:a3:0b:9a:cb:c4:a7:4e:bd:ce:bc:65 +-----BEGIN CERTIFICATE----- +MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC +VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T +U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz +WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0 +b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS +b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB +BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI +7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg +CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud +EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD +VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T +kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+ +gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation +# Subject: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation +# Label: "SSL.com EV Root Certification Authority RSA R2" +# Serial: 6248227494352943350 +# MD5 Fingerprint: e1:1e:31:58:1a:ae:54:53:02:f6:17:6a:11:7b:4d:95 +# SHA1 Fingerprint: 74:3a:f0:52:9b:d0:32:a0:f4:4a:83:cd:d4:ba:a9:7b:7c:2e:c4:9a +# SHA256 Fingerprint: 2e:7b:f1:6c:c2:24:85:a7:bb:e2:aa:86:96:75:07:61:b0:ae:39:be:3b:2f:e9:d0:cc:6d:4e:f7:34:91:42:5c +-----BEGIN CERTIFICATE----- +MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV +BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE +CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy +MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G +A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD +DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq +M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf +OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa +4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9 +HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR +aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA +b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ +Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV +PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO +pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu +UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY +MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV +HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4 +9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW +s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5 +Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg +cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM +79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz +/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt +ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm +Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK +QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ +w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi +S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07 +mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation +# Subject: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation +# Label: "SSL.com EV Root Certification Authority ECC" +# Serial: 3182246526754555285 +# MD5 Fingerprint: 59:53:22:65:83:42:01:54:c0:ce:42:b9:5a:7c:f2:90 +# SHA1 Fingerprint: 4c:dd:51:a3:d1:f5:20:32:14:b0:c6:c5:32:23:03:91:c7:46:42:6d +# SHA256 Fingerprint: 22:a2:c1:f7:bd:ed:70:4c:c1:e7:01:b5:f4:08:c3:10:88:0f:e9:56:b5:de:2a:4a:44:f9:9c:87:3a:25:a7:c8 +-----BEGIN CERTIFICATE----- +MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC +VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T +U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx +NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv +dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv +bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49 +AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA +VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku +WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP +MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX +5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ +ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg +h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 +# Label: "GlobalSign Root CA - R6" +# Serial: 1417766617973444989252670301619537 +# MD5 Fingerprint: 4f:dd:07:e4:d4:22:64:39:1e:0c:37:42:ea:d1:c6:ae +# SHA1 Fingerprint: 80:94:64:0e:b5:a7:a1:ca:11:9c:1f:dd:d5:9f:81:02:63:a7:fb:d1 +# SHA256 Fingerprint: 2c:ab:ea:fe:37:d0:6c:a2:2a:ba:73:91:c0:03:3d:25:98:29:52:c4:53:64:73:49:76:3a:3a:b5:ad:6c:cf:69 +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg +MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh +bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx +MjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET +MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI +xutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k +ZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD +aNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw +LnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw +1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX +k7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2 +SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h +bguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n +WUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY +rZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce +MgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu +bAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN +nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt +Ixg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61 +55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj +vUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf +cDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz +oHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp +nOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs +pA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v +JJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R +8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4 +5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GC CA" +# Serial: 44084345621038548146064804565436152554 +# MD5 Fingerprint: a9:d6:b9:2d:2f:93:64:f8:a5:69:ca:91:e9:68:07:23 +# SHA1 Fingerprint: e0:11:84:5e:34:de:be:88:81:b9:9c:f6:16:26:d1:96:1f:c3:b9:31 +# SHA256 Fingerprint: 85:60:f9:1c:36:24:da:ba:95:70:b5:fe:a0:db:e3:6f:f1:1a:83:23:be:94:86:85:4f:b3:f3:4a:55:71:19:8d +-----BEGIN CERTIFICATE----- +MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQsw +CQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91 +bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwg +Um9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRaFw00MjA1MDkwOTU4MzNaMG0xCzAJ +BgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBGb3Vu +ZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBS +b290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4ni +eUqjFqdrVCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4W +p2OQ0jnUsYd4XxiWD1AbNTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7T +rYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV +57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQg +Mgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R1 O=Google Trust Services LLC +# Subject: CN=GTS Root R1 O=Google Trust Services LLC +# Label: "GTS Root R1" +# Serial: 146587175971765017618439757810265552097 +# MD5 Fingerprint: 82:1a:ef:d4:d2:4a:f2:9f:e2:3d:97:06:14:70:72:85 +# SHA1 Fingerprint: e1:c9:50:e6:ef:22:f8:4c:56:45:72:8b:92:20:60:d7:d5:a7:a3:e8 +# SHA256 Fingerprint: 2a:57:54:71:e3:13:40:bc:21:58:1c:bd:2c:f1:3e:15:84:63:20:3e:ce:94:bc:f9:d3:cc:19:6b:f0:9a:54:72 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBH +MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM +QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy +MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl +cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM +f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vX +mX7wCl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7 +zUjwTcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0P +fyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtc +vfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4 +Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUsp +zBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOO +Rc92wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYW +k70paDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+ +DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgF +lQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBADiW +Cu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1 +d5iyfNm9dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6Z +XPYfcX3v73svfuo21pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZR +gyFmxhE+885H7pwoHyXa/6xmld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3 +d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL07q9bgsiG1eGZbYwE8na6SfZu6W0eX6Dv +J4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdljUEn2NIVq4BjFbkerQUIpm/Zg +DdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0dzpqPJeaAcWErtXvM ++SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwlfnuzCdyy +F62ARPBopY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9 +SQ98POyDGCBDTtWTurQ0sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdws +E3PYJ/HQcu51OyLemGhmW/HGY0dVHLqlCFF1pkgl +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R2 O=Google Trust Services LLC +# Subject: CN=GTS Root R2 O=Google Trust Services LLC +# Label: "GTS Root R2" +# Serial: 146587176055767053814479386953112547951 +# MD5 Fingerprint: 44:ed:9a:0e:a4:09:3b:00:f2:ae:4c:a3:c6:61:b0:8b +# SHA1 Fingerprint: d2:73:96:2a:2a:5e:39:9f:73:3f:e1:c7:1e:64:3f:03:38:34:fc:4d +# SHA256 Fingerprint: c4:5d:7b:b0:8e:6d:67:e6:2e:42:35:11:0b:56:4e:5f:78:fd:92:ef:05:8c:84:0a:ea:4e:64:55:d7:58:5c:60 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQbkepxlqz5yDFMJo/aFLybzANBgkqhkiG9w0BAQwFADBH +MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM +QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy +MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl +cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv +CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3Kg +GjSY6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9Bu +XvAuMC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOd +re7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXu +PuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1 +mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K +8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqj +x5RWIr9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsR +nTKaG73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0 +kzCqgc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9Ok +twIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBALZp +8KZ3/p7uC4Gt4cCpx/k1HUCCq+YEtN/L9x0Pg/B+E02NjO7jMyLDOfxA325BS0JT +vhaI8dI4XsRomRyYUpOM52jtG2pzegVATX9lO9ZY8c6DR2Dj/5epnGB3GFW1fgiT +z9D2PGcDFWEJ+YF59exTpJ/JjwGLc8R3dtyDovUMSRqodt6Sm2T4syzFJ9MHwAiA +pJiS4wGWAqoC7o87xdFtCjMwc3i5T1QWvwsHoaRc5svJXISPD+AVdyx+Jn7axEvb +pxZ3B7DNdehyQtaVhJ2Gg/LkkM0JR9SLA3DaWsYDQvTtN6LwG1BUSw7YhN4ZKJmB +R64JGz9I0cNv4rBgF/XuIwKl2gBbbZCr7qLpGzvpx0QnRY5rn/WkhLx3+WuXrD5R +RaIRpsyF7gpo8j5QOHokYh4XIDdtak23CZvJ/KRY9bb7nE4Yu5UC56GtmwfuNmsk +0jmGwZODUNKBRqhfYlcsu2xkiAhu7xNUX90txGdj08+JN7+dIPT7eoOboB6BAFDC +5AwiWVIQ7UNWhwD4FFKnHYuTjKJNRn8nxnGbJN7k2oaLDX5rIMHAnuFl2GqjpuiF +izoHCBy69Y9Vmhh1fuXsgWbRIXOhNUQLgD1bnF5vKheW0YMjiGZt5obicDIvUiLn +yOd/xCxgXS/Dr55FBcOEArf9LAhST4Ldo/DUhgkC +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R3 O=Google Trust Services LLC +# Subject: CN=GTS Root R3 O=Google Trust Services LLC +# Label: "GTS Root R3" +# Serial: 146587176140553309517047991083707763997 +# MD5 Fingerprint: 1a:79:5b:6b:04:52:9c:5d:c7:74:33:1b:25:9a:f9:25 +# SHA1 Fingerprint: 30:d4:24:6f:07:ff:db:91:89:8a:0b:e9:49:66:11:eb:8c:5e:46:e5 +# SHA256 Fingerprint: 15:d5:b8:77:46:19:ea:7d:54:ce:1c:a6:d0:b0:c4:03:e0:37:a9:17:f1:31:e8:a0:4e:1e:6b:7a:71:ba:bc:e5 +-----BEGIN CERTIFICATE----- +MIICDDCCAZGgAwIBAgIQbkepx2ypcyRAiQ8DVd2NHTAKBggqhkjOPQQDAzBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout +736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2A +DDL24CejQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEAgFuk +fCPAlaUs3L6JbyO5o91lAFJekazInXJ0glMLfalAvWhgxeG4VDvBNhcl2MG9AjEA +njWSdIUlUfUk7GRSJFClH9voy8l27OyCbvWFGFPouOOaKaqW04MjyaR7YbPMAuhd +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R4 O=Google Trust Services LLC +# Subject: CN=GTS Root R4 O=Google Trust Services LLC +# Label: "GTS Root R4" +# Serial: 146587176229350439916519468929765261721 +# MD5 Fingerprint: 5d:b6:6a:c4:60:17:24:6a:1a:99:a8:4b:ee:5e:b4:26 +# SHA1 Fingerprint: 2a:1d:60:27:d9:4a:b1:0a:1c:4d:91:5c:cd:33:a0:cb:3e:2d:54:cb +# SHA256 Fingerprint: 71:cc:a5:39:1f:9e:79:4b:04:80:25:30:b3:63:e1:21:da:8a:30:43:bb:26:66:2f:ea:4d:ca:7f:c9:51:a4:bd +-----BEGIN CERTIFICATE----- +MIICCjCCAZGgAwIBAgIQbkepyIuUtui7OyrYorLBmTAKBggqhkjOPQQDAzBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu +hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/l +xKvRHYqjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNnADBkAjBqUFJ0 +CMRw3J5QdCHojXohw0+WbhXRIjVhLfoIN+4Zba3bssx9BzT1YBkstTTZbyACMANx +sbqjYAuG7ZoIapVon+Kz4ZNkfF6Tpt95LY2F45TPI11xzPKwTdb+mciUqXWi4w== +-----END CERTIFICATE----- + +# Issuer: CN=UCA Global G2 Root O=UniTrust +# Subject: CN=UCA Global G2 Root O=UniTrust +# Label: "UCA Global G2 Root" +# Serial: 124779693093741543919145257850076631279 +# MD5 Fingerprint: 80:fe:f0:c4:4a:f0:5c:62:32:9f:1c:ba:78:a9:50:f8 +# SHA1 Fingerprint: 28:f9:78:16:19:7a:ff:18:25:18:aa:44:fe:c1:a0:ce:5c:b6:4c:8a +# SHA256 Fingerprint: 9b:ea:11:c9:76:fe:01:47:64:c1:be:56:a6:f9:14:b5:a5:60:31:7a:bd:99:88:39:33:82:e5:16:1a:a0:49:3c +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9 +MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBH +bG9iYWwgRzIgUm9vdDAeFw0xNjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0x +CzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlUcnVzdDEbMBkGA1UEAwwSVUNBIEds +b2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxeYr +b3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmToni9 +kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzm +VHqUwCoV8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/R +VogvGjqNO7uCEeBHANBSh6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDc +C/Vkw85DvG1xudLeJ1uK6NjGruFZfc8oLTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIj +tm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/R+zvWr9LesGtOxdQXGLY +D0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBeKW4bHAyv +j5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6Dl +NaBa4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6 +iIis7nCs+dwp4wwcOxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznP +O6Q0ibd5Ei9Hxeepl2n8pndntd978XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFIHEjMz15DD/pQwIX4wV +ZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo5sOASD0Ee/oj +L3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 +1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl +1qnN3e92mI0ADs0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oU +b3n09tDh05S60FdRvScFDcH9yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LV +PtateJLbXDzz2K36uGt/xDYotgIVilQsnLAXc47QN6MUPJiVAAwpBVueSUmxX8fj +y88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHojhJi6IjMtX9Gl8Cb +EGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZkbxqg +DMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI ++Vg7RE+xygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGy +YiGqhkCyLmTTX8jjfhFnRR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bX +UB+K+wb1whnw0A== +-----END CERTIFICATE----- + +# Issuer: CN=UCA Extended Validation Root O=UniTrust +# Subject: CN=UCA Extended Validation Root O=UniTrust +# Label: "UCA Extended Validation Root" +# Serial: 106100277556486529736699587978573607008 +# MD5 Fingerprint: a1:f3:5f:43:c6:34:9b:da:bf:8c:7e:05:53:ad:96:e2 +# SHA1 Fingerprint: a3:a1:b0:6f:24:61:23:4a:e3:36:a5:c2:37:fc:a6:ff:dd:f0:d7:3a +# SHA256 Fingerprint: d4:3a:f9:b3:54:73:75:5c:96:84:fc:06:d7:d8:cb:70:ee:5c:28:e7:73:fb:29:4e:b4:1e:e7:17:22:92:4d:24 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBH +MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBF +eHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMx +MDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNV +BAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrsiWog +D4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvS +sPGP2KxFRv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aop +O2z6+I9tTcg1367r3CTueUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dk +sHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR59mzLC52LqGj3n5qiAno8geK+LLNEOfi +c0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH0mK1lTnj8/FtDw5lhIpj +VMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KRel7sFsLz +KuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/ +TuDvB0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41G +sx2VYVdWf6/wFlthWG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs +1+lvK9JKBZP8nm9rZ/+I8U6laUpSNwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQD +fwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS3H5aBZ8eNJr34RQwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBADaN +l8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR +ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQ +VBcZEhrxH9cMaVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5 +c6sq1WnIeJEmMX3ixzDx/BR4dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp +4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb+7lsq+KePRXBOy5nAliRn+/4Qh8s +t2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOWF3sGPjLtx7dCvHaj +2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwiGpWO +vpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2C +xR9GUeOcGMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmx +cmtpzyKEC2IPrNkZAJSidjzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbM +fjKaiJUINlK73nZfdklJrX+9ZSCyycErdhh2n1ax +-----END CERTIFICATE----- + +# Issuer: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 +# Subject: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 +# Label: "Certigna Root CA" +# Serial: 269714418870597844693661054334862075617 +# MD5 Fingerprint: 0e:5c:30:62:27:eb:5b:bc:d7:ae:62:ba:e9:d5:df:77 +# SHA1 Fingerprint: 2d:0d:52:14:ff:9e:ad:99:24:01:74:20:47:6e:6c:85:27:27:f5:43 +# SHA256 Fingerprint: d4:8d:3d:23:ee:db:50:a4:59:e5:51:97:60:1c:27:77:4b:9d:7b:18:c9:4d:5a:05:95:11:a1:02:50:b9:31:68 +-----BEGIN CERTIFICATE----- +MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAw +WjELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAw +MiA0ODE0NjMwODEwMDAzNjEZMBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0x +MzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjdaMFoxCzAJBgNVBAYTAkZSMRIwEAYD +VQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYzMDgxMDAwMzYxGTAX +BgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sO +ty3tRQgXstmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9M +CiBtnyN6tMbaLOQdLNyzKNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPu +I9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8JXrJhFwLrN1CTivngqIkicuQstDuI7pm +TLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16XdG+RCYyKfHx9WzMfgIh +C59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq4NYKpkDf +ePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3Yz +IoejwpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWT +Co/1VTp2lc5ZmIoJlXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1k +JWumIWmbat10TWuXekG9qxf5kBdIjzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5 +hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp//TBt2dzhauH8XwIDAQABo4IB +GjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of +1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczov +L3d3d3cuY2VydGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilo +dHRwOi8vY3JsLmNlcnRpZ25hLmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYr +aHR0cDovL2NybC5kaGlteW90aXMuY29tL2NlcnRpZ25hcm9vdGNhLmNybDANBgkq +hkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOItOoldaDgvUSILSo3L +6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxPTGRG +HVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH6 +0BGM+RFq7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncB +lA2c5uk5jR+mUYyZDDl34bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdi +o2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1 +gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS6Cvu5zHbugRqh5jnxV/v +faci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaYtlu3zM63 +Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayh +jWZSaX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw +3kAP+HwV96LOPNdeE4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= +-----END CERTIFICATE----- + +# Issuer: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI +# Subject: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI +# Label: "emSign Root CA - G1" +# Serial: 235931866688319308814040 +# MD5 Fingerprint: 9c:42:84:57:dd:cb:0b:a7:2e:95:ad:b6:f3:da:bc:ac +# SHA1 Fingerprint: 8a:c7:ad:8f:73:ac:4e:c1:b5:75:4d:a5:40:f4:fc:cf:7c:b5:8e:8c +# SHA256 Fingerprint: 40:f6:af:03:46:a9:9a:a1:cd:1d:55:5a:4e:9c:ce:62:c7:f9:63:46:03:ee:40:66:15:83:3d:c8:c8:d0:03:67 +-----BEGIN CERTIFICATE----- +MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYD +VQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBU +ZWNobm9sb2dpZXMgTGltaXRlZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBH +MTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgxODMwMDBaMGcxCzAJBgNVBAYTAklO +MRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVkaHJhIFRlY2hub2xv +Z2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQz +f2N4aLTNLnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO +8oG0x5ZOrRkVUkr+PHB1cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aq +d7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHWDV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhM +tTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ6DqS0hdW5TUaQBw+jSzt +Od9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrHhQIDAQAB +o0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQD +AgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31x +PaOfG1vR2vjTnGs2vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjM +wiI/aTvFthUvozXGaCocV685743QNcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6d +GNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q+Mri/Tm3R7nrft8EI6/6nAYH +6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeihU80Bv2noWgby +RQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx +iN66zB+Afko= +-----END CERTIFICATE----- + +# Issuer: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI +# Subject: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI +# Label: "emSign ECC Root CA - G3" +# Serial: 287880440101571086945156 +# MD5 Fingerprint: ce:0b:72:d1:9f:88:8e:d0:50:03:e8:e3:b8:8b:67:40 +# SHA1 Fingerprint: 30:43:fa:4f:f2:57:dc:a0:c3:80:ee:2e:58:ea:78:b2:3f:e6:bb:c1 +# SHA256 Fingerprint: 86:a1:ec:ba:08:9c:4a:8d:3b:be:27:34:c6:12:ba:34:1d:81:3e:04:3c:f9:e8:a8:62:cd:5c:57:a3:6b:be:6b +-----BEGIN CERTIFICATE----- +MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQG +EwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNo +bm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g +RzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4MTgzMDAwWjBrMQswCQYDVQQGEwJJ +TjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9s +b2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMw +djAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0 +WXTsuwYc58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xyS +fvalY8L1X44uT6EYGQIrMgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuB +zhccLikenEhjQjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggq +hkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+DCBeQyh+KTOgNG3qxrdWB +CUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7jHvrZQnD ++JbNR6iC8hZVdyR+EhCVBCyj +-----END CERTIFICATE----- + +# Issuer: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI +# Subject: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI +# Label: "emSign Root CA - C1" +# Serial: 825510296613316004955058 +# MD5 Fingerprint: d8:e3:5d:01:21:fa:78:5a:b0:df:ba:d2:ee:2a:5f:68 +# SHA1 Fingerprint: e7:2e:f1:df:fc:b2:09:28:cf:5d:d4:d5:67:37:b1:51:cb:86:4f:01 +# SHA256 Fingerprint: 12:56:09:aa:30:1d:a0:a2:49:b9:7a:82:39:cb:6a:34:21:6f:44:dc:ac:9f:39:54:b1:42:92:f2:e8:c8:60:8f +-----BEGIN CERTIFICATE----- +MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkG +A1UEBhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEg +SW5jMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAw +MFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln +biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNpZ24gUm9v +dCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+upufGZ +BczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZ +HdPIWoU/Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH +3DspVpNqs8FqOp099cGXOFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvH +GPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4VI5b2P/AgNBbeCsbEBEV5f6f9vtKppa+c +xSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleoomslMuoaJuvimUnzYnu3Yy1 +aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+XJGFehiq +TbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87 +/kOXSTKZEhVb3xEp/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4 +kqNPEjE2NuLe/gDEo2APJ62gsIq1NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrG +YQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9wC68AivTxEDkigcxHpvOJpkT ++xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQBmIMMMAVSKeo +WXzhriKi4gp6D/piq1JM4fHfyr6DDUI= +-----END CERTIFICATE----- + +# Issuer: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI +# Subject: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI +# Label: "emSign ECC Root CA - C3" +# Serial: 582948710642506000014504 +# MD5 Fingerprint: 3e:53:b3:a3:81:ee:d7:10:f8:d3:b0:1d:17:92:f5:d5 +# SHA1 Fingerprint: b6:af:43:c2:9b:81:53:7d:f6:ef:6b:c3:1f:1f:60:15:0c:ee:48:66 +# SHA256 Fingerprint: bc:4d:80:9b:15:18:9d:78:db:3e:1d:8c:f4:f9:72:6a:79:5d:a1:64:3c:a5:f1:35:8e:1d:db:0e:dc:0d:7e:b3 +-----BEGIN CERTIFICATE----- +MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQG +EwJVUzETMBEGA1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMx +IDAeBgNVBAMTF2VtU2lnbiBFQ0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAw +MFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln +biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQDExdlbVNpZ24gRUND +IFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd6bci +MK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4Ojavti +sIGJAnB9SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0O +BBYEFPtaSNCAIEDyqOkAB2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB +Af8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQC02C8Cif22TGK6Q04ThHK1rt0c +3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwUZOR8loMRnLDRWmFLpg9J +0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== +-----END CERTIFICATE----- + +# Issuer: CN=Hongkong Post Root CA 3 O=Hongkong Post +# Subject: CN=Hongkong Post Root CA 3 O=Hongkong Post +# Label: "Hongkong Post Root CA 3" +# Serial: 46170865288971385588281144162979347873371282084 +# MD5 Fingerprint: 11:fc:9f:bd:73:30:02:8a:fd:3f:f3:58:b9:cb:20:f0 +# SHA1 Fingerprint: 58:a2:d0:ec:20:52:81:5b:c1:f3:f8:64:02:24:4e:c2:8e:02:4b:02 +# SHA256 Fingerprint: 5a:2f:c0:3f:0c:83:b0:90:bb:fa:40:60:4b:09:88:44:6c:76:36:18:3d:f9:84:6e:17:10:1a:44:7f:b8:ef:d6 +-----BEGIN CERTIFICATE----- +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 +mpv0 +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - G4 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2015 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - G4 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2015 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - G4" +# Serial: 289383649854506086828220374796556676440 +# MD5 Fingerprint: 89:53:f1:83:23:b7:7c:8e:05:f1:8c:71:38:4e:1f:88 +# SHA1 Fingerprint: 14:88:4e:86:26:37:b0:26:af:59:62:5c:40:77:ec:35:29:ba:96:01 +# SHA256 Fingerprint: db:35:17:d1:f6:73:2a:2d:5a:b9:7c:53:3e:c7:07:79:ee:32:70:a6:2f:b4:ac:42:38:37:24:60:e6:f0:1e:88 +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAw +gb4xCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQL +Ex9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykg +MjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAw +BgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0 +MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1 +c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJ +bmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3Qg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3DumSXbcr3DbVZwbPLqGgZ +2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV3imz/f3E +T+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j +5pds8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAM +C1rlLAHGVK/XqsEQe9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73T +DtTUXm6Hnmo9RR3RXRv06QqsYJn7ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNX +wbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5XxNMhIWNlUpEbsZmOeX7m640A +2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV7rtNOzK+mndm +nqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8 +dWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwl +N4y6mACXi0mWHv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNj +c0kCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9nMA0GCSqGSIb3DQEBCwUAA4ICAQAS +5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4QjbRaZIxowLByQzTS +Gwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht7LGr +hFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/ +B7NTeLUKYvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uI +AeV8KEsD+UmDfLJ/fOPtjqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbw +H5Lk6rWS02FREAutp9lfx1/cH6NcjKF+m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+ +b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKWRGhXxNUzzxkvFMSUHHuk +2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjAJOgc47Ol +IQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk +5F6G+TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuY +n/PIjhs4ViFqUZPTkcpG2om3PVODLAgfi49T3f+sHw== +-----END CERTIFICATE----- diff --git a/examples/BUILD b/examples/BUILD new file mode 100644 index 00000000..5dbde0fe --- /dev/null +++ b/examples/BUILD @@ -0,0 +1,247 @@ +# Copyright 2017 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +licenses(["notice"]) # 3-clause BSD + +package(default_visibility = ["//visibility:public"]) + +load("@grpc_python_dependencies//:requirements.bzl", "requirement") +load("@rules_proto//proto:defs.bzl", "proto_library") +load("//bazel:cc_grpc_library.bzl", "cc_grpc_library") +load("//bazel:grpc_build_system.bzl", "grpc_proto_library") +load("//bazel:python_rules.bzl", "py_grpc_library", "py_proto_library") + +grpc_proto_library( + name = "auth_sample", + srcs = ["protos/auth_sample.proto"], +) + +grpc_proto_library( + name = "hellostreamingworld", + srcs = ["protos/hellostreamingworld.proto"], +) + +# The following three rules demonstrate the usage of the cc_grpc_library rule in +# in a mode compatible with the native proto_library and cc_proto_library rules. +proto_library( + name = "helloworld_proto", + srcs = ["protos/helloworld.proto"], +) + +cc_proto_library( + name = "helloworld_cc_proto", + deps = [":helloworld_proto"], +) + +cc_grpc_library( + name = "helloworld_cc_grpc", + srcs = [":helloworld_proto"], + grpc_only = True, + deps = [":helloworld_cc_proto"], +) + +grpc_proto_library( + name = "route_guide", + srcs = ["protos/route_guide.proto"], +) + +grpc_proto_library( + name = "keyvaluestore", + srcs = ["protos/keyvaluestore.proto"], +) + +proto_library( + name = "protos/helloworld_proto", + srcs = ["protos/helloworld.proto"], +) + +py_proto_library( + name = "helloworld_py_pb2", + deps = [":protos/helloworld_proto"], +) + +py_grpc_library( + name = "helloworld_py_pb2_grpc", + srcs = [":protos/helloworld_proto"], + deps = [":helloworld_py_pb2"], +) + +cc_binary( + name = "greeter_client", + srcs = ["cpp/helloworld/greeter_client.cc"], + defines = ["BAZEL_BUILD"], + deps = [ + ":helloworld_cc_grpc", + "//:grpc++", + ], +) + +cc_binary( + name = "greeter_async_client", + srcs = ["cpp/helloworld/greeter_async_client.cc"], + defines = ["BAZEL_BUILD"], + deps = [ + ":helloworld_cc_grpc", + "//:grpc++", + ], +) + +cc_binary( + name = "greeter_async_client2", + srcs = ["cpp/helloworld/greeter_async_client2.cc"], + defines = ["BAZEL_BUILD"], + deps = [ + ":helloworld_cc_grpc", + "//:grpc++", + ], +) + +cc_binary( + name = "greeter_server", + srcs = ["cpp/helloworld/greeter_server.cc"], + defines = ["BAZEL_BUILD"], + deps = [ + ":helloworld_cc_grpc", + "//:grpc++", + "//:grpc++_reflection", + ], +) + +cc_binary( + name = "greeter_async_server", + srcs = ["cpp/helloworld/greeter_async_server.cc"], + defines = ["BAZEL_BUILD"], + deps = [ + ":helloworld_cc_grpc", + "//:grpc++", + ], +) + +cc_binary( + name = "metadata_client", + srcs = ["cpp/metadata/greeter_client.cc"], + defines = ["BAZEL_BUILD"], + deps = [ + ":helloworld_cc_grpc", + "//:grpc++", + ], +) + +cc_binary( + name = "metadata_server", + srcs = ["cpp/metadata/greeter_server.cc"], + defines = ["BAZEL_BUILD"], + deps = [ + ":helloworld_cc_grpc", + "//:grpc++", + ], +) + +cc_binary( + name = "lb_client", + srcs = ["cpp/load_balancing/greeter_client.cc"], + defines = ["BAZEL_BUILD"], + deps = [ + ":helloworld_cc_grpc", + "//:grpc++", + ], +) + +cc_binary( + name = "lb_server", + srcs = ["cpp/load_balancing/greeter_server.cc"], + defines = ["BAZEL_BUILD"], + deps = [ + ":helloworld_cc_grpc", + "//:grpc++", + ], +) + +cc_binary( + name = "compression_client", + srcs = ["cpp/compression/greeter_client.cc"], + defines = ["BAZEL_BUILD"], + deps = [ + ":helloworld_cc_grpc", + "//:grpc++", + ], +) + +cc_binary( + name = "compression_server", + srcs = ["cpp/compression/greeter_server.cc"], + defines = ["BAZEL_BUILD"], + deps = [ + ":helloworld_cc_grpc", + "//:grpc++", + ], +) + +cc_binary( + name = "keyvaluestore_client", + srcs = [ + "cpp/keyvaluestore/caching_interceptor.h", + "cpp/keyvaluestore/client.cc", + ], + defines = ["BAZEL_BUILD"], + deps = [ + ":keyvaluestore", + "//:grpc++", + ], +) + +cc_binary( + name = "keyvaluestore_server", + srcs = ["cpp/keyvaluestore/server.cc"], + defines = ["BAZEL_BUILD"], + deps = [ + ":keyvaluestore", + "//:grpc++", + ], +) + +cc_binary( + name = "route_guide_client", + srcs = [ + "cpp/route_guide/helper.cc", + "cpp/route_guide/helper.h", + "cpp/route_guide/route_guide_client.cc", + ], + data = ["cpp/route_guide/route_guide_db.json"], + defines = ["BAZEL_BUILD"], + deps = [ + ":route_guide", + "//:grpc++", + ], +) + +cc_binary( + name = "route_guide_server", + srcs = [ + "cpp/route_guide/helper.cc", + "cpp/route_guide/helper.h", + "cpp/route_guide/route_guide_server.cc", + ], + data = ["cpp/route_guide/route_guide_db.json"], + defines = ["BAZEL_BUILD"], + deps = [ + ":route_guide", + "//:grpc++", + ], +) + +proto_library( + name = "route_guide_proto", + srcs = ["protos/route_guide.proto"], +) diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 00000000..151fc9c0 --- /dev/null +++ b/examples/README.md @@ -0,0 +1,27 @@ +# Examples + +This directory contains code examples for all the C-based gRPC implementations: C++, Node.js, Python, Ruby, Objective-C, PHP, and C#. You can find examples and instructions specific to your +favourite language in the relevant subdirectory. + +Examples for Go and Java gRPC live in their own repositories: + +* [Java](https://github.com/grpc/grpc-java/tree/master/examples) +* [Android Java](https://github.com/grpc/grpc-java/tree/master/examples/android) +* [Go](https://github.com/grpc/grpc-go/tree/master/examples) + +For more comprehensive documentation, including an [overview](https://grpc.io/docs/) and tutorials that use this example code, visit [grpc.io](https://grpc.io/docs/). + +## Quick start + +Each example directory has quick start instructions for the appropriate language, including installation instructions and how to run our simplest Hello World example: + +* [C++](cpp) +* [Ruby](ruby) +* [Node.js](node) +* [Python](python/helloworld) +* [C#](csharp) +* [Objective-C](objective-c/helloworld) +* [PHP](php) + + + diff --git a/examples/android/helloworld/.gitignore b/examples/android/helloworld/.gitignore new file mode 100644 index 00000000..39fb081a --- /dev/null +++ b/examples/android/helloworld/.gitignore @@ -0,0 +1,9 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures +.externalNativeBuild diff --git a/examples/android/helloworld/README.md b/examples/android/helloworld/README.md new file mode 100644 index 00000000..ebb16d13 --- /dev/null +++ b/examples/android/helloworld/README.md @@ -0,0 +1,24 @@ +gRPC on Android +============== + +Note: Building the protobuf dependency for Android requires +https://github.com/google/protobuf/pull/3878. This fix will be in the next +protobuf release, but until then must be manually patched in to +`third_party/protobuf` to build gRPC for Android. + +PREREQUISITES +------------- + +- Android SDK +- Android NDK +- `protoc` and `grpc_cpp_plugin` binaries on the host system + +INSTALL +------- + +The example application can be built via Android Studio or on the command line +using `gradle`: + + ```sh + $ ./gradlew installDebug + ``` diff --git a/examples/android/helloworld/app/.gitignore b/examples/android/helloworld/app/.gitignore new file mode 100644 index 00000000..796b96d1 --- /dev/null +++ b/examples/android/helloworld/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/examples/android/helloworld/app/CMakeLists.txt b/examples/android/helloworld/app/CMakeLists.txt new file mode 100644 index 00000000..f449a5ce --- /dev/null +++ b/examples/android/helloworld/app/CMakeLists.txt @@ -0,0 +1,86 @@ +cmake_minimum_required(VERSION 3.4.1) + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") + +set(helloworld_PROTOBUF_PROTOC_EXECUTABLE "/usr/local/bin/protoc" CACHE STRING "Protoc binary on host") +set(helloworld_GRPC_CPP_PLUGIN_EXECUTABLE "/usr/local/bin/grpc_cpp_plugin" CACHE STRING "gRPC CPP plugin binary on host") + +set(GRPC_SRC_DIR ../../../../) + +set(GRPC_BUILD_DIR ../grpc/outputs/${ANDROID_ABI}) +file(MAKE_DIRECTORY ${GRPC_BUILD_DIR}) + +add_subdirectory(${GRPC_SRC_DIR} ${GRPC_BUILD_DIR}) + +set(GRPC_PROTO_GENS_DIR ${CMAKE_BINARY_DIR}/gens) +file(MAKE_DIRECTORY ${GRPC_PROTO_GENS_DIR}) +include_directories(${GRPC_PROTO_GENS_DIR}) + +function(android_protobuf_grpc_generate_cpp SRC_FILES HDR_FILES INCLUDE_ROOT) + if(NOT ARGN) + message(SEND_ERROR "Error: android_protobuf_grpc_generate_cpp() called without any proto files") + return() + endif() + + set(${SRC_FILES}) + set(${HDR_FILES}) + set(PROTOBUF_INCLUDE_PATH -I ${INCLUDE_ROOT}) + foreach(FIL ${ARGN}) + get_filename_component(ABS_FIL ${FIL} ABSOLUTE) + get_filename_component(FIL_WE ${FIL} NAME_WE) + file(RELATIVE_PATH REL_FIL ${CMAKE_CURRENT_SOURCE_DIR}/${INCLUDE_ROOT} ${ABS_FIL}) + get_filename_component(REL_DIR ${REL_FIL} DIRECTORY) + set(RELFIL_WE "${REL_DIR}/${FIL_WE}") + + list(APPEND ${SRC_FILES} "${GRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.cc") + list(APPEND ${HDR_FILES} "${GRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.h") + list(APPEND ${SRC_FILES} "${GRPC_PROTO_GENS_DIR}/${RELFIL_WE}.grpc.pb.cc") + list(APPEND ${HDR_FILES} "${GRPC_PROTO_GENS_DIR}/${RELFIL_WE}.grpc.pb.h") + + add_custom_command( + OUTPUT "${GRPC_PROTO_GENS_DIR}/${RELFIL_WE}.grpc.pb.cc" + "${GRPC_PROTO_GENS_DIR}/${RELFIL_WE}.grpc.pb.h" + "${GRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.cc" + "${GRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.h" + COMMAND ${helloworld_PROTOBUF_PROTOC_EXECUTABLE} + ARGS --grpc_out=${GRPC_PROTO_GENS_DIR} + --cpp_out=${GRPC_PROTO_GENS_DIR} + --plugin=protoc-gen-grpc=${helloworld_GRPC_CPP_PLUGIN_EXECUTABLE} + ${PROTOBUF_INCLUDE_PATH} + ${REL_FIL} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + DEPENDS ${helloworld_PROTOBUF_PROTOC_EXECUTABLE} ${helloworld_GRPC_CPP_PLUGIN_EXECUTABLE} ${ABS_FIL} ) + endforeach() + + set_source_files_properties(${${SRC_FILES}} ${${HDR_FILES}} PROPERTIES GENERATED TRUE) + set(${SRC_FILES} ${${SRC_FILES}} PARENT_SCOPE) + set(${HDR_FILES} ${${HDR_FILES}} PARENT_SCOPE) +endfunction() + +set(PROTO_BASE_DIR ${GRPC_SRC_DIR}/examples/protos) + +android_protobuf_grpc_generate_cpp( + HELLOWORLD_PROTO_SRCS HELLOWORLD_PROTO_HDRS ${PROTO_BASE_DIR} ${PROTO_BASE_DIR}/helloworld.proto) + +add_library(helloworld_proto_lib + SHARED ${HELLOWORLD_PROTO_HDRS} ${HELLOWORLD_PROTO_SRCS}) + +target_link_libraries(helloworld_proto_lib + grpc++ + libprotobuf + android + log) + +find_library(log-lib + log) + +add_library(grpc-helloworld + SHARED src/main/cpp/grpc-helloworld.cc) + +target_include_directories(grpc-helloworld + PRIVATE ${HELLOWORLD_PROTO_HEADERS}) + +target_link_libraries(grpc-helloworld + helloworld_proto_lib + android + ${log-lib}) diff --git a/examples/android/helloworld/app/build.gradle b/examples/android/helloworld/app/build.gradle new file mode 100644 index 00000000..1d09fdc1 --- /dev/null +++ b/examples/android/helloworld/app/build.gradle @@ -0,0 +1,56 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 26 + defaultConfig { + applicationId "io.grpc.android.cpp.helloworldexample" + minSdkVersion 14 + targetSdkVersion 26 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + externalNativeBuild { + cmake { + // The paths to the protoc and grpc_cpp_plugin binaries on the host system (codegen + // is not cross-compiled to Android) + def protoc = project.hasProperty('protoc') ? + project.property('protoc') : '/usr/local/bin/protoc' + def grpc_cpp_plugin = project.hasProperty('grpc_cpp_plugin') ? + project.property('grpc_cpp_plugin') : '/usr/local/bin/grpc_cpp_plugin' + + cppFlags "-std=c++14 -frtti -fexceptions" + arguments '-DANDROID_STL=c++_static' + arguments '-DRUN_HAVE_POSIX_REGEX=0' + arguments '-DRUN_HAVE_STD_REGEX=0' + arguments '-DRUN_HAVE_STEADY_CLOCK=0' + arguments '-Dprotobuf_BUILD_PROTOC_BINARIES=off' + arguments '-DgRPC_BUILD_CODEGEN=off' + arguments '-Dhelloworld_PROTOBUF_PROTOC_EXECUTABLE=' + protoc + arguments '-Dhelloworld_GRPC_CPP_PLUGIN_EXECUTABLE=' + grpc_cpp_plugin + } + } + ndk.abiFilters 'x86' + } + buildTypes { + debug { + minifyEnabled false + } + release { + minifyEnabled true + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + externalNativeBuild { + cmake { + path "CMakeLists.txt" + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation 'com.android.support:appcompat-v7:26.1.0' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'com.android.support.test:runner:1.0.1' + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' +} diff --git a/examples/android/helloworld/app/proguard-rules.pro b/examples/android/helloworld/app/proguard-rules.pro new file mode 100644 index 00000000..f1b42451 --- /dev/null +++ b/examples/android/helloworld/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/examples/android/helloworld/app/src/main/AndroidManifest.xml b/examples/android/helloworld/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..8109da9e --- /dev/null +++ b/examples/android/helloworld/app/src/main/AndroidManifest.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + diff --git a/examples/android/helloworld/app/src/main/cpp/grpc-helloworld.cc b/examples/android/helloworld/app/src/main/cpp/grpc-helloworld.cc new file mode 100644 index 00000000..7a31b783 --- /dev/null +++ b/examples/android/helloworld/app/src/main/cpp/grpc-helloworld.cc @@ -0,0 +1,142 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include + +#include +#include + +#include "helloworld.grpc.pb.h" + +using grpc::Channel; +using grpc::ClientContext; +using grpc::Server; +using grpc::ServerBuilder; +using grpc::ServerContext; +using grpc::Status; +using helloworld::Greeter; +using helloworld::HelloReply; +using helloworld::HelloRequest; + +std::atomic stop_server(false); + +// Logic and data behind the server's behavior. +class GreeterServiceImpl final : public Greeter::Service { + Status SayHello(ServerContext* context, const HelloRequest* request, + HelloReply* reply) override { + std::string prefix("Hello "); + reply->set_message(prefix + request->name()); + return Status::OK; + } +}; + +void StartServer(JNIEnv* env, jobject obj, jmethodID is_cancelled_mid, + int port) { + const int host_port_buf_size = 1024; + char host_port[host_port_buf_size]; + snprintf(host_port, host_port_buf_size, "0.0.0.0:%d", port); + + GreeterServiceImpl service; + ServerBuilder builder; + // Listen on the given address without any authentication mechanism. + builder.AddListeningPort(host_port, grpc::InsecureServerCredentials()); + // Register "service" as the instance through which we'll communicate with + // clients. In this case it corresponds to an *synchronous* service. + builder.RegisterService(&service); + // Finally assemble the server. + std::unique_ptr server(builder.BuildAndStart()); + while (!stop_server.load()) { + // Check with the Java code to see if the user has requested the server stop or the app is no + // longer in the foreground. + jboolean is_cancelled = env->CallBooleanMethod(obj, is_cancelled_mid); + if (is_cancelled == JNI_TRUE) { + stop_server = true; + } + } +} + +class GreeterClient { + public: + GreeterClient(std::shared_ptr channel) + : stub_(Greeter::NewStub(channel)) {} + + // Assembles the client's payload, sends it and presents the response back + // from the server. + std::string SayHello(const std::string& user) { + // Data we are sending to the server. + HelloRequest request; + request.set_name(user); + + // Container for the data we expect from the server. + HelloReply reply; + + // Context for the client. It could be used to convey extra information to + // the server and/or tweak certain RPC behaviors. + ClientContext context; + // The actual RPC. + Status status = stub_->SayHello(&context, request, &reply); + + if (status.ok()) { + return reply.message(); + } else { + return status.error_message(); + } + } + + private: + std::unique_ptr stub_; +}; + +// Send an RPC and return the response. Invoked from Java code. +extern "C" JNIEXPORT jstring JNICALL +Java_io_grpc_helloworldexample_cpp_HelloworldActivity_sayHello( + JNIEnv* env, jobject obj_unused, jstring host_raw, jint port_raw, + jstring message_raw) { + const char* host_chars = env->GetStringUTFChars(host_raw, (jboolean*)0); + std::string host(host_chars, env->GetStringUTFLength(host_raw)); + + int port = static_cast(port_raw); + + const char* message_chars = env->GetStringUTFChars(message_raw, (jboolean*)0); + std::string message(message_chars, env->GetStringUTFLength(message_raw)); + + const int host_port_buf_size = 1024; + char host_port[host_port_buf_size]; + snprintf(host_port, host_port_buf_size, "%s:%d", host.c_str(), port); + + GreeterClient greeter( + grpc::CreateChannel(host_port, grpc::InsecureChannelCredentials())); + std::string reply = greeter.SayHello(message); + + return env->NewStringUTF(reply.c_str()); +} + +// Start the server. Invoked from Java code. +extern "C" JNIEXPORT void JNICALL +Java_io_grpc_helloworldexample_cpp_HelloworldActivity_startServer( + JNIEnv* env, jobject obj_this, jint port_raw) { + int port = static_cast(port_raw); + + jclass cls = env->GetObjectClass(obj_this); + jmethodID is_cancelled_mid = + env->GetMethodID(cls, "isRunServerTaskCancelled", "()Z"); + + stop_server = false; + + StartServer(env, obj_this, is_cancelled_mid, port); +} diff --git a/examples/android/helloworld/app/src/main/java/io/grpc/helloworldexample/cpp/HelloworldActivity.java b/examples/android/helloworld/app/src/main/java/io/grpc/helloworldexample/cpp/HelloworldActivity.java new file mode 100644 index 00000000..ae5c88b2 --- /dev/null +++ b/examples/android/helloworld/app/src/main/java/io/grpc/helloworldexample/cpp/HelloworldActivity.java @@ -0,0 +1,167 @@ +/* + * Copyright 2018, gRPC Authors All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.grpc.helloworldexample.cpp; + +import android.content.Context; +import android.os.AsyncTask; +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.text.TextUtils; +import android.text.method.ScrollingMovementMethod; +import android.view.View; +import android.view.inputmethod.InputMethodManager; +import android.widget.Button; +import android.widget.EditText; +import android.widget.TextView; +import android.widget.Toast; +import java.lang.ref.WeakReference; + +public class HelloworldActivity extends AppCompatActivity { + + static { + System.loadLibrary("grpc-helloworld"); + } + + private Button sendButton; + private Button serverButton; + private EditText hostEdit; + private EditText portEdit; + private EditText messageEdit; + private EditText serverPortEdit; + private TextView resultText; + private GrpcTask grpcTask; + private RunServerTask runServerTask; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_helloworld); + sendButton = (Button) findViewById(R.id.send_button); + serverButton = (Button) findViewById(R.id.server_button); + hostEdit = (EditText) findViewById(R.id.host_edit_text); + portEdit = (EditText) findViewById(R.id.port_edit_text); + messageEdit = (EditText) findViewById(R.id.message_edit_text); + serverPortEdit = (EditText) findViewById(R.id.server_port_edit_text); + resultText = (TextView) findViewById(R.id.grpc_response_text); + resultText.setMovementMethod(new ScrollingMovementMethod()); + } + + @Override + protected void onPause() { + super.onPause(); + if (runServerTask != null) { + runServerTask.cancel(true); + runServerTask = null; + serverButton.setText("Start gRPC Server"); + } + if (grpcTask != null) { + grpcTask.cancel(true); + grpcTask = null; + } + } + + public void sendMessage(View view) { + ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)) + .hideSoftInputFromWindow(hostEdit.getWindowToken(), 0); + sendButton.setEnabled(false); + resultText.setText(""); + grpcTask = new GrpcTask(this); + grpcTask.executeOnExecutor( + AsyncTask.THREAD_POOL_EXECUTOR, + hostEdit.getText().toString(), + messageEdit.getText().toString(), + portEdit.getText().toString()); + } + + public void startOrStopServer(View view) { + if (runServerTask != null) { + runServerTask.cancel(true); + runServerTask = null; + serverButton.setText("Start gRPC Server"); + Toast.makeText(this, "Server stopped", Toast.LENGTH_SHORT).show(); + } else { + runServerTask = new RunServerTask(this); + String portStr = serverPortEdit.getText().toString(); + int port = TextUtils.isEmpty(portStr) ? 50051 : Integer.valueOf(portStr); + runServerTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, port); + serverButton.setText("Stop gRPC Server"); + Toast.makeText(this, "Server started on port " + port, Toast.LENGTH_SHORT).show(); + } + } + + private static class RunServerTask extends AsyncTask { + private final WeakReference activityReference; + + private RunServerTask(HelloworldActivity activity) { + this.activityReference = new WeakReference(activity); + } + + @Override + protected Void doInBackground(Integer... params) { + int port = params[0]; + HelloworldActivity activity = activityReference.get(); + if (activity != null) { + activity.startServer(port); + } + return null; + } + } + + private static class GrpcTask extends AsyncTask { + private final WeakReference activityReference; + + private GrpcTask(HelloworldActivity activity) { + this.activityReference = new WeakReference(activity); + } + + @Override + protected String doInBackground(String... params) { + String host = params[0]; + String message = params[1]; + String portStr = params[2]; + int port = TextUtils.isEmpty(portStr) ? 50051 : Integer.valueOf(portStr); + return sayHello(host, port, message); + } + + @Override + protected void onPostExecute(String result) { + HelloworldActivity activity = activityReference.get(); + if (activity == null || isCancelled()) { + return; + } + TextView resultText = (TextView) activity.findViewById(R.id.grpc_response_text); + Button sendButton = (Button) activity.findViewById(R.id.send_button); + resultText.setText(result); + sendButton.setEnabled(true); + } + } + + /** + * Invoked by native code to stop server when RunServerTask has been canceled, either by user + * request or upon app moving to background. + */ + public boolean isRunServerTaskCancelled() { + if (runServerTask != null) { + return runServerTask.isCancelled(); + } + return false; + } + + public static native String sayHello(String host, int port, String message); + + public native void startServer(int port); +} diff --git a/examples/android/helloworld/app/src/main/res/layout/activity_helloworld.xml b/examples/android/helloworld/app/src/main/res/layout/activity_helloworld.xml new file mode 100644 index 00000000..52804697 --- /dev/null +++ b/examples/android/helloworld/app/src/main/res/layout/activity_helloworld.xml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/csharp/HelloworldXamarin/iOS/ViewController.cs b/examples/csharp/HelloworldXamarin/iOS/ViewController.cs new file mode 100644 index 00000000..c553c1eb --- /dev/null +++ b/examples/csharp/HelloworldXamarin/iOS/ViewController.cs @@ -0,0 +1,91 @@ +#region Copyright notice and license + +// Copyright 2018 The gRPC Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#endregion + +using System; +using System.Threading.Tasks; + +using Grpc.Core; +using Helloworld; + +using UIKit; + +namespace HelloworldXamarin.iOS +{ + public partial class ViewController : UIViewController + { + const int Port = 50051; + int count = 1; + + public ViewController(IntPtr handle) : base(handle) + { + } + + public override void ViewDidLoad() + { + base.ViewDidLoad(); + + // Perform any additional setup after loading the view, typically from a nib. + Button.AccessibilityIdentifier = "myButton"; + Button.TouchUpInside += delegate + { + var title = SayHello(); + Button.SetTitle(title, UIControlState.Normal); + }; + } + + public override void DidReceiveMemoryWarning() + { + base.DidReceiveMemoryWarning(); + // Release any cached data, images, etc that aren't in use. + } + + private string SayHello() + { + Server server = new Server + { + Services = { Greeter.BindService(new GreeterImpl()) }, + Ports = { new ServerPort("localhost", Port, ServerCredentials.Insecure) } + }; + server.Start(); + + Channel channel = new Channel("localhost:50051", ChannelCredentials.Insecure); + + var client = new Greeter.GreeterClient(channel); + string user = "Xamarin " + count; + + var reply = client.SayHello(new HelloRequest { Name = user }); + + channel.ShutdownAsync().Wait(); + server.ShutdownAsync().Wait(); + + count++; + + return "Greeting: " + reply.Message; + } + + + class GreeterImpl : Greeter.GreeterBase + { + // Server side handler of the SayHello RPC + public override Task SayHello(HelloRequest request, ServerCallContext context) + { + return Task.FromResult(new HelloReply { Message = "Hello " + request.Name }); + } + } + } +} diff --git a/examples/csharp/HelloworldXamarin/iOS/ViewController.designer.cs b/examples/csharp/HelloworldXamarin/iOS/ViewController.designer.cs new file mode 100644 index 00000000..2677a068 --- /dev/null +++ b/examples/csharp/HelloworldXamarin/iOS/ViewController.designer.cs @@ -0,0 +1,25 @@ +// +// This file has been generated automatically by MonoDevelop to store outlets and +// actions made in the Xcode designer. If it is removed, they will be lost. +// Manual changes to this file may not be handled correctly. +// +using Foundation; + +namespace HelloworldXamarin.iOS +{ + [Register("ViewController")] + partial class ViewController + { + [Outlet] + UIKit.UIButton Button { get; set; } + + void ReleaseDesignerOutlets() + { + if (Button != null) + { + Button.Dispose(); + Button = null; + } + } + } +} diff --git a/examples/csharp/HelloworldXamarin/iOS/packages.config b/examples/csharp/HelloworldXamarin/iOS/packages.config new file mode 100644 index 00000000..80802a8d --- /dev/null +++ b/examples/csharp/HelloworldXamarin/iOS/packages.config @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/csharp/RouteGuide/.gitignore b/examples/csharp/RouteGuide/.gitignore new file mode 100644 index 00000000..585000ea --- /dev/null +++ b/examples/csharp/RouteGuide/.gitignore @@ -0,0 +1,5 @@ +bin/ +obj/ +packages/ +*.suo +*.userprefs diff --git a/examples/csharp/RouteGuide/README.md b/examples/csharp/RouteGuide/README.md new file mode 100644 index 00000000..3cfb14ae --- /dev/null +++ b/examples/csharp/RouteGuide/README.md @@ -0,0 +1,6 @@ +# gRPC Basics: C# sample code + +The files in this folder are the samples used in [gRPC Basics: C#][], +a detailed tutorial for using gRPC in C#. + +[gRPC Basics: C#]:https://grpc.io/docs/tutorials/basic/csharp.html diff --git a/examples/csharp/RouteGuide/RouteGuide.sln b/examples/csharp/RouteGuide/RouteGuide.sln new file mode 100644 index 00000000..5e103294 --- /dev/null +++ b/examples/csharp/RouteGuide/RouteGuide.sln @@ -0,0 +1,34 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.26228.4 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RouteGuide", "RouteGuide\RouteGuide.csproj", "{49954D9C-5F17-4662-96B2-73BE833DD81A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RouteGuideClient", "RouteGuideClient\RouteGuideClient.csproj", "{D47BE663-4DE3-4206-B7A8-EA3FA066DADC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RouteGuideServer", "RouteGuideServer\RouteGuideServer.csproj", "{4B7C7794-BE24-4477-ACE7-18259EB73D27}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {49954D9C-5F17-4662-96B2-73BE833DD81A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {49954D9C-5F17-4662-96B2-73BE833DD81A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {49954D9C-5F17-4662-96B2-73BE833DD81A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {49954D9C-5F17-4662-96B2-73BE833DD81A}.Release|Any CPU.Build.0 = Release|Any CPU + {D47BE663-4DE3-4206-B7A8-EA3FA066DADC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D47BE663-4DE3-4206-B7A8-EA3FA066DADC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D47BE663-4DE3-4206-B7A8-EA3FA066DADC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D47BE663-4DE3-4206-B7A8-EA3FA066DADC}.Release|Any CPU.Build.0 = Release|Any CPU + {4B7C7794-BE24-4477-ACE7-18259EB73D27}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4B7C7794-BE24-4477-ACE7-18259EB73D27}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4B7C7794-BE24-4477-ACE7-18259EB73D27}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4B7C7794-BE24-4477-ACE7-18259EB73D27}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/examples/csharp/RouteGuide/RouteGuide/RouteGuide.csproj b/examples/csharp/RouteGuide/RouteGuide/RouteGuide.csproj new file mode 100644 index 00000000..712df615 --- /dev/null +++ b/examples/csharp/RouteGuide/RouteGuide/RouteGuide.csproj @@ -0,0 +1,22 @@ + + + + netstandard1.5 + + + + + + + + + + + + + + + + + + diff --git a/examples/csharp/RouteGuide/RouteGuide/RouteGuideUtil.cs b/examples/csharp/RouteGuide/RouteGuide/RouteGuideUtil.cs new file mode 100644 index 00000000..29cd6b9b --- /dev/null +++ b/examples/csharp/RouteGuide/RouteGuide/RouteGuideUtil.cs @@ -0,0 +1,139 @@ +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace Routeguide +{ + ///

+ /// Utility methods for the route guide example. + /// + public static class RouteGuideUtil + { + public const string DefaultFeaturesResourceName = "RouteGuide.route_guide_db.json"; + + private const double CoordFactor = 1e7; + + /// + /// Indicates whether the given feature exists (i.e. has a valid name). + /// + public static bool Exists(this Feature feature) + { + return feature != null && (feature.Name.Length != 0); + } + + public static double GetLatitude(this Point point) + { + return point.Latitude / CoordFactor; + } + + public static double GetLongitude(this Point point) + { + return point.Longitude / CoordFactor; + } + + /// + /// Calculate the distance between two points using the "haversine" formula. + /// The formula is based on http://mathforum.org/library/drmath/view/51879.html + /// + /// the starting point + /// the end point + /// the distance between the points in meters + public static double GetDistance(this Point start, Point end) + { + int r = 6371000; // earth radius in metres + double lat1 = ToRadians(start.GetLatitude()); + double lat2 = ToRadians(end.GetLatitude()); + double lon1 = ToRadians(start.GetLongitude()); + double lon2 = ToRadians(end.GetLongitude()); + double deltalat = lat2 - lat1; + double deltalon = lon2 - lon1; + + double a = Math.Sin(deltalat / 2) * Math.Sin(deltalat / 2) + Math.Cos(lat1) * Math.Cos(lat2) * Math.Sin(deltalon / 2) * Math.Sin(deltalon / 2); + double c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a)); + return r * c; + } + + /// + /// Returns true if rectangular area contains given point. + /// + public static bool Contains(this Rectangle rectangle, Point point) + { + int left = Math.Min(rectangle.Lo.Longitude, rectangle.Hi.Longitude); + int right = Math.Max(rectangle.Lo.Longitude, rectangle.Hi.Longitude); + int top = Math.Max(rectangle.Lo.Latitude, rectangle.Hi.Latitude); + int bottom = Math.Min(rectangle.Lo.Latitude, rectangle.Hi.Latitude); + return (point.Longitude >= left && point.Longitude <= right && point.Latitude >= bottom && point.Latitude <= top); + } + + private static double ToRadians(double val) + { + return (Math.PI / 180) * val; + } + + /// + /// Parses features from an embedded resource. + /// + public static List LoadFeatures() + { + var features = new List(); + var jsonFeatures = JsonConvert.DeserializeObject>(ReadFeaturesFromResource()); + + foreach(var jsonFeature in jsonFeatures) + { + features.Add(new Feature + { + Name = jsonFeature.name, + Location = new Point { Longitude = jsonFeature.location.longitude, Latitude = jsonFeature.location.latitude} + }); + } + return features; + } + + private static string ReadFeaturesFromResource() + { + var stream = typeof(RouteGuideUtil).GetTypeInfo().Assembly.GetManifestResourceStream(DefaultFeaturesResourceName); + if (stream == null) + { + throw new IOException(string.Format("Error loading the embedded resource \"{0}\"", DefaultFeaturesResourceName)); + } + using (var streamReader = new StreamReader(stream)) + { + return streamReader.ReadToEnd(); + } + } + +#pragma warning disable 0649 // Suppresses "Field 'x' is never assigned to". + private class JsonFeature + { + public string name; + public JsonLocation location; + } + + private class JsonLocation + { + public int longitude; + public int latitude; + } +#pragma warning restore 0649 + } +} diff --git a/examples/csharp/RouteGuide/RouteGuide/route_guide_db.json b/examples/csharp/RouteGuide/RouteGuide/route_guide_db.json new file mode 100644 index 00000000..9342beb5 --- /dev/null +++ b/examples/csharp/RouteGuide/RouteGuide/route_guide_db.json @@ -0,0 +1,601 @@ +[{ + "location": { + "latitude": 407838351, + "longitude": -746143763 + }, + "name": "Patriots Path, Mendham, NJ 07945, USA" +}, { + "location": { + "latitude": 408122808, + "longitude": -743999179 + }, + "name": "101 New Jersey 10, Whippany, NJ 07981, USA" +}, { + "location": { + "latitude": 413628156, + "longitude": -749015468 + }, + "name": "U.S. 6, Shohola, PA 18458, USA" +}, { + "location": { + "latitude": 419999544, + "longitude": -740371136 + }, + "name": "5 Conners Road, Kingston, NY 12401, USA" +}, { + "location": { + "latitude": 414008389, + "longitude": -743951297 + }, + "name": "Mid Hudson Psychiatric Center, New Hampton, NY 10958, USA" +}, { + "location": { + "latitude": 419611318, + "longitude": -746524769 + }, + "name": "287 Flugertown Road, Livingston Manor, NY 12758, USA" +}, { + "location": { + "latitude": 406109563, + "longitude": -742186778 + }, + "name": "4001 Tremley Point Road, Linden, NJ 07036, USA" +}, { + "location": { + "latitude": 416802456, + "longitude": -742370183 + }, + "name": "352 South Mountain Road, Wallkill, NY 12589, USA" +}, { + "location": { + "latitude": 412950425, + "longitude": -741077389 + }, + "name": "Bailey Turn Road, Harriman, NY 10926, USA" +}, { + "location": { + "latitude": 412144655, + "longitude": -743949739 + }, + "name": "193-199 Wawayanda Road, Hewitt, NJ 07421, USA" +}, { + "location": { + "latitude": 415736605, + "longitude": -742847522 + }, + "name": "406-496 Ward Avenue, Pine Bush, NY 12566, USA" +}, { + "location": { + "latitude": 413843930, + "longitude": -740501726 + }, + "name": "162 Merrill Road, Highland Mills, NY 10930, USA" +}, { + "location": { + "latitude": 410873075, + "longitude": -744459023 + }, + "name": "Clinton Road, West Milford, NJ 07480, USA" +}, { + "location": { + "latitude": 412346009, + "longitude": -744026814 + }, + "name": "16 Old Brook Lane, Warwick, NY 10990, USA" +}, { + "location": { + "latitude": 402948455, + "longitude": -747903913 + }, + "name": "3 Drake Lane, Pennington, NJ 08534, USA" +}, { + "location": { + "latitude": 406337092, + "longitude": -740122226 + }, + "name": "6324 8th Avenue, Brooklyn, NY 11220, USA" +}, { + "location": { + "latitude": 406421967, + "longitude": -747727624 + }, + "name": "1 Merck Access Road, Whitehouse Station, NJ 08889, USA" +}, { + "location": { + "latitude": 416318082, + "longitude": -749677716 + }, + "name": "78-98 Schalck Road, Narrowsburg, NY 12764, USA" +}, { + "location": { + "latitude": 415301720, + "longitude": -748416257 + }, + "name": "282 Lakeview Drive Road, Highland Lake, NY 12743, USA" +}, { + "location": { + "latitude": 402647019, + "longitude": -747071791 + }, + "name": "330 Evelyn Avenue, Hamilton Township, NJ 08619, USA" +}, { + "location": { + "latitude": 412567807, + "longitude": -741058078 + }, + "name": "New York State Reference Route 987E, Southfields, NY 10975, USA" +}, { + "location": { + "latitude": 416855156, + "longitude": -744420597 + }, + "name": "103-271 Tempaloni Road, Ellenville, NY 12428, USA" +}, { + "location": { + "latitude": 404663628, + "longitude": -744820157 + }, + "name": "1300 Airport Road, North Brunswick Township, NJ 08902, USA" +}, { + "location": { + "latitude": 407113723, + "longitude": -749746483 + }, + "name": "" +}, { + "location": { + "latitude": 402133926, + "longitude": -743613249 + }, + "name": "" +}, { + "location": { + "latitude": 400273442, + "longitude": -741220915 + }, + "name": "" +}, { + "location": { + "latitude": 411236786, + "longitude": -744070769 + }, + "name": "" +}, { + "location": { + "latitude": 411633782, + "longitude": -746784970 + }, + "name": "211-225 Plains Road, Augusta, NJ 07822, USA" +}, { + "location": { + "latitude": 415830701, + "longitude": -742952812 + }, + "name": "" +}, { + "location": { + "latitude": 413447164, + "longitude": -748712898 + }, + "name": "165 Pedersen Ridge Road, Milford, PA 18337, USA" +}, { + "location": { + "latitude": 405047245, + "longitude": -749800722 + }, + "name": "100-122 Locktown Road, Frenchtown, NJ 08825, USA" +}, { + "location": { + "latitude": 418858923, + "longitude": -746156790 + }, + "name": "" +}, { + "location": { + "latitude": 417951888, + "longitude": -748484944 + }, + "name": "650-652 Willi Hill Road, Swan Lake, NY 12783, USA" +}, { + "location": { + "latitude": 407033786, + "longitude": -743977337 + }, + "name": "26 East 3rd Street, New Providence, NJ 07974, USA" +}, { + "location": { + "latitude": 417548014, + "longitude": -740075041 + }, + "name": "" +}, { + "location": { + "latitude": 410395868, + "longitude": -744972325 + }, + "name": "" +}, { + "location": { + "latitude": 404615353, + "longitude": -745129803 + }, + "name": "" +}, { + "location": { + "latitude": 406589790, + "longitude": -743560121 + }, + "name": "611 Lawrence Avenue, Westfield, NJ 07090, USA" +}, { + "location": { + "latitude": 414653148, + "longitude": -740477477 + }, + "name": "18 Lannis Avenue, New Windsor, NY 12553, USA" +}, { + "location": { + "latitude": 405957808, + "longitude": -743255336 + }, + "name": "82-104 Amherst Avenue, Colonia, NJ 07067, USA" +}, { + "location": { + "latitude": 411733589, + "longitude": -741648093 + }, + "name": "170 Seven Lakes Drive, Sloatsburg, NY 10974, USA" +}, { + "location": { + "latitude": 412676291, + "longitude": -742606606 + }, + "name": "1270 Lakes Road, Monroe, NY 10950, USA" +}, { + "location": { + "latitude": 409224445, + "longitude": -748286738 + }, + "name": "509-535 Alphano Road, Great Meadows, NJ 07838, USA" +}, { + "location": { + "latitude": 406523420, + "longitude": -742135517 + }, + "name": "652 Garden Street, Elizabeth, NJ 07202, USA" +}, { + "location": { + "latitude": 401827388, + "longitude": -740294537 + }, + "name": "349 Sea Spray Court, Neptune City, NJ 07753, USA" +}, { + "location": { + "latitude": 410564152, + "longitude": -743685054 + }, + "name": "13-17 Stanley Street, West Milford, NJ 07480, USA" +}, { + "location": { + "latitude": 408472324, + "longitude": -740726046 + }, + "name": "47 Industrial Avenue, Teterboro, NJ 07608, USA" +}, { + "location": { + "latitude": 412452168, + "longitude": -740214052 + }, + "name": "5 White Oak Lane, Stony Point, NY 10980, USA" +}, { + "location": { + "latitude": 409146138, + "longitude": -746188906 + }, + "name": "Berkshire Valley Management Area Trail, Jefferson, NJ, USA" +}, { + "location": { + "latitude": 404701380, + "longitude": -744781745 + }, + "name": "1007 Jersey Avenue, New Brunswick, NJ 08901, USA" +}, { + "location": { + "latitude": 409642566, + "longitude": -746017679 + }, + "name": "6 East Emerald Isle Drive, Lake Hopatcong, NJ 07849, USA" +}, { + "location": { + "latitude": 408031728, + "longitude": -748645385 + }, + "name": "1358-1474 New Jersey 57, Port Murray, NJ 07865, USA" +}, { + "location": { + "latitude": 413700272, + "longitude": -742135189 + }, + "name": "367 Prospect Road, Chester, NY 10918, USA" +}, { + "location": { + "latitude": 404310607, + "longitude": -740282632 + }, + "name": "10 Simon Lake Drive, Atlantic Highlands, NJ 07716, USA" +}, { + "location": { + "latitude": 409319800, + "longitude": -746201391 + }, + "name": "11 Ward Street, Mount Arlington, NJ 07856, USA" +}, { + "location": { + "latitude": 406685311, + "longitude": -742108603 + }, + "name": "300-398 Jefferson Avenue, Elizabeth, NJ 07201, USA" +}, { + "location": { + "latitude": 419018117, + "longitude": -749142781 + }, + "name": "43 Dreher Road, Roscoe, NY 12776, USA" +}, { + "location": { + "latitude": 412856162, + "longitude": -745148837 + }, + "name": "Swan Street, Pine Island, NY 10969, USA" +}, { + "location": { + "latitude": 416560744, + "longitude": -746721964 + }, + "name": "66 Pleasantview Avenue, Monticello, NY 12701, USA" +}, { + "location": { + "latitude": 405314270, + "longitude": -749836354 + }, + "name": "" +}, { + "location": { + "latitude": 414219548, + "longitude": -743327440 + }, + "name": "" +}, { + "location": { + "latitude": 415534177, + "longitude": -742900616 + }, + "name": "565 Winding Hills Road, Montgomery, NY 12549, USA" +}, { + "location": { + "latitude": 406898530, + "longitude": -749127080 + }, + "name": "231 Rocky Run Road, Glen Gardner, NJ 08826, USA" +}, { + "location": { + "latitude": 407586880, + "longitude": -741670168 + }, + "name": "100 Mount Pleasant Avenue, Newark, NJ 07104, USA" +}, { + "location": { + "latitude": 400106455, + "longitude": -742870190 + }, + "name": "517-521 Huntington Drive, Manchester Township, NJ 08759, USA" +}, { + "location": { + "latitude": 400066188, + "longitude": -746793294 + }, + "name": "" +}, { + "location": { + "latitude": 418803880, + "longitude": -744102673 + }, + "name": "40 Mountain Road, Napanoch, NY 12458, USA" +}, { + "location": { + "latitude": 414204288, + "longitude": -747895140 + }, + "name": "" +}, { + "location": { + "latitude": 414777405, + "longitude": -740615601 + }, + "name": "" +}, { + "location": { + "latitude": 415464475, + "longitude": -747175374 + }, + "name": "48 North Road, Forestburgh, NY 12777, USA" +}, { + "location": { + "latitude": 404062378, + "longitude": -746376177 + }, + "name": "" +}, { + "location": { + "latitude": 405688272, + "longitude": -749285130 + }, + "name": "" +}, { + "location": { + "latitude": 400342070, + "longitude": -748788996 + }, + "name": "" +}, { + "location": { + "latitude": 401809022, + "longitude": -744157964 + }, + "name": "" +}, { + "location": { + "latitude": 404226644, + "longitude": -740517141 + }, + "name": "9 Thompson Avenue, Leonardo, NJ 07737, USA" +}, { + "location": { + "latitude": 410322033, + "longitude": -747871659 + }, + "name": "" +}, { + "location": { + "latitude": 407100674, + "longitude": -747742727 + }, + "name": "" +}, { + "location": { + "latitude": 418811433, + "longitude": -741718005 + }, + "name": "213 Bush Road, Stone Ridge, NY 12484, USA" +}, { + "location": { + "latitude": 415034302, + "longitude": -743850945 + }, + "name": "" +}, { + "location": { + "latitude": 411349992, + "longitude": -743694161 + }, + "name": "" +}, { + "location": { + "latitude": 404839914, + "longitude": -744759616 + }, + "name": "1-17 Bergen Court, New Brunswick, NJ 08901, USA" +}, { + "location": { + "latitude": 414638017, + "longitude": -745957854 + }, + "name": "35 Oakland Valley Road, Cuddebackville, NY 12729, USA" +}, { + "location": { + "latitude": 412127800, + "longitude": -740173578 + }, + "name": "" +}, { + "location": { + "latitude": 401263460, + "longitude": -747964303 + }, + "name": "" +}, { + "location": { + "latitude": 412843391, + "longitude": -749086026 + }, + "name": "" +}, { + "location": { + "latitude": 418512773, + "longitude": -743067823 + }, + "name": "" +}, { + "location": { + "latitude": 404318328, + "longitude": -740835638 + }, + "name": "42-102 Main Street, Belford, NJ 07718, USA" +}, { + "location": { + "latitude": 419020746, + "longitude": -741172328 + }, + "name": "" +}, { + "location": { + "latitude": 404080723, + "longitude": -746119569 + }, + "name": "" +}, { + "location": { + "latitude": 401012643, + "longitude": -744035134 + }, + "name": "" +}, { + "location": { + "latitude": 404306372, + "longitude": -741079661 + }, + "name": "" +}, { + "location": { + "latitude": 403966326, + "longitude": -748519297 + }, + "name": "" +}, { + "location": { + "latitude": 405002031, + "longitude": -748407866 + }, + "name": "" +}, { + "location": { + "latitude": 409532885, + "longitude": -742200683 + }, + "name": "" +}, { + "location": { + "latitude": 416851321, + "longitude": -742674555 + }, + "name": "" +}, { + "location": { + "latitude": 406411633, + "longitude": -741722051 + }, + "name": "3387 Richmond Terrace, Staten Island, NY 10303, USA" +}, { + "location": { + "latitude": 413069058, + "longitude": -744597778 + }, + "name": "261 Van Sickle Road, Goshen, NY 10924, USA" +}, { + "location": { + "latitude": 418465462, + "longitude": -746859398 + }, + "name": "" +}, { + "location": { + "latitude": 411733222, + "longitude": -744228360 + }, + "name": "" +}, { + "location": { + "latitude": 410248224, + "longitude": -747127767 + }, + "name": "3 Hasta Way, Newton, NJ 07860, USA" +}] \ No newline at end of file diff --git a/examples/csharp/RouteGuide/RouteGuideClient/Program.cs b/examples/csharp/RouteGuide/RouteGuideClient/Program.cs new file mode 100644 index 00000000..accaf0a0 --- /dev/null +++ b/examples/csharp/RouteGuide/RouteGuideClient/Program.cs @@ -0,0 +1,241 @@ +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +using Grpc.Core; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Routeguide +{ + class Program + { + /// + /// Sample client code that makes gRPC calls to the server. + /// + public class RouteGuideClient + { + readonly RouteGuide.RouteGuideClient client; + + public RouteGuideClient(RouteGuide.RouteGuideClient client) + { + this.client = client; + } + + /// + /// Blocking unary call example. Calls GetFeature and prints the response. + /// + public void GetFeature(int lat, int lon) + { + try + { + Log("*** GetFeature: lat={0} lon={1}", lat, lon); + + Point request = new Point { Latitude = lat, Longitude = lon }; + + Feature feature = client.GetFeature(request); + if (feature.Exists()) + { + Log("Found feature called \"{0}\" at {1}, {2}", + feature.Name, feature.Location.GetLatitude(), feature.Location.GetLongitude()); + } + else + { + Log("Found no feature at {0}, {1}", + feature.Location.GetLatitude(), feature.Location.GetLongitude()); + } + } + catch (RpcException e) + { + Log("RPC failed " + e); + throw; + } + } + + + /// + /// Server-streaming example. Calls listFeatures with a rectangle of interest. Prints each response feature as it arrives. + /// + public async Task ListFeatures(int lowLat, int lowLon, int hiLat, int hiLon) + { + try + { + Log("*** ListFeatures: lowLat={0} lowLon={1} hiLat={2} hiLon={3}", lowLat, lowLon, hiLat, + hiLon); + + Rectangle request = new Rectangle + { + Lo = new Point { Latitude = lowLat, Longitude = lowLon }, + Hi = new Point { Latitude = hiLat, Longitude = hiLon } + }; + + using (var call = client.ListFeatures(request)) + { + var responseStream = call.ResponseStream; + StringBuilder responseLog = new StringBuilder("Result: "); + + while (await responseStream.MoveNext()) + { + Feature feature = responseStream.Current; + responseLog.Append(feature.ToString()); + } + Log(responseLog.ToString()); + } + } + catch (RpcException e) + { + Log("RPC failed " + e); + throw; + } + } + + /// + /// Client-streaming example. Sends numPoints randomly chosen points from features + /// with a variable delay in between. Prints the statistics when they are sent from the server. + /// + public async Task RecordRoute(List features, int numPoints) + { + try + { + Log("*** RecordRoute"); + using (var call = client.RecordRoute()) + { + // Send numPoints points randomly selected from the features list. + StringBuilder numMsg = new StringBuilder(); + Random rand = new Random(); + for (int i = 0; i < numPoints; ++i) + { + int index = rand.Next(features.Count); + Point point = features[index].Location; + Log("Visiting point {0}, {1}", point.GetLatitude(), point.GetLongitude()); + + await call.RequestStream.WriteAsync(point); + + // A bit of delay before sending the next one. + await Task.Delay(rand.Next(1000) + 500); + } + await call.RequestStream.CompleteAsync(); + + RouteSummary summary = await call.ResponseAsync; + Log("Finished trip with {0} points. Passed {1} features. " + + "Travelled {2} meters. It took {3} seconds.", summary.PointCount, + summary.FeatureCount, summary.Distance, summary.ElapsedTime); + + Log("Finished RecordRoute"); + } + } + catch (RpcException e) + { + Log("RPC failed", e); + throw; + } + } + + /// + /// Bi-directional streaming example. Send some chat messages, and print any + /// chat messages that are sent from the server. + /// + public async Task RouteChat() + { + try + { + Log("*** RouteChat"); + var requests = new List + { + NewNote("First message", 0, 0), + NewNote("Second message", 0, 1), + NewNote("Third message", 1, 0), + NewNote("Fourth message", 0, 0) + }; + + using (var call = client.RouteChat()) + { + var responseReaderTask = Task.Run(async () => + { + while (await call.ResponseStream.MoveNext()) + { + var note = call.ResponseStream.Current; + Log("Got message \"{0}\" at {1}, {2}", note.Message, + note.Location.Latitude, note.Location.Longitude); + } + }); + + foreach (RouteNote request in requests) + { + Log("Sending message \"{0}\" at {1}, {2}", request.Message, + request.Location.Latitude, request.Location.Longitude); + + await call.RequestStream.WriteAsync(request); + } + await call.RequestStream.CompleteAsync(); + await responseReaderTask; + + Log("Finished RouteChat"); + } + } + catch (RpcException e) + { + Log("RPC failed", e); + throw; + } + } + + private void Log(string s, params object[] args) + { + Console.WriteLine(string.Format(s, args)); + } + + private void Log(string s) + { + Console.WriteLine(s); + } + + private RouteNote NewNote(string message, int lat, int lon) + { + return new RouteNote + { + Message = message, + Location = new Point { Latitude = lat, Longitude = lon } + }; + } + } + + static void Main(string[] args) + { + var channel = new Channel("127.0.0.1:50052", ChannelCredentials.Insecure); + var client = new RouteGuideClient(new RouteGuide.RouteGuideClient(channel)); + + // Looking for a valid feature + client.GetFeature(409146138, -746188906); + + // Feature missing. + client.GetFeature(0, 0); + + // Looking for features between 40, -75 and 42, -73. + client.ListFeatures(400000000, -750000000, 420000000, -730000000).Wait(); + + // Record a few randomly selected points from the features file. + client.RecordRoute(RouteGuideUtil.LoadFeatures(), 10).Wait(); + + // Send and receive some notes. + client.RouteChat().Wait(); + + channel.ShutdownAsync().Wait(); + Console.WriteLine("Press any key to exit..."); + Console.ReadKey(); + } + } +} diff --git a/examples/csharp/RouteGuide/RouteGuideClient/RouteGuideClient.csproj b/examples/csharp/RouteGuide/RouteGuideClient/RouteGuideClient.csproj new file mode 100644 index 00000000..b773dd09 --- /dev/null +++ b/examples/csharp/RouteGuide/RouteGuideClient/RouteGuideClient.csproj @@ -0,0 +1,12 @@ + + + + netcoreapp2.1 + Exe + + + + + + + diff --git a/examples/csharp/RouteGuide/RouteGuideServer/Program.cs b/examples/csharp/RouteGuide/RouteGuideServer/Program.cs new file mode 100644 index 00000000..a79f8a1a --- /dev/null +++ b/examples/csharp/RouteGuide/RouteGuideServer/Program.cs @@ -0,0 +1,46 @@ +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +using Grpc.Core; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Routeguide +{ + class Program + { + static void Main(string[] args) + { + const int Port = 50052; + + var features = RouteGuideUtil.LoadFeatures(); + + Server server = new Server + { + Services = { RouteGuide.BindService(new RouteGuideImpl(features)) }, + Ports = { new ServerPort("localhost", Port, ServerCredentials.Insecure) } + }; + server.Start(); + + Console.WriteLine("RouteGuide server listening on port " + Port); + Console.WriteLine("Press any key to stop the server..."); + Console.ReadKey(); + + server.ShutdownAsync().Wait(); + } + } +} diff --git a/examples/csharp/RouteGuide/RouteGuideServer/RouteGuideImpl.cs b/examples/csharp/RouteGuide/RouteGuideServer/RouteGuideImpl.cs new file mode 100644 index 00000000..f157ca08 --- /dev/null +++ b/examples/csharp/RouteGuide/RouteGuideServer/RouteGuideImpl.cs @@ -0,0 +1,153 @@ +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using Grpc.Core; +using Grpc.Core.Utils; + +namespace Routeguide +{ + /// + /// Example implementation of RouteGuide server. + /// + public class RouteGuideImpl : RouteGuide.RouteGuideBase + { + readonly List features; + readonly object myLock = new object(); + readonly Dictionary> routeNotes = new Dictionary>(); + + public RouteGuideImpl(List features) + { + this.features = features; + } + + /// + /// Gets the feature at the requested point. If no feature at that location + /// exists, an unnammed feature is returned at the provided location. + /// + public override Task GetFeature(Point request, ServerCallContext context) + { + return Task.FromResult(CheckFeature(request)); + } + + /// + /// Gets all features contained within the given bounding rectangle. + /// + public override async Task ListFeatures(Rectangle request, IServerStreamWriter responseStream, ServerCallContext context) + { + var responses = features.FindAll( (feature) => feature.Exists() && request.Contains(feature.Location) ); + foreach (var response in responses) + { + await responseStream.WriteAsync(response); + } + } + + /// + /// Gets a stream of points, and responds with statistics about the "trip": number of points, + /// number of known features visited, total distance traveled, and total time spent. + /// + public override async Task RecordRoute(IAsyncStreamReader requestStream, ServerCallContext context) + { + int pointCount = 0; + int featureCount = 0; + int distance = 0; + Point previous = null; + var stopwatch = new Stopwatch(); + stopwatch.Start(); + + while (await requestStream.MoveNext()) + { + var point = requestStream.Current; + pointCount++; + if (CheckFeature(point).Exists()) + { + featureCount++; + } + if (previous != null) + { + distance += (int) previous.GetDistance(point); + } + previous = point; + } + + stopwatch.Stop(); + + return new RouteSummary + { + PointCount = pointCount, + FeatureCount = featureCount, + Distance = distance, + ElapsedTime = (int)(stopwatch.ElapsedMilliseconds / 1000) + }; + } + + /// + /// Receives a stream of message/location pairs, and responds with a stream of all previous + /// messages at each of those locations. + /// + public override async Task RouteChat(IAsyncStreamReader requestStream, IServerStreamWriter responseStream, ServerCallContext context) + { + while (await requestStream.MoveNext()) + { + var note = requestStream.Current; + List prevNotes = AddNoteForLocation(note.Location, note); + foreach (var prevNote in prevNotes) + { + await responseStream.WriteAsync(prevNote); + } + } + } + + /// + /// Adds a note for location and returns a list of pre-existing notes for that location (not containing the newly added note). + /// + private List AddNoteForLocation(Point location, RouteNote note) + { + lock (myLock) + { + List notes; + if (!routeNotes.TryGetValue(location, out notes)) { + notes = new List(); + routeNotes.Add(location, notes); + } + var preexistingNotes = new List(notes); + notes.Add(note); + return preexistingNotes; + } + } + + /// + /// Gets the feature at the given point. + /// + /// the location to check + /// The feature object at the point Note that an empty name indicates no feature. + private Feature CheckFeature(Point location) + { + var result = features.FirstOrDefault((feature) => feature.Location.Equals(location)); + if (result == null) + { + // No feature was found, return an unnamed feature. + return new Feature { Name = "", Location = location }; + } + return result; + } + } +} diff --git a/examples/csharp/RouteGuide/RouteGuideServer/RouteGuideServer.csproj b/examples/csharp/RouteGuide/RouteGuideServer/RouteGuideServer.csproj new file mode 100644 index 00000000..b773dd09 --- /dev/null +++ b/examples/csharp/RouteGuide/RouteGuideServer/RouteGuideServer.csproj @@ -0,0 +1,12 @@ + + + + netcoreapp2.1 + Exe + + + + + + + diff --git a/examples/csharp/Xds/Greeter.sln b/examples/csharp/Xds/Greeter.sln new file mode 100644 index 00000000..a5ba98d0 --- /dev/null +++ b/examples/csharp/Xds/Greeter.sln @@ -0,0 +1,34 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.26228.4 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Greeter", "Greeter\Greeter.csproj", "{13B6DFC8-F5F6-4CC2-99DF-57A7CF042033}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GreeterClient", "GreeterClient\GreeterClient.csproj", "{B754FB02-D501-4308-8B89-33AB7119C80D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GreeterServer", "GreeterServer\GreeterServer.csproj", "{DDBFF994-E076-43AD-B18D-049DFC1B670C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {13B6DFC8-F5F6-4CC2-99DF-57A7CF042033}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {13B6DFC8-F5F6-4CC2-99DF-57A7CF042033}.Debug|Any CPU.Build.0 = Debug|Any CPU + {13B6DFC8-F5F6-4CC2-99DF-57A7CF042033}.Release|Any CPU.ActiveCfg = Release|Any CPU + {13B6DFC8-F5F6-4CC2-99DF-57A7CF042033}.Release|Any CPU.Build.0 = Release|Any CPU + {B754FB02-D501-4308-8B89-33AB7119C80D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B754FB02-D501-4308-8B89-33AB7119C80D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B754FB02-D501-4308-8B89-33AB7119C80D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B754FB02-D501-4308-8B89-33AB7119C80D}.Release|Any CPU.Build.0 = Release|Any CPU + {DDBFF994-E076-43AD-B18D-049DFC1B670C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DDBFF994-E076-43AD-B18D-049DFC1B670C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DDBFF994-E076-43AD-B18D-049DFC1B670C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DDBFF994-E076-43AD-B18D-049DFC1B670C}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/examples/csharp/Xds/Greeter/Greeter.csproj b/examples/csharp/Xds/Greeter/Greeter.csproj new file mode 100644 index 00000000..9351cbcb --- /dev/null +++ b/examples/csharp/Xds/Greeter/Greeter.csproj @@ -0,0 +1,20 @@ + + + + netstandard2.0 + + + + + + + + + + + + + + + + diff --git a/examples/csharp/Xds/GreeterClient/GreeterClient.csproj b/examples/csharp/Xds/GreeterClient/GreeterClient.csproj new file mode 100644 index 00000000..ac10d854 --- /dev/null +++ b/examples/csharp/Xds/GreeterClient/GreeterClient.csproj @@ -0,0 +1,12 @@ + + + + netcoreapp2.1 + Exe + + + + + + + diff --git a/examples/csharp/Xds/GreeterClient/Program.cs b/examples/csharp/Xds/GreeterClient/Program.cs new file mode 100644 index 00000000..c6820a8f --- /dev/null +++ b/examples/csharp/Xds/GreeterClient/Program.cs @@ -0,0 +1,51 @@ +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +using System; +using Grpc.Core; +using Helloworld; +using CommandLine; + +namespace GreeterClient +{ + class Program + { + private class Options + { + [Option("server", Default = "localhost:50051", HelpText = "The address of the server")] + public string Server { get; set; } + } + + public static void Main(string[] args) + { + Parser.Default.ParseArguments(args) + .WithParsed(options => RunClient(options)); + } + + private static void RunClient(Options options) + { + Channel channel = new Channel(options.Server, ChannelCredentials.Insecure); + + var client = new Greeter.GreeterClient(channel); + String user = "you"; + + var reply = client.SayHello(new HelloRequest { Name = user }); + Console.WriteLine("Greeter client received: " + reply.Message); + + channel.ShutdownAsync().Wait(); + Console.WriteLine("Press any key to exit..."); + Console.ReadKey(); + } + } +} diff --git a/examples/csharp/Xds/GreeterServer/GreeterServer.csproj b/examples/csharp/Xds/GreeterServer/GreeterServer.csproj new file mode 100644 index 00000000..ac10d854 --- /dev/null +++ b/examples/csharp/Xds/GreeterServer/GreeterServer.csproj @@ -0,0 +1,12 @@ + + + + netcoreapp2.1 + Exe + + + + + + + diff --git a/examples/csharp/Xds/GreeterServer/Program.cs b/examples/csharp/Xds/GreeterServer/Program.cs new file mode 100644 index 00000000..e10b1af9 --- /dev/null +++ b/examples/csharp/Xds/GreeterServer/Program.cs @@ -0,0 +1,93 @@ +// Copyright 2020 The gRPC Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +using System; +using System.Net; +using System.Threading.Tasks; +using Grpc.Core; +using Grpc.HealthCheck; +using Helloworld; +using Grpc.Health; +using Grpc.Health.V1; +using Grpc.Reflection; +using Grpc.Reflection.V1Alpha; +using CommandLine; + +namespace GreeterServer +{ + class GreeterImpl : Greeter.GreeterBase + { + private string hostname; + + public GreeterImpl(string hostname) + { + this.hostname = hostname; + } + + // Server side handler of the SayHello RPC + public override Task SayHello(HelloRequest request, ServerCallContext context) + { + return Task.FromResult(new HelloReply { Message = $"Hello {request.Name} from {hostname}!"}); + } + } + + class Program + { + class Options + { + [Option("port", Default = 50051, HelpText = "The port to listen on.")] + public int Port { get; set; } + + [Option("hostname", Required = false, HelpText = "The name clients will see in responses. If not specified, machine's hostname will obtain automatically.")] + public string Hostname { get; set; } + } + + public static void Main(string[] args) + { + Parser.Default.ParseArguments(args) + .WithParsed(options => RunServer(options)); + } + + private static void RunServer(Options options) + { + var hostName = options.Hostname ?? Dns.GetHostName(); + + var serviceDescriptors = new [] {Greeter.Descriptor, Health.Descriptor, ServerReflection.Descriptor}; + var greeterImpl = new GreeterImpl(hostName); + var healthServiceImpl = new HealthServiceImpl(); + var reflectionImpl = new ReflectionServiceImpl(serviceDescriptors); + + Server server = new Server + { + Services = { Greeter.BindService(greeterImpl), Health.BindService(healthServiceImpl), ServerReflection.BindService(reflectionImpl) }, + Ports = { new ServerPort("[::]", options.Port, ServerCredentials.Insecure) } + }; + server.Start(); + + // Mark all services as healthy. + foreach (var serviceDescriptor in serviceDescriptors) + { + healthServiceImpl.SetStatus(serviceDescriptor.FullName, HealthCheckResponse.Types.ServingStatus.Serving); + } + // Mark overall server status as healthy. + healthServiceImpl.SetStatus("", HealthCheckResponse.Types.ServingStatus.Serving); + + Console.WriteLine("Greeter server listening on port " + options.Port); + Console.WriteLine("Press any key to stop the server..."); + Console.ReadKey(); + + server.ShutdownAsync().Wait(); + } + } +} diff --git a/examples/csharp/Xds/README.md b/examples/csharp/Xds/README.md new file mode 100644 index 00000000..ce0aa9f7 --- /dev/null +++ b/examples/csharp/Xds/README.md @@ -0,0 +1,99 @@ +gRPC Hostname example (C#) +======================== + +BACKGROUND +------------- +This is a version of the helloworld example with a server whose response includes its hostname. It also supports health and reflection services. This makes it a good server to test infrastructure, such as XDS load balancing. + +PREREQUISITES +------------- + +- The [.NET Core SDK 2.1+](https://www.microsoft.com/net/core) + +You can also build the solution `Greeter.sln` using Visual Studio 2019, +but it's not a requirement. + +RUN THE EXAMPLE +------------- + +First, build and run the server, then verify the server is running and +check the server is behaving as expected (more on that below). + +``` +cd GreeterServer +dotnet run +``` + +After configuring your xDS server to track the gRPC server we just started, +create a bootstrap file as desribed in [gRFC A27](https://github.com/grpc/proposal/blob/master/A27-xds-global-load-balancing.md): + +``` +{ + xds_servers": [ + { + "server_uri": , + "channel_creds": [ + { + "type": , + "config": + } + ] + } + ], + "node": +} +``` + +Then point the `GRPC_XDS_BOOTSTRAP` environment variable at the bootstrap file: + +``` +export GRPC_XDS_BOOTSTRAP=/etc/xds-bootstrap.json +``` + +Finally, run your client: + +``` +cd GreeterClient +dotnet run --server xds-experimental:///my-backend +``` + +VERIFYING THE SERVER +------------- + +`grpcurl` can be used to test your server. If you don't have it, +install [`grpcurl`](https://github.com/fullstorydev/grpcurl/releases). This will allow +you to manually test the service. + +Exercise your server's application-layer service: + +```sh +> grpcurl --plaintext -d '{"name": "you"}' localhost:50051 +{ + "message": "Hello you from jtatt.muc.corp.google.com!" +} +``` + +Make sure that all of your server's services are available via reflection: + +```sh +> grpcurl --plaintext localhost:50051 list +grpc.health.v1.Health +grpc.reflection.v1alpha.ServerReflection +helloworld.Greeter +``` + +Make sure that your services are reporting healthy: + +```sh +> grpcurl --plaintext -d '{"service": "helloworld.Greeter"}' localhost:50051 +grpc.health.v1.Health/Check +{ + "status": "SERVING" +} + +> grpcurl --plaintext -d '{"service": ""}' localhost:50051 +grpc.health.v1.Health/Check +{ + "status": "SERVING" +} +``` diff --git a/examples/node/.gitignore b/examples/node/.gitignore new file mode 100644 index 00000000..3d06f5db --- /dev/null +++ b/examples/node/.gitignore @@ -0,0 +1,3 @@ +*~ +node_modules +npm-debug.log \ No newline at end of file diff --git a/examples/node/README.md b/examples/node/README.md new file mode 100644 index 00000000..0264e9d6 --- /dev/null +++ b/examples/node/README.md @@ -0,0 +1,50 @@ +gRPC in 3 minutes (Node.js) +=========================== + +PREREQUISITES +------------- + +- `node`: This requires Node 0.12.x or greater. + +INSTALL +------- + + ```sh + $ # Get the gRPC repository + $ export REPO_ROOT=grpc # REPO root can be any directory of your choice + $ git clone -b RELEASE_TAG_HERE https://github.com/grpc/grpc $REPO_ROOT + $ cd $REPO_ROOT + + $ cd examples/node + $ npm install + ``` + +TRY IT! +------- + +There are two ways to generate the code needed to work with protocol buffers in Node.js - one approach uses [Protobuf.js](https://github.com/dcodeIO/ProtoBuf.js/) to dynamically generate the code at runtime, the other uses code statically generated using the protocol buffer compiler `protoc`. The examples behave identically, and either server can be used with either client. + + - Run the server + + ```sh + $ # from this directory + $ node ./dynamic_codegen/greeter_server.js & + $ # OR + $ node ./static_codegen/greeter_server.js & + ``` + + - Run the client + + ```sh + $ # from this directory + $ node ./dynamic_codegen/greeter_client.js + $ # OR + $ node ./static_codegen/greeter_client.js + ``` + +TUTORIAL +-------- +You can find a more detailed tutorial in [gRPC Basics: Node.js][] + +[Install gRPC Node]:../../src/node +[gRPC Basics: Node.js]:https://grpc.io/docs/tutorials/basic/node.html diff --git a/examples/node/dynamic_codegen/README.md b/examples/node/dynamic_codegen/README.md new file mode 100644 index 00000000..1a6ec17a --- /dev/null +++ b/examples/node/dynamic_codegen/README.md @@ -0,0 +1 @@ +This is the dynamic code generation variant of the Node examples. Code in these examples is generated at runtime using Protobuf.js. diff --git a/examples/node/dynamic_codegen/greeter_client.js b/examples/node/dynamic_codegen/greeter_client.js new file mode 100644 index 00000000..c289f501 --- /dev/null +++ b/examples/node/dynamic_codegen/greeter_client.js @@ -0,0 +1,47 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +var PROTO_PATH = __dirname + '/../../protos/helloworld.proto'; + +var grpc = require('grpc'); +var protoLoader = require('@grpc/proto-loader'); +var packageDefinition = protoLoader.loadSync( + PROTO_PATH, + {keepCase: true, + longs: String, + enums: String, + defaults: true, + oneofs: true + }); +var hello_proto = grpc.loadPackageDefinition(packageDefinition).helloworld; + +function main() { + var client = new hello_proto.Greeter('localhost:50051', + grpc.credentials.createInsecure()); + var user; + if (process.argv.length >= 3) { + user = process.argv[2]; + } else { + user = 'world'; + } + client.sayHello({name: user}, function(err, response) { + console.log('Greeting:', response.message); + }); +} + +main(); diff --git a/examples/node/dynamic_codegen/greeter_server.js b/examples/node/dynamic_codegen/greeter_server.js new file mode 100644 index 00000000..023257ec --- /dev/null +++ b/examples/node/dynamic_codegen/greeter_server.js @@ -0,0 +1,51 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +var PROTO_PATH = __dirname + '/../../protos/helloworld.proto'; + +var grpc = require('grpc'); +var protoLoader = require('@grpc/proto-loader'); +var packageDefinition = protoLoader.loadSync( + PROTO_PATH, + {keepCase: true, + longs: String, + enums: String, + defaults: true, + oneofs: true + }); +var hello_proto = grpc.loadPackageDefinition(packageDefinition).helloworld; + +/** + * Implements the SayHello RPC method. + */ +function sayHello(call, callback) { + callback(null, {message: 'Hello ' + call.request.name}); +} + +/** + * Starts an RPC server that receives requests for the Greeter service at the + * sample server port + */ +function main() { + var server = new grpc.Server(); + server.addService(hello_proto.Greeter.service, {sayHello: sayHello}); + server.bind('0.0.0.0:50051', grpc.ServerCredentials.createInsecure()); + server.start(); +} + +main(); diff --git a/examples/node/dynamic_codegen/route_guide/README.md b/examples/node/dynamic_codegen/route_guide/README.md new file mode 100644 index 00000000..7d6b0b7d --- /dev/null +++ b/examples/node/dynamic_codegen/route_guide/README.md @@ -0,0 +1,5 @@ +# gRPC Basics: Node.js sample code + +The files in this folder are the samples used in [gRPC Basics: Node.js][], a detailed tutorial for using gRPC in Node.js. + +[gRPC Basics: Node.js]:https://grpc.io/docs/tutorials/basic/node.html diff --git a/examples/node/dynamic_codegen/route_guide/route_guide_client.js b/examples/node/dynamic_codegen/route_guide/route_guide_client.js new file mode 100644 index 00000000..34a44bd6 --- /dev/null +++ b/examples/node/dynamic_codegen/route_guide/route_guide_client.js @@ -0,0 +1,237 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +var PROTO_PATH = __dirname + '/../../../protos/route_guide.proto'; + +var async = require('async'); +var fs = require('fs'); +var parseArgs = require('minimist'); +var path = require('path'); +var _ = require('lodash'); +var grpc = require('grpc'); +var protoLoader = require('@grpc/proto-loader'); +var packageDefinition = protoLoader.loadSync( + PROTO_PATH, + {keepCase: true, + longs: String, + enums: String, + defaults: true, + oneofs: true + }); +var routeguide = grpc.loadPackageDefinition(packageDefinition).routeguide; +var client = new routeguide.RouteGuide('localhost:50051', + grpc.credentials.createInsecure()); + +var COORD_FACTOR = 1e7; + +/** + * Run the getFeature demo. Calls getFeature with a point known to have a + * feature and a point known not to have a feature. + * @param {function} callback Called when this demo is complete + */ +function runGetFeature(callback) { + var next = _.after(2, callback); + function featureCallback(error, feature) { + if (error) { + callback(error); + return; + } + if (feature.name === '') { + console.log('Found no feature at ' + + feature.location.latitude/COORD_FACTOR + ', ' + + feature.location.longitude/COORD_FACTOR); + } else { + console.log('Found feature called "' + feature.name + '" at ' + + feature.location.latitude/COORD_FACTOR + ', ' + + feature.location.longitude/COORD_FACTOR); + } + next(); + } + var point1 = { + latitude: 409146138, + longitude: -746188906 + }; + var point2 = { + latitude: 0, + longitude: 0 + }; + client.getFeature(point1, featureCallback); + client.getFeature(point2, featureCallback); +} + +/** + * Run the listFeatures demo. Calls listFeatures with a rectangle containing all + * of the features in the pre-generated database. Prints each response as it + * comes in. + * @param {function} callback Called when this demo is complete + */ +function runListFeatures(callback) { + var rectangle = { + lo: { + latitude: 400000000, + longitude: -750000000 + }, + hi: { + latitude: 420000000, + longitude: -730000000 + } + }; + console.log('Looking for features between 40, -75 and 42, -73'); + var call = client.listFeatures(rectangle); + call.on('data', function(feature) { + console.log('Found feature called "' + feature.name + '" at ' + + feature.location.latitude/COORD_FACTOR + ', ' + + feature.location.longitude/COORD_FACTOR); + }); + call.on('end', callback); +} + +/** + * Run the recordRoute demo. Sends several randomly chosen points from the + * pre-generated feature database with a variable delay in between. Prints the + * statistics when they are sent from the server. + * @param {function} callback Called when this demo is complete + */ +function runRecordRoute(callback) { + var argv = parseArgs(process.argv, { + string: 'db_path' + }); + fs.readFile(path.resolve(argv.db_path), function(err, data) { + if (err) { + callback(err); + return; + } + var feature_list = JSON.parse(data); + + var num_points = 10; + var call = client.recordRoute(function(error, stats) { + if (error) { + callback(error); + return; + } + console.log('Finished trip with', stats.point_count, 'points'); + console.log('Passed', stats.feature_count, 'features'); + console.log('Travelled', stats.distance, 'meters'); + console.log('It took', stats.elapsed_time, 'seconds'); + callback(); + }); + /** + * Constructs a function that asynchronously sends the given point and then + * delays sending its callback + * @param {number} lat The latitude to send + * @param {number} lng The longitude to send + * @return {function(function)} The function that sends the point + */ + function pointSender(lat, lng) { + /** + * Sends the point, then calls the callback after a delay + * @param {function} callback Called when complete + */ + return function(callback) { + console.log('Visiting point ' + lat/COORD_FACTOR + ', ' + + lng/COORD_FACTOR); + call.write({ + latitude: lat, + longitude: lng + }); + _.delay(callback, _.random(500, 1500)); + }; + } + var point_senders = []; + for (var i = 0; i < num_points; i++) { + var rand_point = feature_list[_.random(0, feature_list.length - 1)]; + point_senders[i] = pointSender(rand_point.location.latitude, + rand_point.location.longitude); + } + async.series(point_senders, function() { + call.end(); + }); + }); +} + +/** + * Run the routeChat demo. Send some chat messages, and print any chat messages + * that are sent from the server. + * @param {function} callback Called when the demo is complete + */ +function runRouteChat(callback) { + var call = client.routeChat(); + call.on('data', function(note) { + console.log('Got message "' + note.message + '" at ' + + note.location.latitude + ', ' + note.location.longitude); + }); + + call.on('end', callback); + + var notes = [{ + location: { + latitude: 0, + longitude: 0 + }, + message: 'First message' + }, { + location: { + latitude: 0, + longitude: 1 + }, + message: 'Second message' + }, { + location: { + latitude: 1, + longitude: 0 + }, + message: 'Third message' + }, { + location: { + latitude: 0, + longitude: 0 + }, + message: 'Fourth message' + }]; + for (var i = 0; i < notes.length; i++) { + var note = notes[i]; + console.log('Sending message "' + note.message + '" at ' + + note.location.latitude + ', ' + note.location.longitude); + call.write(note); + } + call.end(); +} + +/** + * Run all of the demos in order + */ +function main() { + async.series([ + runGetFeature, + runListFeatures, + runRecordRoute, + runRouteChat + ]); +} + +if (require.main === module) { + main(); +} + +exports.runGetFeature = runGetFeature; + +exports.runListFeatures = runListFeatures; + +exports.runRecordRoute = runRecordRoute; + +exports.runRouteChat = runRouteChat; diff --git a/examples/node/dynamic_codegen/route_guide/route_guide_db.json b/examples/node/dynamic_codegen/route_guide/route_guide_db.json new file mode 100644 index 00000000..9d6a980a --- /dev/null +++ b/examples/node/dynamic_codegen/route_guide/route_guide_db.json @@ -0,0 +1,601 @@ +[{ + "location": { + "latitude": 407838351, + "longitude": -746143763 + }, + "name": "Patriots Path, Mendham, NJ 07945, USA" +}, { + "location": { + "latitude": 408122808, + "longitude": -743999179 + }, + "name": "101 New Jersey 10, Whippany, NJ 07981, USA" +}, { + "location": { + "latitude": 413628156, + "longitude": -749015468 + }, + "name": "U.S. 6, Shohola, PA 18458, USA" +}, { + "location": { + "latitude": 419999544, + "longitude": -740371136 + }, + "name": "5 Conners Road, Kingston, NY 12401, USA" +}, { + "location": { + "latitude": 414008389, + "longitude": -743951297 + }, + "name": "Mid Hudson Psychiatric Center, New Hampton, NY 10958, USA" +}, { + "location": { + "latitude": 419611318, + "longitude": -746524769 + }, + "name": "287 Flugertown Road, Livingston Manor, NY 12758, USA" +}, { + "location": { + "latitude": 406109563, + "longitude": -742186778 + }, + "name": "4001 Tremley Point Road, Linden, NJ 07036, USA" +}, { + "location": { + "latitude": 416802456, + "longitude": -742370183 + }, + "name": "352 South Mountain Road, Wallkill, NY 12589, USA" +}, { + "location": { + "latitude": 412950425, + "longitude": -741077389 + }, + "name": "Bailey Turn Road, Harriman, NY 10926, USA" +}, { + "location": { + "latitude": 412144655, + "longitude": -743949739 + }, + "name": "193-199 Wawayanda Road, Hewitt, NJ 07421, USA" +}, { + "location": { + "latitude": 415736605, + "longitude": -742847522 + }, + "name": "406-496 Ward Avenue, Pine Bush, NY 12566, USA" +}, { + "location": { + "latitude": 413843930, + "longitude": -740501726 + }, + "name": "162 Merrill Road, Highland Mills, NY 10930, USA" +}, { + "location": { + "latitude": 410873075, + "longitude": -744459023 + }, + "name": "Clinton Road, West Milford, NJ 07480, USA" +}, { + "location": { + "latitude": 412346009, + "longitude": -744026814 + }, + "name": "16 Old Brook Lane, Warwick, NY 10990, USA" +}, { + "location": { + "latitude": 402948455, + "longitude": -747903913 + }, + "name": "3 Drake Lane, Pennington, NJ 08534, USA" +}, { + "location": { + "latitude": 406337092, + "longitude": -740122226 + }, + "name": "6324 8th Avenue, Brooklyn, NY 11220, USA" +}, { + "location": { + "latitude": 406421967, + "longitude": -747727624 + }, + "name": "1 Merck Access Road, Whitehouse Station, NJ 08889, USA" +}, { + "location": { + "latitude": 416318082, + "longitude": -749677716 + }, + "name": "78-98 Schalck Road, Narrowsburg, NY 12764, USA" +}, { + "location": { + "latitude": 415301720, + "longitude": -748416257 + }, + "name": "282 Lakeview Drive Road, Highland Lake, NY 12743, USA" +}, { + "location": { + "latitude": 402647019, + "longitude": -747071791 + }, + "name": "330 Evelyn Avenue, Hamilton Township, NJ 08619, USA" +}, { + "location": { + "latitude": 412567807, + "longitude": -741058078 + }, + "name": "New York State Reference Route 987E, Southfields, NY 10975, USA" +}, { + "location": { + "latitude": 416855156, + "longitude": -744420597 + }, + "name": "103-271 Tempaloni Road, Ellenville, NY 12428, USA" +}, { + "location": { + "latitude": 404663628, + "longitude": -744820157 + }, + "name": "1300 Airport Road, North Brunswick Township, NJ 08902, USA" +}, { + "location": { + "latitude": 407113723, + "longitude": -749746483 + }, + "name": "" +}, { + "location": { + "latitude": 402133926, + "longitude": -743613249 + }, + "name": "" +}, { + "location": { + "latitude": 400273442, + "longitude": -741220915 + }, + "name": "" +}, { + "location": { + "latitude": 411236786, + "longitude": -744070769 + }, + "name": "" +}, { + "location": { + "latitude": 411633782, + "longitude": -746784970 + }, + "name": "211-225 Plains Road, Augusta, NJ 07822, USA" +}, { + "location": { + "latitude": 415830701, + "longitude": -742952812 + }, + "name": "" +}, { + "location": { + "latitude": 413447164, + "longitude": -748712898 + }, + "name": "165 Pedersen Ridge Road, Milford, PA 18337, USA" +}, { + "location": { + "latitude": 405047245, + "longitude": -749800722 + }, + "name": "100-122 Locktown Road, Frenchtown, NJ 08825, USA" +}, { + "location": { + "latitude": 418858923, + "longitude": -746156790 + }, + "name": "" +}, { + "location": { + "latitude": 417951888, + "longitude": -748484944 + }, + "name": "650-652 Willi Hill Road, Swan Lake, NY 12783, USA" +}, { + "location": { + "latitude": 407033786, + "longitude": -743977337 + }, + "name": "26 East 3rd Street, New Providence, NJ 07974, USA" +}, { + "location": { + "latitude": 417548014, + "longitude": -740075041 + }, + "name": "" +}, { + "location": { + "latitude": 410395868, + "longitude": -744972325 + }, + "name": "" +}, { + "location": { + "latitude": 404615353, + "longitude": -745129803 + }, + "name": "" +}, { + "location": { + "latitude": 406589790, + "longitude": -743560121 + }, + "name": "611 Lawrence Avenue, Westfield, NJ 07090, USA" +}, { + "location": { + "latitude": 414653148, + "longitude": -740477477 + }, + "name": "18 Lannis Avenue, New Windsor, NY 12553, USA" +}, { + "location": { + "latitude": 405957808, + "longitude": -743255336 + }, + "name": "82-104 Amherst Avenue, Colonia, NJ 07067, USA" +}, { + "location": { + "latitude": 411733589, + "longitude": -741648093 + }, + "name": "170 Seven Lakes Drive, Sloatsburg, NY 10974, USA" +}, { + "location": { + "latitude": 412676291, + "longitude": -742606606 + }, + "name": "1270 Lakes Road, Monroe, NY 10950, USA" +}, { + "location": { + "latitude": 409224445, + "longitude": -748286738 + }, + "name": "509-535 Alphano Road, Great Meadows, NJ 07838, USA" +}, { + "location": { + "latitude": 406523420, + "longitude": -742135517 + }, + "name": "652 Garden Street, Elizabeth, NJ 07202, USA" +}, { + "location": { + "latitude": 401827388, + "longitude": -740294537 + }, + "name": "349 Sea Spray Court, Neptune City, NJ 07753, USA" +}, { + "location": { + "latitude": 410564152, + "longitude": -743685054 + }, + "name": "13-17 Stanley Street, West Milford, NJ 07480, USA" +}, { + "location": { + "latitude": 408472324, + "longitude": -740726046 + }, + "name": "47 Industrial Avenue, Teterboro, NJ 07608, USA" +}, { + "location": { + "latitude": 412452168, + "longitude": -740214052 + }, + "name": "5 White Oak Lane, Stony Point, NY 10980, USA" +}, { + "location": { + "latitude": 409146138, + "longitude": -746188906 + }, + "name": "Berkshire Valley Management Area Trail, Jefferson, NJ, USA" +}, { + "location": { + "latitude": 404701380, + "longitude": -744781745 + }, + "name": "1007 Jersey Avenue, New Brunswick, NJ 08901, USA" +}, { + "location": { + "latitude": 409642566, + "longitude": -746017679 + }, + "name": "6 East Emerald Isle Drive, Lake Hopatcong, NJ 07849, USA" +}, { + "location": { + "latitude": 408031728, + "longitude": -748645385 + }, + "name": "1358-1474 New Jersey 57, Port Murray, NJ 07865, USA" +}, { + "location": { + "latitude": 413700272, + "longitude": -742135189 + }, + "name": "367 Prospect Road, Chester, NY 10918, USA" +}, { + "location": { + "latitude": 404310607, + "longitude": -740282632 + }, + "name": "10 Simon Lake Drive, Atlantic Highlands, NJ 07716, USA" +}, { + "location": { + "latitude": 409319800, + "longitude": -746201391 + }, + "name": "11 Ward Street, Mount Arlington, NJ 07856, USA" +}, { + "location": { + "latitude": 406685311, + "longitude": -742108603 + }, + "name": "300-398 Jefferson Avenue, Elizabeth, NJ 07201, USA" +}, { + "location": { + "latitude": 419018117, + "longitude": -749142781 + }, + "name": "43 Dreher Road, Roscoe, NY 12776, USA" +}, { + "location": { + "latitude": 412856162, + "longitude": -745148837 + }, + "name": "Swan Street, Pine Island, NY 10969, USA" +}, { + "location": { + "latitude": 416560744, + "longitude": -746721964 + }, + "name": "66 Pleasantview Avenue, Monticello, NY 12701, USA" +}, { + "location": { + "latitude": 405314270, + "longitude": -749836354 + }, + "name": "" +}, { + "location": { + "latitude": 414219548, + "longitude": -743327440 + }, + "name": "" +}, { + "location": { + "latitude": 415534177, + "longitude": -742900616 + }, + "name": "565 Winding Hills Road, Montgomery, NY 12549, USA" +}, { + "location": { + "latitude": 406898530, + "longitude": -749127080 + }, + "name": "231 Rocky Run Road, Glen Gardner, NJ 08826, USA" +}, { + "location": { + "latitude": 407586880, + "longitude": -741670168 + }, + "name": "100 Mount Pleasant Avenue, Newark, NJ 07104, USA" +}, { + "location": { + "latitude": 400106455, + "longitude": -742870190 + }, + "name": "517-521 Huntington Drive, Manchester Township, NJ 08759, USA" +}, { + "location": { + "latitude": 400066188, + "longitude": -746793294 + }, + "name": "" +}, { + "location": { + "latitude": 418803880, + "longitude": -744102673 + }, + "name": "40 Mountain Road, Napanoch, NY 12458, USA" +}, { + "location": { + "latitude": 414204288, + "longitude": -747895140 + }, + "name": "" +}, { + "location": { + "latitude": 414777405, + "longitude": -740615601 + }, + "name": "" +}, { + "location": { + "latitude": 415464475, + "longitude": -747175374 + }, + "name": "48 North Road, Forestburgh, NY 12777, USA" +}, { + "location": { + "latitude": 404062378, + "longitude": -746376177 + }, + "name": "" +}, { + "location": { + "latitude": 405688272, + "longitude": -749285130 + }, + "name": "" +}, { + "location": { + "latitude": 400342070, + "longitude": -748788996 + }, + "name": "" +}, { + "location": { + "latitude": 401809022, + "longitude": -744157964 + }, + "name": "" +}, { + "location": { + "latitude": 404226644, + "longitude": -740517141 + }, + "name": "9 Thompson Avenue, Leonardo, NJ 07737, USA" +}, { + "location": { + "latitude": 410322033, + "longitude": -747871659 + }, + "name": "" +}, { + "location": { + "latitude": 407100674, + "longitude": -747742727 + }, + "name": "" +}, { + "location": { + "latitude": 418811433, + "longitude": -741718005 + }, + "name": "213 Bush Road, Stone Ridge, NY 12484, USA" +}, { + "location": { + "latitude": 415034302, + "longitude": -743850945 + }, + "name": "" +}, { + "location": { + "latitude": 411349992, + "longitude": -743694161 + }, + "name": "" +}, { + "location": { + "latitude": 404839914, + "longitude": -744759616 + }, + "name": "1-17 Bergen Court, New Brunswick, NJ 08901, USA" +}, { + "location": { + "latitude": 414638017, + "longitude": -745957854 + }, + "name": "35 Oakland Valley Road, Cuddebackville, NY 12729, USA" +}, { + "location": { + "latitude": 412127800, + "longitude": -740173578 + }, + "name": "" +}, { + "location": { + "latitude": 401263460, + "longitude": -747964303 + }, + "name": "" +}, { + "location": { + "latitude": 412843391, + "longitude": -749086026 + }, + "name": "" +}, { + "location": { + "latitude": 418512773, + "longitude": -743067823 + }, + "name": "" +}, { + "location": { + "latitude": 404318328, + "longitude": -740835638 + }, + "name": "42-102 Main Street, Belford, NJ 07718, USA" +}, { + "location": { + "latitude": 419020746, + "longitude": -741172328 + }, + "name": "" +}, { + "location": { + "latitude": 404080723, + "longitude": -746119569 + }, + "name": "" +}, { + "location": { + "latitude": 401012643, + "longitude": -744035134 + }, + "name": "" +}, { + "location": { + "latitude": 404306372, + "longitude": -741079661 + }, + "name": "" +}, { + "location": { + "latitude": 403966326, + "longitude": -748519297 + }, + "name": "" +}, { + "location": { + "latitude": 405002031, + "longitude": -748407866 + }, + "name": "" +}, { + "location": { + "latitude": 409532885, + "longitude": -742200683 + }, + "name": "" +}, { + "location": { + "latitude": 416851321, + "longitude": -742674555 + }, + "name": "" +}, { + "location": { + "latitude": 406411633, + "longitude": -741722051 + }, + "name": "3387 Richmond Terrace, Staten Island, NY 10303, USA" +}, { + "location": { + "latitude": 413069058, + "longitude": -744597778 + }, + "name": "261 Van Sickle Road, Goshen, NY 10924, USA" +}, { + "location": { + "latitude": 418465462, + "longitude": -746859398 + }, + "name": "" +}, { + "location": { + "latitude": 411733222, + "longitude": -744228360 + }, + "name": "" +}, { + "location": { + "latitude": 410248224, + "longitude": -747127767 + }, + "name": "3 Hasta Way, Newton, NJ 07860, USA" +}] diff --git a/examples/node/dynamic_codegen/route_guide/route_guide_server.js b/examples/node/dynamic_codegen/route_guide/route_guide_server.js new file mode 100644 index 00000000..106491c1 --- /dev/null +++ b/examples/node/dynamic_codegen/route_guide/route_guide_server.js @@ -0,0 +1,244 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +var PROTO_PATH = __dirname + '/../../../protos/route_guide.proto'; + +var fs = require('fs'); +var parseArgs = require('minimist'); +var path = require('path'); +var _ = require('lodash'); +var grpc = require('grpc'); +var protoLoader = require('@grpc/proto-loader'); +var packageDefinition = protoLoader.loadSync( + PROTO_PATH, + {keepCase: true, + longs: String, + enums: String, + defaults: true, + oneofs: true + }); +var routeguide = grpc.loadPackageDefinition(packageDefinition).routeguide; + +var COORD_FACTOR = 1e7; + +/** + * For simplicity, a point is a record type that looks like + * {latitude: number, longitude: number}, and a feature is a record type that + * looks like {name: string, location: point}. feature objects with name==='' + * are points with no feature. + */ + +/** + * List of feature objects at points that have been requested so far. + */ +var feature_list = []; + +/** + * Get a feature object at the given point, or creates one if it does not exist. + * @param {point} point The point to check + * @return {feature} The feature object at the point. Note that an empty name + * indicates no feature + */ +function checkFeature(point) { + var feature; + // Check if there is already a feature object for the given point + for (var i = 0; i < feature_list.length; i++) { + feature = feature_list[i]; + if (feature.location.latitude === point.latitude && + feature.location.longitude === point.longitude) { + return feature; + } + } + var name = ''; + feature = { + name: name, + location: point + }; + return feature; +} + +/** + * getFeature request handler. Gets a request with a point, and responds with a + * feature object indicating whether there is a feature at that point. + * @param {EventEmitter} call Call object for the handler to process + * @param {function(Error, feature)} callback Response callback + */ +function getFeature(call, callback) { + callback(null, checkFeature(call.request)); +} + +/** + * listFeatures request handler. Gets a request with two points, and responds + * with a stream of all features in the bounding box defined by those points. + * @param {Writable} call Writable stream for responses with an additional + * request property for the request value. + */ +function listFeatures(call) { + var lo = call.request.lo; + var hi = call.request.hi; + var left = _.min([lo.longitude, hi.longitude]); + var right = _.max([lo.longitude, hi.longitude]); + var top = _.max([lo.latitude, hi.latitude]); + var bottom = _.min([lo.latitude, hi.latitude]); + // For each feature, check if it is in the given bounding box + _.each(feature_list, function(feature) { + if (feature.name === '') { + return; + } + if (feature.location.longitude >= left && + feature.location.longitude <= right && + feature.location.latitude >= bottom && + feature.location.latitude <= top) { + call.write(feature); + } + }); + call.end(); +} + +/** + * Calculate the distance between two points using the "haversine" formula. + * The formula is based on http://mathforum.org/library/drmath/view/51879.html. + * @param start The starting point + * @param end The end point + * @return The distance between the points in meters + */ +function getDistance(start, end) { + function toRadians(num) { + return num * Math.PI / 180; + } + var R = 6371000; // earth radius in metres + var lat1 = toRadians(start.latitude / COORD_FACTOR); + var lat2 = toRadians(end.latitude / COORD_FACTOR); + var lon1 = toRadians(start.longitude / COORD_FACTOR); + var lon2 = toRadians(end.longitude / COORD_FACTOR); + + var deltalat = lat2-lat1; + var deltalon = lon2-lon1; + var a = Math.sin(deltalat/2) * Math.sin(deltalat/2) + + Math.cos(lat1) * Math.cos(lat2) * + Math.sin(deltalon/2) * Math.sin(deltalon/2); + var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); + return R * c; +} + +/** + * recordRoute handler. Gets a stream of points, and responds with statistics + * about the "trip": number of points, number of known features visited, total + * distance traveled, and total time spent. + * @param {Readable} call The request point stream. + * @param {function(Error, routeSummary)} callback The callback to pass the + * response to + */ +function recordRoute(call, callback) { + var point_count = 0; + var feature_count = 0; + var distance = 0; + var previous = null; + // Start a timer + var start_time = process.hrtime(); + call.on('data', function(point) { + point_count += 1; + if (checkFeature(point).name !== '') { + feature_count += 1; + } + /* For each point after the first, add the incremental distance from the + * previous point to the total distance value */ + if (previous != null) { + distance += getDistance(previous, point); + } + previous = point; + }); + call.on('end', function() { + callback(null, { + point_count: point_count, + feature_count: feature_count, + // Cast the distance to an integer + distance: distance|0, + // End the timer + elapsed_time: process.hrtime(start_time)[0] + }); + }); +} + +var route_notes = {}; + +/** + * Turn the point into a dictionary key. + * @param {point} point The point to use + * @return {string} The key for an object + */ +function pointKey(point) { + return point.latitude + ' ' + point.longitude; +} + +/** + * routeChat handler. Receives a stream of message/location pairs, and responds + * with a stream of all previous messages at each of those locations. + * @param {Duplex} call The stream for incoming and outgoing messages + */ +function routeChat(call) { + call.on('data', function(note) { + var key = pointKey(note.location); + /* For each note sent, respond with all previous notes that correspond to + * the same point */ + if (route_notes.hasOwnProperty(key)) { + _.each(route_notes[key], function(note) { + call.write(note); + }); + } else { + route_notes[key] = []; + } + // Then add the new note to the list + route_notes[key].push(JSON.parse(JSON.stringify(note))); + }); + call.on('end', function() { + call.end(); + }); +} + +/** + * Get a new server with the handler functions in this file bound to the methods + * it serves. + * @return {Server} The new server object + */ +function getServer() { + var server = new grpc.Server(); + server.addProtoService(routeguide.RouteGuide.service, { + getFeature: getFeature, + listFeatures: listFeatures, + recordRoute: recordRoute, + routeChat: routeChat + }); + return server; +} + +if (require.main === module) { + // If this is run as a script, start a server on an unused port + var routeServer = getServer(); + routeServer.bind('0.0.0.0:50051', grpc.ServerCredentials.createInsecure()); + var argv = parseArgs(process.argv, { + string: 'db_path' + }); + fs.readFile(path.resolve(argv.db_path), function(err, data) { + if (err) throw err; + feature_list = JSON.parse(data); + routeServer.start(); + }); +} + +exports.getServer = getServer; diff --git a/examples/node/package.json b/examples/node/package.json new file mode 100644 index 00000000..3af6a113 --- /dev/null +++ b/examples/node/package.json @@ -0,0 +1,12 @@ +{ + "name": "grpc-examples", + "version": "0.1.0", + "dependencies": { + "@grpc/proto-loader": "^0.1.0", + "async": "^1.5.2", + "google-protobuf": "^3.0.0", + "grpc": "^1.11.0", + "lodash": "^4.6.1", + "minimist": "^1.2.0" + } +} diff --git a/examples/node/static_codegen/README.md b/examples/node/static_codegen/README.md new file mode 100644 index 00000000..0441b27f --- /dev/null +++ b/examples/node/static_codegen/README.md @@ -0,0 +1,8 @@ +This is the static code generation variant of the Node examples. Code in these examples is pre-generated using protoc and the Node gRPC protoc plugin, and the generated code can be found in various `*_pb.js` files. The command line sequence for generating those files is as follows (assuming that `protoc` and `grpc_node_plugin` are present, and starting in the directory which contains this README.md file): + +```sh +cd ../../protos +npm install -g grpc-tools +grpc_tools_node_protoc --js_out=import_style=commonjs,binary:../node/static_codegen/ --grpc_out=../node/static_codegen --plugin=protoc-gen-grpc=`which grpc_tools_node_protoc_plugin` helloworld.proto +grpc_tools_node_protoc --js_out=import_style=commonjs,binary:../node/static_codegen/route_guide/ --grpc_out=../node/static_codegen/route_guide/ --plugin=protoc-gen-grpc=`which grpc_tools_node_protoc_plugin` route_guide.proto +``` diff --git a/examples/node/static_codegen/greeter_client.js b/examples/node/static_codegen/greeter_client.js new file mode 100644 index 00000000..3f85f9b9 --- /dev/null +++ b/examples/node/static_codegen/greeter_client.js @@ -0,0 +1,40 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +var messages = require('./helloworld_pb'); +var services = require('./helloworld_grpc_pb'); + +var grpc = require('grpc'); + +function main() { + var client = new services.GreeterClient('localhost:50051', + grpc.credentials.createInsecure()); + var request = new messages.HelloRequest(); + var user; + if (process.argv.length >= 3) { + user = process.argv[2]; + } else { + user = 'world'; + } + request.setName(user); + client.sayHello(request, function(err, response) { + console.log('Greeting:', response.getMessage()); + }); +} + +main(); diff --git a/examples/node/static_codegen/greeter_server.js b/examples/node/static_codegen/greeter_server.js new file mode 100644 index 00000000..930f5060 --- /dev/null +++ b/examples/node/static_codegen/greeter_server.js @@ -0,0 +1,44 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +var messages = require('./helloworld_pb'); +var services = require('./helloworld_grpc_pb'); + +var grpc = require('grpc'); + +/** + * Implements the SayHello RPC method. + */ +function sayHello(call, callback) { + var reply = new messages.HelloReply(); + reply.setMessage('Hello ' + call.request.getName()); + callback(null, reply); +} + +/** + * Starts an RPC server that receives requests for the Greeter service at the + * sample server port + */ +function main() { + var server = new grpc.Server(); + server.addService(services.GreeterService, {sayHello: sayHello}); + server.bind('0.0.0.0:50051', grpc.ServerCredentials.createInsecure()); + server.start(); +} + +main(); diff --git a/examples/node/static_codegen/helloworld_grpc_pb.js b/examples/node/static_codegen/helloworld_grpc_pb.js new file mode 100644 index 00000000..2605e2da --- /dev/null +++ b/examples/node/static_codegen/helloworld_grpc_pb.js @@ -0,0 +1,61 @@ +// GENERATED CODE -- DO NOT EDIT! + +// Original file comments: +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +'use strict'; +var grpc = require('grpc'); +var helloworld_pb = require('./helloworld_pb.js'); + +function serialize_HelloReply(arg) { + if (!(arg instanceof helloworld_pb.HelloReply)) { + throw new Error('Expected argument of type HelloReply'); + } + return new Buffer(arg.serializeBinary()); +} + +function deserialize_HelloReply(buffer_arg) { + return helloworld_pb.HelloReply.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_HelloRequest(arg) { + if (!(arg instanceof helloworld_pb.HelloRequest)) { + throw new Error('Expected argument of type HelloRequest'); + } + return new Buffer(arg.serializeBinary()); +} + +function deserialize_HelloRequest(buffer_arg) { + return helloworld_pb.HelloRequest.deserializeBinary(new Uint8Array(buffer_arg)); +} + + +// The greeting service definition. +var GreeterService = exports.GreeterService = { + // Sends a greeting + sayHello: { + path: '/helloworld.Greeter/SayHello', + requestStream: false, + responseStream: false, + requestType: helloworld_pb.HelloRequest, + responseType: helloworld_pb.HelloReply, + requestSerialize: serialize_HelloRequest, + requestDeserialize: deserialize_HelloRequest, + responseSerialize: serialize_HelloReply, + responseDeserialize: deserialize_HelloReply, + }, +}; + +exports.GreeterClient = grpc.makeGenericClientConstructor(GreeterService); diff --git a/examples/node/static_codegen/helloworld_pb.js b/examples/node/static_codegen/helloworld_pb.js new file mode 100644 index 00000000..d1e50c90 --- /dev/null +++ b/examples/node/static_codegen/helloworld_pb.js @@ -0,0 +1,332 @@ +/** + * @fileoverview + * @enhanceable + * @public + */ +// GENERATED CODE -- DO NOT EDIT! + +var jspb = require('google-protobuf'); +var goog = jspb; +var global = Function('return this')(); + +goog.exportSymbol('proto.helloworld.HelloReply', null, global); +goog.exportSymbol('proto.helloworld.HelloRequest', null, global); + +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.helloworld.HelloRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.helloworld.HelloRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + proto.helloworld.HelloRequest.displayName = 'proto.helloworld.HelloRequest'; +} + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto suitable for use in Soy templates. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS. + * @param {boolean=} opt_includeInstance Whether to include the JSPB instance + * for transitional soy proto support: http://goto/soy-param-migration + * @return {!Object} + */ +proto.helloworld.HelloRequest.prototype.toObject = function(opt_includeInstance) { + return proto.helloworld.HelloRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Whether to include the JSPB + * instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.helloworld.HelloRequest} msg The msg instance to transform. + * @return {!Object} + */ +proto.helloworld.HelloRequest.toObject = function(includeInstance, msg) { + var f, obj = { + name: msg.getName() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.helloworld.HelloRequest} + */ +proto.helloworld.HelloRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.helloworld.HelloRequest; + return proto.helloworld.HelloRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.helloworld.HelloRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.helloworld.HelloRequest} + */ +proto.helloworld.HelloRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setName(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Class method variant: serializes the given message to binary data + * (in protobuf wire format), writing to the given BinaryWriter. + * @param {!proto.helloworld.HelloRequest} message + * @param {!jspb.BinaryWriter} writer + */ +proto.helloworld.HelloRequest.serializeBinaryToWriter = function(message, writer) { + message.serializeBinaryToWriter(writer); +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.helloworld.HelloRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + this.serializeBinaryToWriter(writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the message to binary data (in protobuf wire format), + * writing to the given BinaryWriter. + * @param {!jspb.BinaryWriter} writer + */ +proto.helloworld.HelloRequest.prototype.serializeBinaryToWriter = function (writer) { + var f = undefined; + f = this.getName(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } +}; + + +/** + * Creates a deep clone of this proto. No data is shared with the original. + * @return {!proto.helloworld.HelloRequest} The clone. + */ +proto.helloworld.HelloRequest.prototype.cloneMessage = function() { + return /** @type {!proto.helloworld.HelloRequest} */ (jspb.Message.cloneMessage(this)); +}; + + +/** + * optional string name = 1; + * @return {string} + */ +proto.helloworld.HelloRequest.prototype.getName = function() { + return /** @type {string} */ (jspb.Message.getFieldProto3(this, 1, "")); +}; + + +/** @param {string} value */ +proto.helloworld.HelloRequest.prototype.setName = function(value) { + jspb.Message.setField(this, 1, value); +}; + + + +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.helloworld.HelloReply = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.helloworld.HelloReply, jspb.Message); +if (goog.DEBUG && !COMPILED) { + proto.helloworld.HelloReply.displayName = 'proto.helloworld.HelloReply'; +} + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto suitable for use in Soy templates. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS. + * @param {boolean=} opt_includeInstance Whether to include the JSPB instance + * for transitional soy proto support: http://goto/soy-param-migration + * @return {!Object} + */ +proto.helloworld.HelloReply.prototype.toObject = function(opt_includeInstance) { + return proto.helloworld.HelloReply.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Whether to include the JSPB + * instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.helloworld.HelloReply} msg The msg instance to transform. + * @return {!Object} + */ +proto.helloworld.HelloReply.toObject = function(includeInstance, msg) { + var f, obj = { + message: msg.getMessage() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.helloworld.HelloReply} + */ +proto.helloworld.HelloReply.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.helloworld.HelloReply; + return proto.helloworld.HelloReply.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.helloworld.HelloReply} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.helloworld.HelloReply} + */ +proto.helloworld.HelloReply.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setMessage(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Class method variant: serializes the given message to binary data + * (in protobuf wire format), writing to the given BinaryWriter. + * @param {!proto.helloworld.HelloReply} message + * @param {!jspb.BinaryWriter} writer + */ +proto.helloworld.HelloReply.serializeBinaryToWriter = function(message, writer) { + message.serializeBinaryToWriter(writer); +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.helloworld.HelloReply.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + this.serializeBinaryToWriter(writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the message to binary data (in protobuf wire format), + * writing to the given BinaryWriter. + * @param {!jspb.BinaryWriter} writer + */ +proto.helloworld.HelloReply.prototype.serializeBinaryToWriter = function (writer) { + var f = undefined; + f = this.getMessage(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } +}; + + +/** + * Creates a deep clone of this proto. No data is shared with the original. + * @return {!proto.helloworld.HelloReply} The clone. + */ +proto.helloworld.HelloReply.prototype.cloneMessage = function() { + return /** @type {!proto.helloworld.HelloReply} */ (jspb.Message.cloneMessage(this)); +}; + + +/** + * optional string message = 1; + * @return {string} + */ +proto.helloworld.HelloReply.prototype.getMessage = function() { + return /** @type {string} */ (jspb.Message.getFieldProto3(this, 1, "")); +}; + + +/** @param {string} value */ +proto.helloworld.HelloReply.prototype.setMessage = function(value) { + jspb.Message.setField(this, 1, value); +}; + + +goog.object.extend(exports, proto.helloworld); diff --git a/examples/node/static_codegen/route_guide/README.md b/examples/node/static_codegen/route_guide/README.md new file mode 100644 index 00000000..7d6b0b7d --- /dev/null +++ b/examples/node/static_codegen/route_guide/README.md @@ -0,0 +1,5 @@ +# gRPC Basics: Node.js sample code + +The files in this folder are the samples used in [gRPC Basics: Node.js][], a detailed tutorial for using gRPC in Node.js. + +[gRPC Basics: Node.js]:https://grpc.io/docs/tutorials/basic/node.html diff --git a/examples/node/static_codegen/route_guide/route_guide_client.js b/examples/node/static_codegen/route_guide/route_guide_client.js new file mode 100644 index 00000000..b65e3f83 --- /dev/null +++ b/examples/node/static_codegen/route_guide/route_guide_client.js @@ -0,0 +1,237 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +var messages = require('./route_guide_pb'); +var services = require('./route_guide_grpc_pb'); + +var async = require('async'); +var fs = require('fs'); +var parseArgs = require('minimist'); +var path = require('path'); +var _ = require('lodash'); +var grpc = require('grpc'); + +var client = new services.RouteGuideClient('localhost:50051', + grpc.credentials.createInsecure()); + +var COORD_FACTOR = 1e7; + +/** + * Run the getFeature demo. Calls getFeature with a point known to have a + * feature and a point known not to have a feature. + * @param {function} callback Called when this demo is complete + */ +function runGetFeature(callback) { + var next = _.after(2, callback); + function featureCallback(error, feature) { + if (error) { + callback(error); + return; + } + var latitude = feature.getLocation().getLatitude(); + var longitude = feature.getLocation().getLongitude(); + if (feature.getName() === '') { + console.log('Found no feature at ' + + latitude/COORD_FACTOR + ', ' + longitude/COORD_FACTOR); + } else { + console.log('Found feature called "' + feature.getName() + '" at ' + + latitude/COORD_FACTOR + ', ' + longitude/COORD_FACTOR); + } + next(); + } + var point1 = new messages.Point(); + point1.setLatitude(409146138); + point1.setLongitude(-746188906); + var point2 = new messages.Point(); + point2.setLatitude(0); + point2.setLongitude(0); + client.getFeature(point1, featureCallback); + client.getFeature(point2, featureCallback); +} + +/** + * Run the listFeatures demo. Calls listFeatures with a rectangle containing all + * of the features in the pre-generated database. Prints each response as it + * comes in. + * @param {function} callback Called when this demo is complete + */ +function runListFeatures(callback) { + var rect = new messages.Rectangle(); + var lo = new messages.Point(); + lo.setLatitude(400000000); + lo.setLongitude(-750000000); + rect.setLo(lo); + var hi = new messages.Point(); + hi.setLatitude(420000000); + hi.setLongitude(-730000000); + rect.setHi(hi); + console.log('Looking for features between 40, -75 and 42, -73'); + var call = client.listFeatures(rect); + call.on('data', function(feature) { + console.log('Found feature called "' + feature.getName() + '" at ' + + feature.getLocation().getLatitude()/COORD_FACTOR + ', ' + + feature.getLocation().getLongitude()/COORD_FACTOR); + }); + call.on('end', callback); +} + +/** + * Run the recordRoute demo. Sends several randomly chosen points from the + * pre-generated feature database with a variable delay in between. Prints the + * statistics when they are sent from the server. + * @param {function} callback Called when this demo is complete + */ +function runRecordRoute(callback) { + var argv = parseArgs(process.argv, { + string: 'db_path' + }); + fs.readFile(path.resolve(argv.db_path), function(err, data) { + if (err) { + callback(err); + return; + } + // Transform the loaded features to Feature objects + var feature_list = _.map(JSON.parse(data), function(value) { + var feature = new messages.Feature(); + feature.setName(value.name); + var location = new messages.Point(); + location.setLatitude(value.location.latitude); + location.setLongitude(value.location.longitude); + feature.setLocation(location); + return feature; + }); + + var num_points = 10; + var call = client.recordRoute(function(error, stats) { + if (error) { + callback(error); + return; + } + console.log('Finished trip with', stats.getPointCount(), 'points'); + console.log('Passed', stats.getFeatureCount(), 'features'); + console.log('Travelled', stats.getDistance(), 'meters'); + console.log('It took', stats.getElapsedTime(), 'seconds'); + callback(); + }); + /** + * Constructs a function that asynchronously sends the given point and then + * delays sending its callback + * @param {messages.Point} location The point to send + * @return {function(function)} The function that sends the point + */ + function pointSender(location) { + /** + * Sends the point, then calls the callback after a delay + * @param {function} callback Called when complete + */ + return function(callback) { + console.log('Visiting point ' + location.getLatitude()/COORD_FACTOR + + ', ' + location.getLongitude()/COORD_FACTOR); + call.write(location); + _.delay(callback, _.random(500, 1500)); + }; + } + var point_senders = []; + for (var i = 0; i < num_points; i++) { + var rand_point = feature_list[_.random(0, feature_list.length - 1)]; + point_senders[i] = pointSender(rand_point.getLocation()); + } + async.series(point_senders, function() { + call.end(); + }); + }); +} + +/** + * Run the routeChat demo. Send some chat messages, and print any chat messages + * that are sent from the server. + * @param {function} callback Called when the demo is complete + */ +function runRouteChat(callback) { + var call = client.routeChat(); + call.on('data', function(note) { + console.log('Got message "' + note.getMessage() + '" at ' + + note.getLocation().getLatitude() + ', ' + + note.getLocation().getLongitude()); + }); + + call.on('end', callback); + + var notes = [{ + location: { + latitude: 0, + longitude: 0 + }, + message: 'First message' + }, { + location: { + latitude: 0, + longitude: 1 + }, + message: 'Second message' + }, { + location: { + latitude: 1, + longitude: 0 + }, + message: 'Third message' + }, { + location: { + latitude: 0, + longitude: 0 + }, + message: 'Fourth message' + }]; + for (var i = 0; i < notes.length; i++) { + var note = notes[i]; + console.log('Sending message "' + note.message + '" at ' + + note.location.latitude + ', ' + note.location.longitude); + var noteMsg = new messages.RouteNote(); + noteMsg.setMessage(note.message); + var location = new messages.Point(); + location.setLatitude(note.location.latitude); + location.setLongitude(note.location.longitude); + noteMsg.setLocation(location); + call.write(noteMsg); + } + call.end(); +} + +/** + * Run all of the demos in order + */ +function main() { + async.series([ + runGetFeature, + runListFeatures, + runRecordRoute, + runRouteChat + ]); +} + +if (require.main === module) { + main(); +} + +exports.runGetFeature = runGetFeature; + +exports.runListFeatures = runListFeatures; + +exports.runRecordRoute = runRecordRoute; + +exports.runRouteChat = runRouteChat; diff --git a/examples/node/static_codegen/route_guide/route_guide_db.json b/examples/node/static_codegen/route_guide/route_guide_db.json new file mode 100644 index 00000000..9d6a980a --- /dev/null +++ b/examples/node/static_codegen/route_guide/route_guide_db.json @@ -0,0 +1,601 @@ +[{ + "location": { + "latitude": 407838351, + "longitude": -746143763 + }, + "name": "Patriots Path, Mendham, NJ 07945, USA" +}, { + "location": { + "latitude": 408122808, + "longitude": -743999179 + }, + "name": "101 New Jersey 10, Whippany, NJ 07981, USA" +}, { + "location": { + "latitude": 413628156, + "longitude": -749015468 + }, + "name": "U.S. 6, Shohola, PA 18458, USA" +}, { + "location": { + "latitude": 419999544, + "longitude": -740371136 + }, + "name": "5 Conners Road, Kingston, NY 12401, USA" +}, { + "location": { + "latitude": 414008389, + "longitude": -743951297 + }, + "name": "Mid Hudson Psychiatric Center, New Hampton, NY 10958, USA" +}, { + "location": { + "latitude": 419611318, + "longitude": -746524769 + }, + "name": "287 Flugertown Road, Livingston Manor, NY 12758, USA" +}, { + "location": { + "latitude": 406109563, + "longitude": -742186778 + }, + "name": "4001 Tremley Point Road, Linden, NJ 07036, USA" +}, { + "location": { + "latitude": 416802456, + "longitude": -742370183 + }, + "name": "352 South Mountain Road, Wallkill, NY 12589, USA" +}, { + "location": { + "latitude": 412950425, + "longitude": -741077389 + }, + "name": "Bailey Turn Road, Harriman, NY 10926, USA" +}, { + "location": { + "latitude": 412144655, + "longitude": -743949739 + }, + "name": "193-199 Wawayanda Road, Hewitt, NJ 07421, USA" +}, { + "location": { + "latitude": 415736605, + "longitude": -742847522 + }, + "name": "406-496 Ward Avenue, Pine Bush, NY 12566, USA" +}, { + "location": { + "latitude": 413843930, + "longitude": -740501726 + }, + "name": "162 Merrill Road, Highland Mills, NY 10930, USA" +}, { + "location": { + "latitude": 410873075, + "longitude": -744459023 + }, + "name": "Clinton Road, West Milford, NJ 07480, USA" +}, { + "location": { + "latitude": 412346009, + "longitude": -744026814 + }, + "name": "16 Old Brook Lane, Warwick, NY 10990, USA" +}, { + "location": { + "latitude": 402948455, + "longitude": -747903913 + }, + "name": "3 Drake Lane, Pennington, NJ 08534, USA" +}, { + "location": { + "latitude": 406337092, + "longitude": -740122226 + }, + "name": "6324 8th Avenue, Brooklyn, NY 11220, USA" +}, { + "location": { + "latitude": 406421967, + "longitude": -747727624 + }, + "name": "1 Merck Access Road, Whitehouse Station, NJ 08889, USA" +}, { + "location": { + "latitude": 416318082, + "longitude": -749677716 + }, + "name": "78-98 Schalck Road, Narrowsburg, NY 12764, USA" +}, { + "location": { + "latitude": 415301720, + "longitude": -748416257 + }, + "name": "282 Lakeview Drive Road, Highland Lake, NY 12743, USA" +}, { + "location": { + "latitude": 402647019, + "longitude": -747071791 + }, + "name": "330 Evelyn Avenue, Hamilton Township, NJ 08619, USA" +}, { + "location": { + "latitude": 412567807, + "longitude": -741058078 + }, + "name": "New York State Reference Route 987E, Southfields, NY 10975, USA" +}, { + "location": { + "latitude": 416855156, + "longitude": -744420597 + }, + "name": "103-271 Tempaloni Road, Ellenville, NY 12428, USA" +}, { + "location": { + "latitude": 404663628, + "longitude": -744820157 + }, + "name": "1300 Airport Road, North Brunswick Township, NJ 08902, USA" +}, { + "location": { + "latitude": 407113723, + "longitude": -749746483 + }, + "name": "" +}, { + "location": { + "latitude": 402133926, + "longitude": -743613249 + }, + "name": "" +}, { + "location": { + "latitude": 400273442, + "longitude": -741220915 + }, + "name": "" +}, { + "location": { + "latitude": 411236786, + "longitude": -744070769 + }, + "name": "" +}, { + "location": { + "latitude": 411633782, + "longitude": -746784970 + }, + "name": "211-225 Plains Road, Augusta, NJ 07822, USA" +}, { + "location": { + "latitude": 415830701, + "longitude": -742952812 + }, + "name": "" +}, { + "location": { + "latitude": 413447164, + "longitude": -748712898 + }, + "name": "165 Pedersen Ridge Road, Milford, PA 18337, USA" +}, { + "location": { + "latitude": 405047245, + "longitude": -749800722 + }, + "name": "100-122 Locktown Road, Frenchtown, NJ 08825, USA" +}, { + "location": { + "latitude": 418858923, + "longitude": -746156790 + }, + "name": "" +}, { + "location": { + "latitude": 417951888, + "longitude": -748484944 + }, + "name": "650-652 Willi Hill Road, Swan Lake, NY 12783, USA" +}, { + "location": { + "latitude": 407033786, + "longitude": -743977337 + }, + "name": "26 East 3rd Street, New Providence, NJ 07974, USA" +}, { + "location": { + "latitude": 417548014, + "longitude": -740075041 + }, + "name": "" +}, { + "location": { + "latitude": 410395868, + "longitude": -744972325 + }, + "name": "" +}, { + "location": { + "latitude": 404615353, + "longitude": -745129803 + }, + "name": "" +}, { + "location": { + "latitude": 406589790, + "longitude": -743560121 + }, + "name": "611 Lawrence Avenue, Westfield, NJ 07090, USA" +}, { + "location": { + "latitude": 414653148, + "longitude": -740477477 + }, + "name": "18 Lannis Avenue, New Windsor, NY 12553, USA" +}, { + "location": { + "latitude": 405957808, + "longitude": -743255336 + }, + "name": "82-104 Amherst Avenue, Colonia, NJ 07067, USA" +}, { + "location": { + "latitude": 411733589, + "longitude": -741648093 + }, + "name": "170 Seven Lakes Drive, Sloatsburg, NY 10974, USA" +}, { + "location": { + "latitude": 412676291, + "longitude": -742606606 + }, + "name": "1270 Lakes Road, Monroe, NY 10950, USA" +}, { + "location": { + "latitude": 409224445, + "longitude": -748286738 + }, + "name": "509-535 Alphano Road, Great Meadows, NJ 07838, USA" +}, { + "location": { + "latitude": 406523420, + "longitude": -742135517 + }, + "name": "652 Garden Street, Elizabeth, NJ 07202, USA" +}, { + "location": { + "latitude": 401827388, + "longitude": -740294537 + }, + "name": "349 Sea Spray Court, Neptune City, NJ 07753, USA" +}, { + "location": { + "latitude": 410564152, + "longitude": -743685054 + }, + "name": "13-17 Stanley Street, West Milford, NJ 07480, USA" +}, { + "location": { + "latitude": 408472324, + "longitude": -740726046 + }, + "name": "47 Industrial Avenue, Teterboro, NJ 07608, USA" +}, { + "location": { + "latitude": 412452168, + "longitude": -740214052 + }, + "name": "5 White Oak Lane, Stony Point, NY 10980, USA" +}, { + "location": { + "latitude": 409146138, + "longitude": -746188906 + }, + "name": "Berkshire Valley Management Area Trail, Jefferson, NJ, USA" +}, { + "location": { + "latitude": 404701380, + "longitude": -744781745 + }, + "name": "1007 Jersey Avenue, New Brunswick, NJ 08901, USA" +}, { + "location": { + "latitude": 409642566, + "longitude": -746017679 + }, + "name": "6 East Emerald Isle Drive, Lake Hopatcong, NJ 07849, USA" +}, { + "location": { + "latitude": 408031728, + "longitude": -748645385 + }, + "name": "1358-1474 New Jersey 57, Port Murray, NJ 07865, USA" +}, { + "location": { + "latitude": 413700272, + "longitude": -742135189 + }, + "name": "367 Prospect Road, Chester, NY 10918, USA" +}, { + "location": { + "latitude": 404310607, + "longitude": -740282632 + }, + "name": "10 Simon Lake Drive, Atlantic Highlands, NJ 07716, USA" +}, { + "location": { + "latitude": 409319800, + "longitude": -746201391 + }, + "name": "11 Ward Street, Mount Arlington, NJ 07856, USA" +}, { + "location": { + "latitude": 406685311, + "longitude": -742108603 + }, + "name": "300-398 Jefferson Avenue, Elizabeth, NJ 07201, USA" +}, { + "location": { + "latitude": 419018117, + "longitude": -749142781 + }, + "name": "43 Dreher Road, Roscoe, NY 12776, USA" +}, { + "location": { + "latitude": 412856162, + "longitude": -745148837 + }, + "name": "Swan Street, Pine Island, NY 10969, USA" +}, { + "location": { + "latitude": 416560744, + "longitude": -746721964 + }, + "name": "66 Pleasantview Avenue, Monticello, NY 12701, USA" +}, { + "location": { + "latitude": 405314270, + "longitude": -749836354 + }, + "name": "" +}, { + "location": { + "latitude": 414219548, + "longitude": -743327440 + }, + "name": "" +}, { + "location": { + "latitude": 415534177, + "longitude": -742900616 + }, + "name": "565 Winding Hills Road, Montgomery, NY 12549, USA" +}, { + "location": { + "latitude": 406898530, + "longitude": -749127080 + }, + "name": "231 Rocky Run Road, Glen Gardner, NJ 08826, USA" +}, { + "location": { + "latitude": 407586880, + "longitude": -741670168 + }, + "name": "100 Mount Pleasant Avenue, Newark, NJ 07104, USA" +}, { + "location": { + "latitude": 400106455, + "longitude": -742870190 + }, + "name": "517-521 Huntington Drive, Manchester Township, NJ 08759, USA" +}, { + "location": { + "latitude": 400066188, + "longitude": -746793294 + }, + "name": "" +}, { + "location": { + "latitude": 418803880, + "longitude": -744102673 + }, + "name": "40 Mountain Road, Napanoch, NY 12458, USA" +}, { + "location": { + "latitude": 414204288, + "longitude": -747895140 + }, + "name": "" +}, { + "location": { + "latitude": 414777405, + "longitude": -740615601 + }, + "name": "" +}, { + "location": { + "latitude": 415464475, + "longitude": -747175374 + }, + "name": "48 North Road, Forestburgh, NY 12777, USA" +}, { + "location": { + "latitude": 404062378, + "longitude": -746376177 + }, + "name": "" +}, { + "location": { + "latitude": 405688272, + "longitude": -749285130 + }, + "name": "" +}, { + "location": { + "latitude": 400342070, + "longitude": -748788996 + }, + "name": "" +}, { + "location": { + "latitude": 401809022, + "longitude": -744157964 + }, + "name": "" +}, { + "location": { + "latitude": 404226644, + "longitude": -740517141 + }, + "name": "9 Thompson Avenue, Leonardo, NJ 07737, USA" +}, { + "location": { + "latitude": 410322033, + "longitude": -747871659 + }, + "name": "" +}, { + "location": { + "latitude": 407100674, + "longitude": -747742727 + }, + "name": "" +}, { + "location": { + "latitude": 418811433, + "longitude": -741718005 + }, + "name": "213 Bush Road, Stone Ridge, NY 12484, USA" +}, { + "location": { + "latitude": 415034302, + "longitude": -743850945 + }, + "name": "" +}, { + "location": { + "latitude": 411349992, + "longitude": -743694161 + }, + "name": "" +}, { + "location": { + "latitude": 404839914, + "longitude": -744759616 + }, + "name": "1-17 Bergen Court, New Brunswick, NJ 08901, USA" +}, { + "location": { + "latitude": 414638017, + "longitude": -745957854 + }, + "name": "35 Oakland Valley Road, Cuddebackville, NY 12729, USA" +}, { + "location": { + "latitude": 412127800, + "longitude": -740173578 + }, + "name": "" +}, { + "location": { + "latitude": 401263460, + "longitude": -747964303 + }, + "name": "" +}, { + "location": { + "latitude": 412843391, + "longitude": -749086026 + }, + "name": "" +}, { + "location": { + "latitude": 418512773, + "longitude": -743067823 + }, + "name": "" +}, { + "location": { + "latitude": 404318328, + "longitude": -740835638 + }, + "name": "42-102 Main Street, Belford, NJ 07718, USA" +}, { + "location": { + "latitude": 419020746, + "longitude": -741172328 + }, + "name": "" +}, { + "location": { + "latitude": 404080723, + "longitude": -746119569 + }, + "name": "" +}, { + "location": { + "latitude": 401012643, + "longitude": -744035134 + }, + "name": "" +}, { + "location": { + "latitude": 404306372, + "longitude": -741079661 + }, + "name": "" +}, { + "location": { + "latitude": 403966326, + "longitude": -748519297 + }, + "name": "" +}, { + "location": { + "latitude": 405002031, + "longitude": -748407866 + }, + "name": "" +}, { + "location": { + "latitude": 409532885, + "longitude": -742200683 + }, + "name": "" +}, { + "location": { + "latitude": 416851321, + "longitude": -742674555 + }, + "name": "" +}, { + "location": { + "latitude": 406411633, + "longitude": -741722051 + }, + "name": "3387 Richmond Terrace, Staten Island, NY 10303, USA" +}, { + "location": { + "latitude": 413069058, + "longitude": -744597778 + }, + "name": "261 Van Sickle Road, Goshen, NY 10924, USA" +}, { + "location": { + "latitude": 418465462, + "longitude": -746859398 + }, + "name": "" +}, { + "location": { + "latitude": 411733222, + "longitude": -744228360 + }, + "name": "" +}, { + "location": { + "latitude": 410248224, + "longitude": -747127767 + }, + "name": "3 Hasta Way, Newton, NJ 07860, USA" +}] diff --git a/examples/node/static_codegen/route_guide/route_guide_grpc_pb.js b/examples/node/static_codegen/route_guide/route_guide_grpc_pb.js new file mode 100644 index 00000000..7765bf91 --- /dev/null +++ b/examples/node/static_codegen/route_guide/route_guide_grpc_pb.js @@ -0,0 +1,146 @@ +// GENERATED CODE -- DO NOT EDIT! + +// Original file comments: +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +'use strict'; +var grpc = require('grpc'); +var route_guide_pb = require('./route_guide_pb.js'); + +function serialize_Feature(arg) { + if (!(arg instanceof route_guide_pb.Feature)) { + throw new Error('Expected argument of type Feature'); + } + return new Buffer(arg.serializeBinary()); +} + +function deserialize_Feature(buffer_arg) { + return route_guide_pb.Feature.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_Point(arg) { + if (!(arg instanceof route_guide_pb.Point)) { + throw new Error('Expected argument of type Point'); + } + return new Buffer(arg.serializeBinary()); +} + +function deserialize_Point(buffer_arg) { + return route_guide_pb.Point.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_Rectangle(arg) { + if (!(arg instanceof route_guide_pb.Rectangle)) { + throw new Error('Expected argument of type Rectangle'); + } + return new Buffer(arg.serializeBinary()); +} + +function deserialize_Rectangle(buffer_arg) { + return route_guide_pb.Rectangle.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_RouteNote(arg) { + if (!(arg instanceof route_guide_pb.RouteNote)) { + throw new Error('Expected argument of type RouteNote'); + } + return new Buffer(arg.serializeBinary()); +} + +function deserialize_RouteNote(buffer_arg) { + return route_guide_pb.RouteNote.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_RouteSummary(arg) { + if (!(arg instanceof route_guide_pb.RouteSummary)) { + throw new Error('Expected argument of type RouteSummary'); + } + return new Buffer(arg.serializeBinary()); +} + +function deserialize_RouteSummary(buffer_arg) { + return route_guide_pb.RouteSummary.deserializeBinary(new Uint8Array(buffer_arg)); +} + + +// Interface exported by the server. +var RouteGuideService = exports.RouteGuideService = { + // A simple RPC. + // + // Obtains the feature at a given position. + // + // A feature with an empty name is returned if there's no feature at the given + // position. + getFeature: { + path: '/routeguide.RouteGuide/GetFeature', + requestStream: false, + responseStream: false, + requestType: route_guide_pb.Point, + responseType: route_guide_pb.Feature, + requestSerialize: serialize_Point, + requestDeserialize: deserialize_Point, + responseSerialize: serialize_Feature, + responseDeserialize: deserialize_Feature, + }, + // A server-to-client streaming RPC. + // + // Obtains the Features available within the given Rectangle. Results are + // streamed rather than returned at once (e.g. in a response message with a + // repeated field), as the rectangle may cover a large area and contain a + // huge number of features. + listFeatures: { + path: '/routeguide.RouteGuide/ListFeatures', + requestStream: false, + responseStream: true, + requestType: route_guide_pb.Rectangle, + responseType: route_guide_pb.Feature, + requestSerialize: serialize_Rectangle, + requestDeserialize: deserialize_Rectangle, + responseSerialize: serialize_Feature, + responseDeserialize: deserialize_Feature, + }, + // A client-to-server streaming RPC. + // + // Accepts a stream of Points on a route being traversed, returning a + // RouteSummary when traversal is completed. + recordRoute: { + path: '/routeguide.RouteGuide/RecordRoute', + requestStream: true, + responseStream: false, + requestType: route_guide_pb.Point, + responseType: route_guide_pb.RouteSummary, + requestSerialize: serialize_Point, + requestDeserialize: deserialize_Point, + responseSerialize: serialize_RouteSummary, + responseDeserialize: deserialize_RouteSummary, + }, + // A Bidirectional streaming RPC. + // + // Accepts a stream of RouteNotes sent while a route is being traversed, + // while receiving other RouteNotes (e.g. from other users). + routeChat: { + path: '/routeguide.RouteGuide/RouteChat', + requestStream: true, + responseStream: true, + requestType: route_guide_pb.RouteNote, + responseType: route_guide_pb.RouteNote, + requestSerialize: serialize_RouteNote, + requestDeserialize: deserialize_RouteNote, + responseSerialize: serialize_RouteNote, + responseDeserialize: deserialize_RouteNote, + }, +}; + +exports.RouteGuideClient = grpc.makeGenericClientConstructor(RouteGuideService); diff --git a/examples/node/static_codegen/route_guide/route_guide_pb.js b/examples/node/static_codegen/route_guide/route_guide_pb.js new file mode 100644 index 00000000..2e2f9a1d --- /dev/null +++ b/examples/node/static_codegen/route_guide/route_guide_pb.js @@ -0,0 +1,1033 @@ +/** + * @fileoverview + * @enhanceable + * @public + */ +// GENERATED CODE -- DO NOT EDIT! + +var jspb = require('google-protobuf'); +var goog = jspb; +var global = Function('return this')(); + +goog.exportSymbol('proto.routeguide.Feature', null, global); +goog.exportSymbol('proto.routeguide.Point', null, global); +goog.exportSymbol('proto.routeguide.Rectangle', null, global); +goog.exportSymbol('proto.routeguide.RouteNote', null, global); +goog.exportSymbol('proto.routeguide.RouteSummary', null, global); + +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.routeguide.Point = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.routeguide.Point, jspb.Message); +if (goog.DEBUG && !COMPILED) { + proto.routeguide.Point.displayName = 'proto.routeguide.Point'; +} + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto suitable for use in Soy templates. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS. + * @param {boolean=} opt_includeInstance Whether to include the JSPB instance + * for transitional soy proto support: http://goto/soy-param-migration + * @return {!Object} + */ +proto.routeguide.Point.prototype.toObject = function(opt_includeInstance) { + return proto.routeguide.Point.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Whether to include the JSPB + * instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.routeguide.Point} msg The msg instance to transform. + * @return {!Object} + */ +proto.routeguide.Point.toObject = function(includeInstance, msg) { + var f, obj = { + latitude: msg.getLatitude(), + longitude: msg.getLongitude() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.routeguide.Point} + */ +proto.routeguide.Point.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.routeguide.Point; + return proto.routeguide.Point.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.routeguide.Point} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.routeguide.Point} + */ +proto.routeguide.Point.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {number} */ (reader.readInt32()); + msg.setLatitude(value); + break; + case 2: + var value = /** @type {number} */ (reader.readInt32()); + msg.setLongitude(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Class method variant: serializes the given message to binary data + * (in protobuf wire format), writing to the given BinaryWriter. + * @param {!proto.routeguide.Point} message + * @param {!jspb.BinaryWriter} writer + */ +proto.routeguide.Point.serializeBinaryToWriter = function(message, writer) { + message.serializeBinaryToWriter(writer); +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.routeguide.Point.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + this.serializeBinaryToWriter(writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the message to binary data (in protobuf wire format), + * writing to the given BinaryWriter. + * @param {!jspb.BinaryWriter} writer + */ +proto.routeguide.Point.prototype.serializeBinaryToWriter = function (writer) { + var f = undefined; + f = this.getLatitude(); + if (f !== 0) { + writer.writeInt32( + 1, + f + ); + } + f = this.getLongitude(); + if (f !== 0) { + writer.writeInt32( + 2, + f + ); + } +}; + + +/** + * Creates a deep clone of this proto. No data is shared with the original. + * @return {!proto.routeguide.Point} The clone. + */ +proto.routeguide.Point.prototype.cloneMessage = function() { + return /** @type {!proto.routeguide.Point} */ (jspb.Message.cloneMessage(this)); +}; + + +/** + * optional int32 latitude = 1; + * @return {number} + */ +proto.routeguide.Point.prototype.getLatitude = function() { + return /** @type {number} */ (jspb.Message.getFieldProto3(this, 1, 0)); +}; + + +/** @param {number} value */ +proto.routeguide.Point.prototype.setLatitude = function(value) { + jspb.Message.setField(this, 1, value); +}; + + +/** + * optional int32 longitude = 2; + * @return {number} + */ +proto.routeguide.Point.prototype.getLongitude = function() { + return /** @type {number} */ (jspb.Message.getFieldProto3(this, 2, 0)); +}; + + +/** @param {number} value */ +proto.routeguide.Point.prototype.setLongitude = function(value) { + jspb.Message.setField(this, 2, value); +}; + + + +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.routeguide.Rectangle = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.routeguide.Rectangle, jspb.Message); +if (goog.DEBUG && !COMPILED) { + proto.routeguide.Rectangle.displayName = 'proto.routeguide.Rectangle'; +} + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto suitable for use in Soy templates. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS. + * @param {boolean=} opt_includeInstance Whether to include the JSPB instance + * for transitional soy proto support: http://goto/soy-param-migration + * @return {!Object} + */ +proto.routeguide.Rectangle.prototype.toObject = function(opt_includeInstance) { + return proto.routeguide.Rectangle.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Whether to include the JSPB + * instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.routeguide.Rectangle} msg The msg instance to transform. + * @return {!Object} + */ +proto.routeguide.Rectangle.toObject = function(includeInstance, msg) { + var f, obj = { + lo: (f = msg.getLo()) && proto.routeguide.Point.toObject(includeInstance, f), + hi: (f = msg.getHi()) && proto.routeguide.Point.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.routeguide.Rectangle} + */ +proto.routeguide.Rectangle.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.routeguide.Rectangle; + return proto.routeguide.Rectangle.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.routeguide.Rectangle} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.routeguide.Rectangle} + */ +proto.routeguide.Rectangle.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.routeguide.Point; + reader.readMessage(value,proto.routeguide.Point.deserializeBinaryFromReader); + msg.setLo(value); + break; + case 2: + var value = new proto.routeguide.Point; + reader.readMessage(value,proto.routeguide.Point.deserializeBinaryFromReader); + msg.setHi(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Class method variant: serializes the given message to binary data + * (in protobuf wire format), writing to the given BinaryWriter. + * @param {!proto.routeguide.Rectangle} message + * @param {!jspb.BinaryWriter} writer + */ +proto.routeguide.Rectangle.serializeBinaryToWriter = function(message, writer) { + message.serializeBinaryToWriter(writer); +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.routeguide.Rectangle.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + this.serializeBinaryToWriter(writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the message to binary data (in protobuf wire format), + * writing to the given BinaryWriter. + * @param {!jspb.BinaryWriter} writer + */ +proto.routeguide.Rectangle.prototype.serializeBinaryToWriter = function (writer) { + var f = undefined; + f = this.getLo(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.routeguide.Point.serializeBinaryToWriter + ); + } + f = this.getHi(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.routeguide.Point.serializeBinaryToWriter + ); + } +}; + + +/** + * Creates a deep clone of this proto. No data is shared with the original. + * @return {!proto.routeguide.Rectangle} The clone. + */ +proto.routeguide.Rectangle.prototype.cloneMessage = function() { + return /** @type {!proto.routeguide.Rectangle} */ (jspb.Message.cloneMessage(this)); +}; + + +/** + * optional Point lo = 1; + * @return {proto.routeguide.Point} + */ +proto.routeguide.Rectangle.prototype.getLo = function() { + return /** @type{proto.routeguide.Point} */ ( + jspb.Message.getWrapperField(this, proto.routeguide.Point, 1)); +}; + + +/** @param {proto.routeguide.Point|undefined} value */ +proto.routeguide.Rectangle.prototype.setLo = function(value) { + jspb.Message.setWrapperField(this, 1, value); +}; + + +proto.routeguide.Rectangle.prototype.clearLo = function() { + this.setLo(undefined); +}; + + +/** + * optional Point hi = 2; + * @return {proto.routeguide.Point} + */ +proto.routeguide.Rectangle.prototype.getHi = function() { + return /** @type{proto.routeguide.Point} */ ( + jspb.Message.getWrapperField(this, proto.routeguide.Point, 2)); +}; + + +/** @param {proto.routeguide.Point|undefined} value */ +proto.routeguide.Rectangle.prototype.setHi = function(value) { + jspb.Message.setWrapperField(this, 2, value); +}; + + +proto.routeguide.Rectangle.prototype.clearHi = function() { + this.setHi(undefined); +}; + + + +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.routeguide.Feature = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.routeguide.Feature, jspb.Message); +if (goog.DEBUG && !COMPILED) { + proto.routeguide.Feature.displayName = 'proto.routeguide.Feature'; +} + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto suitable for use in Soy templates. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS. + * @param {boolean=} opt_includeInstance Whether to include the JSPB instance + * for transitional soy proto support: http://goto/soy-param-migration + * @return {!Object} + */ +proto.routeguide.Feature.prototype.toObject = function(opt_includeInstance) { + return proto.routeguide.Feature.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Whether to include the JSPB + * instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.routeguide.Feature} msg The msg instance to transform. + * @return {!Object} + */ +proto.routeguide.Feature.toObject = function(includeInstance, msg) { + var f, obj = { + name: msg.getName(), + location: (f = msg.getLocation()) && proto.routeguide.Point.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.routeguide.Feature} + */ +proto.routeguide.Feature.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.routeguide.Feature; + return proto.routeguide.Feature.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.routeguide.Feature} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.routeguide.Feature} + */ +proto.routeguide.Feature.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setName(value); + break; + case 2: + var value = new proto.routeguide.Point; + reader.readMessage(value,proto.routeguide.Point.deserializeBinaryFromReader); + msg.setLocation(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Class method variant: serializes the given message to binary data + * (in protobuf wire format), writing to the given BinaryWriter. + * @param {!proto.routeguide.Feature} message + * @param {!jspb.BinaryWriter} writer + */ +proto.routeguide.Feature.serializeBinaryToWriter = function(message, writer) { + message.serializeBinaryToWriter(writer); +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.routeguide.Feature.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + this.serializeBinaryToWriter(writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the message to binary data (in protobuf wire format), + * writing to the given BinaryWriter. + * @param {!jspb.BinaryWriter} writer + */ +proto.routeguide.Feature.prototype.serializeBinaryToWriter = function (writer) { + var f = undefined; + f = this.getName(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = this.getLocation(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.routeguide.Point.serializeBinaryToWriter + ); + } +}; + + +/** + * Creates a deep clone of this proto. No data is shared with the original. + * @return {!proto.routeguide.Feature} The clone. + */ +proto.routeguide.Feature.prototype.cloneMessage = function() { + return /** @type {!proto.routeguide.Feature} */ (jspb.Message.cloneMessage(this)); +}; + + +/** + * optional string name = 1; + * @return {string} + */ +proto.routeguide.Feature.prototype.getName = function() { + return /** @type {string} */ (jspb.Message.getFieldProto3(this, 1, "")); +}; + + +/** @param {string} value */ +proto.routeguide.Feature.prototype.setName = function(value) { + jspb.Message.setField(this, 1, value); +}; + + +/** + * optional Point location = 2; + * @return {proto.routeguide.Point} + */ +proto.routeguide.Feature.prototype.getLocation = function() { + return /** @type{proto.routeguide.Point} */ ( + jspb.Message.getWrapperField(this, proto.routeguide.Point, 2)); +}; + + +/** @param {proto.routeguide.Point|undefined} value */ +proto.routeguide.Feature.prototype.setLocation = function(value) { + jspb.Message.setWrapperField(this, 2, value); +}; + + +proto.routeguide.Feature.prototype.clearLocation = function() { + this.setLocation(undefined); +}; + + + +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.routeguide.RouteNote = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.routeguide.RouteNote, jspb.Message); +if (goog.DEBUG && !COMPILED) { + proto.routeguide.RouteNote.displayName = 'proto.routeguide.RouteNote'; +} + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto suitable for use in Soy templates. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS. + * @param {boolean=} opt_includeInstance Whether to include the JSPB instance + * for transitional soy proto support: http://goto/soy-param-migration + * @return {!Object} + */ +proto.routeguide.RouteNote.prototype.toObject = function(opt_includeInstance) { + return proto.routeguide.RouteNote.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Whether to include the JSPB + * instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.routeguide.RouteNote} msg The msg instance to transform. + * @return {!Object} + */ +proto.routeguide.RouteNote.toObject = function(includeInstance, msg) { + var f, obj = { + location: (f = msg.getLocation()) && proto.routeguide.Point.toObject(includeInstance, f), + message: msg.getMessage() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.routeguide.RouteNote} + */ +proto.routeguide.RouteNote.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.routeguide.RouteNote; + return proto.routeguide.RouteNote.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.routeguide.RouteNote} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.routeguide.RouteNote} + */ +proto.routeguide.RouteNote.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.routeguide.Point; + reader.readMessage(value,proto.routeguide.Point.deserializeBinaryFromReader); + msg.setLocation(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setMessage(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Class method variant: serializes the given message to binary data + * (in protobuf wire format), writing to the given BinaryWriter. + * @param {!proto.routeguide.RouteNote} message + * @param {!jspb.BinaryWriter} writer + */ +proto.routeguide.RouteNote.serializeBinaryToWriter = function(message, writer) { + message.serializeBinaryToWriter(writer); +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.routeguide.RouteNote.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + this.serializeBinaryToWriter(writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the message to binary data (in protobuf wire format), + * writing to the given BinaryWriter. + * @param {!jspb.BinaryWriter} writer + */ +proto.routeguide.RouteNote.prototype.serializeBinaryToWriter = function (writer) { + var f = undefined; + f = this.getLocation(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.routeguide.Point.serializeBinaryToWriter + ); + } + f = this.getMessage(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } +}; + + +/** + * Creates a deep clone of this proto. No data is shared with the original. + * @return {!proto.routeguide.RouteNote} The clone. + */ +proto.routeguide.RouteNote.prototype.cloneMessage = function() { + return /** @type {!proto.routeguide.RouteNote} */ (jspb.Message.cloneMessage(this)); +}; + + +/** + * optional Point location = 1; + * @return {proto.routeguide.Point} + */ +proto.routeguide.RouteNote.prototype.getLocation = function() { + return /** @type{proto.routeguide.Point} */ ( + jspb.Message.getWrapperField(this, proto.routeguide.Point, 1)); +}; + + +/** @param {proto.routeguide.Point|undefined} value */ +proto.routeguide.RouteNote.prototype.setLocation = function(value) { + jspb.Message.setWrapperField(this, 1, value); +}; + + +proto.routeguide.RouteNote.prototype.clearLocation = function() { + this.setLocation(undefined); +}; + + +/** + * optional string message = 2; + * @return {string} + */ +proto.routeguide.RouteNote.prototype.getMessage = function() { + return /** @type {string} */ (jspb.Message.getFieldProto3(this, 2, "")); +}; + + +/** @param {string} value */ +proto.routeguide.RouteNote.prototype.setMessage = function(value) { + jspb.Message.setField(this, 2, value); +}; + + + +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.routeguide.RouteSummary = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.routeguide.RouteSummary, jspb.Message); +if (goog.DEBUG && !COMPILED) { + proto.routeguide.RouteSummary.displayName = 'proto.routeguide.RouteSummary'; +} + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto suitable for use in Soy templates. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS. + * @param {boolean=} opt_includeInstance Whether to include the JSPB instance + * for transitional soy proto support: http://goto/soy-param-migration + * @return {!Object} + */ +proto.routeguide.RouteSummary.prototype.toObject = function(opt_includeInstance) { + return proto.routeguide.RouteSummary.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Whether to include the JSPB + * instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.routeguide.RouteSummary} msg The msg instance to transform. + * @return {!Object} + */ +proto.routeguide.RouteSummary.toObject = function(includeInstance, msg) { + var f, obj = { + pointCount: msg.getPointCount(), + featureCount: msg.getFeatureCount(), + distance: msg.getDistance(), + elapsedTime: msg.getElapsedTime() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.routeguide.RouteSummary} + */ +proto.routeguide.RouteSummary.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.routeguide.RouteSummary; + return proto.routeguide.RouteSummary.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.routeguide.RouteSummary} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.routeguide.RouteSummary} + */ +proto.routeguide.RouteSummary.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {number} */ (reader.readInt32()); + msg.setPointCount(value); + break; + case 2: + var value = /** @type {number} */ (reader.readInt32()); + msg.setFeatureCount(value); + break; + case 3: + var value = /** @type {number} */ (reader.readInt32()); + msg.setDistance(value); + break; + case 4: + var value = /** @type {number} */ (reader.readInt32()); + msg.setElapsedTime(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Class method variant: serializes the given message to binary data + * (in protobuf wire format), writing to the given BinaryWriter. + * @param {!proto.routeguide.RouteSummary} message + * @param {!jspb.BinaryWriter} writer + */ +proto.routeguide.RouteSummary.serializeBinaryToWriter = function(message, writer) { + message.serializeBinaryToWriter(writer); +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.routeguide.RouteSummary.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + this.serializeBinaryToWriter(writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the message to binary data (in protobuf wire format), + * writing to the given BinaryWriter. + * @param {!jspb.BinaryWriter} writer + */ +proto.routeguide.RouteSummary.prototype.serializeBinaryToWriter = function (writer) { + var f = undefined; + f = this.getPointCount(); + if (f !== 0) { + writer.writeInt32( + 1, + f + ); + } + f = this.getFeatureCount(); + if (f !== 0) { + writer.writeInt32( + 2, + f + ); + } + f = this.getDistance(); + if (f !== 0) { + writer.writeInt32( + 3, + f + ); + } + f = this.getElapsedTime(); + if (f !== 0) { + writer.writeInt32( + 4, + f + ); + } +}; + + +/** + * Creates a deep clone of this proto. No data is shared with the original. + * @return {!proto.routeguide.RouteSummary} The clone. + */ +proto.routeguide.RouteSummary.prototype.cloneMessage = function() { + return /** @type {!proto.routeguide.RouteSummary} */ (jspb.Message.cloneMessage(this)); +}; + + +/** + * optional int32 point_count = 1; + * @return {number} + */ +proto.routeguide.RouteSummary.prototype.getPointCount = function() { + return /** @type {number} */ (jspb.Message.getFieldProto3(this, 1, 0)); +}; + + +/** @param {number} value */ +proto.routeguide.RouteSummary.prototype.setPointCount = function(value) { + jspb.Message.setField(this, 1, value); +}; + + +/** + * optional int32 feature_count = 2; + * @return {number} + */ +proto.routeguide.RouteSummary.prototype.getFeatureCount = function() { + return /** @type {number} */ (jspb.Message.getFieldProto3(this, 2, 0)); +}; + + +/** @param {number} value */ +proto.routeguide.RouteSummary.prototype.setFeatureCount = function(value) { + jspb.Message.setField(this, 2, value); +}; + + +/** + * optional int32 distance = 3; + * @return {number} + */ +proto.routeguide.RouteSummary.prototype.getDistance = function() { + return /** @type {number} */ (jspb.Message.getFieldProto3(this, 3, 0)); +}; + + +/** @param {number} value */ +proto.routeguide.RouteSummary.prototype.setDistance = function(value) { + jspb.Message.setField(this, 3, value); +}; + + +/** + * optional int32 elapsed_time = 4; + * @return {number} + */ +proto.routeguide.RouteSummary.prototype.getElapsedTime = function() { + return /** @type {number} */ (jspb.Message.getFieldProto3(this, 4, 0)); +}; + + +/** @param {number} value */ +proto.routeguide.RouteSummary.prototype.setElapsedTime = function(value) { + jspb.Message.setField(this, 4, value); +}; + + +goog.object.extend(exports, proto.routeguide); diff --git a/examples/node/static_codegen/route_guide/route_guide_server.js b/examples/node/static_codegen/route_guide/route_guide_server.js new file mode 100644 index 00000000..eecac623 --- /dev/null +++ b/examples/node/static_codegen/route_guide/route_guide_server.js @@ -0,0 +1,243 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +var messages = require('./route_guide_pb'); +var services = require('./route_guide_grpc_pb'); + +var fs = require('fs'); +var parseArgs = require('minimist'); +var path = require('path'); +var _ = require('lodash'); +var grpc = require('grpc'); + +var COORD_FACTOR = 1e7; + +/** + * For simplicity, a point is a record type that looks like + * {latitude: number, longitude: number}, and a feature is a record type that + * looks like {name: string, location: point}. feature objects with name==='' + * are points with no feature. + */ + +/** + * List of feature objects at points that have been requested so far. + */ +var feature_list = []; + +/** + * Get a feature object at the given point, or creates one if it does not exist. + * @param {point} point The point to check + * @return {feature} The feature object at the point. Note that an empty name + * indicates no feature + */ +function checkFeature(point) { + var feature; + // Check if there is already a feature object for the given point + for (var i = 0; i < feature_list.length; i++) { + feature = feature_list[i]; + if (feature.getLocation().getLatitude() === point.getLatitude() && + feature.getLocation().getLongitude() === point.getLongitude()) { + return feature; + } + } + var name = ''; + feature = new messages.Feature(); + feature.setName(name); + feature.setLocation(point); + return feature; +} + +/** + * getFeature request handler. Gets a request with a point, and responds with a + * feature object indicating whether there is a feature at that point. + * @param {EventEmitter} call Call object for the handler to process + * @param {function(Error, feature)} callback Response callback + */ +function getFeature(call, callback) { + callback(null, checkFeature(call.request)); +} + +/** + * listFeatures request handler. Gets a request with two points, and responds + * with a stream of all features in the bounding box defined by those points. + * @param {Writable} call Writable stream for responses with an additional + * request property for the request value. + */ +function listFeatures(call) { + var lo = call.request.getLo(); + var hi = call.request.getHi(); + var left = _.min([lo.getLongitude(), hi.getLongitude()]); + var right = _.max([lo.getLongitude(), hi.getLongitude()]); + var top = _.max([lo.getLatitude(), hi.getLatitude()]); + var bottom = _.min([lo.getLatitude(), hi.getLatitude()]); + // For each feature, check if it is in the given bounding box + _.each(feature_list, function(feature) { + if (feature.getName() === '') { + return; + } + if (feature.getLocation().getLongitude() >= left && + feature.getLocation().getLongitude() <= right && + feature.getLocation().getLatitude() >= bottom && + feature.getLocation().getLatitude() <= top) { + call.write(feature); + } + }); + call.end(); +} + +/** + * Calculate the distance between two points using the "haversine" formula. + * The formula is based on http://mathforum.org/library/drmath/view/51879.html. + * @param start The starting point + * @param end The end point + * @return The distance between the points in meters + */ +function getDistance(start, end) { + function toRadians(num) { + return num * Math.PI / 180; + } + var R = 6371000; // earth radius in metres + var lat1 = toRadians(start.getLatitude() / COORD_FACTOR); + var lat2 = toRadians(end.getLatitude() / COORD_FACTOR); + var lon1 = toRadians(start.getLongitude() / COORD_FACTOR); + var lon2 = toRadians(end.getLongitude() / COORD_FACTOR); + + var deltalat = lat2-lat1; + var deltalon = lon2-lon1; + var a = Math.sin(deltalat/2) * Math.sin(deltalat/2) + + Math.cos(lat1) * Math.cos(lat2) * + Math.sin(deltalon/2) * Math.sin(deltalon/2); + var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); + return R * c; +} + +/** + * recordRoute handler. Gets a stream of points, and responds with statistics + * about the "trip": number of points, number of known features visited, total + * distance traveled, and total time spent. + * @param {Readable} call The request point stream. + * @param {function(Error, routeSummary)} callback The callback to pass the + * response to + */ +function recordRoute(call, callback) { + var point_count = 0; + var feature_count = 0; + var distance = 0; + var previous = null; + // Start a timer + var start_time = process.hrtime(); + call.on('data', function(point) { + point_count += 1; + if (checkFeature(point).name !== '') { + feature_count += 1; + } + /* For each point after the first, add the incremental distance from the + * previous point to the total distance value */ + if (previous != null) { + distance += getDistance(previous, point); + } + previous = point; + }); + call.on('end', function() { + var summary = new messages.RouteSummary(); + summary.setPointCount(point_count); + summary.setFeatureCount(feature_count); + // Cast the distance to an integer + summary.setDistance(distance|0); + // End the timer + summary.setElapsedTime(process.hrtime(start_time)[0]); + callback(null, summary); + }); +} + +var route_notes = {}; + +/** + * Turn the point into a dictionary key. + * @param {point} point The point to use + * @return {string} The key for an object + */ +function pointKey(point) { + return point.getLatitude() + ' ' + point.getLongitude(); +} + +/** + * routeChat handler. Receives a stream of message/location pairs, and responds + * with a stream of all previous messages at each of those locations. + * @param {Duplex} call The stream for incoming and outgoing messages + */ +function routeChat(call) { + call.on('data', function(note) { + var key = pointKey(note.getLocation()); + /* For each note sent, respond with all previous notes that correspond to + * the same point */ + if (route_notes.hasOwnProperty(key)) { + _.each(route_notes[key], function(note) { + call.write(note); + }); + } else { + route_notes[key] = []; + } + // Then add the new note to the list + route_notes[key].push(note); + }); + call.on('end', function() { + call.end(); + }); +} + +/** + * Get a new server with the handler functions in this file bound to the methods + * it serves. + * @return {Server} The new server object + */ +function getServer() { + var server = new grpc.Server(); + server.addService(services.RouteGuideService, { + getFeature: getFeature, + listFeatures: listFeatures, + recordRoute: recordRoute, + routeChat: routeChat + }); + return server; +} + +if (require.main === module) { + // If this is run as a script, start a server on an unused port + var routeServer = getServer(); + routeServer.bind('0.0.0.0:50051', grpc.ServerCredentials.createInsecure()); + var argv = parseArgs(process.argv, { + string: 'db_path' + }); + fs.readFile(path.resolve(argv.db_path), function(err, data) { + if (err) throw err; + // Transform the loaded features to Feature objects + feature_list = _.map(JSON.parse(data), function(value) { + var feature = new messages.Feature(); + feature.setName(value.name); + var location = new messages.Point(); + location.setLatitude(value.location.latitude); + location.setLongitude(value.location.longitude); + feature.setLocation(location); + return feature; + }); + routeServer.start(); + }); +} + +exports.getServer = getServer; diff --git a/examples/objective-c/BUILD b/examples/objective-c/BUILD new file mode 100644 index 00000000..e8d2184a --- /dev/null +++ b/examples/objective-c/BUILD @@ -0,0 +1,119 @@ +# Copyright 2019 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +licenses(["notice"]) # 3-clause BSD + +package(default_visibility = ["//visibility:public"]) + +load("@com_github_grpc_grpc//bazel:objc_grpc_library.bzl", "objc_grpc_library") +load("@build_bazel_rules_apple//apple:ios.bzl", "ios_application") +load("@build_bazel_rules_apple//apple:macos.bzl", "macos_application") + +objc_grpc_library( + name = "HelloWorld_grpc_proto", + srcs = ["//examples:protos/helloworld.proto"], + tags = ["manual"], + deps = ["//examples:helloworld_proto"], +) + +# This one works with import "external/com_github_grpc_grpc/examples/protos/Helloworld.pbrpc.h" +objc_grpc_library( + name = "HelloWorld_grpc_proto_external", + srcs = ["//external/com_github_grpc_grpc/examples:protos/helloworld.proto"], + tags = ["manual"], + deps = ["@com_github_grpc_grpc//examples:helloworld_proto"], +) + +objc_library( + name = "HelloWorld-lib", + srcs = glob(["helloworld/**/*.m"]), + hdrs = glob(["helloworld/**/*.h"]), + data = glob([ + "helloworld/HelloWorld/Base.lproj/**", + "helloworld/HelloWorld/Images.xcassets/**", + ]), + includes = ["helloworld/HelloWorld"], + tags = ["manual"], + deps = [":HelloWorld_grpc_proto"], +) + +ios_application( + name = "HelloWorld", + bundle_id = "Google.HelloWorld", + families = [ + "iphone", + "ipad", + ], + infoplists = ["helloworld/HelloWorld/Info.plist"], + minimum_os_version = "8.0", + tags = ["manual"], + deps = [":HelloWorld-lib"], +) + +objc_library( + name = "HelloWorldMacos-lib", + srcs = glob(["helloworld_macos/**/*.m"]), + hdrs = glob(["helloworld_macos/**/*.h"]), + data = glob([ + "helloworld_macos/HelloWorld/Base.lproj/**", + "helloworld_macos/HelloWorld/Images.xcassets/**", + ]), + includes = ["helloworld_macos/HelloWorld"], + tags = ["manual"], + deps = [":HelloWorld_grpc_proto"], +) + +macos_application( + name = "HelloWorldMacos", + bundle_id = "io.grpc.HelloWorld", + entitlements = "helloworld_macos/HelloWorld/Helloworld.entitlements", + infoplists = ["helloworld_macos/HelloWorld/Info.plist"], + minimum_os_version = "10.13", + tags = ["manual"], + deps = [":HelloWorldMacos-lib"], +) + +objc_grpc_library( + name = "RouteGuide", + srcs = ["//examples:protos/route_guide.proto"], + tags = ["manual"], + deps = ["//examples:route_guide_proto"], +) + +objc_library( + name = "RouteGuideClient-lib", + srcs = glob(["route_guide/**/*.m"]), + hdrs = glob(["route_guide/**/*.h"]), + data = glob([ + "route_guide/Misc/Base.lproj/**", + "route_guide/Misc/Images.xcassets/**", + "route_guide/route_guide_db.json", + ]), + includes = ["route_guide/Misc"], + tags = ["manual"], + deps = [":RouteGuide"], +) + +ios_application( + name = "RouteGuideClient", + bundle_id = "gRPC.RouteGuideClient", + families = [ + "iphone", + "ipad", + ], + infoplists = ["route_guide/Misc/Info.plist"], + minimum_os_version = "8.0", + tags = ["manual"], + deps = [":RouteGuideClient-lib"], +) diff --git a/examples/objective-c/auth_sample/AuthSample.xcodeproj/project.pbxproj b/examples/objective-c/auth_sample/AuthSample.xcodeproj/project.pbxproj new file mode 100644 index 00000000..ab7419c9 --- /dev/null +++ b/examples/objective-c/auth_sample/AuthSample.xcodeproj/project.pbxproj @@ -0,0 +1,382 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 63E1E9821B28CB2100EF0978 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 63E1E9811B28CB2100EF0978 /* main.m */; }; + 63E1E9851B28CB2100EF0978 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 63E1E9841B28CB2100EF0978 /* AppDelegate.m */; }; + 63E1E9881B28CB2100EF0978 /* SelectUserViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 63E1E9871B28CB2100EF0978 /* SelectUserViewController.m */; }; + 63E1E98B1B28CB2100EF0978 /* MakeRPCViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 63E1E98A1B28CB2100EF0978 /* MakeRPCViewController.m */; }; + 63E1E98E1B28CB2100EF0978 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 63E1E98C1B28CB2100EF0978 /* Main.storyboard */; }; + 63E1E9901B28CB2100EF0978 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 63E1E98F1B28CB2100EF0978 /* Images.xcassets */; }; + 63F5DE481B28F5C100CDD07E /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 63F5DE471B28F5C100CDD07E /* GoogleService-Info.plist */; }; + 832213142AB24DB816D02635 /* libPods-AuthSample.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F217A6ECA7F5BD1D5FB5071B /* libPods-AuthSample.a */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 63E1E97C1B28CB2100EF0978 /* AuthSample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AuthSample.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 63E1E9801B28CB2100EF0978 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 63E1E9811B28CB2100EF0978 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 63E1E9831B28CB2100EF0978 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 63E1E9841B28CB2100EF0978 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 63E1E9861B28CB2100EF0978 /* SelectUserViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SelectUserViewController.h; sourceTree = ""; }; + 63E1E9871B28CB2100EF0978 /* SelectUserViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SelectUserViewController.m; sourceTree = ""; }; + 63E1E9891B28CB2100EF0978 /* MakeRPCViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MakeRPCViewController.h; sourceTree = ""; }; + 63E1E98A1B28CB2100EF0978 /* MakeRPCViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MakeRPCViewController.m; sourceTree = ""; }; + 63E1E98D1B28CB2100EF0978 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 63E1E98F1B28CB2100EF0978 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + 63F5DE471B28F5C100CDD07E /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; + A387D6CECBCF2EAF2983033A /* Pods-AuthSample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AuthSample.debug.xcconfig"; path = "Pods/Target Support Files/Pods-AuthSample/Pods-AuthSample.debug.xcconfig"; sourceTree = ""; }; + B444176735DA81FBE4B8B80C /* Pods-AuthSample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AuthSample.release.xcconfig"; path = "Pods/Target Support Files/Pods-AuthSample/Pods-AuthSample.release.xcconfig"; sourceTree = ""; }; + F217A6ECA7F5BD1D5FB5071B /* libPods-AuthSample.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-AuthSample.a"; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 63E1E9791B28CB2000EF0978 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 832213142AB24DB816D02635 /* libPods-AuthSample.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 021FA0E0B3F5D3D477DDAC10 /* Pods */ = { + isa = PBXGroup; + children = ( + A387D6CECBCF2EAF2983033A /* Pods-AuthSample.debug.xcconfig */, + B444176735DA81FBE4B8B80C /* Pods-AuthSample.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; + 4F443572636F3D60F26E870D /* Frameworks */ = { + isa = PBXGroup; + children = ( + F217A6ECA7F5BD1D5FB5071B /* libPods-AuthSample.a */, + ); + name = Frameworks; + sourceTree = ""; + }; + 63E1E9731B28CB2000EF0978 = { + isa = PBXGroup; + children = ( + 63E1E97E1B28CB2100EF0978 /* AuthSample */, + 63E1E97D1B28CB2100EF0978 /* Products */, + 021FA0E0B3F5D3D477DDAC10 /* Pods */, + 4F443572636F3D60F26E870D /* Frameworks */, + ); + sourceTree = ""; + }; + 63E1E97D1B28CB2100EF0978 /* Products */ = { + isa = PBXGroup; + children = ( + 63E1E97C1B28CB2100EF0978 /* AuthSample.app */, + ); + name = Products; + sourceTree = ""; + }; + 63E1E97E1B28CB2100EF0978 /* AuthSample */ = { + isa = PBXGroup; + children = ( + 63E1E9861B28CB2100EF0978 /* SelectUserViewController.h */, + 63E1E9871B28CB2100EF0978 /* SelectUserViewController.m */, + 63E1E9891B28CB2100EF0978 /* MakeRPCViewController.h */, + 63E1E98A1B28CB2100EF0978 /* MakeRPCViewController.m */, + 63E1E97F1B28CB2100EF0978 /* Supporting Files */, + ); + name = AuthSample; + sourceTree = SOURCE_ROOT; + }; + 63E1E97F1B28CB2100EF0978 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 63E1E98C1B28CB2100EF0978 /* Main.storyboard */, + 63F5DE471B28F5C100CDD07E /* GoogleService-Info.plist */, + 63E1E98F1B28CB2100EF0978 /* Images.xcassets */, + 63E1E9801B28CB2100EF0978 /* Info.plist */, + 63E1E9831B28CB2100EF0978 /* AppDelegate.h */, + 63E1E9841B28CB2100EF0978 /* AppDelegate.m */, + 63E1E9811B28CB2100EF0978 /* main.m */, + ); + name = "Supporting Files"; + path = Misc; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 63E1E97B1B28CB2000EF0978 /* AuthSample */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63E1E9A21B28CB2100EF0978 /* Build configuration list for PBXNativeTarget "AuthSample" */; + buildPhases = ( + DAABBA7B5788A39108D7CA83 /* [CP] Check Pods Manifest.lock */, + 63E1E9781B28CB2000EF0978 /* Sources */, + 63E1E9791B28CB2000EF0978 /* Frameworks */, + 63E1E97A1B28CB2000EF0978 /* Resources */, + AEFCCC69DD59CE8F6EB769D7 /* [CP] Copy Pods Resources */, + D24F6598302C412D4B863D6F /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = AuthSample; + productName = AuthSample; + productReference = 63E1E97C1B28CB2100EF0978 /* AuthSample.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 63E1E9741B28CB2000EF0978 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0630; + ORGANIZATIONNAME = gRPC; + TargetAttributes = { + 63E1E97B1B28CB2000EF0978 = { + CreatedOnToolsVersion = 6.3.1; + }; + }; + }; + buildConfigurationList = 63E1E9771B28CB2000EF0978 /* Build configuration list for PBXProject "AuthSample" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 63E1E9731B28CB2000EF0978; + productRefGroup = 63E1E97D1B28CB2100EF0978 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 63E1E97B1B28CB2000EF0978 /* AuthSample */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 63E1E97A1B28CB2000EF0978 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 63E1E98E1B28CB2100EF0978 /* Main.storyboard in Resources */, + 63E1E9901B28CB2100EF0978 /* Images.xcassets in Resources */, + 63F5DE481B28F5C100CDD07E /* GoogleService-Info.plist in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + AEFCCC69DD59CE8F6EB769D7 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-AuthSample/Pods-AuthSample-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + D24F6598302C412D4B863D6F /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-AuthSample/Pods-AuthSample-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + DAABBA7B5788A39108D7CA83 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 63E1E9781B28CB2000EF0978 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 63E1E98B1B28CB2100EF0978 /* MakeRPCViewController.m in Sources */, + 63E1E9851B28CB2100EF0978 /* AppDelegate.m in Sources */, + 63E1E9881B28CB2100EF0978 /* SelectUserViewController.m in Sources */, + 63E1E9821B28CB2100EF0978 /* main.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 63E1E98C1B28CB2100EF0978 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 63E1E98D1B28CB2100EF0978 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 63E1E9A01B28CB2100EF0978 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.3; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 63E1E9A11B28CB2100EF0978 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.3; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 63E1E9A31B28CB2100EF0978 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = A387D6CECBCF2EAF2983033A /* Pods-AuthSample.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = Misc/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 63E1E9A41B28CB2100EF0978 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B444176735DA81FBE4B8B80C /* Pods-AuthSample.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = Misc/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 63E1E9771B28CB2000EF0978 /* Build configuration list for PBXProject "AuthSample" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63E1E9A01B28CB2100EF0978 /* Debug */, + 63E1E9A11B28CB2100EF0978 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63E1E9A21B28CB2100EF0978 /* Build configuration list for PBXNativeTarget "AuthSample" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63E1E9A31B28CB2100EF0978 /* Debug */, + 63E1E9A41B28CB2100EF0978 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 63E1E9741B28CB2000EF0978 /* Project object */; +} diff --git a/examples/objective-c/auth_sample/AuthSample.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples/objective-c/auth_sample/AuthSample.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..39b57a4b --- /dev/null +++ b/examples/objective-c/auth_sample/AuthSample.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/examples/objective-c/auth_sample/AuthSample.xcodeproj/xcshareddata/xcschemes/AuthSample.xcscheme b/examples/objective-c/auth_sample/AuthSample.xcodeproj/xcshareddata/xcschemes/AuthSample.xcscheme new file mode 100644 index 00000000..0a210712 --- /dev/null +++ b/examples/objective-c/auth_sample/AuthSample.xcodeproj/xcshareddata/xcschemes/AuthSample.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/objective-c/auth_sample/AuthTestService.podspec b/examples/objective-c/auth_sample/AuthTestService.podspec new file mode 100644 index 00000000..d603c2e4 --- /dev/null +++ b/examples/objective-c/auth_sample/AuthTestService.podspec @@ -0,0 +1,66 @@ +Pod::Spec.new do |s| + s.name = "AuthTestService" + s.version = "0.0.1" + s.license = "Apache License, Version 2.0" + s.authors = { 'gRPC contributors' => 'grpc-io@googlegroups.com' } + s.homepage = "https://grpc.io/" + s.summary = "AuthTestService example" + s.source = { :git => 'https://github.com/grpc/grpc.git' } + + s.ios.deployment_target = "7.1" + s.osx.deployment_target = "10.9" + + # Base directory where the .proto files are. + src = "../../protos" + + # Run protoc with the Objective-C and gRPC plugins to generate protocol messages and gRPC clients. + s.dependency "!ProtoCompiler-gRPCPlugin", "~> 1.0" + + # Pods directory corresponding to this app's Podfile, relative to the location of this podspec. + pods_root = 'Pods' + + # Path where Cocoapods downloads protoc and the gRPC plugin. + protoc_dir = "#{pods_root}/!ProtoCompiler" + protoc = "#{protoc_dir}/protoc" + plugin = "#{pods_root}/!ProtoCompiler-gRPCPlugin/grpc_objective_c_plugin" + + # Directory where the generated files will be placed. + dir = "#{pods_root}/#{s.name}" + + s.prepare_command = <<-CMD + mkdir -p #{dir} + #{protoc} \ + --plugin=protoc-gen-grpc=#{plugin} \ + --objc_out=#{dir} \ + --grpc_out=#{dir} \ + -I #{src} \ + -I #{protoc_dir} \ + #{src}/auth_sample.proto + CMD + + # Files generated by protoc + s.subspec "Messages" do |ms| + ms.source_files = "#{dir}/*.pbobjc.{h,m}", "#{dir}/**/*.pbobjc.{h,m}" + ms.header_mappings_dir = dir + ms.requires_arc = false + # The generated files depend on the protobuf runtime. + ms.dependency "Protobuf" + end + + # Files generated by the gRPC plugin + s.subspec "Services" do |ss| + ss.source_files = "#{dir}/*.pbrpc.{h,m}", "#{dir}/**/*.pbrpc.{h,m}" + ss.header_mappings_dir = dir + ss.requires_arc = true + # The generated files depend on the gRPC runtime, and on the files generated by protoc. + ss.dependency "gRPC-ProtoRPC" + ss.dependency "#{s.name}/Messages" + end + + s.pod_target_xcconfig = { + # This is needed by all pods that depend on Protobuf: + 'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited) GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1', + # This is needed by all pods that depend on gRPC-RxLibrary: + 'CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES' => 'YES', + } +end diff --git a/examples/objective-c/auth_sample/MakeRPCViewController.h b/examples/objective-c/auth_sample/MakeRPCViewController.h new file mode 100644 index 00000000..4a058116 --- /dev/null +++ b/examples/objective-c/auth_sample/MakeRPCViewController.h @@ -0,0 +1,25 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#import + +extern NSString * const kTestScope; + +@interface MakeRPCViewController : UIViewController +@property(weak, nonatomic) IBOutlet UILabel *mainLabel; +@end diff --git a/examples/objective-c/auth_sample/MakeRPCViewController.m b/examples/objective-c/auth_sample/MakeRPCViewController.m new file mode 100644 index 00000000..648bbab7 --- /dev/null +++ b/examples/objective-c/auth_sample/MakeRPCViewController.m @@ -0,0 +1,94 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#import "MakeRPCViewController.h" + +#import +#import +#import + +NSString * const kTestScope = @"https://www.googleapis.com/auth/xapi.zoo"; + +static NSString * const kTestHostAddress = @"grpc-test.sandbox.googleapis.com"; + +// Category for RPC errors to create the descriptions as we want them to appear on our view. +@interface NSError (AuthSample) +- (NSString *)UIDescription; +@end + +@implementation NSError (AuthSample) +- (NSString *)UIDescription { + if (self.code == GRPCErrorCodeUnauthenticated) { + // Authentication error. OAuth2 specifies we'll receive a challenge header. + // |userInfo[kGRPCHeadersKey]| is the dictionary of response headers. + NSString *challengeHeader = self.userInfo[kGRPCHeadersKey][@"www-authenticate"] ?: @""; + return [@"Invalid credentials. Server challenge:\n" stringByAppendingString:challengeHeader]; + } else { + // Any other error. + return [NSString stringWithFormat:@"Unexpected RPC error %li: %@", + (long)self.code, self.localizedDescription]; + } +} +@end + +@interface MakeRPCViewController () + +@end + +@implementation MakeRPCViewController + +- (dispatch_queue_t)dispatchQueue { + return dispatch_get_main_queue(); +} + +- (void)viewWillAppear:(BOOL)animated { + + // Create a service client and a proto request as usual. + AUTHTestService *client = [[AUTHTestService alloc] initWithHost:kTestHostAddress]; + + AUTHRequest *request = [AUTHRequest message]; + request.fillUsername = YES; + request.fillOauthScope = YES; + + // Set the request header with call options + GRPCMutableCallOptions *options = [[GRPCMutableCallOptions alloc] init]; + options.oauth2AccessToken = GIDSignIn.sharedInstance.currentUser.authentication.accessToken; + GRPCUnaryProtoCall *call = [client unaryCallWithMessage:request + responseHandler:self + callOptions:options]; + [call start]; + + self.mainLabel.text = @"Waiting for RPC to complete..."; +} + +- (void)didReceiveProtoMessage:(GPBMessage *)message { + AUTHResponse *response = (AUTHResponse *)message; + if (response) { + // This test server responds with the email and scope of the access token it receives. + self.mainLabel.text = [NSString stringWithFormat:@"Used scope: %@ on behalf of user %@", + response.oauthScope, response.username]; + } +} + +- (void)didCloseWithTrailingMetadata:(NSDictionary *)trailingMetadata error:(NSError *)error { + if (error) { + self.mainLabel.text = error.UIDescription; + } +} + +@end diff --git a/examples/objective-c/auth_sample/Misc/AppDelegate.h b/examples/objective-c/auth_sample/Misc/AppDelegate.h new file mode 100644 index 00000000..c345a544 --- /dev/null +++ b/examples/objective-c/auth_sample/Misc/AppDelegate.h @@ -0,0 +1,23 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#import + +@interface AppDelegate : UIResponder +@property (strong, nonatomic) UIWindow *window; +@end diff --git a/examples/objective-c/auth_sample/Misc/AppDelegate.m b/examples/objective-c/auth_sample/Misc/AppDelegate.m new file mode 100644 index 00000000..27880fd7 --- /dev/null +++ b/examples/objective-c/auth_sample/Misc/AppDelegate.m @@ -0,0 +1,46 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#import "AppDelegate.h" + +#import + +@implementation AppDelegate + +// As instructed in https://developers.google.com/identity/sign-in/ios/sign-in +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + NSError* configureError; + [GGLContext.sharedInstance configureWithError: &configureError]; + NSAssert(!configureError, @"Error configuring Google services: %@", configureError); + + return YES; +} + +// As instructed in https://developers.google.com/identity/sign-in/ios/sign-in +- (BOOL)application:(UIApplication *)application + openURL:(NSURL *)url + sourceApplication:(NSString *)sourceApplication + annotation:(id)annotation { + // This will properly handle the URL that the application receives at the end of the + // authentication process. + return [GIDSignIn.sharedInstance handleURL:url + sourceApplication:sourceApplication + annotation:annotation]; +} + +@end diff --git a/examples/objective-c/auth_sample/Misc/Base.lproj/Main.storyboard b/examples/objective-c/auth_sample/Misc/Base.lproj/Main.storyboard new file mode 100644 index 00000000..fb29c124 --- /dev/null +++ b/examples/objective-c/auth_sample/Misc/Base.lproj/Main.storyboard @@ -0,0 +1,154 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/objective-c/auth_sample/Misc/GoogleService-Info.plist b/examples/objective-c/auth_sample/Misc/GoogleService-Info.plist new file mode 100644 index 00000000..ff225074 --- /dev/null +++ b/examples/objective-c/auth_sample/Misc/GoogleService-Info.plist @@ -0,0 +1,40 @@ + + + + + AD_UNIT_ID_FOR_BANNER_TEST + redacted + AD_UNIT_ID_FOR_INTERSTITIAL_TEST + redacted + CLIENT_ID + 15087385131-lh9bpkiai9nls53uadju0if6k7un3uih.apps.googleusercontent.com + REVERSED_CLIENT_ID + com.googleusercontent.apps.15087385131-lh9bpkiai9nls53uadju0if6k7un3uih + API_KEY + redacted + GCM_SENDER_ID + redacted + PLIST_VERSION + 1 + BUNDLE_ID + io.grpc.AuthSample + PROJECT_ID + grpc-authsample + STORAGE_BUCKET + grpc-authsample.appspot.com + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:15087385131:ios:d547168abe3c362f + DATABASE_URL + https://grpc-authsample.firebaseio.com + + diff --git a/examples/objective-c/auth_sample/Misc/Images.xcassets/AppIcon.appiconset/Contents.json b/examples/objective-c/auth_sample/Misc/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..36d2c80d --- /dev/null +++ b/examples/objective-c/auth_sample/Misc/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/objective-c/auth_sample/Misc/Images.xcassets/first.imageset/Contents.json b/examples/objective-c/auth_sample/Misc/Images.xcassets/first.imageset/Contents.json new file mode 100644 index 00000000..33a74510 --- /dev/null +++ b/examples/objective-c/auth_sample/Misc/Images.xcassets/first.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "first.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/objective-c/auth_sample/Misc/Images.xcassets/first.imageset/first.pdf b/examples/objective-c/auth_sample/Misc/Images.xcassets/first.imageset/first.pdf new file mode 100644 index 0000000000000000000000000000000000000000..47d911dea647d55983671ead4d08b6f6b3600715 GIT binary patch literal 2465 zcmai03se(l7FLvisY+L#f-EBsK`11Xkc1=%MIujmB|xQ!>5vQ%APFP`Mlf5nSPOKE z2-^C>7DZkM!J;Da5{kfrC?Kvp3J41-3shFXvhuJqKo*oer*r0H{{P-P_x0cTzLzjD!bE z0qT;#Q7l4Gy%fMoXJaKT`@{5#R(MOqJPwQifv8iK6A%Ot9L14h2`38T!2s4PM=1!< zmL06}VYAA|ay#jZRs>HpA%X+eQW4rufWU%d1w5GTy!X#LeZsF_+~ccZmn3Fi)v^Z; zIG;?uU*yLLEYs61tjD>gXOFvSWsh{48xJvPNqKrIJtMdCz2cA2aC7TF?b@K`V!Lw- zE;zpH&ApqhoRjAHt}gK}>(qAc8dvrkD31*`<5<%C(&4_LqhQ3-GOf8~n^leG?+-@@^pjPa$J2gW@O)!b9hdTJ zTauyIJ&~rqeEZC1p9dWgx7{_WRc2=drMO=wcT7B{Zd58z`d)r_36r4V<6PGkCjpGfbnVMtm@;b}F!T?)Qav$_y7H5T;Mf!T}M zWxP9TNqrV?e5;b|pWd3^u2KAatk&3aDB@0 zZBaQNdCZ2#fblzYZnRCCjQ-GQWb-s8bX&<)?SxnUGdDYVFVk`xIf7@g3~$DX`H71_;r5OSZz1p`$_8y_9 z{;MJJ+n=>7Ewg;GnGHoz)&ID0z@F2!e$F7cWQ?d6s(!VY)_Gw})xCyMvsD={5i&H* zAIr_ACo8;Se6<*!-mm9Am79Iz^RVlc?%S5sg|E*SyIV{dd9{Mpf#d3cih5WKt=%ps zBEo)bt8EjmeCFYJRYU|b7d`p+-V|X2wOCYtyLP6t=!WH-kgdf0A};ytPfZiCwVPx{ z`g;zpe{8a4RQxQUwVU02<4X3w|9h;}XjhGWquqn{vVqq8g{*}BQF9=ybe_TM*!M=rFs1pN)yzctIXAoicsCe6>fit>wgZ#vp^hZOY0`J`rx zwdSK?GwR_xm9;5XjH|vf{O+Yg-)z;s*xt>;-vU`D-_SK<=~4eEVQkV~57{vyH6ebu>DqwE~Mx_A31Lg~$ zy`i52ew?GEluE%AN>ju*5z~dx2QQLP-G+E>o|En2+s&<^4*d zWD+<8PXs_Jp7_5Dpi(Gg3J?M;%Rn0{dcxQRh!ip+iHJ_e`!bM1MGxwI8Iedr+x>wI zq@&04fsADHfBccq^gpm8Q_u-~Uj|Z$YwSR(^_mzUb!}Xb2Cj`uqphg}v_Y%?Fs=;= zWq3s{hy)Tu!ji@RJsd$C+G{F6V2j1*Xk+7xo|LO7M2yb)(wc=%x-AclP9pLsbTF7m tf?*P!2EjJu5MD57P32Q4pdJ3tO_shCDT2=K;$ebx8ymcd$v!V9{2$sQiO>K5 literal 0 HcmV?d00001 diff --git a/examples/objective-c/auth_sample/Misc/Images.xcassets/second.imageset/Contents.json b/examples/objective-c/auth_sample/Misc/Images.xcassets/second.imageset/Contents.json new file mode 100644 index 00000000..03bd9c92 --- /dev/null +++ b/examples/objective-c/auth_sample/Misc/Images.xcassets/second.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "second.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/objective-c/auth_sample/Misc/Images.xcassets/second.imageset/second.pdf b/examples/objective-c/auth_sample/Misc/Images.xcassets/second.imageset/second.pdf new file mode 100644 index 0000000000000000000000000000000000000000..401614e288b4b160471c2776bed6f09762af3e1c GIT binary patch literal 2423 zcmai02~-nz8dqq7rWU#)x2z)&iMWtV?gK$2a)?|BP!TbkV}J-Gl1wmy+3G9S0=uOY zwCjai6uBOPMMdNiN`VDYKwLQr2#W^`R93*Ua=0^)EGYY4=grIf|KIohziYnv{elnR zdN_hk6db<(+3RPcxs!iut8c(j0TLh=9mY931H^rhEE0|aXo!dh5Iv+ZFr+}9F+v#P zLSnfD0$f~hN>~92V{z)WJA&2)5rW!|I?;o?oI*%zejJiuY>hFLQwKlAa9O+PnPh#% zJp~JAfs-De6u@;{cREMs}D-sGib_4>50m8_|Uj-zC0m@Qx zJV+^5Da4Qxpf3sBtKZs<_aI$Cb1T+h<->yL^rfiGNelYkqgC3#SqVP_iy*_RPcbjH)xYf zvYdC-)D_t8c{=5%;$VJQxs_#61J*kuXMC?|&PbPo-7uSxoNr~&J94|gKk+03JGXXM zx4w~=^VUzWqQveu_ilRgPdgNNdnLZCH`=;w91}cP5ihdm*B_jI+rk=Pz2Lk!)XUu| zkls3P5&YHJ!t0kF+MUVBHOAx)a zy|JxHNd37z*~b5#%*0w_F|#4?erNP;pG`Fevoq2%?9Y>%Cmzv1(ks;aPIGaiy1mhU zr{7lB^Mem&`QK{b{uiDC zLD8muY(FNk{YdV|zO#o_VB%);8|~Bh(Z4p?GM}g-HN2;q7~YNl-lD~HZ$taYw$Fzbn6c?c5eo=@`i>()el#qwB)hI-gp0 ztsw@dh-I5NJkk)RCoBC`L8ffKfY)=oG=#4LA9TO6eA}9~@a6dupB+=S{%s&NY}^0GY`hAqod)uxXHitrN%bWOJohV>t?!&Z#d4y^7J@=Oh`HV zee**4j>xRUd)|D0^I-B#<`m1-5PO{)!v(q?ecFYqr_8Q{+z7#n0uFbq%_?hZ-Ck(6NRn=vDS7Nb1Xxx_)9`!i- zGR>av*PJ+P_AGO*a_$FbtCCISg5PK44p&W#t$)+HVcxpR9LAL%_Pv$p`0tO*sYZD0 zCG3-ipr4WoVbjpw%Nf^r^rnWcDcjumgBPEjO;NM6QtZ8wU#0rjHx5zs%CahF4$W*U zxu!q8kYP+>v!BNPVIRJUGIWU@7qVvx2VZDw4gV8%z%bjpF#aF(W|PmliwlakuRq>= zhaCRc^R!7T)#Twb0{!Tns=CxGcGX|leErg`f3|v0eBXxHU&6Sj-_>zOL!!d+j5Xt* zPS;rWd^zEF{5d5%)nNK=)zFJ8Uc=aQKD%UK)_TNes1Gh{SD*Mb_@O` z7*zs9Uq~Vq?v|^8FcM-yLGMKzR3YFB0z@CFM2X-dio%Gu6&MJj=I?uS7sA3AdE^p8 zE49$PjJzPIJwfn;jso7X2#jynr3dO@p5QAK1O9wqKLC=PkQjj~p#n|-5O`ihbTzzu zL{}2QEe28pJYfVZRW56FL`LvO&|C^1Th{0}hQMW$Ng$QPpnzlwnMnf=kVy8(y==L% zLMa>r0gELdT + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + io.grpc.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLName + REVERSED_CLIENT_ID + CFBundleURLSchemes + + com.googleusercontent.apps.15087385131-lh9bpkiai9nls53uadju0if6k7un3uih + + + + CFBundleTypeRole + Editor + CFBundleURLName + BUNDLE_ID + CFBundleURLSchemes + + io.grpc.AuthSample + + + + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + Main + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UIStatusBarTintParameters + + UINavigationBar + + Style + UIBarStyleDefault + Translucent + + + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/examples/objective-c/auth_sample/Misc/main.m b/examples/objective-c/auth_sample/Misc/main.m new file mode 100644 index 00000000..aa89f7b1 --- /dev/null +++ b/examples/objective-c/auth_sample/Misc/main.m @@ -0,0 +1,26 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#import +#import "AppDelegate.h" + +int main(int argc, char * argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/examples/objective-c/auth_sample/Podfile b/examples/objective-c/auth_sample/Podfile new file mode 100644 index 00000000..a25d20f4 --- /dev/null +++ b/examples/objective-c/auth_sample/Podfile @@ -0,0 +1,12 @@ +source 'https://github.com/CocoaPods/Specs.git' +platform :ios, '8.0' + +install! 'cocoapods', :deterministic_uuids => false + +target 'AuthSample' do + # Depend on the generated AuthTestService library. + pod 'AuthTestService', :path => '.' + + # Depend on Google's OAuth2 library + pod 'Google/SignIn' +end diff --git a/examples/objective-c/auth_sample/README.md b/examples/objective-c/auth_sample/README.md new file mode 100644 index 00000000..a0063de3 --- /dev/null +++ b/examples/objective-c/auth_sample/README.md @@ -0,0 +1,3 @@ +# OAuth2 on gRPC: Objective-C + +This is the supporting code for the tutorial "[OAuth2 on gRPC: Objective-C](https://grpc.io/docs/tutorials/auth/oauth2-objective-c.html)." diff --git a/examples/objective-c/auth_sample/SelectUserViewController.h b/examples/objective-c/auth_sample/SelectUserViewController.h new file mode 100644 index 00000000..e1ad3f93 --- /dev/null +++ b/examples/objective-c/auth_sample/SelectUserViewController.h @@ -0,0 +1,27 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#import +#import + +@interface SelectUserViewController : UIViewController +@property(weak, nonatomic) IBOutlet GIDSignInButton *signInButton; +@property(weak, nonatomic) IBOutlet UIButton *signOutButton; +@property(weak, nonatomic) IBOutlet UILabel *mainLabel; +@property(weak, nonatomic) IBOutlet UILabel *subLabel; +@end diff --git a/examples/objective-c/auth_sample/SelectUserViewController.m b/examples/objective-c/auth_sample/SelectUserViewController.m new file mode 100644 index 00000000..26d8cce9 --- /dev/null +++ b/examples/objective-c/auth_sample/SelectUserViewController.m @@ -0,0 +1,71 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#import "SelectUserViewController.h" + +#import "MakeRPCViewController.h" + +@implementation SelectUserViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + + self.signOutButton.layer.cornerRadius = 5; + self.signOutButton.hidden = YES; + + // As instructed in https://developers.google.com/identity/sign-in/ios/sign-in + GIDSignIn *signIn = GIDSignIn.sharedInstance; + signIn.delegate = self; + signIn.uiDelegate = self; + + // As instructed in https://developers.google.com/identity/sign-in/ios/additional-scopes + if (![signIn.scopes containsObject:kTestScope]) { + signIn.scopes = [signIn.scopes arrayByAddingObject:kTestScope]; + } + + [signIn signInSilently]; +} + +- (void)signIn:(GIDSignIn *)signIn +didSignInForUser:(GIDGoogleUser *)user + withError:(NSError *)error { + if (error) { + // The user probably cancelled the sign-in flow. + return; + } + + self.mainLabel.text = [NSString stringWithFormat:@"User: %@", user.profile.email]; + NSString *scopes = [user.accessibleScopes componentsJoinedByString:@", "]; + scopes = scopes.length ? scopes : @"(none)"; + self.subLabel.text = [NSString stringWithFormat:@"Scopes: %@", scopes]; + + self.signInButton.hidden = YES; + self.signOutButton.hidden = NO; +} + +- (IBAction)didTapSignOut { + [GIDSignIn.sharedInstance signOut]; + + self.mainLabel.text = @"Please sign in."; + self.subLabel.text = @""; + + self.signInButton.hidden = NO; + self.signOutButton.hidden = YES; +} + +@end diff --git a/examples/objective-c/helloworld/HelloWorld.podspec b/examples/objective-c/helloworld/HelloWorld.podspec new file mode 100644 index 00000000..fc671ef4 --- /dev/null +++ b/examples/objective-c/helloworld/HelloWorld.podspec @@ -0,0 +1,66 @@ +Pod::Spec.new do |s| + s.name = "HelloWorld" + s.version = "0.0.1" + s.license = "Apache License, Version 2.0" + s.authors = { 'gRPC contributors' => 'grpc-io@googlegroups.com' } + s.homepage = "https://grpc.io/" + s.summary = "HelloWorld example" + s.source = { :git => 'https://github.com/grpc/grpc.git' } + + s.ios.deployment_target = "7.1" + s.osx.deployment_target = "10.9" + + # Base directory where the .proto files are. + src = "../../protos" + + # Run protoc with the Objective-C and gRPC plugins to generate protocol messages and gRPC clients. + s.dependency "!ProtoCompiler-gRPCPlugin", "~> 1.0" + + # Pods directory corresponding to this app's Podfile, relative to the location of this podspec. + pods_root = 'Pods' + + # Path where Cocoapods downloads protoc and the gRPC plugin. + protoc_dir = "#{pods_root}/!ProtoCompiler" + protoc = "#{protoc_dir}/protoc" + plugin = "#{pods_root}/!ProtoCompiler-gRPCPlugin/grpc_objective_c_plugin" + + # Directory where the generated files will be placed. + dir = "#{pods_root}/#{s.name}" + + s.prepare_command = <<-CMD + mkdir -p #{dir} + #{protoc} \ + --plugin=protoc-gen-grpc=#{plugin} \ + --objc_out=#{dir} \ + --grpc_out=#{dir} \ + -I #{src} \ + -I #{protoc_dir} \ + #{src}/helloworld.proto + CMD + + # Files generated by protoc + s.subspec "Messages" do |ms| + ms.source_files = "#{dir}/*.pbobjc.{h,m}", "#{dir}/**/*.pbobjc.{h,m}" + ms.header_mappings_dir = dir + ms.requires_arc = false + # The generated files depend on the protobuf runtime. + ms.dependency "Protobuf" + end + + # Files generated by the gRPC plugin + s.subspec "Services" do |ss| + ss.source_files = "#{dir}/*.pbrpc.{h,m}", "#{dir}/**/*.pbrpc.{h,m}" + ss.header_mappings_dir = dir + ss.requires_arc = true + # The generated files depend on the gRPC runtime, and on the files generated by protoc. + ss.dependency "gRPC-ProtoRPC" + ss.dependency "#{s.name}/Messages" + end + + s.pod_target_xcconfig = { + # This is needed by all pods that depend on Protobuf: + 'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited) GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1', + # This is needed by all pods that depend on gRPC-RxLibrary: + 'CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES' => 'YES', + } +end diff --git a/examples/objective-c/helloworld/HelloWorld.xcodeproj/project.pbxproj b/examples/objective-c/helloworld/HelloWorld.xcodeproj/project.pbxproj new file mode 100644 index 00000000..e067e82b --- /dev/null +++ b/examples/objective-c/helloworld/HelloWorld.xcodeproj/project.pbxproj @@ -0,0 +1,373 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 5E3690661B2A23800040F884 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 5E3690651B2A23800040F884 /* main.m */; }; + 5E3690691B2A23800040F884 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 5E3690681B2A23800040F884 /* AppDelegate.m */; }; + 5E36906C1B2A23800040F884 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5E36906B1B2A23800040F884 /* ViewController.m */; }; + 5E36906F1B2A23800040F884 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5E36906D1B2A23800040F884 /* Main.storyboard */; }; + 5E3690711B2A23800040F884 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5E3690701B2A23800040F884 /* Images.xcassets */; }; + EF61CF6AE2536A31D47F0E63 /* libPods-HelloWorld.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6B4E1F55F8A2EC95A0E7EE88 /* libPods-HelloWorld.a */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 0C432EF610DB15C0F47A66BB /* Pods-HelloWorld.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HelloWorld.release.xcconfig"; path = "Pods/Target Support Files/Pods-HelloWorld/Pods-HelloWorld.release.xcconfig"; sourceTree = ""; }; + 5E3690601B2A23800040F884 /* HelloWorld.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = HelloWorld.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 5E3690641B2A23800040F884 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 5E3690651B2A23800040F884 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 5E3690671B2A23800040F884 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 5E3690681B2A23800040F884 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 5E36906B1B2A23800040F884 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; + 5E36906E1B2A23800040F884 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 5E3690701B2A23800040F884 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + 6B4E1F55F8A2EC95A0E7EE88 /* libPods-HelloWorld.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-HelloWorld.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + DBDE3E48389499064CD664B8 /* Pods-HelloWorld.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HelloWorld.debug.xcconfig"; path = "Pods/Target Support Files/Pods-HelloWorld/Pods-HelloWorld.debug.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 5E36905D1B2A23800040F884 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + EF61CF6AE2536A31D47F0E63 /* libPods-HelloWorld.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 5E3690571B2A23800040F884 = { + isa = PBXGroup; + children = ( + 5E3690651B2A23800040F884 /* main.m */, + 5E3690621B2A23800040F884 /* HelloWorld */, + 5E3690611B2A23800040F884 /* Products */, + BD9CE6458E7C4FF49A1DF69F /* Pods */, + 66CEC7120220DDD2221DD075 /* Frameworks */, + ); + sourceTree = ""; + }; + 5E3690611B2A23800040F884 /* Products */ = { + isa = PBXGroup; + children = ( + 5E3690601B2A23800040F884 /* HelloWorld.app */, + ); + name = Products; + sourceTree = ""; + }; + 5E3690621B2A23800040F884 /* HelloWorld */ = { + isa = PBXGroup; + children = ( + 5E3690631B2A23800040F884 /* Supporting Files */, + ); + path = HelloWorld; + sourceTree = ""; + }; + 5E3690631B2A23800040F884 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 5E3690701B2A23800040F884 /* Images.xcassets */, + 5E36906D1B2A23800040F884 /* Main.storyboard */, + 5E36906B1B2A23800040F884 /* ViewController.m */, + 5E3690681B2A23800040F884 /* AppDelegate.m */, + 5E3690671B2A23800040F884 /* AppDelegate.h */, + 5E3690641B2A23800040F884 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 66CEC7120220DDD2221DD075 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 6B4E1F55F8A2EC95A0E7EE88 /* libPods-HelloWorld.a */, + ); + name = Frameworks; + sourceTree = ""; + }; + BD9CE6458E7C4FF49A1DF69F /* Pods */ = { + isa = PBXGroup; + children = ( + DBDE3E48389499064CD664B8 /* Pods-HelloWorld.debug.xcconfig */, + 0C432EF610DB15C0F47A66BB /* Pods-HelloWorld.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 5E36905F1B2A23800040F884 /* HelloWorld */ = { + isa = PBXNativeTarget; + buildConfigurationList = 5E3690831B2A23810040F884 /* Build configuration list for PBXNativeTarget "HelloWorld" */; + buildPhases = ( + ACF9162361FB8F24C70657DE /* [CP] Check Pods Manifest.lock */, + 5E36905C1B2A23800040F884 /* Sources */, + 5E36905D1B2A23800040F884 /* Frameworks */, + 5E36905E1B2A23800040F884 /* Resources */, + 4C7D815378D98AB3BFC1A7D5 /* [CP] Copy Pods Resources */, + BB76529986A8BFAF19A385B1 /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = HelloWorld; + productName = HelloWorld; + productReference = 5E3690601B2A23800040F884 /* HelloWorld.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 5E3690581B2A23800040F884 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0620; + ORGANIZATIONNAME = Google; + TargetAttributes = { + 5E36905F1B2A23800040F884 = { + CreatedOnToolsVersion = 6.2; + DevelopmentTeam = EQHXZ8M8AV; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = 5E36905B1B2A23800040F884 /* Build configuration list for PBXProject "HelloWorld" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 5E3690571B2A23800040F884; + productRefGroup = 5E3690611B2A23800040F884 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 5E36905F1B2A23800040F884 /* HelloWorld */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 5E36905E1B2A23800040F884 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5E36906F1B2A23800040F884 /* Main.storyboard in Resources */, + 5E3690711B2A23800040F884 /* Images.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 4C7D815378D98AB3BFC1A7D5 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-HelloWorld/Pods-HelloWorld-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + ACF9162361FB8F24C70657DE /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; + showEnvVarsInLog = 0; + }; + BB76529986A8BFAF19A385B1 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-HelloWorld/Pods-HelloWorld-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 5E36905C1B2A23800040F884 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5E36906C1B2A23800040F884 /* ViewController.m in Sources */, + 5E3690691B2A23800040F884 /* AppDelegate.m in Sources */, + 5E3690661B2A23800040F884 /* main.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 5E36906D1B2A23800040F884 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 5E36906E1B2A23800040F884 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 5E3690811B2A23810040F884 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.2; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 5E3690821B2A23810040F884 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.2; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 5E3690841B2A23810040F884 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = DBDE3E48389499064CD664B8 /* Pods-HelloWorld.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Manual; + DEVELOPMENT_TEAM = EQHXZ8M8AV; + INFOPLIST_FILE = HelloWorld/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "Google Development"; + }; + name = Debug; + }; + 5E3690851B2A23810040F884 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 0C432EF610DB15C0F47A66BB /* Pods-HelloWorld.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Manual; + DEVELOPMENT_TEAM = ""; + INFOPLIST_FILE = HelloWorld/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 5E36905B1B2A23800040F884 /* Build configuration list for PBXProject "HelloWorld" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5E3690811B2A23810040F884 /* Debug */, + 5E3690821B2A23810040F884 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 5E3690831B2A23810040F884 /* Build configuration list for PBXNativeTarget "HelloWorld" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5E3690841B2A23810040F884 /* Debug */, + 5E3690851B2A23810040F884 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 5E3690581B2A23800040F884 /* Project object */; +} diff --git a/examples/objective-c/helloworld/HelloWorld.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples/objective-c/helloworld/HelloWorld.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..174a04ec --- /dev/null +++ b/examples/objective-c/helloworld/HelloWorld.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/examples/objective-c/helloworld/HelloWorld.xcodeproj/xcshareddata/xcschemes/HelloWorld.xcscheme b/examples/objective-c/helloworld/HelloWorld.xcodeproj/xcshareddata/xcschemes/HelloWorld.xcscheme new file mode 100644 index 00000000..be7b9903 --- /dev/null +++ b/examples/objective-c/helloworld/HelloWorld.xcodeproj/xcshareddata/xcschemes/HelloWorld.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/objective-c/helloworld/HelloWorld/AppDelegate.h b/examples/objective-c/helloworld/HelloWorld/AppDelegate.h new file mode 100644 index 00000000..c345a544 --- /dev/null +++ b/examples/objective-c/helloworld/HelloWorld/AppDelegate.h @@ -0,0 +1,23 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#import + +@interface AppDelegate : UIResponder +@property (strong, nonatomic) UIWindow *window; +@end diff --git a/examples/objective-c/helloworld/HelloWorld/AppDelegate.m b/examples/objective-c/helloworld/HelloWorld/AppDelegate.m new file mode 100644 index 00000000..3baa809c --- /dev/null +++ b/examples/objective-c/helloworld/HelloWorld/AppDelegate.m @@ -0,0 +1,22 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#import "AppDelegate.h" + +@implementation AppDelegate +@end diff --git a/examples/objective-c/helloworld/HelloWorld/Base.lproj/Main.storyboard b/examples/objective-c/helloworld/HelloWorld/Base.lproj/Main.storyboard new file mode 100644 index 00000000..f56d2f3b --- /dev/null +++ b/examples/objective-c/helloworld/HelloWorld/Base.lproj/Main.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/objective-c/helloworld/HelloWorld/Images.xcassets/AppIcon.appiconset/Contents.json b/examples/objective-c/helloworld/HelloWorld/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..36d2c80d --- /dev/null +++ b/examples/objective-c/helloworld/HelloWorld/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/objective-c/helloworld/HelloWorld/Info.plist b/examples/objective-c/helloworld/HelloWorld/Info.plist new file mode 100644 index 00000000..1078fff7 --- /dev/null +++ b/examples/objective-c/helloworld/HelloWorld/Info.plist @@ -0,0 +1,47 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + Google.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + Main + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/examples/objective-c/helloworld/HelloWorld/ViewController.m b/examples/objective-c/helloworld/HelloWorld/ViewController.m new file mode 100644 index 00000000..043a837e --- /dev/null +++ b/examples/objective-c/helloworld/HelloWorld/ViewController.m @@ -0,0 +1,25 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#import + +@interface ViewController : UIViewController +@end + +@implementation ViewController +@end diff --git a/examples/objective-c/helloworld/Podfile b/examples/objective-c/helloworld/Podfile new file mode 100644 index 00000000..0c3feaa4 --- /dev/null +++ b/examples/objective-c/helloworld/Podfile @@ -0,0 +1,9 @@ +source 'https://github.com/CocoaPods/Specs.git' +platform :ios, '8.0' + +install! 'cocoapods', :deterministic_uuids => false + +target 'HelloWorld' do + # Depend on the generated HelloWorld library. + pod 'HelloWorld', :path => '.' +end diff --git a/examples/objective-c/helloworld/README.md b/examples/objective-c/helloworld/README.md new file mode 100644 index 00000000..c57e07ca --- /dev/null +++ b/examples/objective-c/helloworld/README.md @@ -0,0 +1,107 @@ +# gRPC in 3 minutes (Objective-C) + +There are currently two ways to build projects with the gRPC Objective-C library: +* Cocoapods & Xcode +* Bazel (experimental) + +## Cocoapods + +## Installation + +To run this example you should have [Cocoapods](https://cocoapods.org/#install) installed, as well +as the relevant tools to generate the client library code (and a server in another language, for +testing). You can obtain the latter by following [these setup instructions](https://github.com/grpc/homebrew-grpc). + +### Hello Objective-C gRPC! + +Here's how to build and run the Objective-C implementation of the [Hello World](../../protos/helloworld.proto) +example used in [Getting started](https://github.com/grpc/grpc/tree/master/examples). + +The example code for this and our other examples lives in the `examples` directory. Clone +this repository at the [latest stable release tag](https://github.com/grpc/grpc/releases) to your local machine by running the following commands: + + +```sh +$ git clone -b RELEASE_TAG_HERE https://github.com/grpc/grpc +$ cd grpc +$ git submodule update --init +``` + +Change your current directory to `examples/objective-c/helloworld` + +```sh +$ cd examples/objective-c/helloworld +``` + +#### Try it! +To try the sample app, we need a gRPC server running locally. Let's compile and run, for example, +the C++ server in this repository: + +```shell +$ pushd ../../cpp/helloworld +$ make +$ ./greeter_server & +$ popd +``` + +Now have Cocoapods generate and install the client library for our .proto files: + +```shell +$ pod install +``` + +(This might have to compile OpenSSL, which takes around 15 minutes if Cocoapods doesn't have it yet +on your computer's cache.) + +Finally, open the XCode workspace created by Cocoapods, and run the app. You can check the calling +code in `main.m` and see the results in XCode's log console. + +The code sends a `HLWHelloRequest` containing the string "Objective-C" to a local server. The server +responds with a `HLWHelloResponse`, which contains a string that is then output to the log. + +## Bazel +### Installation +To run the examples in Bazel, you should have [Bazel](https://docs.bazel.build/versions/master/install-os-x.html) installed. + +### Hello Objective-C gRPC! +Here's how to build and run the Objective-C implementation of the [Hello World](helloworld) example. + +The code for the Hello World example and others live in the `examples` directory. Clone this repository to your local machine by running the following commands: +```shell +$ git clone --recursive https://github.com/grpc/grpc +``` + +Next, change your directory to `examples/objective-c` +```shell +$ cd grpc/examples/objective-c +``` + +Now build the Hello World project: +```shell +$ bazel build :HelloWorld +``` + +#### Try it! +To run the Hello World sample properly, we need a local server. Let's compile and run the corresponding C++ server: +```shell +$ bazel run //examples:greeter_server +``` + +To run the sample, you need to know the available simulator runtimes in your machine. You could either list the available runtimes yourself by running: +```shell +$ xcrun simctl list +``` +Or just try running the app and it will let you know what is available in the error messages: +```shell +$ bazel run :HelloWorld +``` +Note that running this command will build the project even if it is not built beforehand. + +Finally, launch the app with one of the available runtimes: +```shell +$ bazel run :HelloWorld --ios_simulator_version='' --ios_sumlator_device='' +``` + +## Tutorial + +You can find a more detailed tutorial in [gRPC Basics: Objective-C](https://grpc.io/docs/tutorials/basic/objective-c.html). diff --git a/examples/objective-c/helloworld/main.m b/examples/objective-c/helloworld/main.m new file mode 100644 index 00000000..72c1c232 --- /dev/null +++ b/examples/objective-c/helloworld/main.m @@ -0,0 +1,68 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#import +#import "AppDelegate.h" + +#import +#import +#import +#if COCOAPODS +#import +#else +#import "examples/protos/Helloworld.pbrpc.h" +#endif + +static NSString * const kHostAddress = @"localhost:50051"; + +@interface HLWResponseHandler : NSObject + +@end + +// A response handler object dispatching messages to main queue +@implementation HLWResponseHandler + +- (dispatch_queue_t)dispatchQueue { + return dispatch_get_main_queue(); +} + +- (void)didReceiveProtoMessage:(GPBMessage *)message { + NSLog(@"%@", message); +} + +@end + +int main(int argc, char * argv[]) { + @autoreleasepool { + HLWGreeter *client = [[HLWGreeter alloc] initWithHost:kHostAddress]; + + HLWHelloRequest *request = [HLWHelloRequest message]; + request.name = @"Objective-C"; + + GRPCMutableCallOptions *options = [[GRPCMutableCallOptions alloc] init]; + // this example does not use TLS (secure channel); use insecure channel instead + options.transport = GRPCDefaultTransportImplList.core_insecure; + options.userAgentPrefix = @"HelloWorld/1.0"; + + [[client sayHelloWithMessage:request + responseHandler:[[HLWResponseHandler alloc] init] + callOptions:options] start]; + + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/examples/objective-c/helloworld_macos/HelloWorld.podspec b/examples/objective-c/helloworld_macos/HelloWorld.podspec new file mode 100644 index 00000000..fc671ef4 --- /dev/null +++ b/examples/objective-c/helloworld_macos/HelloWorld.podspec @@ -0,0 +1,66 @@ +Pod::Spec.new do |s| + s.name = "HelloWorld" + s.version = "0.0.1" + s.license = "Apache License, Version 2.0" + s.authors = { 'gRPC contributors' => 'grpc-io@googlegroups.com' } + s.homepage = "https://grpc.io/" + s.summary = "HelloWorld example" + s.source = { :git => 'https://github.com/grpc/grpc.git' } + + s.ios.deployment_target = "7.1" + s.osx.deployment_target = "10.9" + + # Base directory where the .proto files are. + src = "../../protos" + + # Run protoc with the Objective-C and gRPC plugins to generate protocol messages and gRPC clients. + s.dependency "!ProtoCompiler-gRPCPlugin", "~> 1.0" + + # Pods directory corresponding to this app's Podfile, relative to the location of this podspec. + pods_root = 'Pods' + + # Path where Cocoapods downloads protoc and the gRPC plugin. + protoc_dir = "#{pods_root}/!ProtoCompiler" + protoc = "#{protoc_dir}/protoc" + plugin = "#{pods_root}/!ProtoCompiler-gRPCPlugin/grpc_objective_c_plugin" + + # Directory where the generated files will be placed. + dir = "#{pods_root}/#{s.name}" + + s.prepare_command = <<-CMD + mkdir -p #{dir} + #{protoc} \ + --plugin=protoc-gen-grpc=#{plugin} \ + --objc_out=#{dir} \ + --grpc_out=#{dir} \ + -I #{src} \ + -I #{protoc_dir} \ + #{src}/helloworld.proto + CMD + + # Files generated by protoc + s.subspec "Messages" do |ms| + ms.source_files = "#{dir}/*.pbobjc.{h,m}", "#{dir}/**/*.pbobjc.{h,m}" + ms.header_mappings_dir = dir + ms.requires_arc = false + # The generated files depend on the protobuf runtime. + ms.dependency "Protobuf" + end + + # Files generated by the gRPC plugin + s.subspec "Services" do |ss| + ss.source_files = "#{dir}/*.pbrpc.{h,m}", "#{dir}/**/*.pbrpc.{h,m}" + ss.header_mappings_dir = dir + ss.requires_arc = true + # The generated files depend on the gRPC runtime, and on the files generated by protoc. + ss.dependency "gRPC-ProtoRPC" + ss.dependency "#{s.name}/Messages" + end + + s.pod_target_xcconfig = { + # This is needed by all pods that depend on Protobuf: + 'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited) GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1', + # This is needed by all pods that depend on gRPC-RxLibrary: + 'CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES' => 'YES', + } +end diff --git a/examples/objective-c/helloworld_macos/HelloWorld.xcodeproj/project.pbxproj b/examples/objective-c/helloworld_macos/HelloWorld.xcodeproj/project.pbxproj new file mode 100644 index 00000000..06f06290 --- /dev/null +++ b/examples/objective-c/helloworld_macos/HelloWorld.xcodeproj/project.pbxproj @@ -0,0 +1,399 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 5EF711A4215174880077496F /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 5EF711A3215174880077496F /* AppDelegate.m */; }; + 5EF711A7215174880077496F /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5EF711A6215174880077496F /* ViewController.m */; }; + 5EF711A9215174890077496F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5EF711A8215174890077496F /* Assets.xcassets */; }; + 5EF711AC215174890077496F /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5EF711AA215174890077496F /* Main.storyboard */; }; + 5EF711AF215174890077496F /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 5EF711AE215174890077496F /* main.m */; }; + 827B966E84F6A63FD0F3F6BC /* libPods-HelloWorld.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 369D887F6054EBA486218C69 /* libPods-HelloWorld.a */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 2AAF8E8BA7DBFD2D3886AA25 /* Pods-HelloWorld.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HelloWorld.release.xcconfig"; path = "Pods/Target Support Files/Pods-HelloWorld/Pods-HelloWorld.release.xcconfig"; sourceTree = ""; }; + 369D887F6054EBA486218C69 /* libPods-HelloWorld.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-HelloWorld.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 5EF7119F215174870077496F /* HelloWorld.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = HelloWorld.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 5EF711A2215174880077496F /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 5EF711A3215174880077496F /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 5EF711A5215174880077496F /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; + 5EF711A6215174880077496F /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; + 5EF711A8215174890077496F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 5EF711AB215174890077496F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 5EF711AD215174890077496F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 5EF711AE215174890077496F /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 5EF711B0215174890077496F /* HelloWorld.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = HelloWorld.entitlements; sourceTree = ""; }; + CA4699782F6344C8E67C9FEE /* Pods-HelloWorld.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HelloWorld.debug.xcconfig"; path = "Pods/Target Support Files/Pods-HelloWorld/Pods-HelloWorld.debug.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 5EF7119C215174870077496F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 827B966E84F6A63FD0F3F6BC /* libPods-HelloWorld.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 5EF71196215174870077496F = { + isa = PBXGroup; + children = ( + 5EF711AE215174890077496F /* main.m */, + 5EF711A1215174870077496F /* HelloWorld */, + 5EF711A0215174870077496F /* Products */, + 8D3EFBB796129582177142C4 /* Pods */, + A986548CB5622AF6CC3ECCCE /* Frameworks */, + ); + sourceTree = ""; + }; + 5EF711A0215174870077496F /* Products */ = { + isa = PBXGroup; + children = ( + 5EF7119F215174870077496F /* HelloWorld.app */, + ); + name = Products; + sourceTree = ""; + }; + 5EF711A1215174870077496F /* HelloWorld */ = { + isa = PBXGroup; + children = ( + 5EF711A2215174880077496F /* AppDelegate.h */, + 5EF711A3215174880077496F /* AppDelegate.m */, + 5EF711A5215174880077496F /* ViewController.h */, + 5EF711A6215174880077496F /* ViewController.m */, + 5EF711A8215174890077496F /* Assets.xcassets */, + 5EF711AA215174890077496F /* Main.storyboard */, + 5EF711AD215174890077496F /* Info.plist */, + 5EF711B0215174890077496F /* HelloWorld.entitlements */, + ); + path = HelloWorld; + sourceTree = ""; + }; + 8D3EFBB796129582177142C4 /* Pods */ = { + isa = PBXGroup; + children = ( + CA4699782F6344C8E67C9FEE /* Pods-HelloWorld.debug.xcconfig */, + 2AAF8E8BA7DBFD2D3886AA25 /* Pods-HelloWorld.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; + A986548CB5622AF6CC3ECCCE /* Frameworks */ = { + isa = PBXGroup; + children = ( + 369D887F6054EBA486218C69 /* libPods-HelloWorld.a */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 5EF7119E215174870077496F /* HelloWorld */ = { + isa = PBXNativeTarget; + buildConfigurationList = 5EF711B3215174890077496F /* Build configuration list for PBXNativeTarget "HelloWorld" */; + buildPhases = ( + 3694AEA482289A5BDD5EA5A4 /* [CP] Check Pods Manifest.lock */, + 5EF7119B215174870077496F /* Sources */, + 5EF7119C215174870077496F /* Frameworks */, + 5EF7119D215174870077496F /* Resources */, + DF5241368CCEAA9DC73E7EA8 /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = HelloWorld; + productName = HelloWorld; + productReference = 5EF7119F215174870077496F /* HelloWorld.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 5EF71197215174870077496F /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0930; + ORGANIZATIONNAME = gRPC; + TargetAttributes = { + 5EF7119E215174870077496F = { + CreatedOnToolsVersion = 9.3; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 0; + }; + }; + }; + }; + }; + buildConfigurationList = 5EF7119A215174870077496F /* Build configuration list for PBXProject "HelloWorld" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 5EF71196215174870077496F; + productRefGroup = 5EF711A0215174870077496F /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 5EF7119E215174870077496F /* HelloWorld */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 5EF7119D215174870077496F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5EF711A9215174890077496F /* Assets.xcassets in Resources */, + 5EF711AC215174890077496F /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3694AEA482289A5BDD5EA5A4 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-HelloWorld-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + DF5241368CCEAA9DC73E7EA8 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${SRCROOT}/Pods/Target Support Files/Pods-HelloWorld/Pods-HelloWorld-resources.sh", + "${PODS_CONFIGURATION_BUILD_DIR}/gRPC/gRPCCertificates.bundle", + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/gRPCCertificates.bundle", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-HelloWorld/Pods-HelloWorld-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 5EF7119B215174870077496F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5EF711A7215174880077496F /* ViewController.m in Sources */, + 5EF711AF215174890077496F /* main.m in Sources */, + 5EF711A4215174880077496F /* AppDelegate.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 5EF711AA215174890077496F /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 5EF711AB215174890077496F /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 5EF711B1215174890077496F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.13; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + 5EF711B2215174890077496F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.13; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + }; + name = Release; + }; + 5EF711B4215174890077496F /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = CA4699782F6344C8E67C9FEE /* Pods-HelloWorld.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = HelloWorld/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.grpc.HelloWorld; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 5EF711B5215174890077496F /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 2AAF8E8BA7DBFD2D3886AA25 /* Pods-HelloWorld.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = HelloWorld/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.grpc.HelloWorld; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 5EF7119A215174870077496F /* Build configuration list for PBXProject "HelloWorld" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5EF711B1215174890077496F /* Debug */, + 5EF711B2215174890077496F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 5EF711B3215174890077496F /* Build configuration list for PBXNativeTarget "HelloWorld" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5EF711B4215174890077496F /* Debug */, + 5EF711B5215174890077496F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 5EF71197215174870077496F /* Project object */; +} diff --git a/examples/objective-c/helloworld_macos/HelloWorld/AppDelegate.h b/examples/objective-c/helloworld_macos/HelloWorld/AppDelegate.h new file mode 100644 index 00000000..1b88e35d --- /dev/null +++ b/examples/objective-c/helloworld_macos/HelloWorld/AppDelegate.h @@ -0,0 +1,25 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#import + +@interface AppDelegate : NSObject + + +@end + diff --git a/examples/objective-c/helloworld_macos/HelloWorld/AppDelegate.m b/examples/objective-c/helloworld_macos/HelloWorld/AppDelegate.m new file mode 100644 index 00000000..7da5e117 --- /dev/null +++ b/examples/objective-c/helloworld_macos/HelloWorld/AppDelegate.m @@ -0,0 +1,37 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#import "AppDelegate.h" + +@interface AppDelegate () + +@end + +@implementation AppDelegate + +- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { + // Insert code here to initialize your application +} + + +- (void)applicationWillTerminate:(NSNotification *)aNotification { + // Insert code here to tear down your application +} + + +@end diff --git a/examples/objective-c/helloworld_macos/HelloWorld/Assets.xcassets/AppIcon.appiconset/Contents.json b/examples/objective-c/helloworld_macos/HelloWorld/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..2db2b1c7 --- /dev/null +++ b/examples/objective-c/helloworld_macos/HelloWorld/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,58 @@ +{ + "images" : [ + { + "idiom" : "mac", + "size" : "16x16", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "16x16", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "32x32", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "32x32", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "128x128", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "128x128", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "256x256", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "256x256", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "512x512", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "512x512", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/objective-c/helloworld_macos/HelloWorld/Assets.xcassets/Contents.json b/examples/objective-c/helloworld_macos/HelloWorld/Assets.xcassets/Contents.json new file mode 100644 index 00000000..da4a164c --- /dev/null +++ b/examples/objective-c/helloworld_macos/HelloWorld/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/objective-c/helloworld_macos/HelloWorld/Base.lproj/Main.storyboard b/examples/objective-c/helloworld_macos/HelloWorld/Base.lproj/Main.storyboard new file mode 100644 index 00000000..3ed4144f --- /dev/null +++ b/examples/objective-c/helloworld_macos/HelloWorld/Base.lproj/Main.storyboard @@ -0,0 +1,717 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Default + + + + + + + Left to Right + + + + + + + Right to Left + + + + + + + + + + + Default + + + + + + + Left to Right + + + + + + + Right to Left + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/objective-c/helloworld_macos/HelloWorld/HelloWorld.entitlements b/examples/objective-c/helloworld_macos/HelloWorld/HelloWorld.entitlements new file mode 100644 index 00000000..0c67376e --- /dev/null +++ b/examples/objective-c/helloworld_macos/HelloWorld/HelloWorld.entitlements @@ -0,0 +1,5 @@ + + + + + diff --git a/examples/objective-c/helloworld_macos/HelloWorld/Info.plist b/examples/objective-c/helloworld_macos/HelloWorld/Info.plist new file mode 100644 index 00000000..c76261ba --- /dev/null +++ b/examples/objective-c/helloworld_macos/HelloWorld/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSHumanReadableCopyright + Copyright © 2018 gRPC. All rights reserved. + NSMainStoryboardFile + Main + NSPrincipalClass + NSApplication + + diff --git a/examples/objective-c/helloworld_macos/HelloWorld/ViewController.h b/examples/objective-c/helloworld_macos/HelloWorld/ViewController.h new file mode 100644 index 00000000..ff620dc4 --- /dev/null +++ b/examples/objective-c/helloworld_macos/HelloWorld/ViewController.h @@ -0,0 +1,25 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#import + +@interface ViewController : NSViewController + + +@end + diff --git a/examples/objective-c/helloworld_macos/HelloWorld/ViewController.m b/examples/objective-c/helloworld_macos/HelloWorld/ViewController.m new file mode 100644 index 00000000..fc9e95f9 --- /dev/null +++ b/examples/objective-c/helloworld_macos/HelloWorld/ViewController.m @@ -0,0 +1,37 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#import "ViewController.h" + +@implementation ViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + + // Do any additional setup after loading the view. +} + + +- (void)setRepresentedObject:(id)representedObject { + [super setRepresentedObject:representedObject]; + + // Update the view, if already loaded. +} + + +@end diff --git a/examples/objective-c/helloworld_macos/Podfile b/examples/objective-c/helloworld_macos/Podfile new file mode 100644 index 00000000..bf1488cb --- /dev/null +++ b/examples/objective-c/helloworld_macos/Podfile @@ -0,0 +1,9 @@ +source 'https://github.com/CocoaPods/Specs.git' +platform :macos, '10.9' + +install! 'cocoapods', :deterministic_uuids => false + +target 'HelloWorld' do + # Depend on the generated HelloWorld library. + pod 'HelloWorld', :path => '.' +end diff --git a/examples/objective-c/helloworld_macos/README.md b/examples/objective-c/helloworld_macos/README.md new file mode 100644 index 00000000..295701b5 --- /dev/null +++ b/examples/objective-c/helloworld_macos/README.md @@ -0,0 +1,6 @@ +# gRPC Objective-C Mac OS Hello World Example + +A hello world example app on Mac OS. Note that Mac OS is not a first class supported platform of gRPC +Objective-C library. This example is only for reference. + +Refer to [Hello World Example](../helloworld) for instructions on installation and running. diff --git a/examples/objective-c/helloworld_macos/main.m b/examples/objective-c/helloworld_macos/main.m new file mode 100644 index 00000000..12b2d941 --- /dev/null +++ b/examples/objective-c/helloworld_macos/main.m @@ -0,0 +1,69 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#import + +#import +#import +#import +#if COCOAPODS +#import +#else +#import "examples/protos/Helloworld.pbrpc.h" +#endif + +static NSString * const kHostAddress = @"localhost:50051"; + +@interface HLWResponseHandler : NSObject + +@end + +// A response handler object dispatching messages to main queue +@implementation HLWResponseHandler + +- (dispatch_queue_t)dispatchQueue { + return dispatch_get_main_queue(); +} + +- (void)didReceiveProtoMessage:(GPBMessage *)message { + NSLog(@"%@", message); +} + +@end + +int main(int argc, const char * argv[]) { + @autoreleasepool { + HLWGreeter *client = [[HLWGreeter alloc] initWithHost:kHostAddress]; + + HLWHelloRequest *request = [HLWHelloRequest message]; + request.name = @"Objective-C"; + + GRPCMutableCallOptions *options = [[GRPCMutableCallOptions alloc] init]; + // this example does not use TLS (secure channel); use insecure channel instead + options.transport = GRPCDefaultTransportImplList.core_insecure; + options.userAgentPrefix = @"HelloWorld/1.0"; + + GRPCUnaryProtoCall *call = [client sayHelloWithMessage:request + responseHandler:[[HLWResponseHandler alloc] init] + callOptions:options]; + + [call start]; + } + + return NSApplicationMain(argc, argv); +} diff --git a/examples/objective-c/route_guide/Misc/AppDelegate.h b/examples/objective-c/route_guide/Misc/AppDelegate.h new file mode 100644 index 00000000..c345a544 --- /dev/null +++ b/examples/objective-c/route_guide/Misc/AppDelegate.h @@ -0,0 +1,23 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#import + +@interface AppDelegate : UIResponder +@property (strong, nonatomic) UIWindow *window; +@end diff --git a/examples/objective-c/route_guide/Misc/AppDelegate.m b/examples/objective-c/route_guide/Misc/AppDelegate.m new file mode 100644 index 00000000..3baa809c --- /dev/null +++ b/examples/objective-c/route_guide/Misc/AppDelegate.m @@ -0,0 +1,22 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#import "AppDelegate.h" + +@implementation AppDelegate +@end diff --git a/examples/objective-c/route_guide/Misc/Base.lproj/Main.storyboard b/examples/objective-c/route_guide/Misc/Base.lproj/Main.storyboard new file mode 100644 index 00000000..5ca9f464 --- /dev/null +++ b/examples/objective-c/route_guide/Misc/Base.lproj/Main.storyboard @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/objective-c/route_guide/Misc/Images.xcassets/AppIcon.appiconset/Contents.json b/examples/objective-c/route_guide/Misc/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..36d2c80d --- /dev/null +++ b/examples/objective-c/route_guide/Misc/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/objective-c/route_guide/Misc/Images.xcassets/first.imageset/Contents.json b/examples/objective-c/route_guide/Misc/Images.xcassets/first.imageset/Contents.json new file mode 100644 index 00000000..33a74510 --- /dev/null +++ b/examples/objective-c/route_guide/Misc/Images.xcassets/first.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "first.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/objective-c/route_guide/Misc/Images.xcassets/first.imageset/first.pdf b/examples/objective-c/route_guide/Misc/Images.xcassets/first.imageset/first.pdf new file mode 100644 index 0000000000000000000000000000000000000000..47d911dea647d55983671ead4d08b6f6b3600715 GIT binary patch literal 2465 zcmai03se(l7FLvisY+L#f-EBsK`11Xkc1=%MIujmB|xQ!>5vQ%APFP`Mlf5nSPOKE z2-^C>7DZkM!J;Da5{kfrC?Kvp3J41-3shFXvhuJqKo*oer*r0H{{P-P_x0cTzLzjD!bE z0qT;#Q7l4Gy%fMoXJaKT`@{5#R(MOqJPwQifv8iK6A%Ot9L14h2`38T!2s4PM=1!< zmL06}VYAA|ay#jZRs>HpA%X+eQW4rufWU%d1w5GTy!X#LeZsF_+~ccZmn3Fi)v^Z; zIG;?uU*yLLEYs61tjD>gXOFvSWsh{48xJvPNqKrIJtMdCz2cA2aC7TF?b@K`V!Lw- zE;zpH&ApqhoRjAHt}gK}>(qAc8dvrkD31*`<5<%C(&4_LqhQ3-GOf8~n^leG?+-@@^pjPa$J2gW@O)!b9hdTJ zTauyIJ&~rqeEZC1p9dWgx7{_WRc2=drMO=wcT7B{Zd58z`d)r_36r4V<6PGkCjpGfbnVMtm@;b}F!T?)Qav$_y7H5T;Mf!T}M zWxP9TNqrV?e5;b|pWd3^u2KAatk&3aDB@0 zZBaQNdCZ2#fblzYZnRCCjQ-GQWb-s8bX&<)?SxnUGdDYVFVk`xIf7@g3~$DX`H71_;r5OSZz1p`$_8y_9 z{;MJJ+n=>7Ewg;GnGHoz)&ID0z@F2!e$F7cWQ?d6s(!VY)_Gw})xCyMvsD={5i&H* zAIr_ACo8;Se6<*!-mm9Am79Iz^RVlc?%S5sg|E*SyIV{dd9{Mpf#d3cih5WKt=%ps zBEo)bt8EjmeCFYJRYU|b7d`p+-V|X2wOCYtyLP6t=!WH-kgdf0A};ytPfZiCwVPx{ z`g;zpe{8a4RQxQUwVU02<4X3w|9h;}XjhGWquqn{vVqq8g{*}BQF9=ybe_TM*!M=rFs1pN)yzctIXAoicsCe6>fit>wgZ#vp^hZOY0`J`rx zwdSK?GwR_xm9;5XjH|vf{O+Yg-)z;s*xt>;-vU`D-_SK<=~4eEVQkV~57{vyH6ebu>DqwE~Mx_A31Lg~$ zy`i52ew?GEluE%AN>ju*5z~dx2QQLP-G+E>o|En2+s&<^4*d zWD+<8PXs_Jp7_5Dpi(Gg3J?M;%Rn0{dcxQRh!ip+iHJ_e`!bM1MGxwI8Iedr+x>wI zq@&04fsADHfBccq^gpm8Q_u-~Uj|Z$YwSR(^_mzUb!}Xb2Cj`uqphg}v_Y%?Fs=;= zWq3s{hy)Tu!ji@RJsd$C+G{F6V2j1*Xk+7xo|LO7M2yb)(wc=%x-AclP9pLsbTF7m tf?*P!2EjJu5MD57P32Q4pdJ3tO_shCDT2=K;$ebx8ymcd$v!V9{2$sQiO>K5 literal 0 HcmV?d00001 diff --git a/examples/objective-c/route_guide/Misc/Images.xcassets/second.imageset/Contents.json b/examples/objective-c/route_guide/Misc/Images.xcassets/second.imageset/Contents.json new file mode 100644 index 00000000..03bd9c92 --- /dev/null +++ b/examples/objective-c/route_guide/Misc/Images.xcassets/second.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "second.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/objective-c/route_guide/Misc/Images.xcassets/second.imageset/second.pdf b/examples/objective-c/route_guide/Misc/Images.xcassets/second.imageset/second.pdf new file mode 100644 index 0000000000000000000000000000000000000000..401614e288b4b160471c2776bed6f09762af3e1c GIT binary patch literal 2423 zcmai02~-nz8dqq7rWU#)x2z)&iMWtV?gK$2a)?|BP!TbkV}J-Gl1wmy+3G9S0=uOY zwCjai6uBOPMMdNiN`VDYKwLQr2#W^`R93*Ua=0^)EGYY4=grIf|KIohziYnv{elnR zdN_hk6db<(+3RPcxs!iut8c(j0TLh=9mY931H^rhEE0|aXo!dh5Iv+ZFr+}9F+v#P zLSnfD0$f~hN>~92V{z)WJA&2)5rW!|I?;o?oI*%zejJiuY>hFLQwKlAa9O+PnPh#% zJp~JAfs-De6u@;{cREMs}D-sGib_4>50m8_|Uj-zC0m@Qx zJV+^5Da4Qxpf3sBtKZs<_aI$Cb1T+h<->yL^rfiGNelYkqgC3#SqVP_iy*_RPcbjH)xYf zvYdC-)D_t8c{=5%;$VJQxs_#61J*kuXMC?|&PbPo-7uSxoNr~&J94|gKk+03JGXXM zx4w~=^VUzWqQveu_ilRgPdgNNdnLZCH`=;w91}cP5ihdm*B_jI+rk=Pz2Lk!)XUu| zkls3P5&YHJ!t0kF+MUVBHOAx)a zy|JxHNd37z*~b5#%*0w_F|#4?erNP;pG`Fevoq2%?9Y>%Cmzv1(ks;aPIGaiy1mhU zr{7lB^Mem&`QK{b{uiDC zLD8muY(FNk{YdV|zO#o_VB%);8|~Bh(Z4p?GM}g-HN2;q7~YNl-lD~HZ$taYw$Fzbn6c?c5eo=@`i>()el#qwB)hI-gp0 ztsw@dh-I5NJkk)RCoBC`L8ffKfY)=oG=#4LA9TO6eA}9~@a6dupB+=S{%s&NY}^0GY`hAqod)uxXHitrN%bWOJohV>t?!&Z#d4y^7J@=Oh`HV zee**4j>xRUd)|D0^I-B#<`m1-5PO{)!v(q?ecFYqr_8Q{+z7#n0uFbq%_?hZ-Ck(6NRn=vDS7Nb1Xxx_)9`!i- zGR>av*PJ+P_AGO*a_$FbtCCISg5PK44p&W#t$)+HVcxpR9LAL%_Pv$p`0tO*sYZD0 zCG3-ipr4WoVbjpw%Nf^r^rnWcDcjumgBPEjO;NM6QtZ8wU#0rjHx5zs%CahF4$W*U zxu!q8kYP+>v!BNPVIRJUGIWU@7qVvx2VZDw4gV8%z%bjpF#aF(W|PmliwlakuRq>= zhaCRc^R!7T)#Twb0{!Tns=CxGcGX|leErg`f3|v0eBXxHU&6Sj-_>zOL!!d+j5Xt* zPS;rWd^zEF{5d5%)nNK=)zFJ8Uc=aQKD%UK)_TNes1Gh{SD*Mb_@O` z7*zs9Uq~Vq?v|^8FcM-yLGMKzR3YFB0z@CFM2X-dio%Gu6&MJj=I?uS7sA3AdE^p8 zE49$PjJzPIJwfn;jso7X2#jynr3dO@p5QAK1O9wqKLC=PkQjj~p#n|-5O`ihbTzzu zL{}2QEe28pJYfVZRW56FL`LvO&|C^1Th{0}hQMW$Ng$QPpnzlwnMnf=kVy8(y==L% zLMa>r0gELdT + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + gRPC.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + Main + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UIStatusBarTintParameters + + UINavigationBar + + Style + UIBarStyleDefault + Translucent + + + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/examples/objective-c/route_guide/Misc/main.m b/examples/objective-c/route_guide/Misc/main.m new file mode 100644 index 00000000..e8b9abdc --- /dev/null +++ b/examples/objective-c/route_guide/Misc/main.m @@ -0,0 +1,26 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#import +#import "AppDelegate.h" + +int main(int argc, char * argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/examples/objective-c/route_guide/Podfile b/examples/objective-c/route_guide/Podfile new file mode 100644 index 00000000..b77eb1b1 --- /dev/null +++ b/examples/objective-c/route_guide/Podfile @@ -0,0 +1,9 @@ +source 'https://github.com/CocoaPods/Specs.git' +platform :ios, '8.0' + +install! 'cocoapods', :deterministic_uuids => false + +target 'RouteGuideClient' do + # Depend on the generated RouteGuide library. + pod 'RouteGuide', :path => '.' +end diff --git a/examples/objective-c/route_guide/README.md b/examples/objective-c/route_guide/README.md new file mode 100644 index 00000000..60e53046 --- /dev/null +++ b/examples/objective-c/route_guide/README.md @@ -0,0 +1,4 @@ +# gRPC Basics: Objective-C + +This is the supporting code for the tutorial "[gRPC Basics: Objective-C](https://grpc.io/docs/tutorials/basic/objective-c.html)." + diff --git a/examples/objective-c/route_guide/RouteGuide.podspec b/examples/objective-c/route_guide/RouteGuide.podspec new file mode 100644 index 00000000..59639599 --- /dev/null +++ b/examples/objective-c/route_guide/RouteGuide.podspec @@ -0,0 +1,66 @@ +Pod::Spec.new do |s| + s.name = "RouteGuide" + s.version = "0.0.1" + s.license = "Apache License, Version 2.0" + s.authors = { 'gRPC contributors' => 'grpc-io@googlegroups.com' } + s.homepage = "https://grpc.io/" + s.summary = "RouteGuide example" + s.source = { :git => 'https://github.com/grpc/grpc.git' } + + s.ios.deployment_target = "7.1" + s.osx.deployment_target = "10.9" + + # Base directory where the .proto files are. + src = "../../protos" + + # Run protoc with the Objective-C and gRPC plugins to generate protocol messages and gRPC clients. + s.dependency "!ProtoCompiler-gRPCPlugin", "~> 1.0" + + # Pods directory corresponding to this app's Podfile, relative to the location of this podspec. + pods_root = 'Pods' + + # Path where Cocoapods downloads protoc and the gRPC plugin. + protoc_dir = "#{pods_root}/!ProtoCompiler" + protoc = "#{protoc_dir}/protoc" + plugin = "#{pods_root}/!ProtoCompiler-gRPCPlugin/grpc_objective_c_plugin" + + # Directory where the generated files will be placed. + dir = "#{pods_root}/#{s.name}" + + s.prepare_command = <<-CMD + mkdir -p #{dir} + #{protoc} \ + --plugin=protoc-gen-grpc=#{plugin} \ + --objc_out=#{dir} \ + --grpc_out=#{dir} \ + -I #{src} \ + -I #{protoc_dir} \ + #{src}/route_guide.proto + CMD + + # Files generated by protoc + s.subspec "Messages" do |ms| + ms.source_files = "#{dir}/*.pbobjc.{h,m}", "#{dir}/**/*.pbobjc.{h,m}" + ms.header_mappings_dir = dir + ms.requires_arc = false + # The generated files depend on the protobuf runtime. + ms.dependency "Protobuf" + end + + # Files generated by the gRPC plugin + s.subspec "Services" do |ss| + ss.source_files = "#{dir}/*.pbrpc.{h,m}", "#{dir}/**/*.pbrpc.{h,m}" + ss.header_mappings_dir = dir + ss.requires_arc = true + # The generated files depend on the gRPC runtime, and on the files generated by protoc. + ss.dependency "gRPC-ProtoRPC" + ss.dependency "#{s.name}/Messages" + end + + s.pod_target_xcconfig = { + # This is needed by all pods that depend on Protobuf: + 'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited) GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1', + # This is needed by all pods that depend on gRPC-RxLibrary: + 'CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES' => 'YES', + } +end diff --git a/examples/objective-c/route_guide/RouteGuideClient.xcodeproj/project.pbxproj b/examples/objective-c/route_guide/RouteGuideClient.xcodeproj/project.pbxproj new file mode 100644 index 00000000..0bb84b3b --- /dev/null +++ b/examples/objective-c/route_guide/RouteGuideClient.xcodeproj/project.pbxproj @@ -0,0 +1,382 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 124E20A2FC8EAE54460D4ED2 /* libPods-RouteGuideClient.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 71CEE03D66D40FC37264D6E4 /* libPods-RouteGuideClient.a */; }; + 632527831B1D0396003073D9 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 632527821B1D0396003073D9 /* main.m */; }; + 632527861B1D0396003073D9 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 632527851B1D0396003073D9 /* AppDelegate.m */; }; + 6325278F1B1D0396003073D9 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6325278D1B1D0396003073D9 /* Main.storyboard */; }; + 632527911B1D0396003073D9 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 632527901B1D0396003073D9 /* Images.xcassets */; }; + 6367B55B1B223AFA008861F5 /* route_guide_db.json in Resources */ = {isa = PBXBuildFile; fileRef = 6367B55A1B223AFA008861F5 /* route_guide_db.json */; }; + 63A6015C1B1DAB5000FA5B86 /* ViewControllers.m in Sources */ = {isa = PBXBuildFile; fileRef = 63A6015B1B1DAB5000FA5B86 /* ViewControllers.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 6325277D1B1D0396003073D9 /* RouteGuideClient.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RouteGuideClient.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 632527811B1D0396003073D9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 632527821B1D0396003073D9 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 632527841B1D0396003073D9 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 632527851B1D0396003073D9 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 6325278E1B1D0396003073D9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 632527901B1D0396003073D9 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + 6367B55A1B223AFA008861F5 /* route_guide_db.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = route_guide_db.json; sourceTree = ""; }; + 63A6015B1B1DAB5000FA5B86 /* ViewControllers.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ViewControllers.m; sourceTree = ""; }; + 71CEE03D66D40FC37264D6E4 /* libPods-RouteGuideClient.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-RouteGuideClient.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + ADA4C647BAE906F79AD9A45E /* Pods-RouteGuideClient.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RouteGuideClient.debug.xcconfig"; path = "Pods/Target Support Files/Pods-RouteGuideClient/Pods-RouteGuideClient.debug.xcconfig"; sourceTree = ""; }; + C83C5A54D1A4EA07569F1AED /* Pods-RouteGuideClient.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RouteGuideClient.release.xcconfig"; path = "Pods/Target Support Files/Pods-RouteGuideClient/Pods-RouteGuideClient.release.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 6325277A1B1D0395003073D9 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 124E20A2FC8EAE54460D4ED2 /* libPods-RouteGuideClient.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 56849C29DC376BF4B902CD77 /* Pods */ = { + isa = PBXGroup; + children = ( + ADA4C647BAE906F79AD9A45E /* Pods-RouteGuideClient.debug.xcconfig */, + C83C5A54D1A4EA07569F1AED /* Pods-RouteGuideClient.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; + 631C63891B1DBC41001295D5 /* Misc */ = { + isa = PBXGroup; + children = ( + 632527841B1D0396003073D9 /* AppDelegate.h */, + 632527851B1D0396003073D9 /* AppDelegate.m */, + 632527901B1D0396003073D9 /* Images.xcassets */, + 632527801B1D0396003073D9 /* Supporting Files */, + ); + path = Misc; + sourceTree = ""; + }; + 632527741B1D0395003073D9 = { + isa = PBXGroup; + children = ( + 6325277F1B1D0396003073D9 /* RouteGuideClient */, + 6325277E1B1D0396003073D9 /* Products */, + 56849C29DC376BF4B902CD77 /* Pods */, + 7482B8A18481F7B13ADE4530 /* Frameworks */, + ); + sourceTree = ""; + }; + 6325277E1B1D0396003073D9 /* Products */ = { + isa = PBXGroup; + children = ( + 6325277D1B1D0396003073D9 /* RouteGuideClient.app */, + ); + name = Products; + sourceTree = ""; + }; + 6325277F1B1D0396003073D9 /* RouteGuideClient */ = { + isa = PBXGroup; + children = ( + 63A6015B1B1DAB5000FA5B86 /* ViewControllers.m */, + 6367B55A1B223AFA008861F5 /* route_guide_db.json */, + 6325278D1B1D0396003073D9 /* Main.storyboard */, + 631C63891B1DBC41001295D5 /* Misc */, + ); + name = RouteGuideClient; + sourceTree = SOURCE_ROOT; + }; + 632527801B1D0396003073D9 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 632527811B1D0396003073D9 /* Info.plist */, + 632527821B1D0396003073D9 /* main.m */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 7482B8A18481F7B13ADE4530 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 71CEE03D66D40FC37264D6E4 /* libPods-RouteGuideClient.a */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 6325277C1B1D0395003073D9 /* RouteGuideClient */ = { + isa = PBXNativeTarget; + buildConfigurationList = 632527A31B1D0396003073D9 /* Build configuration list for PBXNativeTarget "RouteGuideClient" */; + buildPhases = ( + C6FC30AD2376EC04317237C5 /* [CP] Check Pods Manifest.lock */, + 632527791B1D0395003073D9 /* Sources */, + 6325277A1B1D0395003073D9 /* Frameworks */, + 6325277B1B1D0395003073D9 /* Resources */, + FFE0BCF30339E7A50A989EAB /* [CP] Copy Pods Resources */, + B5388EC5A25E89021740B916 /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = RouteGuideClient; + productName = RouteGuideClient; + productReference = 6325277D1B1D0396003073D9 /* RouteGuideClient.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 632527751B1D0395003073D9 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0630; + ORGANIZATIONNAME = gRPC; + TargetAttributes = { + 6325277C1B1D0395003073D9 = { + CreatedOnToolsVersion = 6.3.1; + }; + }; + }; + buildConfigurationList = 632527781B1D0395003073D9 /* Build configuration list for PBXProject "RouteGuideClient" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 632527741B1D0395003073D9; + productRefGroup = 6325277E1B1D0396003073D9 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 6325277C1B1D0395003073D9 /* RouteGuideClient */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 6325277B1B1D0395003073D9 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6325278F1B1D0396003073D9 /* Main.storyboard in Resources */, + 632527911B1D0396003073D9 /* Images.xcassets in Resources */, + 6367B55B1B223AFA008861F5 /* route_guide_db.json in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + B5388EC5A25E89021740B916 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-RouteGuideClient/Pods-RouteGuideClient-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + C6FC30AD2376EC04317237C5 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; + showEnvVarsInLog = 0; + }; + FFE0BCF30339E7A50A989EAB /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-RouteGuideClient/Pods-RouteGuideClient-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 632527791B1D0395003073D9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 632527861B1D0396003073D9 /* AppDelegate.m in Sources */, + 632527831B1D0396003073D9 /* main.m in Sources */, + 63A6015C1B1DAB5000FA5B86 /* ViewControllers.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 6325278D1B1D0396003073D9 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 6325278E1B1D0396003073D9 /* Base */, + ); + name = Main.storyboard; + path = Misc; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 632527A11B1D0396003073D9 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.3; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 632527A21B1D0396003073D9 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.3; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 632527A41B1D0396003073D9 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = ADA4C647BAE906F79AD9A45E /* Pods-RouteGuideClient.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = Misc/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 632527A51B1D0396003073D9 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C83C5A54D1A4EA07569F1AED /* Pods-RouteGuideClient.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = Misc/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 632527781B1D0395003073D9 /* Build configuration list for PBXProject "RouteGuideClient" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 632527A11B1D0396003073D9 /* Debug */, + 632527A21B1D0396003073D9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 632527A31B1D0396003073D9 /* Build configuration list for PBXNativeTarget "RouteGuideClient" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 632527A41B1D0396003073D9 /* Debug */, + 632527A51B1D0396003073D9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 632527751B1D0395003073D9 /* Project object */; +} diff --git a/examples/objective-c/route_guide/RouteGuideClient.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples/objective-c/route_guide/RouteGuideClient.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..f208589e --- /dev/null +++ b/examples/objective-c/route_guide/RouteGuideClient.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/examples/objective-c/route_guide/RouteGuideClient.xcodeproj/xcshareddata/xcschemes/RouteGuideClient.xcscheme b/examples/objective-c/route_guide/RouteGuideClient.xcodeproj/xcshareddata/xcschemes/RouteGuideClient.xcscheme new file mode 100644 index 00000000..42806a73 --- /dev/null +++ b/examples/objective-c/route_guide/RouteGuideClient.xcodeproj/xcshareddata/xcschemes/RouteGuideClient.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/objective-c/route_guide/ViewControllers.m b/examples/objective-c/route_guide/ViewControllers.m new file mode 100644 index 00000000..17736bac --- /dev/null +++ b/examples/objective-c/route_guide/ViewControllers.m @@ -0,0 +1,374 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#import +#if COCOAPODS +#import +#else +#import "examples/protos/RouteGuide.pbrpc.h" +#endif + +#import + +static NSString *const kHostAddress = @"localhost:50051"; + +/** Category to override RTGPoint's description. */ +@interface RTGPoint (Description) +- (NSString *)description; +@end + +@implementation RTGPoint (Description) +- (NSString *)description { + NSString *verticalDirection = self.latitude >= 0 ? @"N" : @"S"; + NSString *horizontalDirection = self.longitude >= 0 ? @"E" : @"W"; + return + [NSString stringWithFormat:@"%.02f%@ %.02f%@", abs(self.latitude) / 1E7f, verticalDirection, + abs(self.longitude) / 1E7f, horizontalDirection]; +} +@end + +/** Category to give RTGRouteNote a convenience constructor. */ +@interface RTGRouteNote (Constructors) ++ (instancetype)noteWithMessage:(NSString *)message + latitude:(float)latitude + longitude:(float)longitude; +@end + +@implementation RTGRouteNote (Constructors) ++ (instancetype)noteWithMessage:(NSString *)message + latitude:(float)latitude + longitude:(float)longitude { + RTGRouteNote *note = [self message]; + note.message = message; + note.location.latitude = (int32_t)latitude * 1E7; + note.location.longitude = (int32_t)longitude * 1E7; + return note; +} +@end + +#pragma mark Demo: Get Feature + +/** + * Run the getFeature demo. Calls getFeature with a point known to have a feature and a point known + * not to have a feature. + */ +@interface GetFeatureViewController : UIViewController + +@property(weak, nonatomic) IBOutlet UILabel *outputLabel; + +@end + +@implementation GetFeatureViewController { + RTGRouteGuide *_service; +} + +- (void)execRequest { + void (^handler)(RTGFeature *response, NSError *error) = ^(RTGFeature *response, NSError *error) { + // TODO(makdharma): Remove boilerplate by consolidating into one log function. + if (response.name.length) { + NSString *str = + [NSString stringWithFormat:@"%@\nFound feature called %@ at %@.", self.outputLabel.text, + response.location, response.name]; + self.outputLabel.text = str; + NSLog(@"Found feature called %@ at %@.", response.name, response.location); + } else if (response) { + NSString *str = [NSString stringWithFormat:@"%@\nFound no features at %@", + self.outputLabel.text, response.location]; + self.outputLabel.text = str; + NSLog(@"Found no features at %@", response.location); + } else { + NSString *str = + [NSString stringWithFormat:@"%@\nRPC error: %@", self.outputLabel.text, error]; + self.outputLabel.text = str; + NSLog(@"RPC error: %@", error); + } + }; + + RTGPoint *point = [RTGPoint message]; + point.latitude = 409146138; + point.longitude = -746188906; + + GRPCUnaryProtoCall *call = [_service + getFeatureWithMessage:point + responseHandler:[[GRPCUnaryResponseHandler alloc] initWithResponseHandler:handler + responseDispatchQueue:nil] + callOptions:nil]; + [call start]; + call = [_service + getFeatureWithMessage:[RTGPoint message] + responseHandler:[[GRPCUnaryResponseHandler alloc] initWithResponseHandler:handler + responseDispatchQueue:nil] + callOptions:nil]; + [call start]; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + + GRPCMutableCallOptions *options = [[GRPCMutableCallOptions alloc] init]; + options.transport = GRPCDefaultTransportImplList.core_insecure; + + _service = [[RTGRouteGuide alloc] initWithHost:kHostAddress callOptions:options]; +} + +- (void)viewDidAppear:(BOOL)animated { + self.outputLabel.text = @"RPC log:"; + self.outputLabel.numberOfLines = 0; + self.outputLabel.font = [UIFont fontWithName:@"Helvetica Neue" size:8.0]; + [self execRequest]; +} + +@end + +#pragma mark Demo: List Features + +/** + * Run the listFeatures demo. Calls listFeatures with a rectangle containing all of the features in + * the pre-generated database. Prints each response as it comes in. + */ +@interface ListFeaturesViewController : UIViewController + +@property(weak, nonatomic) IBOutlet UILabel *outputLabel; + +@end + +@implementation ListFeaturesViewController { + RTGRouteGuide *_service; +} + +- (dispatch_queue_t)dispatchQueue { + return dispatch_get_main_queue(); +} + +- (void)execRequest { + RTGRectangle *rectangle = [RTGRectangle message]; + rectangle.lo.latitude = 405E6; + rectangle.lo.longitude = -750E6; + rectangle.hi.latitude = 410E6; + rectangle.hi.longitude = -745E6; + + NSLog(@"Looking for features between %@ and %@", rectangle.lo, rectangle.hi); + GRPCUnaryProtoCall *call = [_service listFeaturesWithMessage:rectangle + responseHandler:self + callOptions:nil]; + [call start]; +} + +- (void)didReceiveProtoMessage:(GPBMessage *)message { + RTGFeature *response = (RTGFeature *)message; + if (response) { + NSString *str = + [NSString stringWithFormat:@"%@\nFound feature at %@ called %@.", self.outputLabel.text, + response.location, response.name]; + self.outputLabel.text = str; + NSLog(@"Found feature at %@ called %@.", response.location, response.name); + } +} + +- (void)didCloseWithTrailingMetadata:(NSDictionary *)trailingMetadata error:(NSError *)error { + if (error) { + NSString *str = [NSString stringWithFormat:@"%@\nRPC error: %@", self.outputLabel.text, error]; + self.outputLabel.text = str; + NSLog(@"RPC error: %@", error); + } +} + +- (void)viewDidLoad { + [super viewDidLoad]; + + GRPCMutableCallOptions *options = [[GRPCMutableCallOptions alloc] init]; + options.transport = GRPCDefaultTransportImplList.core_insecure; + + _service = [[RTGRouteGuide alloc] initWithHost:kHostAddress callOptions:options]; +} + +- (void)viewDidAppear:(BOOL)animated { + self.outputLabel.text = @"RPC log:"; + self.outputLabel.numberOfLines = 0; + self.outputLabel.font = [UIFont fontWithName:@"Helvetica Neue" size:8.0]; + [self execRequest]; +} + +@end + +#pragma mark Demo: Record Route + +/** + * Run the recordRoute demo. Sends several randomly chosen points from the pre-generated feature + * database with a variable delay in between. Prints the statistics when they are sent from the + * server. + */ +@interface RecordRouteViewController : UIViewController + +@property(weak, nonatomic) IBOutlet UILabel *outputLabel; + +@end + +@implementation RecordRouteViewController { + RTGRouteGuide *_service; +} + +- (void)execRequest { + NSString *dataBasePath = [NSBundle.mainBundle pathForResource:@"route_guide_db" ofType:@"json"]; + NSData *dataBaseContent = [NSData dataWithContentsOfFile:dataBasePath]; + NSError *error; + NSArray *features = [NSJSONSerialization JSONObjectWithData:dataBaseContent + options:0 + error:&error]; + + if (error) { + NSLog(@"Error reading database."); + NSString *str = @"Error reading database."; + self.outputLabel.text = str; + return; + } + + void (^handler)(RTGRouteSummary *response, NSError *error) = + ^(RTGRouteSummary *response, NSError *error) { + if (response) { + NSString *str = [NSString + stringWithFormat:@"%@\nFinished trip with %i points\nPassed %i features\n" + "Travelled %i meters\nIt took %i seconds", + self.outputLabel.text, response.pointCount, response.featureCount, + response.distance, response.elapsedTime]; + self.outputLabel.text = str; + NSLog(@"Finished trip with %i points", response.pointCount); + NSLog(@"Passed %i features", response.featureCount); + NSLog(@"Travelled %i meters", response.distance); + NSLog(@"It took %i seconds", response.elapsedTime); + } else { + NSString *str = + [NSString stringWithFormat:@"%@\nRPC error: %@", self.outputLabel.text, error]; + self.outputLabel.text = str; + NSLog(@"RPC error: %@", error); + } + }; + + // We can use unary response handler here because, despite the requests being a stream, the + // response of the RPC is unary. + GRPCStreamingProtoCall *call = + [_service recordRouteWithResponseHandler:[[GRPCUnaryResponseHandler alloc] + initWithResponseHandler:handler + responseDispatchQueue:nil] + callOptions:nil]; + [call start]; + for (id feature in features) { + RTGPoint *location = [RTGPoint message]; + location.longitude = [((NSNumber *)feature[@"location"][@"longitude"]) intValue]; + location.latitude = [((NSNumber *)feature[@"location"][@"latitude"]) intValue]; + NSString *str = + [NSString stringWithFormat:@"%@\nVisiting point %@", self.outputLabel.text, location]; + self.outputLabel.text = str; + NSLog(@"Visiting point %@", location); + [call writeMessage:location]; + } + [call finish]; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + + GRPCMutableCallOptions *options = [[GRPCMutableCallOptions alloc] init]; + options.transport = GRPCDefaultTransportImplList.core_insecure; + + _service = [[RTGRouteGuide alloc] initWithHost:kHostAddress callOptions:options]; +} + +- (void)viewDidAppear:(BOOL)animated { + self.outputLabel.text = @"RPC log:"; + self.outputLabel.numberOfLines = 0; + self.outputLabel.font = [UIFont fontWithName:@"Helvetica Neue" size:8.0]; + [self execRequest]; +} + +@end + +#pragma mark Demo: Route Chat + +/** + * Run the routeChat demo. Send some chat messages, and print any chat messages that are sent from + * the server. + */ +@interface RouteChatViewController : UIViewController + +@property(weak, nonatomic) IBOutlet UILabel *outputLabel; + +@end + +@implementation RouteChatViewController { + RTGRouteGuide *_service; +} + +- (dispatch_queue_t)dispatchQueue { + return dispatch_get_main_queue(); +} + +- (void)execRequest { + NSArray *notes = @[ + [RTGRouteNote noteWithMessage:@"First message" latitude:0 longitude:0], + [RTGRouteNote noteWithMessage:@"Second message" latitude:0 longitude:1], + [RTGRouteNote noteWithMessage:@"Third message" latitude:1 longitude:0], + [RTGRouteNote noteWithMessage:@"Fourth message" latitude:0 longitude:0] + ]; + + GRPCStreamingProtoCall *call = [_service routeChatWithResponseHandler:self callOptions:nil]; + [call start]; + for (RTGRouteNote *note in notes) { + [call writeMessage:note]; + } + [call finish]; +} + +- (void)didReceiveProtoMessage:(GPBMessage *)message { + RTGRouteNote *note = (RTGRouteNote *)message; + if (note) { + NSString *str = [NSString stringWithFormat:@"%@\nGot message %@ at %@", self.outputLabel.text, + note.message, note.location]; + self.outputLabel.text = str; + NSLog(@"Got message %@ at %@", note.message, note.location); + } +} + +- (void)didCloseWithTrailingMetadata:(NSDictionary *)trailingMetadata error:(NSError *)error { + if (!error) { + NSLog(@"Chat ended."); + } else { + NSString *str = [NSString stringWithFormat:@"%@\nRPC error: %@", self.outputLabel.text, error]; + self.outputLabel.text = str; + NSLog(@"RPC error: %@", error); + } +} + +- (void)viewDidLoad { + [super viewDidLoad]; + + GRPCMutableCallOptions *options = [[GRPCMutableCallOptions alloc] init]; + options.transport = GRPCDefaultTransportImplList.core_insecure; + + _service = [[RTGRouteGuide alloc] initWithHost:kHostAddress callOptions:options]; +} + +- (void)viewDidAppear:(BOOL)animated { + // TODO(makarandd): Set these properties through UI builder + self.outputLabel.text = @"RPC log:"; + self.outputLabel.numberOfLines = 0; + self.outputLabel.font = [UIFont fontWithName:@"Helvetica Neue" size:8.0]; + [self execRequest]; +} + +@end diff --git a/examples/objective-c/route_guide/route_guide_db.json b/examples/objective-c/route_guide/route_guide_db.json new file mode 100644 index 00000000..9caebaa4 --- /dev/null +++ b/examples/objective-c/route_guide/route_guide_db.json @@ -0,0 +1,121 @@ +[{ + "location": { + "latitude": 407838351, + "longitude": -746143763 + }, + "name": "Patriots Path, Mendham, NJ 07945, USA" +}, { + "location": { + "latitude": 408122808, + "longitude": -743999179 + }, + "name": "101 New Jersey 10, Whippany, NJ 07981, USA" +}, { + "location": { + "latitude": 413628156, + "longitude": -749015468 + }, + "name": "U.S. 6, Shohola, PA 18458, USA" +}, { + "location": { + "latitude": 419999544, + "longitude": -740371136 + }, + "name": "5 Conners Road, Kingston, NY 12401, USA" +}, { + "location": { + "latitude": 414008389, + "longitude": -743951297 + }, + "name": "Mid Hudson Psychiatric Center, New Hampton, NY 10958, USA" +}, { + "location": { + "latitude": 419611318, + "longitude": -746524769 + }, + "name": "287 Flugertown Road, Livingston Manor, NY 12758, USA" +}, { + "location": { + "latitude": 406109563, + "longitude": -742186778 + }, + "name": "4001 Tremley Point Road, Linden, NJ 07036, USA" +}, { + "location": { + "latitude": 416802456, + "longitude": -742370183 + }, + "name": "352 South Mountain Road, Wallkill, NY 12589, USA" +}, { + "location": { + "latitude": 412950425, + "longitude": -741077389 + }, + "name": "Bailey Turn Road, Harriman, NY 10926, USA" +}, { + "location": { + "latitude": 412144655, + "longitude": -743949739 + }, + "name": "193-199 Wawayanda Road, Hewitt, NJ 07421, USA" +}, { + "location": { + "latitude": 404306372, + "longitude": -741079661 + }, + "name": "" +}, { + "location": { + "latitude": 403966326, + "longitude": -748519297 + }, + "name": "" +}, { + "location": { + "latitude": 405002031, + "longitude": -748407866 + }, + "name": "" +}, { + "location": { + "latitude": 409532885, + "longitude": -742200683 + }, + "name": "" +}, { + "location": { + "latitude": 416851321, + "longitude": -742674555 + }, + "name": "" +}, { + "location": { + "latitude": 406411633, + "longitude": -741722051 + }, + "name": "3387 Richmond Terrace, Staten Island, NY 10303, USA" +}, { + "location": { + "latitude": 413069058, + "longitude": -744597778 + }, + "name": "261 Van Sickle Road, Goshen, NY 10924, USA" +}, { + "location": { + "latitude": 418465462, + "longitude": -746859398 + }, + "name": "" +}, { + "location": { + "latitude": 411733222, + "longitude": -744228360 + }, + "name": "" +}, { + "location": { + "latitude": 410248224, + "longitude": -747127767 + }, + "name": "3 Hasta Way, Newton, NJ 07860, USA" +}] diff --git a/examples/php/.gitignore b/examples/php/.gitignore new file mode 100644 index 00000000..d8a7996a --- /dev/null +++ b/examples/php/.gitignore @@ -0,0 +1,2 @@ +composer.lock +vendor/ diff --git a/examples/php/README.md b/examples/php/README.md new file mode 100644 index 00000000..75b9e6fb --- /dev/null +++ b/examples/php/README.md @@ -0,0 +1,56 @@ +# gRPC PHP Quick Start Example + + +## Prerequisites + +This requires `php` >= 5.5, `pecl`, `composer` + +## Install + + - Install the `grpc` extension + + ```sh + $ [sudo] pecl install grpc + ``` + + - Install the `protoc` compiler plugin `grpc_php_plugin` + + ```sh + $ git clone -b RELEASE_TAG_HERE https://github.com/grpc/grpc + $ cd grpc + $ make grpc_php_plugin + ``` + + - Install the `grpc/grpc` composer package + + ``` + $ cd examples/php + $ composer install + ``` + +## Try it! + + - Run the server + + Please follow the instruction in [Node][] to run the server + ``` + $ cd examples/node + $ npm install + $ cd dynamic_codegen or cd static_codegen + $ node greeter_server.js + ``` + + - Generate proto files and run the client + + ``` + $ cd examples/php + $ ./greeter_proto_gen.sh + $ ./run_greeter_client.sh + ``` + +## In-depth Tutorial + +You can find a more detailed tutorial in [gRPC Basics: PHP][] + +[Node]:https://github.com/grpc/grpc/tree/master/examples/node +[gRPC Basics: PHP]:https://grpc.io/docs/tutorials/basic/php.html diff --git a/examples/php/composer.json b/examples/php/composer.json new file mode 100644 index 00000000..927f7df2 --- /dev/null +++ b/examples/php/composer.json @@ -0,0 +1,15 @@ +{ + "name": "grpc/grpc-demo", + "description": "gRPC example for PHP", + "require": { + "grpc/grpc": "^v1.3.0", + "google/protobuf": "^v3.3.0" + }, + "autoload": { + "psr-4": { + "Routeguide\\": "route_guide/Routeguide/", + "GPBMetadata\\": ["GPBMetadata/","route_guide/GPBMetadata/"], + "Helloworld\\": "Helloworld/" + } + } +} diff --git a/examples/php/echo/README.md b/examples/php/echo/README.md new file mode 100644 index 00000000..c34ea468 --- /dev/null +++ b/examples/php/echo/README.md @@ -0,0 +1,86 @@ + +# gRPC PHP End-to-End Examples + +This page shows a number of ways to create a PHP gRPC client and connect with +a gRPC backend service. + + +## Run the Server + +For all the following examples, we use a simple gRPC server, written in Node. + +```sh +$ git clone https://github.com/grpc/grpc-web +$ cd grpc-web +$ docker-compose build common node-server +$ docker run -d -p 9090:9090 --name node-server grpcweb/node-server +``` + + +## Install the gRPC PECL extension + +All the following commands are assumed to be run from this current directory. + +```sh +$ cd grpc/examples/php/echo +``` + + +In order to build a PHP gRPC client, we need to install the `grpc` extension +first. + +```sh +$ docker build -t grpc-php/base -f ./base.Dockerfile . +``` + + +## CLI + + +Let's first build a simple CLI gRPC client: + +```sh +$ docker build -t grpc-php/echo-client -f ./cli.Dockerfile . +$ docker run -it --rm --link node-server:node-server grpc-php/echo-client +$ php client.php +``` + + + +## Apache + + +Now let's see how the gRPC PHP client can run with Apache: + +```sh +$ docker build -t grpc-php/apache -f ./apache.Dockerfile . +$ docker run -it --rm --link node-server:node-server -p 80:80 grpc-php/apache +``` + +Open the browser to `http://localhost`. + + + +## Nginx + FPM + + +We can also try running PHP-FPM and put Nginx in front of it. + + +The PHP-FPM part: + +```sh +$ docker build -t grpc-php/fpm -f ./fpm.Dockerfile . +$ docker run -it --rm --link node-server:node-server -p 9000:9000 \ + --name fpm grpc-php/fpm +``` + +The Nginx part: + +```sh +$ docker run -it --rm -v $(pwd)/nginx.conf:/etc/nginx/conf.d/default.conf:ro \ + --link fpm:fpm -p 80:80 nginx:1.17.4 +``` + + +Open the browser to `http://localhost`. diff --git a/examples/php/echo/apache.Dockerfile b/examples/php/echo/apache.Dockerfile new file mode 100644 index 00000000..ed3f01b4 --- /dev/null +++ b/examples/php/echo/apache.Dockerfile @@ -0,0 +1,51 @@ +# Copyright 2019 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +FROM composer:1.8.6 as composer + + +FROM grpc-php/base as grpc-base + + +FROM php:7.2-apache-stretch + +RUN apt-get -qq update && apt-get -qq install -y git + + +COPY --from=composer /usr/bin/composer /usr/bin/composer + +COPY --from=grpc-base /usr/local/bin/protoc /usr/local/bin/protoc + +COPY --from=grpc-base /github/grpc/bins/opt/grpc_php_plugin \ + /usr/local/bin/protoc-gen-grpc + +COPY --from=grpc-base \ + /usr/local/lib/php/extensions/no-debug-non-zts-20170718/grpc.so \ + /usr/local/lib/php/extensions/no-debug-non-zts-20170718/grpc.so + + +RUN docker-php-ext-enable grpc + + +WORKDIR /var/www/html + +COPY client.php ./index.php +COPY composer.json . +COPY echo.proto . + +RUN chmod 644 index.php + +RUN protoc -I=. echo.proto --php_out=. --grpc_out=. + +RUN composer install diff --git a/examples/php/echo/base.Dockerfile b/examples/php/echo/base.Dockerfile new file mode 100644 index 00000000..c64876f6 --- /dev/null +++ b/examples/php/echo/base.Dockerfile @@ -0,0 +1,40 @@ +# Copyright 2019 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +FROM php:7.2-stretch + +RUN apt-get -qq update && apt-get -qq install -y \ + autoconf automake curl git libtool \ + pkg-config unzip zlib1g-dev + +ARG MAKEFLAGS=-j8 + + +WORKDIR /tmp + +RUN curl -sSL https://github.com/protocolbuffers/protobuf/releases/download/v3.8.0/\ +protoc-3.8.0-linux-x86_64.zip -o /tmp/protoc.zip && \ + unzip -qq protoc.zip && \ + cp /tmp/bin/protoc /usr/local/bin/protoc + + +WORKDIR /github/grpc + +RUN git clone https://github.com/grpc/grpc . && \ + git submodule update --init && \ + cd third_party/protobuf && git submodule update --init + +RUN make grpc_php_plugin + +RUN pecl install grpc diff --git a/examples/php/echo/cli.Dockerfile b/examples/php/echo/cli.Dockerfile new file mode 100644 index 00000000..ef3d3b3a --- /dev/null +++ b/examples/php/echo/cli.Dockerfile @@ -0,0 +1,52 @@ +# Copyright 2019 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +FROM composer:1.8.6 as composer + + +FROM grpc-php/base as grpc-base + + +FROM php:7.2-stretch + +RUN apt-get -qq update && apt-get -qq install -y git + + +COPY --from=composer /usr/bin/composer /usr/bin/composer + +COPY --from=grpc-base /usr/local/bin/protoc /usr/local/bin/protoc + +COPY --from=grpc-base /github/grpc/bins/opt/grpc_php_plugin \ + /usr/local/bin/protoc-gen-grpc + +COPY --from=grpc-base \ + /usr/local/lib/php/extensions/no-debug-non-zts-20170718/grpc.so \ + /usr/local/lib/php/extensions/no-debug-non-zts-20170718/grpc.so + + +RUN docker-php-ext-enable grpc + + +WORKDIR /github/grpc-php/examples/echo + +COPY client.php . +COPY composer.json . +COPY echo.proto . + +RUN protoc -I=. echo.proto --php_out=. --grpc_out=. + +RUN composer install + + +CMD ["/bin/bash"] diff --git a/examples/php/echo/client.php b/examples/php/echo/client.php new file mode 100644 index 00000000..b4829928 --- /dev/null +++ b/examples/php/echo/client.php @@ -0,0 +1,45 @@ + Grpc\ChannelCredentials::createInsecure(), +]); + + +// unary call +$request = new Grpc\Gateway\Testing\EchoRequest(); +$request->setMessage("Hello World!"); + +list($response, $status) = $client->Echo($request)->wait(); + +echo $response->getMessage()."\n"; + + +// server streaming call +$stream_request = new Grpc\Gateway\Testing\ServerStreamingEchoRequest(); +$stream_request->setMessage("stream message"); +$stream_request->setMessageCount(5); + +$responses = $client->ServerStreamingEcho($stream_request)->responses(); + +foreach ($responses as $response) { + echo $response->getMessage()."\n"; +} diff --git a/examples/php/echo/composer.json b/examples/php/echo/composer.json new file mode 100644 index 00000000..c74e5527 --- /dev/null +++ b/examples/php/echo/composer.json @@ -0,0 +1,12 @@ +{ + "name": "grpc-php/echo-example", + "require": { + "grpc/grpc": "^v1.22.0", + "google/protobuf": "^3.7.0" + }, + "autoload": { + "psr-4": { + "": "./" + } + } +} diff --git a/examples/php/echo/echo.proto b/examples/php/echo/echo.proto new file mode 100644 index 00000000..7823f54c --- /dev/null +++ b/examples/php/echo/echo.proto @@ -0,0 +1,100 @@ +// Copyright 2019 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package grpc.gateway.testing; + +message Empty {} + +message EchoRequest { + string message = 1; +} + +message EchoResponse { + string message = 1; + int32 message_count = 2; +} + +// Request type for server side streaming echo. +message ServerStreamingEchoRequest { + // Message string for server streaming request. + string message = 1; + + // The total number of messages to be generated before the server + // closes the stream; default is 10. + int32 message_count = 2; + + // The interval (ms) between two server messages. The server implementation + // may enforce some minimum interval (e.g. 100ms) to avoid message overflow. + int32 message_interval = 3; +} + +// Response type for server streaming response. +message ServerStreamingEchoResponse { + // Response message. + string message = 1; +} + +// Request type for client side streaming echo. +message ClientStreamingEchoRequest { + // A special value "" indicates that there's no further messages. + string message = 1; +} + +// Response type for client side streaming echo. +message ClientStreamingEchoResponse { + // Total number of client messages that have been received. + int32 message_count = 1; +} + +// A simple echo service. +service EchoService { + // One request followed by one response + // The server returns the client message as-is. + rpc Echo(EchoRequest) returns (EchoResponse); + + // Sends back abort status. + rpc EchoAbort(EchoRequest) returns (EchoResponse) {} + + // One empty request, ZERO processing, followed by one empty response + // (minimum effort to do message serialization). + rpc NoOp(Empty) returns (Empty); + + // One request followed by a sequence of responses (streamed download). + // The server will return the same client message repeatedly. + rpc ServerStreamingEcho(ServerStreamingEchoRequest) + returns (stream ServerStreamingEchoResponse); + + // One request followed by a sequence of responses (streamed download). + // The server abort directly. + rpc ServerStreamingEchoAbort(ServerStreamingEchoRequest) + returns (stream ServerStreamingEchoResponse) {} + + // A sequence of requests followed by one response (streamed upload). + // The server returns the total number of messages as the result. + rpc ClientStreamingEcho(stream ClientStreamingEchoRequest) + returns (ClientStreamingEchoResponse); + + // A sequence of requests with each message echoed by the server immediately. + // The server returns the same client messages in order. + // E.g. this is how the speech API works. + rpc FullDuplexEcho(stream EchoRequest) returns (stream EchoResponse); + + // A sequence of requests followed by a sequence of responses. + // The server buffers all the client messages and then returns the same + // client messages one by one after the client half-closes the stream. + // This is how an image recognition API may work. + rpc HalfDuplexEcho(stream EchoRequest) returns (stream EchoResponse); +} diff --git a/examples/php/echo/fpm.Dockerfile b/examples/php/echo/fpm.Dockerfile new file mode 100644 index 00000000..6e2df8b0 --- /dev/null +++ b/examples/php/echo/fpm.Dockerfile @@ -0,0 +1,51 @@ +# Copyright 2019 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +FROM composer:1.8.6 as composer + + +FROM grpc-php/base as grpc-base + + +FROM php:7.2-fpm-stretch + +RUN apt-get -qq update && apt-get -qq install -y git + + +COPY --from=composer /usr/bin/composer /usr/bin/composer + +COPY --from=grpc-base /usr/local/bin/protoc /usr/local/bin/protoc + +COPY --from=grpc-base /github/grpc/bins/opt/grpc_php_plugin \ + /usr/local/bin/protoc-gen-grpc + +COPY --from=grpc-base \ + /usr/local/lib/php/extensions/no-debug-non-zts-20170718/grpc.so \ + /usr/local/lib/php/extensions/no-debug-non-zts-20170718/grpc.so + + +RUN docker-php-ext-enable grpc + + +WORKDIR /var/www/html + +COPY client.php ./index.php +COPY composer.json . +COPY echo.proto . + +RUN chmod 644 index.php + +RUN protoc -I=. echo.proto --php_out=. --grpc_out=. + +RUN composer install diff --git a/examples/php/echo/nginx.conf b/examples/php/echo/nginx.conf new file mode 100644 index 00000000..ad29815f --- /dev/null +++ b/examples/php/echo/nginx.conf @@ -0,0 +1,23 @@ +server { + listen 80; + server_name localhost; + root /var/www/html; + + index index.php; + + location / { + try_files $uri $uri/ /index.php?$args; + } + + location ~ [^/]\.php(/|$) { + fastcgi_split_path_info ^(.+?\.php)(/.*)$; + + include fastcgi_params; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + fastcgi_param PATH_INFO $fastcgi_path_info; + fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; + + fastcgi_pass fpm:9000; + fastcgi_index index.php; + } +} diff --git a/examples/php/greeter_client.php b/examples/php/greeter_client.php new file mode 100644 index 00000000..1c7ec2a2 --- /dev/null +++ b/examples/php/greeter_client.php @@ -0,0 +1,44 @@ + Grpc\ChannelCredentials::createInsecure(), + ]); + $request = new Helloworld\HelloRequest(); + $request->setName($name); + list($response, $status) = $client->SayHello($request)->wait(); + if ($status->code !== Grpc\STATUS_OK) { + echo "ERROR: " . $status->code . ", " . $status->details . PHP_EOL; + exit(1); + } + echo $response->getMessage() . PHP_EOL; +} + +$name = !empty($argv[1]) ? $argv[1] : 'world'; +$hostname = !empty($argv[2]) ? $argv[2] : 'localhost:50051'; +greet($hostname, $name); diff --git a/examples/php/greeter_proto_gen.sh b/examples/php/greeter_proto_gen.sh new file mode 100755 index 00000000..4322bbda --- /dev/null +++ b/examples/php/greeter_proto_gen.sh @@ -0,0 +1,16 @@ +#!/bin/bash +# Copyright 2017 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +protoc --proto_path=../protos --php_out=. --grpc_out=. --plugin=protoc-gen-grpc=../../bins/opt/grpc_php_plugin ../protos/helloworld.proto diff --git a/examples/php/route_guide/README.md b/examples/php/route_guide/README.md new file mode 100644 index 00000000..6bea70de --- /dev/null +++ b/examples/php/route_guide/README.md @@ -0,0 +1,6 @@ +# gRPC Basics: PHP sample code + +The files in this folder are the samples used in [gRPC Basics: PHP][], +a detailed tutorial for using gRPC in PHP. + +[gRPC Basics: PHP]:https://grpc.io/docs/tutorials/basic/php.html diff --git a/examples/php/route_guide/route_guide_client.php b/examples/php/route_guide/route_guide_client.php new file mode 100644 index 00000000..92b2bace --- /dev/null +++ b/examples/php/route_guide/route_guide_client.php @@ -0,0 +1,212 @@ + Grpc\ChannelCredentials::createInsecure(), +]); + +function printFeature($feature) +{ + $name = $feature->getName(); + if (!$name) { + $name_str = 'no feature'; + } else { + $name_str = "feature called $name"; + } + echo sprintf( + "Found %s \n at %f, %f\n", + $name_str, + $feature->getLocation()->getLatitude() / COORD_FACTOR, + $feature->getLocation()->getLongitude() / COORD_FACTOR + ); +} + +/** + * Run the getFeature demo. Calls getFeature with a point known to have a + * feature and a point known not to have a feature. + */ +function runGetFeature() +{ + echo "Running GetFeature...\n"; + global $client; + + $point = new Routeguide\Point(); + $points = array( + array(409146138, -746188906), + array(0, 0), + ); + + foreach ($points as $p) { + $point->setLatitude($p[0]); + $point->setLongitude($p[1]); + // make a unary grpc call + list($feature, $status) = $client->GetFeature($point)->wait(); + printFeature($feature); + } +} + +/** + * Run the listFeatures demo. Calls listFeatures with a rectangle + * containing all of the features in the pre-generated + * database. Prints each response as it comes in. + */ +function runListFeatures() +{ + echo "Running ListFeatures...\n"; + global $client; + + $lo_point = new Routeguide\Point(); + $hi_point = new Routeguide\Point(); + + $lo_point->setLatitude(400000000); + $lo_point->setLongitude(-750000000); + $hi_point->setLatitude(420000000); + $hi_point->setLongitude(-730000000); + + $rectangle = new Routeguide\Rectangle(); + $rectangle->setLo($lo_point); + $rectangle->setHi($hi_point); + + // start the server streaming call + $call = $client->ListFeatures($rectangle); + // an iterator over the server streaming responses + $features = $call->responses(); + foreach ($features as $feature) { + printFeature($feature); + } +} + +/** + * Run the recordRoute demo. Sends several randomly chosen points from the + * pre-generated feature database with a variable delay in between. Prints + * the statistics when they are sent from the server. + */ +function runRecordRoute() +{ + echo "Running RecordRoute...\n"; + global $client, $argv; + + // start the client streaming call + $call = $client->RecordRoute(); + + $db = json_decode(file_get_contents($argv[1]), true); + $num_points_in_db = count($db); + $num_points = 10; + for ($i = 0; $i < $num_points; ++$i) { + $point = new Routeguide\Point(); + $index = rand(0, $num_points_in_db - 1); + $lat = $db[$index]['location']['latitude']; + $long = $db[$index]['location']['longitude']; + $feature_name = $db[$index]['name']; + $point->setLatitude($lat); + $point->setLongitude($long); + echo sprintf( + "Visiting point %f, %f,\n with feature name: %s\n", + $lat / COORD_FACTOR, + $long / COORD_FACTOR, + $feature_name ? $feature_name : '' + ); + usleep(rand(300000, 800000)); + $call->write($point); + } + list($route_summary, $status) = $call->wait(); + echo sprintf( + "Finished trip with %d points\nPassed %d features\n". + "Travelled %d meters\nIt took %d seconds\n", + $route_summary->getPointCount(), + $route_summary->getFeatureCount(), + $route_summary->getDistance(), + $route_summary->getElapsedTime() + ); +} + +/** + * Run the routeChat demo. Send some chat messages, and print any chat + * messages that are sent from the server. + */ +function runRouteChat() +{ + echo "Running RouteChat...\n"; + global $client; + + // start the bidirectional streaming call + $call = $client->RouteChat(); + + $notes = array( + array(1, 1, 'first message'), + array(1, 2, 'second message'), + array(2, 1, 'third message'), + array(1, 1, 'fourth message'), + array(1, 1, 'fifth message'), + ); + + foreach ($notes as $n) { + $point = new Routeguide\Point(); + $point->setLatitude($lat = $n[0]); + $point->setLongitude($long = $n[1]); + + $route_note = new Routeguide\RouteNote(); + $route_note->setLocation($point); + $route_note->setMessage($message = $n[2]); + + echo sprintf( + "Sending message: '%s' at (%d, %d)\n", + $message, + $lat, + $long + ); + // send a bunch of messages to the server + $call->write($route_note); + } + $call->writesDone(); + + // read from the server until there's no more + while ($route_note_reply = $call->read()) { + echo sprintf( + "Previous left message at (%d, %d): '%s'\n", + $route_note_reply->getLocation()->getLatitude(), + $route_note_reply->getLocation()->getLongitude(), + $route_note_reply->getMessage() + ); + } +} + +/** + * Run all of the demos in order. + */ +function main() +{ + runGetFeature(); + runListFeatures(); + runRecordRoute(); + runRouteChat(); +} + +if (empty($argv[1])) { + echo 'Usage: php -d extension=grpc.so route_guide_client.php '. + "\n"; + exit(1); +} +main(); diff --git a/examples/php/route_guide/route_guide_proto_gen.sh b/examples/php/route_guide/route_guide_proto_gen.sh new file mode 100755 index 00000000..bfd7cdb7 --- /dev/null +++ b/examples/php/route_guide/route_guide_proto_gen.sh @@ -0,0 +1,16 @@ +#!/bin/bash +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +protoc --proto_path=./../../protos --php_out=./ --grpc_out=./ --plugin=protoc-gen-grpc=./../../../bins/opt/grpc_php_plugin ./../../protos/route_guide.proto diff --git a/examples/php/route_guide/run_route_guide_client.sh b/examples/php/route_guide/run_route_guide_client.sh new file mode 100755 index 00000000..4f1013f5 --- /dev/null +++ b/examples/php/route_guide/run_route_guide_client.sh @@ -0,0 +1,20 @@ +#!/bin/bash +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -e +cd $(dirname $0) +php -d extension=grpc.so -d max_execution_time=300 \ + route_guide_client.php \ + ../../node/static_codegen/route_guide/route_guide_db.json diff --git a/examples/php/run_greeter_client.sh b/examples/php/run_greeter_client.sh new file mode 100755 index 00000000..457b692b --- /dev/null +++ b/examples/php/run_greeter_client.sh @@ -0,0 +1,19 @@ +#!/bin/bash +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -e +cd $(dirname $0) +php -d extension=grpc.so -d max_execution_time=300 \ + greeter_client.php $1 diff --git a/examples/protos/README.md b/examples/protos/README.md new file mode 100644 index 00000000..48df7c89 --- /dev/null +++ b/examples/protos/README.md @@ -0,0 +1,8 @@ +# Example protos + +## Contents + +- [helloworld.proto] + - The simple example used in the overview. +- [route_guide.proto] + - An example service described in detail in the tutorial. diff --git a/examples/protos/auth_sample.proto b/examples/protos/auth_sample.proto new file mode 100644 index 00000000..7e63602f --- /dev/null +++ b/examples/protos/auth_sample.proto @@ -0,0 +1,42 @@ +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package grpc.testing; + +option objc_class_prefix = "AUTH"; + +// Unary request. +message Request { + // Whether Response should include username. + bool fill_username = 4; + + // Whether Response should include OAuth scope. + bool fill_oauth_scope = 5; +} + +// Unary response, as configured by the request. +message Response { + // The user the request came from, for verifying authentication was + // successful. + string username = 2; + // OAuth scope. + string oauth_scope = 3; +} + +service TestService { + // One request followed by one response. + rpc UnaryCall(Request) returns (Response); +} diff --git a/examples/protos/hellostreamingworld.proto b/examples/protos/hellostreamingworld.proto new file mode 100644 index 00000000..8a322bd6 --- /dev/null +++ b/examples/protos/hellostreamingworld.proto @@ -0,0 +1,39 @@ +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +option java_package = "ex.grpc"; +option objc_class_prefix = "HSW"; + +package hellostreamingworld; + +// The greeting service definition. +service MultiGreeter { + // Sends multiple greetings + rpc sayHello (HelloRequest) returns (stream HelloReply) {} +} + +// The request message containing the user's name and how many greetings +// they want. +message HelloRequest { + string name = 1; + string num_greetings = 2; +} + +// A response message containing a greeting +message HelloReply { + string message = 1; +} + diff --git a/examples/protos/helloworld.proto b/examples/protos/helloworld.proto new file mode 100644 index 00000000..be878ce2 --- /dev/null +++ b/examples/protos/helloworld.proto @@ -0,0 +1,38 @@ +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +option java_multiple_files = true; +option java_package = "io.grpc.examples.helloworld"; +option java_outer_classname = "HelloWorldProto"; +option objc_class_prefix = "HLW"; + +package helloworld; + +// The greeting service definition. +service Greeter { + // Sends a greeting + rpc SayHello (HelloRequest) returns (HelloReply) {} +} + +// The request message containing the user's name. +message HelloRequest { + string name = 1; +} + +// The response message containing the greetings +message HelloReply { + string message = 1; +} diff --git a/examples/protos/keyvaluestore.proto b/examples/protos/keyvaluestore.proto new file mode 100644 index 00000000..74ad57e0 --- /dev/null +++ b/examples/protos/keyvaluestore.proto @@ -0,0 +1,33 @@ +// Copyright 2018 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package keyvaluestore; + +// A simple key-value storage service +service KeyValueStore { + // Provides a value for each key request + rpc GetValues (stream Request) returns (stream Response) {} +} + +// The request message containing the key +message Request { + string key = 1; +} + +// The response message containing the value associated with the key +message Response { + string value = 1; +} diff --git a/examples/protos/route_guide.proto b/examples/protos/route_guide.proto new file mode 100644 index 00000000..b519f558 --- /dev/null +++ b/examples/protos/route_guide.proto @@ -0,0 +1,111 @@ +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +option java_multiple_files = true; +option java_package = "io.grpc.examples.routeguide"; +option java_outer_classname = "RouteGuideProto"; +option objc_class_prefix = "RTG"; + +package routeguide; + +// Interface exported by the server. +service RouteGuide { + // A simple RPC. + // + // Obtains the feature at a given position. + // + // A feature with an empty name is returned if there's no feature at the given + // position. + rpc GetFeature(Point) returns (Feature) {} + + // A server-to-client streaming RPC. + // + // Obtains the Features available within the given Rectangle. Results are + // streamed rather than returned at once (e.g. in a response message with a + // repeated field), as the rectangle may cover a large area and contain a + // huge number of features. + rpc ListFeatures(Rectangle) returns (stream Feature) {} + + // A client-to-server streaming RPC. + // + // Accepts a stream of Points on a route being traversed, returning a + // RouteSummary when traversal is completed. + rpc RecordRoute(stream Point) returns (RouteSummary) {} + + // A Bidirectional streaming RPC. + // + // Accepts a stream of RouteNotes sent while a route is being traversed, + // while receiving other RouteNotes (e.g. from other users). + rpc RouteChat(stream RouteNote) returns (stream RouteNote) {} +} + +// Points are represented as latitude-longitude pairs in the E7 representation +// (degrees multiplied by 10**7 and rounded to the nearest integer). +// Latitudes should be in the range +/- 90 degrees and longitude should be in +// the range +/- 180 degrees (inclusive). +message Point { + int32 latitude = 1; + int32 longitude = 2; +} + +// A latitude-longitude rectangle, represented as two diagonally opposite +// points "lo" and "hi". +message Rectangle { + // One corner of the rectangle. + Point lo = 1; + + // The other corner of the rectangle. + Point hi = 2; +} + +// A feature names something at a given point. +// +// If a feature could not be named, the name is empty. +message Feature { + // The name of the feature. + string name = 1; + + // The point where the feature is detected. + Point location = 2; +} + +// A RouteNote is a message sent while at a given point. +message RouteNote { + // The location from which the message is sent. + Point location = 1; + + // The message to be sent. + string message = 2; +} + +// A RouteSummary is received in response to a RecordRoute rpc. +// +// It contains the number of individual points received, the number of +// detected features, and the total distance covered as the cumulative sum of +// the distance between each point. +message RouteSummary { + // The number of points received. + int32 point_count = 1; + + // The number of known features passed while traversing the route. + int32 feature_count = 2; + + // The distance covered in metres. + int32 distance = 3; + + // The duration of the traversal in seconds. + int32 elapsed_time = 4; +} diff --git a/examples/python/README.md b/examples/python/README.md new file mode 100644 index 00000000..63d61e43 --- /dev/null +++ b/examples/python/README.md @@ -0,0 +1 @@ +[This code's documentation lives on the grpc.io site.](https://grpc.io/docs/quickstart/python.html) diff --git a/examples/python/auth/BUILD.bazel b/examples/python/auth/BUILD.bazel new file mode 100644 index 00000000..3838b39e --- /dev/null +++ b/examples/python/auth/BUILD.bazel @@ -0,0 +1,69 @@ +# Copyright 2019 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +filegroup( + name = "_credentials_files", + testonly = 1, + srcs = [ + "credentials/localhost.crt", + "credentials/localhost.key", + "credentials/root.crt", + ], +) + +py_library( + name = "_credentials", + testonly = 1, + srcs = ["_credentials.py"], + data = [":_credentials_files"], +) + +py_binary( + name = "customized_auth_client", + testonly = 1, + srcs = ["customized_auth_client.py"], + python_version = "PY3", + deps = [ + ":_credentials", + "//examples:helloworld_py_pb2", + "//examples:helloworld_py_pb2_grpc", + "//src/python/grpcio/grpc:grpcio", + ], +) + +py_binary( + name = "customized_auth_server", + testonly = 1, + srcs = ["customized_auth_server.py"], + python_version = "PY3", + deps = [ + ":_credentials", + "//examples:helloworld_py_pb2", + "//examples:helloworld_py_pb2_grpc", + "//src/python/grpcio/grpc:grpcio", + ], +) + +py_test( + name = "_auth_example_test", + srcs = ["test/_auth_example_test.py"], + python_version = "PY3", + deps = [ + ":_credentials", + ":customized_auth_client", + ":customized_auth_server", + "//examples:helloworld_py_pb2", + "//src/python/grpcio/grpc:grpcio", + ], +) diff --git a/examples/python/auth/README.md b/examples/python/auth/README.md new file mode 100644 index 00000000..2fd044b8 --- /dev/null +++ b/examples/python/auth/README.md @@ -0,0 +1,112 @@ +# Authentication Extension Example in gRPC Python + +## Check Our Guide First + +For most common usage of authentication in gRPC Python, please see our +[Authentication](https://grpc.io/docs/guides/auth/) guide's Python section. The +Guide includes following scenarios: + +1. Server SSL credential setup +2. Client SSL credential setup +3. Authenticate with Google using a JWT +4. Authenticate with Google using an Oauth2 token + +Also, the guide talks about gRPC specific credential types. + +### Channel credentials + +Channel credentials are attached to a `Channel` object, the most common use case +are SSL credentials. + +### Call credentials + +Call credentials are attached to a `Call` object (corresponding to an RPC). +Under the hood, the call credentials is a function that takes in information of +the RPC and modify metadata through callback. + +## About This Example + +This example focuses on extending gRPC authentication mechanism: +1) Customize authentication plugin; +2) Composite client side credentials; +3) Validation through interceptor on server side. + +## AuthMetadataPlugin: Manipulate metadata for each call + +Unlike TLS/SSL based authentication, the authentication extension in gRPC Python +lives at a much higher level of networking. It relies on the transmission of +metadata (HTTP Header) between client and server, instead of alternating the +transport protocol. + +gRPC Python provides a way to intercept an RPC and append authentication related +metadata through +[`AuthMetadataPlugin`](https://grpc.github.io/grpc/python/grpc.html#grpc.AuthMetadataPlugin). +Those in need of a custom authentication method may simply provide a concrete +implementation of the following interface: + +```Python +class AuthMetadataPlugin: + """A specification for custom authentication.""" + + def __call__(self, context, callback): + """Implements authentication by passing metadata to a callback. + + Implementations of this method must not block. + + Args: + context: An AuthMetadataContext providing information on the RPC that + the plugin is being called to authenticate. + callback: An AuthMetadataPluginCallback to be invoked either + synchronously or asynchronously. + """ +``` + +Then pass the instance of the concrete implementation to +`grpc.metadata_call_credentials` function to be converted into a +`CallCredentials` object. Please NOTE that it is possible to pass a Python +function object directly, but we recommend to inherit from the base class to +ensure implementation correctness. + + +```Python +def metadata_call_credentials(metadata_plugin, name=None): + """Construct CallCredentials from an AuthMetadataPlugin. + + Args: + metadata_plugin: An AuthMetadataPlugin to use for authentication. + name: An optional name for the plugin. + + Returns: + A CallCredentials. + """ +``` + +The `CallCredentials` object can be passed directly into an RPC like: + +```Python +call_credentials = grpc.metadata_call_credentials(my_foo_plugin) +stub.FooRpc(request, credentials=call_credentials) +``` + +Or you can use `ChannelCredentials` and `CallCredentials` at the same time by +combining them: + +```Python +channel_credentials = ... +call_credentials = ... +composite_credentials = grpc.composite_channel_credentials( + channel_credential, + call_credentials) +channel = grpc.secure_channel(server_address, composite_credentials) +``` + +It is also possible to apply multiple `CallCredentials` to a single RPC: + +```Python +call_credentials_foo = ... +call_credentials_bar = ... +call_credentials = grpc.composite_call_credentials( + call_credentials_foo, + call_credentials_bar) +stub.FooRpc(request, credentials=call_credentials) +``` diff --git a/examples/python/auth/_credentials.py b/examples/python/auth/_credentials.py new file mode 100644 index 00000000..732587b7 --- /dev/null +++ b/examples/python/auth/_credentials.py @@ -0,0 +1,31 @@ +# Copyright 2019 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Loading SSL credentials for gRPC Python authentication example.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os + + +def _load_credential_from_file(filepath): + real_path = os.path.join(os.path.dirname(__file__), filepath) + with open(real_path, 'rb') as f: + return f.read() + + +SERVER_CERTIFICATE = _load_credential_from_file('credentials/localhost.crt') +SERVER_CERTIFICATE_KEY = _load_credential_from_file('credentials/localhost.key') +ROOT_CERTIFICATE = _load_credential_from_file('credentials/root.crt') diff --git a/examples/python/auth/credentials/localhost.crt b/examples/python/auth/credentials/localhost.crt new file mode 100644 index 00000000..fc54fd49 --- /dev/null +++ b/examples/python/auth/credentials/localhost.crt @@ -0,0 +1,19 @@ +-----BEGIN CERTIFICATE----- +MIIDFjCCAf4CCQCzrLIhrWa55zANBgkqhkiG9w0BAQsFADBCMQswCQYDVQQGEwJV +UzETMBEGA1UECAwKQ2FsaWZvcm5pYTEPMA0GA1UECgwGR29vZ2xlMQ0wCwYDVQQL +DARnUlBDMCAXDTE5MDYyNDIyMjIzM1oYDzIxMTkwNTMxMjIyMjMzWjBWMQswCQYD +VQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEPMA0GA1UECgwGR29vZ2xlMQ0w +CwYDVQQLDARnUlBDMRIwEAYDVQQDDAlsb2NhbGhvc3QwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQCtCW0TjugnIUu8BEVIYvdMP+/2GENQDjZhZ8eKR5C6 +toDGbgjsDtt/GxISAg4cg70fIvy0XolnGPZodvfHDM4lJ7yHBOdZD8TXQoE6okR7 +HZuLUJ20M0pXgWqtRewKRUjuYsSDXBnzLiZw1dcv9nGpo+Bqa8NonpiGRRpEkshF +D6T9KU9Ts/x+wMQBIra2Gj0UMh79jPhUuxcYAQA0JQGivnOtdwuPiumpnUT8j8h6 +tWg5l01EsCZWJecCF85KnGpJEVYPyPqBqGsy0nGS9plGotOWF87+jyUQt+KD63xA +aBmTro86mKDDKEK4JvzjVeMGz2UbVcLPiiZnErTFaiXJAgMBAAEwDQYJKoZIhvcN +AQELBQADggEBAKsDgOPCWp5WCy17vJbRlgfgk05sVNIHZtzrmdswjBmvSg8MUpep +XqcPNUpsljAXsf9UM5IFEMRdilUsFGWvHjBEtNAW8WUK9UV18WRuU//0w1Mp5HAN +xUEKb4BoyZr65vlCnTR+AR5c9FfPvLibhr5qHs2RA8Y3GyLOcGqBWed87jhdQLCc +P1bxB+96le5JeXq0tw215lxonI2/3ZYVK4/ok9gwXrQoWm8YieJqitk/ZQ4S17/4 +pynHtDfdxLn23EXeGx+UTxJGfpRmhEZdJ+MN7QGYoomzx5qS5XoYKxRNrDlirJpr +OqXIn8E1it+6d5gOZfuHawcNGhRLplE/pfA= +-----END CERTIFICATE----- diff --git a/examples/python/auth/credentials/localhost.key b/examples/python/auth/credentials/localhost.key new file mode 100644 index 00000000..72e24632 --- /dev/null +++ b/examples/python/auth/credentials/localhost.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEogIBAAKCAQEArQltE47oJyFLvARFSGL3TD/v9hhDUA42YWfHikeQuraAxm4I +7A7bfxsSEgIOHIO9HyL8tF6JZxj2aHb3xwzOJSe8hwTnWQ/E10KBOqJEex2bi1Cd +tDNKV4FqrUXsCkVI7mLEg1wZ8y4mcNXXL/ZxqaPgamvDaJ6YhkUaRJLIRQ+k/SlP +U7P8fsDEASK2tho9FDIe/Yz4VLsXGAEANCUBor5zrXcLj4rpqZ1E/I/IerVoOZdN +RLAmViXnAhfOSpxqSRFWD8j6gahrMtJxkvaZRqLTlhfO/o8lELfig+t8QGgZk66P +OpigwyhCuCb841XjBs9lG1XCz4omZxK0xWolyQIDAQABAoIBADeq/Kh6JT3RfGf0 +h8WN8TlaqHxnueAbcmtL0+oss+cdp7gu1jf7X6o4r0uT1a5ew40s2Fe+wj2kzkE1 +ZOlouTlC22gkr7j7Vbxa7PBMG/Pvxoa/XL0IczZLsGImSJXVTG1E4SvRiZeulTdf +1GbdxhtpWV1jZe5Wd4Na3+SHxF5S7m3PrHiZlYdz1ND+8XZs1NlL9+ej72qSFul9 +t/QjMWJ9pky/Wad5abnRLRyOsg+BsgnXbkUy2rD89ZxFMLda9pzXo3TPyAlBHonr +mkEsE4eRMWMpjBM79JbeyDdHn/cs/LjAZrzeDf7ugXr2CHQpKaM5O0PsNHezJII9 +L5kCfzECgYEA4M/rz1UP1/BJoSqigUlSs0tPAg8a5UlkVsh6Osuq72IPNo8qg/Fw +oV/IiIS+q+obRcFj1Od3PGdTpCJwW5dzd2fXBQGmGdj0HucnCrs13RtBh91JiF5i +y/YYI9KfgOG2ZT9gG68T0gTs6jRrS3Qd83npqjrkJqMOd7s00MK9tUcCgYEAxQq7 +T541oCYHSBRIIb0IrR25krZy9caxzCqPDwOcuuhaCqCiaq+ATvOWlSfgecm4eH0K +PCH0xlWxG0auPEwm4pA8+/WR/XJwscPZMuoht1EoKy1his4eKx/s7hHNeO6KOF0V +Y/zqIiuZnEwUoKbn7EqqNFSTT65PJKyGsICJFG8CgYAfaw9yl1myfQNdQb8aQGwN +YJ33FLNWje427qeeZe5KrDKiFloDvI9YDjHRWnPnRL1w/zj7fSm9yFb5HlMDieP6 +MQnsyjEzdY2QcA+VwVoiv3dmDHgFVeOKy6bOAtaFxYWfGr9MvygO9t9BT/gawGyb +JVORlc9i0vDnrMMR1dV7awKBgBpTWLtGc/u1mPt0Wj7HtsUKV6TWY32a0l5owTxM +S0BdksogtBJ06DukJ9Y9wawD23WdnyRxlPZ6tHLkeprrwbY7dypioOKvy4a0l+xJ +g7+uRCOgqIuXBkjUtx8HmeAyXp0xMo5tWArAsIFFWOwt4IadYygitJvMuh44PraO +NcJZAoGADEiV0dheXUCVr8DrtSom8DQMj92/G/FIYjXL8OUhh0+F+YlYP0+F8PEU +yYIWEqL/S5tVKYshimUXQa537JcRKsTVJBG/ZKD2kuqgOc72zQy3oplimXeJDCXY +h2eAQ0u8GN6tN9C4t8Kp4a3y6FGsxgu+UTxdnL3YQ+yHAVhtCzo= +-----END RSA PRIVATE KEY----- diff --git a/examples/python/auth/credentials/root.crt b/examples/python/auth/credentials/root.crt new file mode 100644 index 00000000..0fa644d3 --- /dev/null +++ b/examples/python/auth/credentials/root.crt @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDWTCCAkGgAwIBAgIJAPOConZMwykwMA0GCSqGSIb3DQEBCwUAMEIxCzAJBgNV +BAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMQ8wDQYDVQQKDAZHb29nbGUxDTAL +BgNVBAsMBGdSUEMwIBcNMTkwNjI0MjIyMDA3WhgPMjExOTA1MzEyMjIwMDdaMEIx +CzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMQ8wDQYDVQQKDAZHb29n +bGUxDTALBgNVBAsMBGdSUEMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCwqei3TfyLidnQNDJ2lierMYo229K92DuORni7nSjJQ59Jc3dNMsmqGQJjCD8o +6mTlKM/oCbs27Wpx+OxcOLvT95j2kiDGca1fCvaMdguIod09SWiyMpv/hp0trLv7 +NJIKHznath6rHYX2Ii3fZ1yCPzyQbEPSAA+GNpoNm1v1ZWmWKke9v7vLlS3inNlW +Mt9jepK7DrtbNZnVDjeItnppBSbVYRMxIyNHkepFbqXx5TpkCvl4M4XQZw9bfSxQ +i3WZ3q+T1Tw//OUdPNc+OfMhu0MA0QoMwikskP0NaIC3dbJZ5Ogx0RcnaB4E+9C6 +O/znUEh3WuKVl5HXBF+UwWoFAgMBAAGjUDBOMB0GA1UdDgQWBBRm3JIgzgK4G97J +fbMGatWMZc7V3jAfBgNVHSMEGDAWgBRm3JIgzgK4G97JfbMGatWMZc7V3jAMBgNV +HRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQCNiV8x41if094ry2srS0YucpiN +3rTPk08FOLsENTMYai524TGXJti1P6ofGr5KXCL0uxTByHE3fEiMMud2TIY5iHQo +Y4mzDTTcb+Q7yKHwYZMlcp6nO8W+NeY5t+S0JPHhb8deKWepcN2UpXBUYQLw7AiE +l96T9Gi+vC9h/XE5IVwHFQXTxf5UYzXtW1nfapvrOONg/ms41dgmrRKIi+knWfiJ +FdHpHX2sfDAoJtnpEISX+nxRGNVTLY64utXWm4yxaZJshvy2s8zWJgRg7rtwAhTT +Np9E9MnihXLEmDI4Co9XlLPJyZFmqImsbmVuKFeQOCiLAoPJaMI2lbi7fiTo +-----END CERTIFICATE----- diff --git a/examples/python/auth/customized_auth_client.py b/examples/python/auth/customized_auth_client.py new file mode 100644 index 00000000..49eb25bc --- /dev/null +++ b/examples/python/auth/customized_auth_client.py @@ -0,0 +1,102 @@ +# Copyright 2019 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Client of the Python example of customizing authentication mechanism.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import contextlib +import logging + +import grpc +from examples import helloworld_pb2 +from examples import helloworld_pb2_grpc +from examples.python.auth import _credentials + +_LOGGER = logging.getLogger(__name__) +_LOGGER.setLevel(logging.INFO) + +_SERVER_ADDR_TEMPLATE = 'localhost:%d' +_SIGNATURE_HEADER_KEY = 'x-signature' + + +class AuthGateway(grpc.AuthMetadataPlugin): + + def __call__(self, context, callback): + """Implements authentication by passing metadata to a callback. + + Implementations of this method must not block. + + Args: + context: An AuthMetadataContext providing information on the RPC that + the plugin is being called to authenticate. + callback: An AuthMetadataPluginCallback to be invoked either + synchronously or asynchronously. + """ + # Example AuthMetadataContext object: + # AuthMetadataContext( + # service_url=u'https://localhost:50051/helloworld.Greeter', + # method_name=u'SayHello') + signature = context.method_name[::-1] + callback(((_SIGNATURE_HEADER_KEY, signature),), None) + + +@contextlib.contextmanager +def create_client_channel(addr): + # Call credential object will be invoked for every single RPC + call_credentials = grpc.metadata_call_credentials(AuthGateway(), + name='auth gateway') + # Channel credential will be valid for the entire channel + channel_credential = grpc.ssl_channel_credentials( + _credentials.ROOT_CERTIFICATE) + # Combining channel credentials and call credentials together + composite_credentials = grpc.composite_channel_credentials( + channel_credential, + call_credentials, + ) + channel = grpc.secure_channel(addr, composite_credentials) + yield channel + + +def send_rpc(channel): + stub = helloworld_pb2_grpc.GreeterStub(channel) + request = helloworld_pb2.HelloRequest(name='you') + try: + response = stub.SayHello(request) + except grpc.RpcError as rpc_error: + _LOGGER.error('Received error: %s', rpc_error) + return rpc_error + else: + _LOGGER.info('Received message: %s', response) + return response + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('--port', + nargs='?', + type=int, + default=50051, + help='the address of server') + args = parser.parse_args() + + with create_client_channel(_SERVER_ADDR_TEMPLATE % args.port) as channel: + send_rpc(channel) + + +if __name__ == '__main__': + logging.basicConfig(level=logging.INFO) + main() diff --git a/examples/python/auth/customized_auth_server.py b/examples/python/auth/customized_auth_server.py new file mode 100644 index 00000000..ecc73e36 --- /dev/null +++ b/examples/python/auth/customized_auth_server.py @@ -0,0 +1,105 @@ +# Copyright 2019 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Server of the Python example of customizing authentication mechanism.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import contextlib +import logging +from concurrent import futures + +import grpc +from examples import helloworld_pb2 +from examples import helloworld_pb2_grpc +from examples.python.auth import _credentials + +_LOGGER = logging.getLogger(__name__) +_LOGGER.setLevel(logging.INFO) + +_LISTEN_ADDRESS_TEMPLATE = 'localhost:%d' +_SIGNATURE_HEADER_KEY = 'x-signature' + + +class SignatureValidationInterceptor(grpc.ServerInterceptor): + + def __init__(self): + + def abort(ignored_request, context): + context.abort(grpc.StatusCode.UNAUTHENTICATED, 'Invalid signature') + + self._abortion = grpc.unary_unary_rpc_method_handler(abort) + + def intercept_service(self, continuation, handler_call_details): + # Example HandlerCallDetails object: + # _HandlerCallDetails( + # method=u'/helloworld.Greeter/SayHello', + # invocation_metadata=...) + method_name = handler_call_details.method.split('/')[-1] + expected_metadata = (_SIGNATURE_HEADER_KEY, method_name[::-1]) + if expected_metadata in handler_call_details.invocation_metadata: + return continuation(handler_call_details) + else: + return self._abortion + + +class SimpleGreeter(helloworld_pb2_grpc.GreeterServicer): + + def SayHello(self, request, unused_context): + return helloworld_pb2.HelloReply(message='Hello, %s!' % request.name) + + +@contextlib.contextmanager +def run_server(port): + # Bind interceptor to server + server = grpc.server(futures.ThreadPoolExecutor(), + interceptors=(SignatureValidationInterceptor(),)) + helloworld_pb2_grpc.add_GreeterServicer_to_server(SimpleGreeter(), server) + + # Loading credentials + server_credentials = grpc.ssl_server_credentials((( + _credentials.SERVER_CERTIFICATE_KEY, + _credentials.SERVER_CERTIFICATE, + ),)) + + # Pass down credentials + port = server.add_secure_port(_LISTEN_ADDRESS_TEMPLATE % port, + server_credentials) + + server.start() + try: + yield server, port + finally: + server.stop(0) + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('--port', + nargs='?', + type=int, + default=50051, + help='the listening port') + args = parser.parse_args() + + with run_server(args.port) as (server, port): + logging.info('Server is listening at port :%d', port) + server.wait_for_termination() + + +if __name__ == '__main__': + logging.basicConfig(level=logging.INFO) + main() diff --git a/examples/python/auth/test/_auth_example_test.py b/examples/python/auth/test/_auth_example_test.py new file mode 100644 index 00000000..8e1a3b2b --- /dev/null +++ b/examples/python/auth/test/_auth_example_test.py @@ -0,0 +1,56 @@ +# Copyright 2019 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Test for gRPC Python authentication example.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import unittest + +import grpc +from examples.python.auth import _credentials +from examples.python.auth import customized_auth_client +from examples.python.auth import customized_auth_server + +_SERVER_ADDR_TEMPLATE = 'localhost:%d' + + +class AuthExampleTest(unittest.TestCase): + + def test_successful_call(self): + with customized_auth_server.run_server(0) as (_, port): + with customized_auth_client.create_client_channel( + _SERVER_ADDR_TEMPLATE % port) as channel: + customized_auth_client.send_rpc(channel) + # No unhandled exception raised, test passed! + + def test_no_channel_credential(self): + with customized_auth_server.run_server(0) as (_, port): + with grpc.insecure_channel(_SERVER_ADDR_TEMPLATE % port) as channel: + resp = customized_auth_client.send_rpc(channel) + self.assertEqual(resp.code(), grpc.StatusCode.UNAVAILABLE) + + def test_no_call_credential(self): + with customized_auth_server.run_server(0) as (_, port): + channel_credential = grpc.ssl_channel_credentials( + _credentials.ROOT_CERTIFICATE) + with grpc.secure_channel(_SERVER_ADDR_TEMPLATE % port, + channel_credential) as channel: + resp = customized_auth_client.send_rpc(channel) + self.assertEqual(resp.code(), grpc.StatusCode.UNAUTHENTICATED) + + +if __name__ == '__main__': + unittest.main(verbosity=2) diff --git a/examples/python/cancellation/BUILD.bazel b/examples/python/cancellation/BUILD.bazel new file mode 100644 index 00000000..0426cf0b --- /dev/null +++ b/examples/python/cancellation/BUILD.bazel @@ -0,0 +1,85 @@ +# gRPC Bazel BUILD file. +# +# Copyright 2019 The gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("@grpc_python_dependencies//:requirements.bzl", "requirement") +load("@rules_proto//proto:defs.bzl", "proto_library") +load("//bazel:python_rules.bzl", "py_grpc_library", "py_proto_library") + +package(default_testonly = 1) + +proto_library( + name = "hash_name_proto", + srcs = ["hash_name.proto"], +) + +py_proto_library( + name = "hash_name_py_pb2", + deps = [":hash_name_proto"], +) + +py_grpc_library( + name = "hash_name_py_pb2_grpc", + srcs = [":hash_name_proto"], + deps = [":hash_name_py_pb2"], +) + +py_binary( + name = "client", + srcs = ["client.py"], + python_version = "PY3", + srcs_version = "PY2AND3", + deps = [ + ":hash_name_py_pb2", + ":hash_name_py_pb2_grpc", + "//src/python/grpcio/grpc:grpcio", + "@six", + ], +) + +py_library( + name = "search", + srcs = ["search.py"], + srcs_version = "PY2AND3", + deps = [ + ":hash_name_py_pb2", + ], +) + +py_binary( + name = "server", + srcs = ["server.py"], + python_version = "PY3", + srcs_version = "PY2AND3", + deps = [ + "//src/python/grpcio/grpc:grpcio", + ":hash_name_py_pb2", + ":search", + ] + select({ + "//conditions:default": ["@futures//:futures"], + "//:python3": [], + }), +) + +py_test( + name = "test/_cancellation_example_test", + size = "small", + srcs = ["test/_cancellation_example_test.py"], + data = [ + ":client", + ":server", + ], + python_version = "PY3", +) diff --git a/examples/python/cancellation/README.md b/examples/python/cancellation/README.md new file mode 100644 index 00000000..87d0c76d --- /dev/null +++ b/examples/python/cancellation/README.md @@ -0,0 +1,127 @@ +### Cancellation + +In the example, we implement a silly algorithm. We search for bytestrings whose +hashes are similar to a given search string. For example, say we're looking for +the string "doctor". Our algorithm may return `JrqhZVkTDoctYrUlXDbL6pfYQHU=` or +`RC9/7mlM3ldy4TdoctOc6WzYbO4=`. This is a brute force algorithm, so the server +performing the search must be conscious of the resources it allows to each client +and each client must be conscientious of the resources it demands of the server. + +In particular, we ensure that client processes cancel the stream explicitly +before terminating and we ensure that server processes cancel RPCs that have gone on longer +than a certain number of iterations. + +#### Cancellation on the Client Side + +A client may cancel an RPC for several reasons. Perhaps the data it requested +has been made irrelevant. Perhaps you, as the client, want to be a good citizen +of the server and are conserving compute resources. + +##### Cancelling a Server-Side Unary RPC from the Client + +The default RPC methods on a stub will simply return the result of an RPC. + +```python +>>> stub = hash_name_pb2_grpc.HashFinderStub(channel) +>>> stub.Find(hash_name_pb2.HashNameRequest(desired_name=name)) + +``` + +But you may use the `future()` method to receive an instance of `grpc.Future`. +This interface allows you to wait on a response with a timeout, add a callback +to be executed when the RPC completes, or to cancel the RPC before it has +completed. + +In the example, we use this interface to cancel our in-progress RPC when the +user interrupts the process with ctrl-c. + +```python +stub = hash_name_pb2_grpc.HashFinderStub(channel) +future = stub.Find.future(hash_name_pb2.HashNameRequest(desired_name=name)) +def cancel_request(unused_signum, unused_frame): + future.cancel() + sys.exit(0) +signal.signal(signal.SIGINT, cancel_request) + +result = future.result() +print(result) +``` + +We also call `sys.exit(0)` to terminate the process. If we do not do this, then +`future.result()` with throw an `RpcError`. Alternatively, you may catch this +exception. + + +##### Cancelling a Server-Side Streaming RPC from the Client + +Cancelling a Server-side streaming RPC is even simpler from the perspective of +the gRPC API. The default stub method is already an instance of `grpc.Future`, +so the methods outlined above still apply. It is also a generator, so we may +iterate over it to yield the results of our RPC. + +```python +stub = hash_name_pb2_grpc.HashFinderStub(channel) +result_generator = stub.FindRange(hash_name_pb2.HashNameRequest(desired_name=name)) +def cancel_request(unused_signum, unused_frame): + result_generator.cancel() + sys.exit(0) +signal.signal(signal.SIGINT, cancel_request) +for result in result_generator: + print(result) +``` + +We also call `sys.exit(0)` here to terminate the process. Alternatively, you may +catch the `RpcError` raised by the for loop upon cancellation. + + +#### Cancellation on the Server Side + +A server is responsible for cancellation in two ways. It must respond in some way +when a client initiates a cancellation, otherwise long-running computations +could continue indefinitely. + +It may also decide to cancel the RPC for its own reasons. In our example, the +server can be configured to cancel an RPC after a certain number of hashes has +been computed in order to conserve compute resources. + +##### Responding to Cancellations from a Servicer Thread + +It's important to remember that a gRPC Python server is backed by a thread pool +with a fixed size. When an RPC is cancelled, the library does *not* terminate +your servicer thread. It is your responsibility as the application author to +ensure that your servicer thread terminates soon after the RPC has been +cancelled. + +In this example, we use the `ServicerContext.add_callback` method to set a +`threading.Event` object when the RPC is terminated. We pass this `Event` object +down through our hashing algorithm and ensure to check that the RPC is still +ongoing before each iteration. + +```python +stop_event = threading.Event() +def on_rpc_done(): + # Regain servicer thread. + stop_event.set() +context.add_callback(on_rpc_done) +secret = _find_secret(stop_event) +``` + +##### Initiating a Cancellation on the Server Side + +Initiating a cancellation from the server side is simpler. Just call +`ServicerContext.cancel()`. + +In our example, we ensure that no single client is monopolizing the server by +cancelling after a configurable number of hashes have been checked. + +```python +try: + for candidate in secret_generator: + yield candidate +except ResourceLimitExceededError: + print("Cancelling RPC due to exhausted resources.") + context.cancel() +``` + +In this type of situation, you may also consider returning a more specific error +using the [`grpcio-status`](https://pypi.org/project/grpcio-status/) package. diff --git a/examples/python/cancellation/client.py b/examples/python/cancellation/client.py new file mode 100644 index 00000000..c61b3c3a --- /dev/null +++ b/examples/python/cancellation/client.py @@ -0,0 +1,100 @@ +# Copyright 2019 the gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""An example of cancelling requests in gRPC.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import logging +import signal +import sys + +import grpc + +from examples.python.cancellation import hash_name_pb2 +from examples.python.cancellation import hash_name_pb2_grpc + +_DESCRIPTION = "A client for finding hashes similar to names." +_LOGGER = logging.getLogger(__name__) + + +def run_unary_client(server_target, name, ideal_distance): + with grpc.insecure_channel(server_target) as channel: + stub = hash_name_pb2_grpc.HashFinderStub(channel) + future = stub.Find.future(hash_name_pb2.HashNameRequest( + desired_name=name, ideal_hamming_distance=ideal_distance), + wait_for_ready=True) + + def cancel_request(unused_signum, unused_frame): + future.cancel() + sys.exit(0) + + signal.signal(signal.SIGINT, cancel_request) + result = future.result() + print(result) + + +def run_streaming_client(server_target, name, ideal_distance, + interesting_distance): + with grpc.insecure_channel(server_target) as channel: + stub = hash_name_pb2_grpc.HashFinderStub(channel) + result_generator = stub.FindRange(hash_name_pb2.HashNameRequest( + desired_name=name, + ideal_hamming_distance=ideal_distance, + interesting_hamming_distance=interesting_distance), + wait_for_ready=True) + + def cancel_request(unused_signum, unused_frame): + result_generator.cancel() + sys.exit(0) + + signal.signal(signal.SIGINT, cancel_request) + for result in result_generator: + print(result) + + +def main(): + parser = argparse.ArgumentParser(description=_DESCRIPTION) + parser.add_argument("name", type=str, help='The desired name.') + parser.add_argument("--ideal-distance", + default=0, + nargs='?', + type=int, + help="The desired Hamming distance.") + parser.add_argument('--server', + default='localhost:50051', + type=str, + nargs='?', + help='The host-port pair at which to reach the server.') + parser.add_argument( + '--show-inferior', + default=None, + type=int, + nargs='?', + help='Also show candidates with a Hamming distance less than this value.' + ) + + args = parser.parse_args() + if args.show_inferior is not None: + run_streaming_client(args.server, args.name, args.ideal_distance, + args.show_inferior) + else: + run_unary_client(args.server, args.name, args.ideal_distance) + + +if __name__ == "__main__": + logging.basicConfig() + main() diff --git a/examples/python/cancellation/hash_name.proto b/examples/python/cancellation/hash_name.proto new file mode 100644 index 00000000..262f12b2 --- /dev/null +++ b/examples/python/cancellation/hash_name.proto @@ -0,0 +1,56 @@ +// Copyright 2019 the gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package hash_name; + +// A request for a single secret whose hash is similar to a desired name. +message HashNameRequest { + // The string that is desired in the secret's hash. + string desired_name = 1; + + // The ideal Hamming distance between desired_name and the secret that will + // be searched for. + int32 ideal_hamming_distance = 2; + + // A Hamming distance greater than the ideal Hamming distance. Search results + // with a Hamming distance less than this value but greater than the ideal + // distance will be returned back to the client but will not terminate the + // search. + int32 interesting_hamming_distance = 3; +} + +message HashNameResponse { + // The search result. + string secret = 1; + + // The hash of the search result. A substring of this is of + // ideal_hamming_distance Hamming distance or less from desired_name. + string hashed_name = 2; + + // The Hamming distance between hashed_name and desired_name. + int32 hamming_distance = 3; +} + +service HashFinder { + + // Search for a single string whose hash is similar to the specified + // desired_name. interesting_hamming_distance is ignored. + rpc Find (HashNameRequest) returns (HashNameResponse) {} + + // Search for a string whose hash is similar to the specified desired_name, + // but also stream back less-than-ideal candidates. + rpc FindRange (HashNameRequest) returns (stream HashNameResponse) {} +} diff --git a/examples/python/cancellation/search.py b/examples/python/cancellation/search.py new file mode 100644 index 00000000..9d2331af --- /dev/null +++ b/examples/python/cancellation/search.py @@ -0,0 +1,148 @@ +# Copyright 2019 the gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""A search algorithm over the space of all bytestrings.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import base64 +import hashlib +import itertools +import logging +import struct + +from examples.python.cancellation import hash_name_pb2 + +_LOGGER = logging.getLogger(__name__) +_BYTE_MAX = 255 + + +def _get_hamming_distance(a, b): + """Calculates hamming distance between strings of equal length.""" + distance = 0 + for char_a, char_b in zip(a, b): + if char_a != char_b: + distance += 1 + return distance + + +def _get_substring_hamming_distance(candidate, target): + """Calculates the minimum hamming distance between between the target + and any substring of the candidate. + + Args: + candidate: The string whose substrings will be tested. + target: The target string. + + Returns: + The minimum Hamming distance between candidate and target. + """ + min_distance = None + if len(target) > len(candidate): + raise ValueError("Candidate must be at least as long as target.") + for i in range(len(candidate) - len(target) + 1): + distance = _get_hamming_distance(candidate[i:i + len(target)].lower(), + target.lower()) + if min_distance is None or distance < min_distance: + min_distance = distance + return min_distance + + +def _get_hash(secret): + hasher = hashlib.sha1() + hasher.update(secret) + return base64.b64encode(hasher.digest()).decode('ascii') + + +class ResourceLimitExceededError(Exception): + """Signifies the request has exceeded configured limits.""" + + +def _bytestrings_of_length(length): + """Generates a stream containing all bytestrings of a given length. + + Args: + length: A positive integer length. + + Yields: + All bytestrings of length `length`. + """ + for digits in itertools.product(range(_BYTE_MAX), repeat=length): + yield b''.join(struct.pack('B', i) for i in digits) + + +def _all_bytestrings(): + """Generates a stream containing all possible bytestrings. + + This generator does not terminate. + + Yields: + All bytestrings in ascending order of length. + """ + for bytestring in itertools.chain.from_iterable( + _bytestrings_of_length(length) for length in itertools.count()): + yield bytestring + + +def search(target, + ideal_distance, + stop_event, + maximum_hashes, + interesting_hamming_distance=None): + """Find candidate strings. + + Search through the space of all bytestrings, in order of increasing length, + indefinitely, until a hash with a Hamming distance of `maximum_distance` or + less has been found. + + Args: + target: The search string. + ideal_distance: The desired Hamming distance. + stop_event: An event indicating whether the RPC should terminate. + maximum_hashes: The maximum number of hashes to check before stopping. + interesting_hamming_distance: If specified, strings with a Hamming + distance from the target below this value will be yielded. + + Yields: + Instances of HashNameResponse. The final entry in the stream will be of + `maximum_distance` Hamming distance or less from the target string, + while all others will be of less than `interesting_hamming_distance`. + + Raises: + ResourceLimitExceededError: If the computation exceeds `maximum_hashes` + iterations. + """ + hashes_computed = 0 + for secret in _all_bytestrings(): + if stop_event.is_set(): + raise StopIteration() # pylint: disable=stop-iteration-return + candidate_hash = _get_hash(secret) + distance = _get_substring_hamming_distance(candidate_hash, target) + if interesting_hamming_distance is not None and distance <= interesting_hamming_distance: + # Surface interesting candidates, but don't stop. + yield hash_name_pb2.HashNameResponse( + secret=base64.b64encode(secret), + hashed_name=candidate_hash, + hamming_distance=distance) + elif distance <= ideal_distance: + # Yield ideal candidate and end the stream. + yield hash_name_pb2.HashNameResponse( + secret=base64.b64encode(secret), + hashed_name=candidate_hash, + hamming_distance=distance) + raise StopIteration() # pylint: disable=stop-iteration-return + hashes_computed += 1 + if hashes_computed == maximum_hashes: + raise ResourceLimitExceededError() diff --git a/examples/python/cancellation/server.py b/examples/python/cancellation/server.py new file mode 100644 index 00000000..4116fd1d --- /dev/null +++ b/examples/python/cancellation/server.py @@ -0,0 +1,123 @@ +# Copyright 2019 the gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""An example of cancelling requests in gRPC.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from concurrent import futures +import argparse +import logging +import threading + +import grpc +import search + +from examples.python.cancellation import hash_name_pb2 +from examples.python.cancellation import hash_name_pb2_grpc + +_LOGGER = logging.getLogger(__name__) +_SERVER_HOST = 'localhost' + +_DESCRIPTION = "A server for finding hashes similar to names." + + +class HashFinder(hash_name_pb2_grpc.HashFinderServicer): + + def __init__(self, maximum_hashes): + super(HashFinder, self).__init__() + self._maximum_hashes = maximum_hashes + + def Find(self, request, context): + stop_event = threading.Event() + + def on_rpc_done(): + _LOGGER.debug("Attempting to regain servicer thread.") + stop_event.set() + + context.add_callback(on_rpc_done) + candidates = [] + try: + candidates = list( + search.search(request.desired_name, + request.ideal_hamming_distance, stop_event, + self._maximum_hashes)) + except search.ResourceLimitExceededError: + _LOGGER.info("Cancelling RPC due to exhausted resources.") + context.cancel() + _LOGGER.debug("Servicer thread returning.") + if not candidates: + return hash_name_pb2.HashNameResponse() + return candidates[-1] + + def FindRange(self, request, context): + stop_event = threading.Event() + + def on_rpc_done(): + _LOGGER.debug("Attempting to regain servicer thread.") + stop_event.set() + + context.add_callback(on_rpc_done) + secret_generator = search.search( + request.desired_name, + request.ideal_hamming_distance, + stop_event, + self._maximum_hashes, + interesting_hamming_distance=request.interesting_hamming_distance) + try: + for candidate in secret_generator: + yield candidate + except search.ResourceLimitExceededError: + _LOGGER.info("Cancelling RPC due to exhausted resources.") + context.cancel() + _LOGGER.debug("Regained servicer thread.") + + +def _running_server(port, maximum_hashes): + # We use only a single servicer thread here to demonstrate that, if managed + # carefully, cancelled RPCs can need not continue occupying servicers + # threads. + server = grpc.server(futures.ThreadPoolExecutor(max_workers=1), + maximum_concurrent_rpcs=1) + hash_name_pb2_grpc.add_HashFinderServicer_to_server( + HashFinder(maximum_hashes), server) + address = '{}:{}'.format(_SERVER_HOST, port) + actual_port = server.add_insecure_port(address) + server.start() + print("Server listening at '{}'".format(address)) + return server + + +def main(): + parser = argparse.ArgumentParser(description=_DESCRIPTION) + parser.add_argument('--port', + type=int, + default=50051, + nargs='?', + help='The port on which the server will listen.') + parser.add_argument( + '--maximum-hashes', + type=int, + default=1000000, + nargs='?', + help='The maximum number of hashes to search before cancelling.') + args = parser.parse_args() + server = _running_server(args.port, args.maximum_hashes) + server.wait_for_termination() + + +if __name__ == "__main__": + logging.basicConfig() + main() diff --git a/examples/python/cancellation/test/_cancellation_example_test.py b/examples/python/cancellation/test/_cancellation_example_test.py new file mode 100644 index 00000000..2b936d21 --- /dev/null +++ b/examples/python/cancellation/test/_cancellation_example_test.py @@ -0,0 +1,87 @@ +# Copyright 2019 the gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Test for cancellation example.""" + +import contextlib +import os +import signal +import socket +import subprocess +import unittest + +_BINARY_DIR = os.path.realpath( + os.path.join(os.path.dirname(os.path.abspath(__file__)), '..')) +_SERVER_PATH = os.path.join(_BINARY_DIR, 'server') +_CLIENT_PATH = os.path.join(_BINARY_DIR, 'client') + + +@contextlib.contextmanager +def _get_port(): + sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM) + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) + if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT) == 0: + raise RuntimeError("Failed to set SO_REUSEPORT.") + sock.bind(('', 0)) + try: + yield sock.getsockname()[1] + finally: + sock.close() + + +def _start_client(server_port, + desired_string, + ideal_distance, + interesting_distance=None): + interesting_distance_args = () if interesting_distance is None else ( + '--show-inferior', interesting_distance) + return subprocess.Popen((_CLIENT_PATH, desired_string, '--server', + 'localhost:{}'.format(server_port), + '--ideal-distance', str(ideal_distance)) + + interesting_distance_args) + + +class CancellationExampleTest(unittest.TestCase): + + def test_successful_run(self): + with _get_port() as test_port: + server_process = subprocess.Popen( + (_SERVER_PATH, '--port', str(test_port))) + try: + client_process = _start_client(test_port, 'aa', 0) + client_return_code = client_process.wait() + self.assertEqual(0, client_return_code) + self.assertIsNone(server_process.poll()) + finally: + server_process.kill() + server_process.wait() + + def test_graceful_sigint(self): + with _get_port() as test_port: + server_process = subprocess.Popen( + (_SERVER_PATH, '--port', str(test_port))) + try: + client_process1 = _start_client(test_port, 'aaaaaaaaaa', 0) + client_process1.send_signal(signal.SIGINT) + client_process1.wait() + client_process2 = _start_client(test_port, 'aa', 0) + client_return_code = client_process2.wait() + self.assertEqual(0, client_return_code) + self.assertIsNone(server_process.poll()) + finally: + server_process.kill() + server_process.wait() + + +if __name__ == '__main__': + unittest.main(verbosity=2) diff --git a/examples/python/compression/BUILD.bazel b/examples/python/compression/BUILD.bazel new file mode 100644 index 00000000..1ab1d5a2 --- /dev/null +++ b/examples/python/compression/BUILD.bazel @@ -0,0 +1,49 @@ +# Copyright 2019 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +py_binary( + name = "server", + srcs = ["server.py"], + python_version = "PY3", + srcs_version = "PY2AND3", + deps = [ + "//examples:helloworld_py_pb2", + "//examples:helloworld_py_pb2_grpc", + "//src/python/grpcio/grpc:grpcio", + ], +) + +py_binary( + name = "client", + srcs = ["client.py"], + python_version = "PY3", + srcs_version = "PY2AND3", + deps = [ + "//examples:helloworld_py_pb2", + "//examples:helloworld_py_pb2_grpc", + "//src/python/grpcio/grpc:grpcio", + ], +) + +py_test( + name = "test/compression_example_test", + size = "small", + srcs = ["test/compression_example_test.py"], + data = [ + ":client", + ":server", + ], + python_version = "PY3", + srcs_version = "PY2AND3", +) diff --git a/examples/python/compression/README.md b/examples/python/compression/README.md new file mode 100644 index 00000000..c719bba0 --- /dev/null +++ b/examples/python/compression/README.md @@ -0,0 +1,58 @@ +## Compression with gRPC Python + +gRPC offers lossless compression options in order to decrease the number of bits +transferred over the wire. Three levels of compression are available: + + - `grpc.Compression.NoCompression` - No compression is applied to the payload. (default) + - `grpc.Compression.Deflate` - The "Deflate" algorithm is applied to the payload. + - `grpc.Compression.Gzip` - The Gzip algorithm is applied to the payload. + +The default option on both clients and servers is `grpc.Compression.NoCompression`. + +See [the gRPC Compression Spec](https://github.com/grpc/grpc/blob/master/doc/compression.md) +for more information. + +### Client Side Compression + +Compression may be set at two levels on the client side. + +#### At the channel level + +```python +with grpc.insecure_channel('foo.bar:1234', compression=grpc.Compression.Gzip) as channel: + use_channel(channel) +``` + +#### At the call level + +Setting the compression method at the call level will override any settings on +the channel level. + +```python +stub = helloworld_pb2_grpc.GreeterStub(channel) +response = stub.SayHello(helloworld_pb2.HelloRequest(name='you'), + compression=grpc.Compression.Deflate) +``` + + +### Server Side Compression + +Additionally, compression may be set at two levels on the server side. + +#### On the entire server + +```python +server = grpc.server(futures.ThreadPoolExecutor(), + compression=grpc.Compression.Gzip) +``` + +#### For an individual RPC + +```python +def SayHello(self, request, context): + context.set_response_compression(grpc.Compression.NoCompression) + return helloworld_pb2.HelloReply(message='Hello, %s!' % request.name) +``` + +Setting the compression method for an individual RPC will override any setting +supplied at server creation time. diff --git a/examples/python/compression/client.py b/examples/python/compression/client.py new file mode 100644 index 00000000..5d7a2aee --- /dev/null +++ b/examples/python/compression/client.py @@ -0,0 +1,73 @@ +# Copyright 2019 the gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""An example of compression on the client side with gRPC.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import logging +import grpc + +from examples import helloworld_pb2 +from examples import helloworld_pb2_grpc + +_DESCRIPTION = 'A client capable of compression.' +_COMPRESSION_OPTIONS = { + "none": grpc.Compression.NoCompression, + "deflate": grpc.Compression.Deflate, + "gzip": grpc.Compression.Gzip, +} + +_LOGGER = logging.getLogger(__name__) + + +def run_client(channel_compression, call_compression, target): + with grpc.insecure_channel(target, + compression=channel_compression) as channel: + stub = helloworld_pb2_grpc.GreeterStub(channel) + response = stub.SayHello(helloworld_pb2.HelloRequest(name='you'), + compression=call_compression, + wait_for_ready=True) + print("Response: {}".format(response)) + + +def main(): + parser = argparse.ArgumentParser(description=_DESCRIPTION) + parser.add_argument('--channel_compression', + default='none', + nargs='?', + choices=_COMPRESSION_OPTIONS.keys(), + help='The compression method to use for the channel.') + parser.add_argument( + '--call_compression', + default='none', + nargs='?', + choices=_COMPRESSION_OPTIONS.keys(), + help='The compression method to use for an individual call.') + parser.add_argument('--server', + default='localhost:50051', + type=str, + nargs='?', + help='The host-port pair at which to reach the server.') + args = parser.parse_args() + channel_compression = _COMPRESSION_OPTIONS[args.channel_compression] + call_compression = _COMPRESSION_OPTIONS[args.call_compression] + run_client(channel_compression, call_compression, args.server) + + +if __name__ == "__main__": + logging.basicConfig() + main() diff --git a/examples/python/compression/server.py b/examples/python/compression/server.py new file mode 100644 index 00000000..15fb0d0f --- /dev/null +++ b/examples/python/compression/server.py @@ -0,0 +1,99 @@ +# Copyright 2019 the gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""An example of compression on the server side with gRPC.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from concurrent import futures +import argparse +import logging +import threading +import grpc + +from examples import helloworld_pb2 +from examples import helloworld_pb2_grpc + +_DESCRIPTION = 'A server capable of compression.' +_COMPRESSION_OPTIONS = { + "none": grpc.Compression.NoCompression, + "deflate": grpc.Compression.Deflate, + "gzip": grpc.Compression.Gzip, +} +_LOGGER = logging.getLogger(__name__) + +_SERVER_HOST = 'localhost' + + +class Greeter(helloworld_pb2_grpc.GreeterServicer): + + def __init__(self, no_compress_every_n): + super(Greeter, self).__init__() + self._no_compress_every_n = 0 + self._request_counter = 0 + self._counter_lock = threading.RLock() + + def _should_suppress_compression(self): + suppress_compression = False + with self._counter_lock: + if self._no_compress_every_n and self._request_counter % self._no_compress_every_n == 0: + suppress_compression = True + self._request_counter += 1 + return suppress_compression + + def SayHello(self, request, context): + if self._should_suppress_compression(): + context.set_response_compression(grpc.Compression.NoCompression) + return helloworld_pb2.HelloReply(message='Hello, %s!' % request.name) + + +def run_server(server_compression, no_compress_every_n, port): + server = grpc.server(futures.ThreadPoolExecutor(), + compression=server_compression, + options=(('grpc.so_reuseport', 1),)) + helloworld_pb2_grpc.add_GreeterServicer_to_server( + Greeter(no_compress_every_n), server) + address = '{}:{}'.format(_SERVER_HOST, port) + server.add_insecure_port(address) + server.start() + print("Server listening at '{}'".format(address)) + server.wait_for_termination() + + +def main(): + parser = argparse.ArgumentParser(description=_DESCRIPTION) + parser.add_argument('--server_compression', + default='none', + nargs='?', + choices=_COMPRESSION_OPTIONS.keys(), + help='The default compression method for the server.') + parser.add_argument('--no_compress_every_n', + type=int, + default=0, + nargs='?', + help='If set, every nth reply will be uncompressed.') + parser.add_argument('--port', + type=int, + default=50051, + nargs='?', + help='The port on which the server will listen.') + args = parser.parse_args() + run_server(_COMPRESSION_OPTIONS[args.server_compression], + args.no_compress_every_n, args.port) + + +if __name__ == "__main__": + logging.basicConfig() + main() diff --git a/examples/python/compression/test/compression_example_test.py b/examples/python/compression/test/compression_example_test.py new file mode 100644 index 00000000..2a8f632a --- /dev/null +++ b/examples/python/compression/test/compression_example_test.py @@ -0,0 +1,62 @@ +# Copyright 2019 the gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Test for compression example.""" + +import contextlib +import os +import socket +import subprocess +import unittest + +_BINARY_DIR = os.path.realpath( + os.path.join(os.path.dirname(os.path.abspath(__file__)), '..')) +_SERVER_PATH = os.path.join(_BINARY_DIR, 'server') +_CLIENT_PATH = os.path.join(_BINARY_DIR, 'client') + + +@contextlib.contextmanager +def _get_port(): + sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM) + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) + if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT) == 0: + raise RuntimeError("Failed to set SO_REUSEPORT.") + sock.bind(('', 0)) + try: + yield sock.getsockname()[1] + finally: + sock.close() + + +class CompressionExampleTest(unittest.TestCase): + + def test_compression_example(self): + with _get_port() as test_port: + server_process = subprocess.Popen( + (_SERVER_PATH, '--port', str(test_port), '--server_compression', + 'gzip')) + try: + server_target = 'localhost:{}'.format(test_port) + client_process = subprocess.Popen( + (_CLIENT_PATH, '--server', server_target, + '--channel_compression', 'gzip')) + client_return_code = client_process.wait() + self.assertEqual(0, client_return_code) + self.assertIsNone(server_process.poll()) + finally: + server_process.kill() + server_process.wait() + + +if __name__ == '__main__': + unittest.main(verbosity=2) diff --git a/examples/python/data_transmission/BUILD b/examples/python/data_transmission/BUILD new file mode 100644 index 00000000..2eefb7a3 --- /dev/null +++ b/examples/python/data_transmission/BUILD @@ -0,0 +1,49 @@ +# Copyright 2020 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +licenses(["notice"]) # 3-clause BSD + +load("@grpc_python_dependencies//:requirements.bzl", "requirement") + +py_binary( + name = "alts_server", + srcs = [ + "alts_server.py", + "demo_pb2.py", + "demo_pb2_grpc.py", + "server.py", + ], + main = "alts_server.py", + python_version = "PY3", + srcs_version = "PY2AND3", + deps = [ + "//src/python/grpcio/grpc:grpcio", + ], +) + +py_binary( + name = "alts_client", + srcs = [ + "alts_client.py", + "client.py", + "demo_pb2.py", + "demo_pb2_grpc.py", + ], + main = "alts_client.py", + python_version = "PY3", + srcs_version = "PY2AND3", + deps = [ + "//src/python/grpcio/grpc:grpcio", + ], +) diff --git a/examples/python/data_transmission/README.cn.md b/examples/python/data_transmission/README.cn.md new file mode 100644 index 00000000..ecffa5d3 --- /dev/null +++ b/examples/python/data_transmission/README.cn.md @@ -0,0 +1,36 @@ +## Data transmission demo for using gRPC in Python + +在Python中使用gRPC时, 进行数据传输的四种方式 [官方指南]() + +- #### 一元模式 + + 在一次调用中, 客户端只能向服务器传输一次请求数据, 服务器也只能返回一次响应 + + `client.py: simple_method` + + `server.py: SimpleMethod` + +- #### 客户端流模式 + + 在一次调用中, 客户端可以多次向服务器传输数据, 但是服务器只能返回一次响应 + + `client.py: client_streaming_method ` + + `server.py: ClientStreamingMethod` + +- #### 服务端流模式 + + 在一次调用中, 客户端只能向服务器传输一次请求数据, 但是服务器可以多次返回响应 + + `client.py: server_streaming_method` + + `server.py: ServerStreamingMethod` + +- #### 双向流模式 + + 在一次调用中, 客户端和服务器都可以向对方多次收发数据 + + `client.py: bidirectional_streaming_method` + + `server.py: BidirectionalStreamingMethod` + diff --git a/examples/python/data_transmission/README.en.md b/examples/python/data_transmission/README.en.md new file mode 100644 index 00000000..b9359434 --- /dev/null +++ b/examples/python/data_transmission/README.en.md @@ -0,0 +1,37 @@ +## Data transmission demo for using gRPC in Python + +Four ways of data transmission when gRPC is used in Python. [Official Guide]() + +- #### unary-unary + + In a single call, the client can only send request once, and the server can only respond once. + + `client.py: simple_method` + + `server.py: SimpleMethod` + +- #### stream-unary + + In a single call, the client can transfer data to the server an arbitrary number of times, but the server can only return a response once. + + `client.py: client_streaming_method` + + `server.py: ClientStreamingMethod` + +- #### unary-stream + + In a single call, the client can only transmit data to the server at one time, but the server can return the response many times. + + `client.py: server_streaming_method` + + `server.py: ServerStreamingMethod` + +- #### stream-stream + + In a single call, both client and server can send and receive data + to each other multiple times. + + `client.py: bidirectional_streaming_method` + + `server.py: BidirectionalStreamingMethod` + diff --git a/examples/python/data_transmission/alts_client.py b/examples/python/data_transmission/alts_client.py new file mode 100644 index 00000000..eb328667 --- /dev/null +++ b/examples/python/data_transmission/alts_client.py @@ -0,0 +1,39 @@ +# Copyright 2020 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""The example of using ALTS credentials to setup gRPC client. + +The example would only successfully run in GCP environment.""" + +import grpc + +import demo_pb2_grpc +from client import (bidirectional_streaming_method, client_streaming_method, + server_streaming_method, simple_method) + +SERVER_ADDRESS = "localhost:23333" + + +def main(): + with grpc.secure_channel( + SERVER_ADDRESS, + credentials=grpc.alts_channel_credentials()) as channel: + stub = demo_pb2_grpc.GRPCDemoStub(channel) + simple_method(stub) + client_streaming_method(stub) + server_streaming_method(stub) + bidirectional_streaming_method(stub) + + +if __name__ == '__main__': + main() diff --git a/examples/python/data_transmission/alts_server.py b/examples/python/data_transmission/alts_server.py new file mode 100644 index 00000000..4e8747ce --- /dev/null +++ b/examples/python/data_transmission/alts_server.py @@ -0,0 +1,39 @@ +# Copyright 2020 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""The example of using ALTS credentials to setup gRPC server in python. + +The example would only successfully run in GCP environment.""" + +from concurrent import futures + +import grpc + +import demo_pb2_grpc +from server import DemoServer + +SERVER_ADDRESS = 'localhost:23333' + + +def main(): + svr = grpc.server(futures.ThreadPoolExecutor()) + demo_pb2_grpc.add_GRPCDemoServicer_to_server(DemoServer(), svr) + svr.add_secure_port(SERVER_ADDRESS, + server_credentials=grpc.alts_server_credentials()) + print("------------------start Python GRPC server with ALTS encryption") + svr.start() + svr.wait_for_termination() + + +if __name__ == '__main__': + main() diff --git a/examples/python/data_transmission/client.py b/examples/python/data_transmission/client.py new file mode 100644 index 00000000..cc4a68e3 --- /dev/null +++ b/examples/python/data_transmission/client.py @@ -0,0 +1,123 @@ +# Copyright 2019 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""The example of four ways of data transmission using gRPC in Python.""" + +import time +import grpc + +import demo_pb2_grpc +import demo_pb2 + +__all__ = [ + 'simple_method', 'client_streaming_method', 'server_streaming_method', + 'bidirectional_streaming_method' +] + +SERVER_ADDRESS = "localhost:23333" +CLIENT_ID = 1 + +# 中文注释和英文翻译 +# Note that this example was contributed by an external user using Chinese comments. +# In all cases, the Chinese comment text is translated to English just below it. + + +# 一元模式(在一次调用中, 客户端只能向服务器传输一次请求数据, 服务器也只能返回一次响应) +# unary-unary(In a single call, the client can only send request once, and the server can +# only respond once.) +def simple_method(stub): + print("--------------Call SimpleMethod Begin--------------") + request = demo_pb2.Request(client_id=CLIENT_ID, + request_data="called by Python client") + response = stub.SimpleMethod(request) + print("resp from server(%d), the message=%s" % + (response.server_id, response.response_data)) + print("--------------Call SimpleMethod Over---------------") + + +# 客户端流模式(在一次调用中, 客户端可以多次向服务器传输数据, 但是服务器只能返回一次响应) +# stream-unary (In a single call, the client can transfer data to the server several times, +# but the server can only return a response once.) +def client_streaming_method(stub): + print("--------------Call ClientStreamingMethod Begin--------------") + + # 创建一个生成器 + # create a generator + def request_messages(): + for i in range(5): + request = demo_pb2.Request( + client_id=CLIENT_ID, + request_data=("called by Python client, message:%d" % i)) + yield request + + response = stub.ClientStreamingMethod(request_messages()) + print("resp from server(%d), the message=%s" % + (response.server_id, response.response_data)) + print("--------------Call ClientStreamingMethod Over---------------") + + +# 服务端流模式(在一次调用中, 客户端只能一次向服务器传输数据, 但是服务器可以多次返回响应) +# unary-stream (In a single call, the client can only transmit data to the server at one time, +# but the server can return the response many times.) +def server_streaming_method(stub): + print("--------------Call ServerStreamingMethod Begin--------------") + request = demo_pb2.Request(client_id=CLIENT_ID, + request_data="called by Python client") + response_iterator = stub.ServerStreamingMethod(request) + for response in response_iterator: + print("recv from server(%d), message=%s" % + (response.server_id, response.response_data)) + + print("--------------Call ServerStreamingMethod Over---------------") + + +# 双向流模式 (在一次调用中, 客户端和服务器都可以向对方多次收发数据) +# stream-stream (In a single call, both client and server can send and receive data +# to each other multiple times.) +def bidirectional_streaming_method(stub): + print( + "--------------Call BidirectionalStreamingMethod Begin---------------") + + # 创建一个生成器 + # create a generator + def request_messages(): + for i in range(5): + request = demo_pb2.Request( + client_id=CLIENT_ID, + request_data=("called by Python client, message: %d" % i)) + yield request + time.sleep(1) + + response_iterator = stub.BidirectionalStreamingMethod(request_messages()) + for response in response_iterator: + print("recv from server(%d), message=%s" % + (response.server_id, response.response_data)) + + print("--------------Call BidirectionalStreamingMethod Over---------------") + + +def main(): + with grpc.insecure_channel(SERVER_ADDRESS) as channel: + stub = demo_pb2_grpc.GRPCDemoStub(channel) + + simple_method(stub) + + client_streaming_method(stub) + + server_streaming_method(stub) + + bidirectional_streaming_method(stub) + + +if __name__ == '__main__': + main() diff --git a/examples/python/data_transmission/demo.proto b/examples/python/data_transmission/demo.proto new file mode 100644 index 00000000..b2d956c8 --- /dev/null +++ b/examples/python/data_transmission/demo.proto @@ -0,0 +1,69 @@ +// Copyright 2019 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// 语法版本声明,必须放在非注释的第一行 +// Syntax version declaration. Must be placed on the first line of non-commentary. + +syntax = "proto3"; +// The document of proto3: https://developers.google.com/protocol-buffers/docs/proto3 + +// 包名定义, Python中使用时可以省略不写 +// Package name definition, which can be omitted in Python. +package demo; + +/* +`message`是用来定义传输的数据的格式的, 等号后面的是字段编号 +消息定义中的每个字段都有唯一的编号 +总体格式类似于Python中定义一个类或者Golang中定义一个结构体 +*/ +/* +`message` is used to define the structure of the data to be transmitted, after the equal sign +is the field number. Each field in the message definition has a unique number. +The overall format is similar to defining a class in Python or a structure in Golang. +*/ +message Request { + int64 client_id = 1; + string request_data = 2; +} + +message Response { + int64 server_id = 1; + string response_data = 2; +} + +// `service` 是用来给gRPC服务定义方法的, 格式固定, 类似于Golang中定义一个接口 +// `service` is used to define methods for gRPC services in a fixed format, similar to defining +//an interface in Golang +service GRPCDemo { + // 一元模式(在一次调用中, 客户端只能向服务器传输一次请求数据, 服务器也只能返回一次响应) + // unary-unary(In a single call, the client can only send request once, and the server can + // only respond once.) + rpc SimpleMethod (Request) returns (Response); + + // 客户端流模式(在一次调用中, 客户端可以多次向服务器传输数据, 但是服务器只能返回一次响应) + // stream-unary (In a single call, the client can transfer data to the server several times, + // but the server can only return a response once.) + rpc ClientStreamingMethod (stream Request) returns (Response); + + // 服务端流模式(在一次调用中, 客户端只能一次向服务器传输数据, 但是服务器可以多次返回响应) + // unary-stream (In a single call, the client can only transmit data to the server at one time, + // but the server can return the response many times.) + rpc ServerStreamingMethod (Request) returns (stream Response); + + // 双向流模式 (在一次调用中, 客户端和服务器都可以向对方多次收发数据) + // stream-stream (In a single call, both client and server can send and receive data + // to each other multiple times.) + rpc BidirectionalStreamingMethod (stream Request) returns (stream Response); +} + diff --git a/examples/python/data_transmission/demo_pb2.py b/examples/python/data_transmission/demo_pb2.py new file mode 100644 index 00000000..5dfaf837 --- /dev/null +++ b/examples/python/data_transmission/demo_pb2.py @@ -0,0 +1,174 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: demo.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +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 +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='demo.proto', + package='demo', + syntax='proto3', + serialized_options=None, + serialized_pb=_b('\n\ndemo.proto\x12\x04\x64\x65mo\"2\n\x07Request\x12\x11\n\tclient_id\x18\x01 \x01(\x03\x12\x14\n\x0crequest_data\x18\x02 \x01(\t\"4\n\x08Response\x12\x11\n\tserver_id\x18\x01 \x01(\x03\x12\x15\n\rresponse_data\x18\x02 \x01(\t2\xf0\x01\n\x08GRPCDemo\x12-\n\x0cSimpleMethod\x12\r.demo.Request\x1a\x0e.demo.Response\x12\x38\n\x15\x43lientStreamingMethod\x12\r.demo.Request\x1a\x0e.demo.Response(\x01\x12\x38\n\x15ServerStreamingMethod\x12\r.demo.Request\x1a\x0e.demo.Response0\x01\x12\x41\n\x1c\x42idirectionalStreamingMethod\x12\r.demo.Request\x1a\x0e.demo.Response(\x01\x30\x01\x62\x06proto3') +) + + + + +_REQUEST = _descriptor.Descriptor( + name='Request', + full_name='demo.Request', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='client_id', full_name='demo.Request.client_id', index=0, + number=1, type=3, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='request_data', full_name='demo.Request.request_data', 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, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=20, + serialized_end=70, +) + + +_RESPONSE = _descriptor.Descriptor( + name='Response', + full_name='demo.Response', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='server_id', full_name='demo.Response.server_id', index=0, + number=1, type=3, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='response_data', full_name='demo.Response.response_data', 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, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=72, + serialized_end=124, +) + +DESCRIPTOR.message_types_by_name['Request'] = _REQUEST +DESCRIPTOR.message_types_by_name['Response'] = _RESPONSE +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +Request = _reflection.GeneratedProtocolMessageType('Request', (_message.Message,), { + 'DESCRIPTOR' : _REQUEST, + '__module__' : 'demo_pb2' + # @@protoc_insertion_point(class_scope:demo.Request) + }) +_sym_db.RegisterMessage(Request) + +Response = _reflection.GeneratedProtocolMessageType('Response', (_message.Message,), { + 'DESCRIPTOR' : _RESPONSE, + '__module__' : 'demo_pb2' + # @@protoc_insertion_point(class_scope:demo.Response) + }) +_sym_db.RegisterMessage(Response) + + + +_GRPCDEMO = _descriptor.ServiceDescriptor( + name='GRPCDemo', + full_name='demo.GRPCDemo', + file=DESCRIPTOR, + index=0, + serialized_options=None, + serialized_start=127, + serialized_end=367, + methods=[ + _descriptor.MethodDescriptor( + name='SimpleMethod', + full_name='demo.GRPCDemo.SimpleMethod', + index=0, + containing_service=None, + input_type=_REQUEST, + output_type=_RESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='ClientStreamingMethod', + full_name='demo.GRPCDemo.ClientStreamingMethod', + index=1, + containing_service=None, + input_type=_REQUEST, + output_type=_RESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='ServerStreamingMethod', + full_name='demo.GRPCDemo.ServerStreamingMethod', + index=2, + containing_service=None, + input_type=_REQUEST, + output_type=_RESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='BidirectionalStreamingMethod', + full_name='demo.GRPCDemo.BidirectionalStreamingMethod', + index=3, + containing_service=None, + input_type=_REQUEST, + output_type=_RESPONSE, + serialized_options=None, + ), +]) +_sym_db.RegisterServiceDescriptor(_GRPCDEMO) + +DESCRIPTOR.services_by_name['GRPCDemo'] = _GRPCDEMO + +# @@protoc_insertion_point(module_scope) diff --git a/examples/python/data_transmission/demo_pb2_grpc.py b/examples/python/data_transmission/demo_pb2_grpc.py new file mode 100644 index 00000000..b6d6fc72 --- /dev/null +++ b/examples/python/data_transmission/demo_pb2_grpc.py @@ -0,0 +1,106 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +import grpc + +import demo_pb2 as demo__pb2 + + +class GRPCDemoStub(object): + """service是用来给GRPC服务定义方法的, 格式固定, 类似于Golang中定义一个接口 + `service` is used to define methods for GRPC services in a fixed format, similar to defining an interface in Golang + """ + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.SimpleMethod = channel.unary_unary( + '/demo.GRPCDemo/SimpleMethod', + request_serializer=demo__pb2.Request.SerializeToString, + response_deserializer=demo__pb2.Response.FromString, + ) + self.ClientStreamingMethod = channel.stream_unary( + '/demo.GRPCDemo/ClientStreamingMethod', + request_serializer=demo__pb2.Request.SerializeToString, + response_deserializer=demo__pb2.Response.FromString, + ) + self.ServerStreamingMethod = channel.unary_stream( + '/demo.GRPCDemo/ServerStreamingMethod', + request_serializer=demo__pb2.Request.SerializeToString, + response_deserializer=demo__pb2.Response.FromString, + ) + self.BidirectionalStreamingMethod = channel.stream_stream( + '/demo.GRPCDemo/BidirectionalStreamingMethod', + request_serializer=demo__pb2.Request.SerializeToString, + response_deserializer=demo__pb2.Response.FromString, + ) + + +class GRPCDemoServicer(object): + """service是用来给GRPC服务定义方法的, 格式固定, 类似于Golang中定义一个接口 + `service` is used to define methods for GRPC services in a fixed format, similar to defining an interface in Golang + """ + + def SimpleMethod(self, request, context): + """简单模式 + unary-unary + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ClientStreamingMethod(self, request_iterator, context): + """客户端流模式(在一次调用中, 客户端可以多次向服务器传输数据, 但是服务器只能返回一次响应) + stream-unary (In a single call, the client can transfer data to the server several times, + but the server can only return a response once.) + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ServerStreamingMethod(self, request, context): + """服务端流模式(在一次调用中, 客户端只能一次向服务器传输数据, 但是服务器可以多次返回响应) + unary-stream (In a single call, the client can only transmit data to the server at one time, + but the server can return the response many times.) + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def BidirectionalStreamingMethod(self, request_iterator, context): + """双向流模式 (在一次调用中, 客户端和服务器都可以向对方多次收发数据) + stream-stream (In a single call, both client and server can send and receive data + to each other multiple times.) + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_GRPCDemoServicer_to_server(servicer, server): + rpc_method_handlers = { + 'SimpleMethod': grpc.unary_unary_rpc_method_handler( + servicer.SimpleMethod, + request_deserializer=demo__pb2.Request.FromString, + response_serializer=demo__pb2.Response.SerializeToString, + ), + 'ClientStreamingMethod': grpc.stream_unary_rpc_method_handler( + servicer.ClientStreamingMethod, + request_deserializer=demo__pb2.Request.FromString, + response_serializer=demo__pb2.Response.SerializeToString, + ), + 'ServerStreamingMethod': grpc.unary_stream_rpc_method_handler( + servicer.ServerStreamingMethod, + request_deserializer=demo__pb2.Request.FromString, + response_serializer=demo__pb2.Response.SerializeToString, + ), + 'BidirectionalStreamingMethod': grpc.stream_stream_rpc_method_handler( + servicer.BidirectionalStreamingMethod, + request_deserializer=demo__pb2.Request.FromString, + response_serializer=demo__pb2.Response.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'demo.GRPCDemo', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) diff --git a/examples/python/data_transmission/server.py b/examples/python/data_transmission/server.py new file mode 100644 index 00000000..3c990945 --- /dev/null +++ b/examples/python/data_transmission/server.py @@ -0,0 +1,115 @@ +# Copyright 2019 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""The example of four ways of data transmission using gRPC in Python.""" + +from threading import Thread +from concurrent import futures + +import grpc +import demo_pb2_grpc +import demo_pb2 + +__all__ = 'DemoServer' +SERVER_ADDRESS = 'localhost:23333' +SERVER_ID = 1 + + +class DemoServer(demo_pb2_grpc.GRPCDemoServicer): + + # 一元模式(在一次调用中, 客户端只能向服务器传输一次请求数据, 服务器也只能返回一次响应) + # unary-unary(In a single call, the client can only send request once, and the server can + # only respond once.) + def SimpleMethod(self, request, context): + print("SimpleMethod called by client(%d) the message: %s" % + (request.client_id, request.request_data)) + response = demo_pb2.Response( + server_id=SERVER_ID, + response_data="Python server SimpleMethod Ok!!!!") + return response + + # 客户端流模式(在一次调用中, 客户端可以多次向服务器传输数据, 但是服务器只能返回一次响应) + # stream-unary (In a single call, the client can transfer data to the server several times, + # but the server can only return a response once.) + def ClientStreamingMethod(self, request_iterator, context): + print("ClientStreamingMethod called by client...") + for request in request_iterator: + print("recv from client(%d), message= %s" % + (request.client_id, request.request_data)) + response = demo_pb2.Response( + server_id=SERVER_ID, + response_data="Python server ClientStreamingMethod ok") + return response + + # 服务端流模式(在一次调用中, 客户端只能一次向服务器传输数据, 但是服务器可以多次返回响应) + # unary-stream (In a single call, the client can only transmit data to the server at one time, + # but the server can return the response many times.) + def ServerStreamingMethod(self, request, context): + print("ServerStreamingMethod called by client(%d), message= %s" % + (request.client_id, request.request_data)) + + # 创建一个生成器 + # create a generator + def response_messages(): + for i in range(5): + response = demo_pb2.Response( + server_id=SERVER_ID, + response_data=("send by Python server, message=%d" % i)) + yield response + + return response_messages() + + # 双向流模式 (在一次调用中, 客户端和服务器都可以向对方多次收发数据) + # stream-stream (In a single call, both client and server can send and receive data + # to each other multiple times.) + def BidirectionalStreamingMethod(self, request_iterator, context): + print("BidirectionalStreamingMethod called by client...") + + # 开启一个子线程去接收数据 + # Open a sub thread to receive data + def parse_request(): + for request in request_iterator: + print("recv from client(%d), message= %s" % + (request.client_id, request.request_data)) + + t = Thread(target=parse_request) + t.start() + + for i in range(5): + yield demo_pb2.Response( + server_id=SERVER_ID, + response_data=("send by Python server, message= %d" % i)) + + t.join() + + +def main(): + server = grpc.server(futures.ThreadPoolExecutor()) + + demo_pb2_grpc.add_GRPCDemoServicer_to_server(DemoServer(), server) + + server.add_insecure_port(SERVER_ADDRESS) + print("------------------start Python GRPC server") + server.start() + server.wait_for_termination() + + # If raise Error: + # AttributeError: '_Server' object has no attribute 'wait_for_termination' + # You can use the following code instead: + # import time + # while 1: + # time.sleep(10) + + +if __name__ == '__main__': + main() diff --git a/examples/python/debug/BUILD.bazel b/examples/python/debug/BUILD.bazel new file mode 100644 index 00000000..029f78d5 --- /dev/null +++ b/examples/python/debug/BUILD.bazel @@ -0,0 +1,65 @@ +# Copyright 2019 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("@grpc_python_dependencies//:requirements.bzl", "requirement") + +py_binary( + name = "debug_server", + testonly = 1, + srcs = ["debug_server.py"], + deps = [ + "//examples:helloworld_py_pb2", + "//examples:helloworld_py_pb2_grpc", + "//src/python/grpcio/grpc:grpcio", + "//src/python/grpcio_channelz/grpc_channelz/v1:grpc_channelz", + ], +) + +py_binary( + name = "send_message", + testonly = 1, + srcs = ["send_message.py"], + python_version = "PY3", + deps = [ + "//examples:helloworld_py_pb2", + "//examples:helloworld_py_pb2_grpc", + "//src/python/grpcio/grpc:grpcio", + ], +) + +py_binary( + name = "get_stats", + testonly = 1, + srcs = ["get_stats.py"], + python_version = "PY3", + deps = [ + "//src/python/grpcio/grpc:grpcio", + "//src/python/grpcio_channelz/grpc_channelz/v1:grpc_channelz", + ], +) + +py_test( + name = "_debug_example_test", + srcs = ["test/_debug_example_test.py"], + python_version = "PY3", + deps = [ + ":debug_server", + ":get_stats", + ":send_message", + "//examples:helloworld_py_pb2", + "//examples:helloworld_py_pb2_grpc", + "//src/python/grpcio/grpc:grpcio", + "//src/python/grpcio_channelz/grpc_channelz/v1:grpc_channelz", + ], +) diff --git a/examples/python/debug/README.md b/examples/python/debug/README.md new file mode 100644 index 00000000..ceed31ef --- /dev/null +++ b/examples/python/debug/README.md @@ -0,0 +1,68 @@ +# gRPC Python Debug Example + +This example demonstrate the usage of Channelz. For a better looking website, +the [gdebug](https://github.com/grpc/grpc-experiments/tree/master/gdebug) uses +gRPC-Web protocol and will serve all useful information in web pages. + +## Channelz: Live Channel Tracing + +Channelz is a channel tracing feature. It will track statistics like how many +messages have been sent, how many of them failed, what are the connected +sockets. Since it is implemented in C-Core and has low-overhead, it is +recommended to turn on for production services. See [Channelz design +doc](https://github.com/grpc/proposal/blob/master/A14-channelz.md). + +## How to enable tracing log +The tracing log generation might have larger overhead, especially when you try +to trace transport. It would result in replicating the traffic loads. However, +it is still the most powerful tool when you need to dive in. + +### The Most Verbose Tracing Log + +Specify environment variables, then run your application: + +``` +GRPC_VERBOSITY=debug +GRPC_TRACE=all +``` + +For more granularity, please see +[environment_variables](https://github.com/grpc/grpc/blob/master/doc/environment_variables.md). + +### Debug Transport Protocol + +``` +GRPC_VERBOSITY=debug +GRPC_TRACE=tcp,http,secure_endpoint,transport_security +``` + +### Debug Connection Behavior + +``` +GRPC_VERBOSITY=debug +GRPC_TRACE=call_error,connectivity_state,pick_first,round_robin,glb +``` + +## How to debug your application? + +`pdb` is a debugging tool that is available for Python interpreters natively. +You can set breakpoint, and execute commands while the application is stopped. + +The simplest usage is add a single line in the place you want to inspect: +`import pdb; pdb.set_trace()`. When interpreter see this line, it would pop out +a interactive command line interface for you to inspect the application state. + +For more detailed usage, see https://docs.python.org/3/library/pdb.html. + +**Caveat**: gRPC Python uses C-Extension under-the-hood, so `pdb` may not be +able to trace through the whole stack. + +## gRPC Command Line Tool + +`grpc_cli` is a handy tool to interact with gRPC backend easily. Imageine you can +inspect what service does a server provide without writing any code, and make +gRPC calls just like `curl`. + +The installation guide: https://github.com/grpc/grpc/blob/master/doc/command_line_tool.md#code-location +The usage guide: https://github.com/grpc/grpc/blob/master/doc/command_line_tool.md#usage +The source code: https://github.com/grpc/grpc/blob/master/test/cpp/util/grpc_cli.cc diff --git a/examples/python/debug/debug_server.py b/examples/python/debug/debug_server.py new file mode 100644 index 00000000..ce78fe33 --- /dev/null +++ b/examples/python/debug/debug_server.py @@ -0,0 +1,83 @@ +# Copyright 2019 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""The Python example of utilizing Channelz feature.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import logging +from concurrent import futures +import random + +import grpc +from grpc_channelz.v1 import channelz + +from examples import helloworld_pb2 +from examples import helloworld_pb2_grpc + +_LOGGER = logging.getLogger(__name__) +_LOGGER.setLevel(logging.INFO) + +_RANDOM_FAILURE_RATE = 0.3 + + +class FaultInjectGreeter(helloworld_pb2_grpc.GreeterServicer): + + def __init__(self, failure_rate): + self._failure_rate = failure_rate + + def SayHello(self, request, context): + if random.random() < self._failure_rate: + context.abort(grpc.StatusCode.UNAVAILABLE, + 'Randomly injected failure.') + return helloworld_pb2.HelloReply(message='Hello, %s!' % request.name) + + +def create_server(addr, failure_rate): + server = grpc.server(futures.ThreadPoolExecutor()) + helloworld_pb2_grpc.add_GreeterServicer_to_server( + FaultInjectGreeter(failure_rate), server) + + # Add Channelz Servicer to the gRPC server + channelz.add_channelz_servicer(server) + + server.add_insecure_port(addr) + return server + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('--addr', + nargs=1, + type=str, + default='[::]:50051', + help='the address to listen on') + parser.add_argument( + '--failure_rate', + nargs=1, + type=float, + default=0.3, + help='a float indicates the percentage of failed message injections') + args = parser.parse_args() + + server = create_server(addr=args.addr, failure_rate=args.failure_rate) + server.start() + server.wait_for_termination() + + +if __name__ == '__main__': + logging.basicConfig(level=logging.INFO) + main() diff --git a/examples/python/debug/get_stats.py b/examples/python/debug/get_stats.py new file mode 100644 index 00000000..2888182f --- /dev/null +++ b/examples/python/debug/get_stats.py @@ -0,0 +1,49 @@ +# Copyright 2019 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Poll statistics from the server.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import logging +import argparse +import grpc + +from grpc_channelz.v1 import channelz_pb2 +from grpc_channelz.v1 import channelz_pb2_grpc + + +def run(addr): + with grpc.insecure_channel(addr) as channel: + channelz_stub = channelz_pb2_grpc.ChannelzStub(channel) + response = channelz_stub.GetServers( + channelz_pb2.GetServersRequest(start_server_id=0)) + print('Info for all servers: %s' % response) + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('--addr', + nargs=1, + type=str, + default='[::]:50051', + help='the address to request') + args = parser.parse_args() + run(addr=args.addr) + + +if __name__ == '__main__': + logging.basicConfig() + main() diff --git a/examples/python/debug/send_message.py b/examples/python/debug/send_message.py new file mode 100644 index 00000000..63cc60a5 --- /dev/null +++ b/examples/python/debug/send_message.py @@ -0,0 +1,62 @@ +# Copyright 2019 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Send multiple greeting messages to the backend.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import logging +import argparse +import grpc +from examples import helloworld_pb2 +from examples import helloworld_pb2_grpc + + +def process(stub, request): + try: + response = stub.SayHello(request) + except grpc.RpcError as rpc_error: + print('Received error: %s' % rpc_error) + else: + print('Received message: %s' % response) + + +def run(addr, n): + with grpc.insecure_channel(addr) as channel: + stub = helloworld_pb2_grpc.GreeterStub(channel) + request = helloworld_pb2.HelloRequest(name='you') + for _ in range(n): + process(stub, request) + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('--addr', + nargs=1, + type=str, + default='[::]:50051', + help='the address to request') + parser.add_argument('-n', + nargs=1, + type=int, + default=10, + help='an integer for number of messages to sent') + args = parser.parse_args() + run(addr=args.addr, n=args.n) + + +if __name__ == '__main__': + logging.basicConfig() + main() diff --git a/examples/python/debug/test/_debug_example_test.py b/examples/python/debug/test/_debug_example_test.py new file mode 100644 index 00000000..26a40ae5 --- /dev/null +++ b/examples/python/debug/test/_debug_example_test.py @@ -0,0 +1,53 @@ +# Copyright 2019 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Test for gRPC Python debug example.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import logging +import unittest + +from examples.python.debug import debug_server +from examples.python.debug import send_message +from examples.python.debug import get_stats + +_LOGGER = logging.getLogger(__name__) +_LOGGER.setLevel(logging.INFO) + +_FAILURE_RATE = 0.5 +_NUMBER_OF_MESSAGES = 100 + +_ADDR_TEMPLATE = 'localhost:%d' + + +class DebugExampleTest(unittest.TestCase): + + def test_channelz_example(self): + server = debug_server.create_server(addr='[::]:0', + failure_rate=_FAILURE_RATE) + port = server.add_insecure_port('[::]:0') + server.start() + address = _ADDR_TEMPLATE % port + + send_message.run(addr=address, n=_NUMBER_OF_MESSAGES) + get_stats.run(addr=address) + server.stop(None) + # No unhandled exception raised, test passed! + + +if __name__ == '__main__': + logging.basicConfig() + unittest.main(verbosity=2) diff --git a/examples/python/errors/BUILD.bazel b/examples/python/errors/BUILD.bazel new file mode 100644 index 00000000..a6aacd75 --- /dev/null +++ b/examples/python/errors/BUILD.bazel @@ -0,0 +1,59 @@ +# Copyright 2019 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("@grpc_python_dependencies//:requirements.bzl", "requirement") + +py_library( + name = "client", + testonly = 1, + srcs = ["client.py"], + deps = [ + "//examples:helloworld_py_pb2", + "//examples:helloworld_py_pb2_grpc", + "//src/python/grpcio/grpc:grpcio", + "//src/python/grpcio_status/grpc_status", + requirement("googleapis-common-protos"), + ], +) + +py_library( + name = "server", + testonly = 1, + srcs = ["server.py"], + deps = [ + "//src/python/grpcio/grpc:grpcio", + "//src/python/grpcio_status/grpc_status:grpc_status", + "//examples:helloworld_py_pb2", + "//examples:helloworld_py_pb2_grpc", + ] + select({ + "//conditions:default": [requirement("futures")], + "//:python3": [], + }), +) + +py_test( + name = "test/_error_handling_example_test", + size = "small", + srcs = ["test/_error_handling_example_test.py"], + imports = [ + "../../../src/python/grpcio_status", + "../../../src/python/grpcio_tests", + ], + python_version = "PY3", + deps = [ + ":client", + ":server", + "//src/python/grpcio_tests/tests:bazel_namespace_package_hack", + ], +) diff --git a/examples/python/errors/README.md b/examples/python/errors/README.md new file mode 100644 index 00000000..2cfc26a9 --- /dev/null +++ b/examples/python/errors/README.md @@ -0,0 +1,107 @@ +# gRPC Python Error Handling Example + +The goal of this example is sending error status from server that is more complicated than a code and detail string. + +The definition for an RPC method in proto files contains request message and response message. There are many error states that can be shared across RPC methods (e.g. stack trace, insufficient quota). Using a different path to handle error will make the code more maintainable. + +Ideally, the final status of an RPC should be described in the trailing headers of HTTP2, and gRPC Python provides helper functions in `grpcio-status` package to assist the packing and unpacking of error status. + + +### Requirement +``` +grpcio>=1.18.0 +grpcio-status>=1.18.0 +googleapis-common-protos>=1.5.5 +``` + + +### Error Detail Proto + +You may provide any custom proto message as error detail in your implementation. Here are protos are defined by Google Cloud Library Team: + +* [code.proto]([https://github.com/googleapis/api-common-protos/blob/master/google/rpc/code.proto](https://github.com/googleapis/api-common-protos/blob/87185dfffad4afa5a33a8c153f0e1ea53b4f85dc/google/rpc/code.proto)) contains definition of RPC error codes. +* [error_details.proto]([https://github.com/googleapis/api-common-protos/blob/master/google/rpc/error_details.proto](https://github.com/googleapis/api-common-protos/blob/87185dfffad4afa5a33a8c153f0e1ea53b4f85dc/google/rpc/error_details.proto)) contains definitions of common error details. + + +### Definition of Status Proto + +Here is the definition of Status proto. For full text, please see [status.proto](https://github.com/googleapis/api-common-protos/blob/87185dfffad4afa5a33a8c153f0e1ea53b4f85dc/google/rpc/status.proto). + +```proto +// The `Status` type defines a logical error model that is suitable for different +// programming environments, including REST APIs and RPC APIs. It is used by +// [gRPC](https://github.com/grpc). The error model is designed to be: +// +// - Simple to use and understand for most users +// - Flexible enough to meet unexpected needs +// +// # Overview +// +// The `Status` message contains three pieces of data: error code, error message, +// and error details. The error code should be an enum value of +// [google.rpc.Code][google.rpc.Code], but it may accept additional error codes if needed. The +// error message should be a developer-facing English message that helps +// developers *understand* and *resolve* the error. If a localized user-facing +// error message is needed, put the localized message in the error details or +// localize it in the client. The optional error details may contain arbitrary +// information about the error. There is a predefined set of error detail types +// in the package `google.rpc` that can be used for common error conditions. +// +// # Language mapping +// +// The `Status` message is the logical representation of the error model, but it +// is not necessarily the actual wire format. When the `Status` message is +// exposed in different client libraries and different wire protocols, it can be +// mapped differently. For example, it will likely be mapped to some exceptions +// in Java, but more likely mapped to some error codes in C. +// +// # Other uses +// +// The error model and the `Status` message can be used in a variety of +// environments, either with or without APIs, to provide a +// consistent developer experience across different environments. +// +// Example uses of this error model include: +// +// - Partial errors. If a service needs to return partial errors to the client, +// it may embed the `Status` in the normal response to indicate the partial +// errors. +// +// - Workflow errors. A typical workflow has multiple steps. Each step may +// have a `Status` message for error reporting. +// +// - Batch operations. If a client uses batch request and batch response, the +// `Status` message should be used directly inside batch response, one for +// each error sub-response. +// +// - Asynchronous operations. If an API call embeds asynchronous operation +// results in its response, the status of those operations should be +// represented directly using the `Status` message. +// +// - Logging. If some API errors are stored in logs, the message `Status` could +// be used directly after any stripping needed for security/privacy reasons. +message Status { + // The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code]. + int32 code = 1; + + // A developer-facing error message, which should be in English. Any + // user-facing error message should be localized and sent in the + // [google.rpc.Status.details][google.rpc.Status.details] field, or localized by the client. + string message = 2; + + // A list of messages that carry the error details. There is a common set of + // message types for APIs to use. + repeated google.protobuf.Any details = 3; +} +``` + + +### Usage of Well-Known-Proto `Any` + +Please check [ProtoBuf Document: Any](https://developers.google.com/protocol-buffers/docs/reference/python-generated#any) + +```Python +any_message.Pack(message) +any_message.Unpack(message) +assert any_message.Is(message.DESCRIPTOR) +``` diff --git a/examples/python/errors/client.py b/examples/python/errors/client.py new file mode 100644 index 00000000..c762d798 --- /dev/null +++ b/examples/python/errors/client.py @@ -0,0 +1,56 @@ +# Copyright 2019 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""This example handles rich error status in client-side.""" + +from __future__ import print_function +import logging + +import grpc +from grpc_status import rpc_status +from google.rpc import error_details_pb2 + +from examples import helloworld_pb2 +from examples import helloworld_pb2_grpc + +_LOGGER = logging.getLogger(__name__) + + +def process(stub): + try: + response = stub.SayHello(helloworld_pb2.HelloRequest(name='Alice')) + _LOGGER.info('Call success: %s', response.message) + except grpc.RpcError as rpc_error: + _LOGGER.error('Call failure: %s', rpc_error) + status = rpc_status.from_call(rpc_error) + for detail in status.details: + if detail.Is(error_details_pb2.QuotaFailure.DESCRIPTOR): + info = error_details_pb2.QuotaFailure() + detail.Unpack(info) + _LOGGER.error('Quota failure: %s', info) + else: + raise RuntimeError('Unexpected failure: %s' % detail) + + +def main(): + # NOTE(gRPC Python Team): .close() is possible on a channel and should be + # used in circumstances in which the with statement does not fit the needs + # of the code. + with grpc.insecure_channel('localhost:50051') as channel: + stub = helloworld_pb2_grpc.GreeterStub(channel) + process(stub) + + +if __name__ == '__main__': + logging.basicConfig() + main() diff --git a/examples/python/errors/server.py b/examples/python/errors/server.py new file mode 100644 index 00000000..096d2170 --- /dev/null +++ b/examples/python/errors/server.py @@ -0,0 +1,82 @@ +# Copyright 2019 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""This example sends out rich error status from server-side.""" + +from concurrent import futures +import logging +import threading + +import grpc +from grpc_status import rpc_status + +from google.protobuf import any_pb2 +from google.rpc import code_pb2, status_pb2, error_details_pb2 + +from examples import helloworld_pb2 +from examples import helloworld_pb2_grpc + + +def create_greet_limit_exceed_error_status(name): + detail = any_pb2.Any() + detail.Pack( + error_details_pb2.QuotaFailure(violations=[ + error_details_pb2.QuotaFailure.Violation( + subject="name: %s" % name, + description="Limit one greeting per person", + ) + ],)) + return status_pb2.Status( + code=code_pb2.RESOURCE_EXHAUSTED, + message='Request limit exceeded.', + details=[detail], + ) + + +class LimitedGreeter(helloworld_pb2_grpc.GreeterServicer): + + def __init__(self): + self._lock = threading.RLock() + self._greeted = set() + + def SayHello(self, request, context): + with self._lock: + if request.name in self._greeted: + rich_status = create_greet_limit_exceed_error_status( + request.name) + context.abort_with_status(rpc_status.to_status(rich_status)) + else: + self._greeted.add(request.name) + return helloworld_pb2.HelloReply(message='Hello, %s!' % request.name) + + +def create_server(server_address): + server = grpc.server(futures.ThreadPoolExecutor()) + helloworld_pb2_grpc.add_GreeterServicer_to_server(LimitedGreeter(), server) + port = server.add_insecure_port(server_address) + return server, port + + +def serve(server): + server.start() + server.wait_for_termination() + + +def main(): + server, unused_port = create_server('[::]:50051') + serve(server) + + +if __name__ == '__main__': + logging.basicConfig() + main() diff --git a/examples/python/errors/test/_error_handling_example_test.py b/examples/python/errors/test/_error_handling_example_test.py new file mode 100644 index 00000000..9eb81ba3 --- /dev/null +++ b/examples/python/errors/test/_error_handling_example_test.py @@ -0,0 +1,54 @@ +# Copyright 2019 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Tests of the error handling example.""" + +# NOTE(lidiz) This module only exists in Bazel BUILD file, for more details +# please refer to comments in the "bazel_namespace_package_hack" module. +try: + from tests import bazel_namespace_package_hack + bazel_namespace_package_hack.sys_path_to_site_dir_hack() +except ImportError: + pass + +import unittest +import logging + +import grpc + +from examples import helloworld_pb2_grpc +from examples.python.errors import client as error_handling_client +from examples.python.errors import server as error_handling_server + + +class ErrorHandlingExampleTest(unittest.TestCase): + + def setUp(self): + self._server, port = error_handling_server.create_server('[::]:0') + self._server.start() + self._channel = grpc.insecure_channel('localhost:%d' % port) + + def tearDown(self): + self._channel.close() + self._server.stop(None) + + def test_error_handling_example(self): + stub = helloworld_pb2_grpc.GreeterStub(self._channel) + error_handling_client.process(stub) + error_handling_client.process(stub) + # No unhandled exception raised, test passed! + + +if __name__ == '__main__': + logging.basicConfig() + unittest.main(verbosity=2) diff --git a/examples/python/helloworld/.gitignore b/examples/python/helloworld/.gitignore new file mode 100644 index 00000000..0d20b648 --- /dev/null +++ b/examples/python/helloworld/.gitignore @@ -0,0 +1 @@ +*.pyc diff --git a/examples/python/helloworld/README.md b/examples/python/helloworld/README.md new file mode 100644 index 00000000..63d61e43 --- /dev/null +++ b/examples/python/helloworld/README.md @@ -0,0 +1 @@ +[This code's documentation lives on the grpc.io site.](https://grpc.io/docs/quickstart/python.html) diff --git a/examples/python/helloworld/greeter_client.py b/examples/python/helloworld/greeter_client.py new file mode 100644 index 00000000..ee2032a9 --- /dev/null +++ b/examples/python/helloworld/greeter_client.py @@ -0,0 +1,37 @@ +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""The Python implementation of the GRPC helloworld.Greeter client.""" + +from __future__ import print_function +import logging + +import grpc + +import helloworld_pb2 +import helloworld_pb2_grpc + + +def run(): + # NOTE(gRPC Python Team): .close() is possible on a channel and should be + # used in circumstances in which the with statement does not fit the needs + # of the code. + with grpc.insecure_channel('localhost:50051') as channel: + stub = helloworld_pb2_grpc.GreeterStub(channel) + response = stub.SayHello(helloworld_pb2.HelloRequest(name='you')) + print("Greeter client received: " + response.message) + + +if __name__ == '__main__': + logging.basicConfig() + run() diff --git a/examples/python/helloworld/greeter_client_with_options.py b/examples/python/helloworld/greeter_client_with_options.py new file mode 100644 index 00000000..74c6a154 --- /dev/null +++ b/examples/python/helloworld/greeter_client_with_options.py @@ -0,0 +1,46 @@ +# Copyright 2018 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""gRPC Python helloworld.Greeter client with channel options and call timeout parameters.""" + +from __future__ import print_function +import logging + +import grpc + +import helloworld_pb2 +import helloworld_pb2_grpc + + +def run(): + # NOTE(gRPC Python Team): .close() is possible on a channel and should be + # used in circumstances in which the with statement does not fit the needs + # of the code. + # + # For more channel options, please see https://grpc.io/grpc/core/group__grpc__arg__keys.html + with grpc.insecure_channel(target='localhost:50051', + options=[('grpc.lb_policy_name', 'pick_first'), + ('grpc.enable_retries', 0), + ('grpc.keepalive_timeout_ms', 10000) + ]) as channel: + stub = helloworld_pb2_grpc.GreeterStub(channel) + # Timeout in seconds. + # Please refer gRPC Python documents for more detail. https://grpc.io/grpc/python/grpc.html + response = stub.SayHello(helloworld_pb2.HelloRequest(name='you'), + timeout=10) + print("Greeter client received: " + response.message) + + +if __name__ == '__main__': + logging.basicConfig() + run() diff --git a/examples/python/helloworld/greeter_server.py b/examples/python/helloworld/greeter_server.py new file mode 100644 index 00000000..7bc3f2f7 --- /dev/null +++ b/examples/python/helloworld/greeter_server.py @@ -0,0 +1,41 @@ +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""The Python implementation of the GRPC helloworld.Greeter server.""" + +from concurrent import futures +import logging + +import grpc + +import helloworld_pb2 +import helloworld_pb2_grpc + + +class Greeter(helloworld_pb2_grpc.GreeterServicer): + + def SayHello(self, request, context): + return helloworld_pb2.HelloReply(message='Hello, %s!' % request.name) + + +def serve(): + server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) + helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server) + server.add_insecure_port('[::]:50051') + server.start() + server.wait_for_termination() + + +if __name__ == '__main__': + logging.basicConfig() + serve() diff --git a/examples/python/helloworld/greeter_server_with_reflection.py b/examples/python/helloworld/greeter_server_with_reflection.py new file mode 100644 index 00000000..7c73a42e --- /dev/null +++ b/examples/python/helloworld/greeter_server_with_reflection.py @@ -0,0 +1,47 @@ +# Copyright 2018 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""The reflection-enabled version of gRPC helloworld.Greeter server.""" + +from concurrent import futures +import logging + +import grpc +from grpc_reflection.v1alpha import reflection + +import helloworld_pb2 +import helloworld_pb2_grpc + + +class Greeter(helloworld_pb2_grpc.GreeterServicer): + + def SayHello(self, request, context): + return helloworld_pb2.HelloReply(message='Hello, %s!' % request.name) + + +def serve(): + server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) + helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server) + SERVICE_NAMES = ( + helloworld_pb2.DESCRIPTOR.services_by_name['Greeter'].full_name, + reflection.SERVICE_NAME, + ) + reflection.enable_server_reflection(SERVICE_NAMES, server) + server.add_insecure_port('[::]:50051') + server.start() + server.wait_for_termination() + + +if __name__ == '__main__': + logging.basicConfig() + serve() diff --git a/examples/python/helloworld/helloworld_pb2.py b/examples/python/helloworld/helloworld_pb2.py new file mode 100644 index 00000000..e18ab9ac --- /dev/null +++ b/examples/python/helloworld/helloworld_pb2.py @@ -0,0 +1,134 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: helloworld.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +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='helloworld.proto', + package='helloworld', + syntax='proto3', + serialized_pb=_b('\n\x10helloworld.proto\x12\nhelloworld\"\x1c\n\x0cHelloRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"\x1d\n\nHelloReply\x12\x0f\n\x07message\x18\x01 \x01(\t2I\n\x07Greeter\x12>\n\x08SayHello\x12\x18.helloworld.HelloRequest\x1a\x16.helloworld.HelloReply\"\x00\x42\x36\n\x1bio.grpc.examples.helloworldB\x0fHelloWorldProtoP\x01\xa2\x02\x03HLWb\x06proto3') +) + + + + +_HELLOREQUEST = _descriptor.Descriptor( + name='HelloRequest', + full_name='helloworld.HelloRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='helloworld.HelloRequest.name', index=0, + number=1, 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=32, + serialized_end=60, +) + + +_HELLOREPLY = _descriptor.Descriptor( + name='HelloReply', + full_name='helloworld.HelloReply', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='message', full_name='helloworld.HelloReply.message', index=0, + number=1, 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=62, + serialized_end=91, +) + +DESCRIPTOR.message_types_by_name['HelloRequest'] = _HELLOREQUEST +DESCRIPTOR.message_types_by_name['HelloReply'] = _HELLOREPLY +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +HelloRequest = _reflection.GeneratedProtocolMessageType('HelloRequest', (_message.Message,), dict( + DESCRIPTOR = _HELLOREQUEST, + __module__ = 'helloworld_pb2' + # @@protoc_insertion_point(class_scope:helloworld.HelloRequest) + )) +_sym_db.RegisterMessage(HelloRequest) + +HelloReply = _reflection.GeneratedProtocolMessageType('HelloReply', (_message.Message,), dict( + DESCRIPTOR = _HELLOREPLY, + __module__ = 'helloworld_pb2' + # @@protoc_insertion_point(class_scope:helloworld.HelloReply) + )) +_sym_db.RegisterMessage(HelloReply) + + +DESCRIPTOR.has_options = True +DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\033io.grpc.examples.helloworldB\017HelloWorldProtoP\001\242\002\003HLW')) + +_GREETER = _descriptor.ServiceDescriptor( + name='Greeter', + full_name='helloworld.Greeter', + file=DESCRIPTOR, + index=0, + options=None, + serialized_start=93, + serialized_end=166, + methods=[ + _descriptor.MethodDescriptor( + name='SayHello', + full_name='helloworld.Greeter.SayHello', + index=0, + containing_service=None, + input_type=_HELLOREQUEST, + output_type=_HELLOREPLY, + options=None, + ), +]) +_sym_db.RegisterServiceDescriptor(_GREETER) + +DESCRIPTOR.services_by_name['Greeter'] = _GREETER + +# @@protoc_insertion_point(module_scope) diff --git a/examples/python/helloworld/helloworld_pb2_grpc.py b/examples/python/helloworld/helloworld_pb2_grpc.py new file mode 100644 index 00000000..18e07d16 --- /dev/null +++ b/examples/python/helloworld/helloworld_pb2_grpc.py @@ -0,0 +1,46 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +import grpc + +import helloworld_pb2 as helloworld__pb2 + + +class GreeterStub(object): + """The greeting service definition. + """ + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.SayHello = channel.unary_unary( + '/helloworld.Greeter/SayHello', + request_serializer=helloworld__pb2.HelloRequest.SerializeToString, + response_deserializer=helloworld__pb2.HelloReply.FromString, + ) + + +class GreeterServicer(object): + """The greeting service definition. + """ + + def SayHello(self, request, context): + """Sends a greeting + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_GreeterServicer_to_server(servicer, server): + rpc_method_handlers = { + 'SayHello': grpc.unary_unary_rpc_method_handler( + servicer.SayHello, + request_deserializer=helloworld__pb2.HelloRequest.FromString, + response_serializer=helloworld__pb2.HelloReply.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'helloworld.Greeter', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) diff --git a/examples/python/interceptors/default_value/default_value_client_interceptor.py b/examples/python/interceptors/default_value/default_value_client_interceptor.py new file mode 100644 index 00000000..c935b954 --- /dev/null +++ b/examples/python/interceptors/default_value/default_value_client_interceptor.py @@ -0,0 +1,66 @@ +# Copyright 2017 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Interceptor that adds headers to outgoing requests.""" + +import grpc + + +class _ConcreteValue(grpc.Future): + + def __init__(self, result): + self._result = result + + def cancel(self): + return False + + def cancelled(self): + return False + + def running(self): + return False + + def done(self): + return True + + def result(self, timeout=None): + return self._result + + def exception(self, timeout=None): + return None + + def traceback(self, timeout=None): + return None + + def add_done_callback(self, fn): + fn(self._result) + + +class DefaultValueClientInterceptor(grpc.UnaryUnaryClientInterceptor, + grpc.StreamUnaryClientInterceptor): + + def __init__(self, value): + self._default = _ConcreteValue(value) + + def _intercept_call(self, continuation, client_call_details, + request_or_iterator): + response = continuation(client_call_details, request_or_iterator) + return self._default if response.exception() else response + + def intercept_unary_unary(self, continuation, client_call_details, request): + return self._intercept_call(continuation, client_call_details, request) + + def intercept_stream_unary(self, continuation, client_call_details, + request_iterator): + return self._intercept_call(continuation, client_call_details, + request_iterator) diff --git a/examples/python/interceptors/default_value/greeter_client.py b/examples/python/interceptors/default_value/greeter_client.py new file mode 100644 index 00000000..25834c2b --- /dev/null +++ b/examples/python/interceptors/default_value/greeter_client.py @@ -0,0 +1,44 @@ +# Copyright 2017 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""The Python implementation of the gRPC helloworld.Greeter client.""" + +from __future__ import print_function +import logging + +import grpc + +import helloworld_pb2 +import helloworld_pb2_grpc +import default_value_client_interceptor + + +def run(): + default_value = helloworld_pb2.HelloReply( + message='Hello from your local interceptor!') + default_value_interceptor = default_value_client_interceptor.DefaultValueClientInterceptor( + default_value) + # NOTE(gRPC Python Team): .close() is possible on a channel and should be + # used in circumstances in which the with statement does not fit the needs + # of the code. + with grpc.insecure_channel('localhost:50051') as channel: + intercept_channel = grpc.intercept_channel(channel, + default_value_interceptor) + stub = helloworld_pb2_grpc.GreeterStub(intercept_channel) + response = stub.SayHello(helloworld_pb2.HelloRequest(name='you')) + print("Greeter client received: " + response.message) + + +if __name__ == '__main__': + logging.basicConfig() + run() diff --git a/examples/python/interceptors/default_value/helloworld_pb2.py b/examples/python/interceptors/default_value/helloworld_pb2.py new file mode 100644 index 00000000..e18ab9ac --- /dev/null +++ b/examples/python/interceptors/default_value/helloworld_pb2.py @@ -0,0 +1,134 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: helloworld.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +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='helloworld.proto', + package='helloworld', + syntax='proto3', + serialized_pb=_b('\n\x10helloworld.proto\x12\nhelloworld\"\x1c\n\x0cHelloRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"\x1d\n\nHelloReply\x12\x0f\n\x07message\x18\x01 \x01(\t2I\n\x07Greeter\x12>\n\x08SayHello\x12\x18.helloworld.HelloRequest\x1a\x16.helloworld.HelloReply\"\x00\x42\x36\n\x1bio.grpc.examples.helloworldB\x0fHelloWorldProtoP\x01\xa2\x02\x03HLWb\x06proto3') +) + + + + +_HELLOREQUEST = _descriptor.Descriptor( + name='HelloRequest', + full_name='helloworld.HelloRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='helloworld.HelloRequest.name', index=0, + number=1, 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=32, + serialized_end=60, +) + + +_HELLOREPLY = _descriptor.Descriptor( + name='HelloReply', + full_name='helloworld.HelloReply', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='message', full_name='helloworld.HelloReply.message', index=0, + number=1, 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=62, + serialized_end=91, +) + +DESCRIPTOR.message_types_by_name['HelloRequest'] = _HELLOREQUEST +DESCRIPTOR.message_types_by_name['HelloReply'] = _HELLOREPLY +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +HelloRequest = _reflection.GeneratedProtocolMessageType('HelloRequest', (_message.Message,), dict( + DESCRIPTOR = _HELLOREQUEST, + __module__ = 'helloworld_pb2' + # @@protoc_insertion_point(class_scope:helloworld.HelloRequest) + )) +_sym_db.RegisterMessage(HelloRequest) + +HelloReply = _reflection.GeneratedProtocolMessageType('HelloReply', (_message.Message,), dict( + DESCRIPTOR = _HELLOREPLY, + __module__ = 'helloworld_pb2' + # @@protoc_insertion_point(class_scope:helloworld.HelloReply) + )) +_sym_db.RegisterMessage(HelloReply) + + +DESCRIPTOR.has_options = True +DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\033io.grpc.examples.helloworldB\017HelloWorldProtoP\001\242\002\003HLW')) + +_GREETER = _descriptor.ServiceDescriptor( + name='Greeter', + full_name='helloworld.Greeter', + file=DESCRIPTOR, + index=0, + options=None, + serialized_start=93, + serialized_end=166, + methods=[ + _descriptor.MethodDescriptor( + name='SayHello', + full_name='helloworld.Greeter.SayHello', + index=0, + containing_service=None, + input_type=_HELLOREQUEST, + output_type=_HELLOREPLY, + options=None, + ), +]) +_sym_db.RegisterServiceDescriptor(_GREETER) + +DESCRIPTOR.services_by_name['Greeter'] = _GREETER + +# @@protoc_insertion_point(module_scope) diff --git a/examples/python/interceptors/default_value/helloworld_pb2_grpc.py b/examples/python/interceptors/default_value/helloworld_pb2_grpc.py new file mode 100644 index 00000000..18e07d16 --- /dev/null +++ b/examples/python/interceptors/default_value/helloworld_pb2_grpc.py @@ -0,0 +1,46 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +import grpc + +import helloworld_pb2 as helloworld__pb2 + + +class GreeterStub(object): + """The greeting service definition. + """ + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.SayHello = channel.unary_unary( + '/helloworld.Greeter/SayHello', + request_serializer=helloworld__pb2.HelloRequest.SerializeToString, + response_deserializer=helloworld__pb2.HelloReply.FromString, + ) + + +class GreeterServicer(object): + """The greeting service definition. + """ + + def SayHello(self, request, context): + """Sends a greeting + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_GreeterServicer_to_server(servicer, server): + rpc_method_handlers = { + 'SayHello': grpc.unary_unary_rpc_method_handler( + servicer.SayHello, + request_deserializer=helloworld__pb2.HelloRequest.FromString, + response_serializer=helloworld__pb2.HelloReply.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'helloworld.Greeter', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) diff --git a/examples/python/interceptors/headers/generic_client_interceptor.py b/examples/python/interceptors/headers/generic_client_interceptor.py new file mode 100644 index 00000000..3fed93d5 --- /dev/null +++ b/examples/python/interceptors/headers/generic_client_interceptor.py @@ -0,0 +1,56 @@ +# Copyright 2017 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Base class for interceptors that operate on all RPC types.""" + +import grpc + + +class _GenericClientInterceptor(grpc.UnaryUnaryClientInterceptor, + grpc.UnaryStreamClientInterceptor, + grpc.StreamUnaryClientInterceptor, + grpc.StreamStreamClientInterceptor): + + def __init__(self, interceptor_function): + self._fn = interceptor_function + + def intercept_unary_unary(self, continuation, client_call_details, request): + new_details, new_request_iterator, postprocess = self._fn( + client_call_details, iter((request,)), False, False) + response = continuation(new_details, next(new_request_iterator)) + return postprocess(response) if postprocess else response + + def intercept_unary_stream(self, continuation, client_call_details, + request): + new_details, new_request_iterator, postprocess = self._fn( + client_call_details, iter((request,)), False, True) + response_it = continuation(new_details, next(new_request_iterator)) + return postprocess(response_it) if postprocess else response_it + + def intercept_stream_unary(self, continuation, client_call_details, + request_iterator): + new_details, new_request_iterator, postprocess = self._fn( + client_call_details, request_iterator, True, False) + response = continuation(new_details, new_request_iterator) + return postprocess(response) if postprocess else response + + def intercept_stream_stream(self, continuation, client_call_details, + request_iterator): + new_details, new_request_iterator, postprocess = self._fn( + client_call_details, request_iterator, True, True) + response_it = continuation(new_details, new_request_iterator) + return postprocess(response_it) if postprocess else response_it + + +def create(intercept_call): + return _GenericClientInterceptor(intercept_call) diff --git a/examples/python/interceptors/headers/greeter_client.py b/examples/python/interceptors/headers/greeter_client.py new file mode 100644 index 00000000..71253985 --- /dev/null +++ b/examples/python/interceptors/headers/greeter_client.py @@ -0,0 +1,42 @@ +# Copyright 2017 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""The Python implementation of the GRPC helloworld.Greeter client.""" + +from __future__ import print_function +import logging + +import grpc + +import helloworld_pb2 +import helloworld_pb2_grpc +import header_manipulator_client_interceptor + + +def run(): + header_adder_interceptor = header_manipulator_client_interceptor.header_adder_interceptor( + 'one-time-password', '42') + # NOTE(gRPC Python Team): .close() is possible on a channel and should be + # used in circumstances in which the with statement does not fit the needs + # of the code. + with grpc.insecure_channel('localhost:50051') as channel: + intercept_channel = grpc.intercept_channel(channel, + header_adder_interceptor) + stub = helloworld_pb2_grpc.GreeterStub(intercept_channel) + response = stub.SayHello(helloworld_pb2.HelloRequest(name='you')) + print("Greeter client received: " + response.message) + + +if __name__ == '__main__': + logging.basicConfig() + run() diff --git a/examples/python/interceptors/headers/greeter_server.py b/examples/python/interceptors/headers/greeter_server.py new file mode 100644 index 00000000..21d86631 --- /dev/null +++ b/examples/python/interceptors/headers/greeter_server.py @@ -0,0 +1,46 @@ +# Copyright 2017 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""The Python implementation of the GRPC helloworld.Greeter server.""" + +from concurrent import futures +import logging + +import grpc + +import helloworld_pb2 +import helloworld_pb2_grpc +from request_header_validator_interceptor import RequestHeaderValidatorInterceptor + + +class Greeter(helloworld_pb2_grpc.GreeterServicer): + + def SayHello(self, request, context): + return helloworld_pb2.HelloReply(message='Hello, %s!' % request.name) + + +def serve(): + header_validator = RequestHeaderValidatorInterceptor( + 'one-time-password', '42', grpc.StatusCode.UNAUTHENTICATED, + 'Access denied!') + server = grpc.server(futures.ThreadPoolExecutor(max_workers=10), + interceptors=(header_validator,)) + helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server) + server.add_insecure_port('[::]:50051') + server.start() + server.wait_for_termination() + + +if __name__ == '__main__': + logging.basicConfig() + serve() diff --git a/examples/python/interceptors/headers/header_manipulator_client_interceptor.py b/examples/python/interceptors/headers/header_manipulator_client_interceptor.py new file mode 100644 index 00000000..89b1bef0 --- /dev/null +++ b/examples/python/interceptors/headers/header_manipulator_client_interceptor.py @@ -0,0 +1,46 @@ +# Copyright 2017 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Interceptor that adds headers to outgoing requests.""" + +import collections + +import grpc +import generic_client_interceptor + + +class _ClientCallDetails( + collections.namedtuple( + '_ClientCallDetails', + ('method', 'timeout', 'metadata', 'credentials')), + grpc.ClientCallDetails): + pass + + +def header_adder_interceptor(header, value): + + def intercept_call(client_call_details, request_iterator, request_streaming, + response_streaming): + metadata = [] + if client_call_details.metadata is not None: + metadata = list(client_call_details.metadata) + metadata.append(( + header, + value, + )) + client_call_details = _ClientCallDetails( + client_call_details.method, client_call_details.timeout, metadata, + client_call_details.credentials) + return client_call_details, request_iterator, None + + return generic_client_interceptor.create(intercept_call) diff --git a/examples/python/interceptors/headers/helloworld_pb2.py b/examples/python/interceptors/headers/helloworld_pb2.py new file mode 100644 index 00000000..e18ab9ac --- /dev/null +++ b/examples/python/interceptors/headers/helloworld_pb2.py @@ -0,0 +1,134 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: helloworld.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +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='helloworld.proto', + package='helloworld', + syntax='proto3', + serialized_pb=_b('\n\x10helloworld.proto\x12\nhelloworld\"\x1c\n\x0cHelloRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"\x1d\n\nHelloReply\x12\x0f\n\x07message\x18\x01 \x01(\t2I\n\x07Greeter\x12>\n\x08SayHello\x12\x18.helloworld.HelloRequest\x1a\x16.helloworld.HelloReply\"\x00\x42\x36\n\x1bio.grpc.examples.helloworldB\x0fHelloWorldProtoP\x01\xa2\x02\x03HLWb\x06proto3') +) + + + + +_HELLOREQUEST = _descriptor.Descriptor( + name='HelloRequest', + full_name='helloworld.HelloRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='helloworld.HelloRequest.name', index=0, + number=1, 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=32, + serialized_end=60, +) + + +_HELLOREPLY = _descriptor.Descriptor( + name='HelloReply', + full_name='helloworld.HelloReply', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='message', full_name='helloworld.HelloReply.message', index=0, + number=1, 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=62, + serialized_end=91, +) + +DESCRIPTOR.message_types_by_name['HelloRequest'] = _HELLOREQUEST +DESCRIPTOR.message_types_by_name['HelloReply'] = _HELLOREPLY +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +HelloRequest = _reflection.GeneratedProtocolMessageType('HelloRequest', (_message.Message,), dict( + DESCRIPTOR = _HELLOREQUEST, + __module__ = 'helloworld_pb2' + # @@protoc_insertion_point(class_scope:helloworld.HelloRequest) + )) +_sym_db.RegisterMessage(HelloRequest) + +HelloReply = _reflection.GeneratedProtocolMessageType('HelloReply', (_message.Message,), dict( + DESCRIPTOR = _HELLOREPLY, + __module__ = 'helloworld_pb2' + # @@protoc_insertion_point(class_scope:helloworld.HelloReply) + )) +_sym_db.RegisterMessage(HelloReply) + + +DESCRIPTOR.has_options = True +DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\033io.grpc.examples.helloworldB\017HelloWorldProtoP\001\242\002\003HLW')) + +_GREETER = _descriptor.ServiceDescriptor( + name='Greeter', + full_name='helloworld.Greeter', + file=DESCRIPTOR, + index=0, + options=None, + serialized_start=93, + serialized_end=166, + methods=[ + _descriptor.MethodDescriptor( + name='SayHello', + full_name='helloworld.Greeter.SayHello', + index=0, + containing_service=None, + input_type=_HELLOREQUEST, + output_type=_HELLOREPLY, + options=None, + ), +]) +_sym_db.RegisterServiceDescriptor(_GREETER) + +DESCRIPTOR.services_by_name['Greeter'] = _GREETER + +# @@protoc_insertion_point(module_scope) diff --git a/examples/python/interceptors/headers/helloworld_pb2_grpc.py b/examples/python/interceptors/headers/helloworld_pb2_grpc.py new file mode 100644 index 00000000..18e07d16 --- /dev/null +++ b/examples/python/interceptors/headers/helloworld_pb2_grpc.py @@ -0,0 +1,46 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +import grpc + +import helloworld_pb2 as helloworld__pb2 + + +class GreeterStub(object): + """The greeting service definition. + """ + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.SayHello = channel.unary_unary( + '/helloworld.Greeter/SayHello', + request_serializer=helloworld__pb2.HelloRequest.SerializeToString, + response_deserializer=helloworld__pb2.HelloReply.FromString, + ) + + +class GreeterServicer(object): + """The greeting service definition. + """ + + def SayHello(self, request, context): + """Sends a greeting + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_GreeterServicer_to_server(servicer, server): + rpc_method_handlers = { + 'SayHello': grpc.unary_unary_rpc_method_handler( + servicer.SayHello, + request_deserializer=helloworld__pb2.HelloRequest.FromString, + response_serializer=helloworld__pb2.HelloReply.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'helloworld.Greeter', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) diff --git a/examples/python/interceptors/headers/request_header_validator_interceptor.py b/examples/python/interceptors/headers/request_header_validator_interceptor.py new file mode 100644 index 00000000..95af4177 --- /dev/null +++ b/examples/python/interceptors/headers/request_header_validator_interceptor.py @@ -0,0 +1,39 @@ +# Copyright 2017 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Interceptor that ensures a specific header is present.""" + +import grpc + + +def _unary_unary_rpc_terminator(code, details): + + def terminate(ignored_request, context): + context.abort(code, details) + + return grpc.unary_unary_rpc_method_handler(terminate) + + +class RequestHeaderValidatorInterceptor(grpc.ServerInterceptor): + + def __init__(self, header, value, code, details): + self._header = header + self._value = value + self._terminator = _unary_unary_rpc_terminator(code, details) + + def intercept_service(self, continuation, handler_call_details): + if (self._header, + self._value) in handler_call_details.invocation_metadata: + return continuation(handler_call_details) + else: + return self._terminator diff --git a/examples/python/metadata/README.md b/examples/python/metadata/README.md new file mode 100644 index 00000000..5aa75d50 --- /dev/null +++ b/examples/python/metadata/README.md @@ -0,0 +1,6 @@ +An example showing how to add custom HTTP2 headers (or [metadata](https://grpc.io/grpc/python/glossary.html) in gRPC glossary) + +HTTP2 supports initial headers and trailing headers, which gRPC utilizes both of them ([learn more](https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md)). + +More complete documentation lives at [grpc.io](https://grpc.io/docs/tutorials/basic/python.html). +For API reference please see [API](https://grpc.io/grpc/python/grpc.html). diff --git a/examples/python/metadata/helloworld_pb2.py b/examples/python/metadata/helloworld_pb2.py new file mode 100644 index 00000000..e18ab9ac --- /dev/null +++ b/examples/python/metadata/helloworld_pb2.py @@ -0,0 +1,134 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: helloworld.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +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='helloworld.proto', + package='helloworld', + syntax='proto3', + serialized_pb=_b('\n\x10helloworld.proto\x12\nhelloworld\"\x1c\n\x0cHelloRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"\x1d\n\nHelloReply\x12\x0f\n\x07message\x18\x01 \x01(\t2I\n\x07Greeter\x12>\n\x08SayHello\x12\x18.helloworld.HelloRequest\x1a\x16.helloworld.HelloReply\"\x00\x42\x36\n\x1bio.grpc.examples.helloworldB\x0fHelloWorldProtoP\x01\xa2\x02\x03HLWb\x06proto3') +) + + + + +_HELLOREQUEST = _descriptor.Descriptor( + name='HelloRequest', + full_name='helloworld.HelloRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='helloworld.HelloRequest.name', index=0, + number=1, 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=32, + serialized_end=60, +) + + +_HELLOREPLY = _descriptor.Descriptor( + name='HelloReply', + full_name='helloworld.HelloReply', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='message', full_name='helloworld.HelloReply.message', index=0, + number=1, 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=62, + serialized_end=91, +) + +DESCRIPTOR.message_types_by_name['HelloRequest'] = _HELLOREQUEST +DESCRIPTOR.message_types_by_name['HelloReply'] = _HELLOREPLY +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +HelloRequest = _reflection.GeneratedProtocolMessageType('HelloRequest', (_message.Message,), dict( + DESCRIPTOR = _HELLOREQUEST, + __module__ = 'helloworld_pb2' + # @@protoc_insertion_point(class_scope:helloworld.HelloRequest) + )) +_sym_db.RegisterMessage(HelloRequest) + +HelloReply = _reflection.GeneratedProtocolMessageType('HelloReply', (_message.Message,), dict( + DESCRIPTOR = _HELLOREPLY, + __module__ = 'helloworld_pb2' + # @@protoc_insertion_point(class_scope:helloworld.HelloReply) + )) +_sym_db.RegisterMessage(HelloReply) + + +DESCRIPTOR.has_options = True +DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\033io.grpc.examples.helloworldB\017HelloWorldProtoP\001\242\002\003HLW')) + +_GREETER = _descriptor.ServiceDescriptor( + name='Greeter', + full_name='helloworld.Greeter', + file=DESCRIPTOR, + index=0, + options=None, + serialized_start=93, + serialized_end=166, + methods=[ + _descriptor.MethodDescriptor( + name='SayHello', + full_name='helloworld.Greeter.SayHello', + index=0, + containing_service=None, + input_type=_HELLOREQUEST, + output_type=_HELLOREPLY, + options=None, + ), +]) +_sym_db.RegisterServiceDescriptor(_GREETER) + +DESCRIPTOR.services_by_name['Greeter'] = _GREETER + +# @@protoc_insertion_point(module_scope) diff --git a/examples/python/metadata/helloworld_pb2_grpc.py b/examples/python/metadata/helloworld_pb2_grpc.py new file mode 100644 index 00000000..18e07d16 --- /dev/null +++ b/examples/python/metadata/helloworld_pb2_grpc.py @@ -0,0 +1,46 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +import grpc + +import helloworld_pb2 as helloworld__pb2 + + +class GreeterStub(object): + """The greeting service definition. + """ + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.SayHello = channel.unary_unary( + '/helloworld.Greeter/SayHello', + request_serializer=helloworld__pb2.HelloRequest.SerializeToString, + response_deserializer=helloworld__pb2.HelloReply.FromString, + ) + + +class GreeterServicer(object): + """The greeting service definition. + """ + + def SayHello(self, request, context): + """Sends a greeting + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_GreeterServicer_to_server(servicer, server): + rpc_method_handlers = { + 'SayHello': grpc.unary_unary_rpc_method_handler( + servicer.SayHello, + request_deserializer=helloworld__pb2.HelloRequest.FromString, + response_serializer=helloworld__pb2.HelloReply.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'helloworld.Greeter', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) diff --git a/examples/python/metadata/metadata_client.py b/examples/python/metadata/metadata_client.py new file mode 100644 index 00000000..f2a8e37c --- /dev/null +++ b/examples/python/metadata/metadata_client.py @@ -0,0 +1,48 @@ +# Copyright 2018 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Example gRPC client that gets/sets metadata (HTTP2 headers)""" + +from __future__ import print_function +import logging + +import grpc + +import helloworld_pb2 +import helloworld_pb2_grpc + + +def run(): + # NOTE(gRPC Python Team): .close() is possible on a channel and should be + # used in circumstances in which the with statement does not fit the needs + # of the code. + with grpc.insecure_channel('localhost:50051') as channel: + stub = helloworld_pb2_grpc.GreeterStub(channel) + response, call = stub.SayHello.with_call( + helloworld_pb2.HelloRequest(name='you'), + metadata=( + ('initial-metadata-1', 'The value should be str'), + ('binary-metadata-bin', + b'With -bin surffix, the value can be bytes'), + ('accesstoken', 'gRPC Python is great'), + )) + + print("Greeter client received: " + response.message) + for key, value in call.trailing_metadata(): + print('Greeter client received trailing metadata: key=%s value=%s' % + (key, value)) + + +if __name__ == '__main__': + logging.basicConfig() + run() diff --git a/examples/python/metadata/metadata_server.py b/examples/python/metadata/metadata_server.py new file mode 100644 index 00000000..79eb3800 --- /dev/null +++ b/examples/python/metadata/metadata_server.py @@ -0,0 +1,49 @@ +# Copyright 2018 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Example gRPC server that gets/sets metadata (HTTP2 headers)""" + +from __future__ import print_function +from concurrent import futures +import logging + +import grpc + +import helloworld_pb2 +import helloworld_pb2_grpc + + +class Greeter(helloworld_pb2_grpc.GreeterServicer): + + def SayHello(self, request, context): + for key, value in context.invocation_metadata(): + print('Received initial metadata: key=%s value=%s' % (key, value)) + + context.set_trailing_metadata(( + ('checksum-bin', b'I agree'), + ('retry', 'false'), + )) + return helloworld_pb2.HelloReply(message='Hello, %s!' % request.name) + + +def serve(): + server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) + helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server) + server.add_insecure_port('[::]:50051') + server.start() + server.wait_for_termination() + + +if __name__ == '__main__': + logging.basicConfig() + serve() diff --git a/examples/python/multiplex/.gitignore b/examples/python/multiplex/.gitignore new file mode 100644 index 00000000..0d20b648 --- /dev/null +++ b/examples/python/multiplex/.gitignore @@ -0,0 +1 @@ +*.pyc diff --git a/examples/python/multiplex/README.md b/examples/python/multiplex/README.md new file mode 100644 index 00000000..2316cd39 --- /dev/null +++ b/examples/python/multiplex/README.md @@ -0,0 +1,3 @@ +An example showing two stubs sharing a channel and two servicers sharing a server. + +More complete documentation lives at [grpc.io](https://grpc.io/docs/tutorials/basic/python.html). diff --git a/examples/python/multiplex/helloworld_pb2.py b/examples/python/multiplex/helloworld_pb2.py new file mode 100644 index 00000000..e18ab9ac --- /dev/null +++ b/examples/python/multiplex/helloworld_pb2.py @@ -0,0 +1,134 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: helloworld.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +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='helloworld.proto', + package='helloworld', + syntax='proto3', + serialized_pb=_b('\n\x10helloworld.proto\x12\nhelloworld\"\x1c\n\x0cHelloRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"\x1d\n\nHelloReply\x12\x0f\n\x07message\x18\x01 \x01(\t2I\n\x07Greeter\x12>\n\x08SayHello\x12\x18.helloworld.HelloRequest\x1a\x16.helloworld.HelloReply\"\x00\x42\x36\n\x1bio.grpc.examples.helloworldB\x0fHelloWorldProtoP\x01\xa2\x02\x03HLWb\x06proto3') +) + + + + +_HELLOREQUEST = _descriptor.Descriptor( + name='HelloRequest', + full_name='helloworld.HelloRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='helloworld.HelloRequest.name', index=0, + number=1, 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=32, + serialized_end=60, +) + + +_HELLOREPLY = _descriptor.Descriptor( + name='HelloReply', + full_name='helloworld.HelloReply', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='message', full_name='helloworld.HelloReply.message', index=0, + number=1, 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=62, + serialized_end=91, +) + +DESCRIPTOR.message_types_by_name['HelloRequest'] = _HELLOREQUEST +DESCRIPTOR.message_types_by_name['HelloReply'] = _HELLOREPLY +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +HelloRequest = _reflection.GeneratedProtocolMessageType('HelloRequest', (_message.Message,), dict( + DESCRIPTOR = _HELLOREQUEST, + __module__ = 'helloworld_pb2' + # @@protoc_insertion_point(class_scope:helloworld.HelloRequest) + )) +_sym_db.RegisterMessage(HelloRequest) + +HelloReply = _reflection.GeneratedProtocolMessageType('HelloReply', (_message.Message,), dict( + DESCRIPTOR = _HELLOREPLY, + __module__ = 'helloworld_pb2' + # @@protoc_insertion_point(class_scope:helloworld.HelloReply) + )) +_sym_db.RegisterMessage(HelloReply) + + +DESCRIPTOR.has_options = True +DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\033io.grpc.examples.helloworldB\017HelloWorldProtoP\001\242\002\003HLW')) + +_GREETER = _descriptor.ServiceDescriptor( + name='Greeter', + full_name='helloworld.Greeter', + file=DESCRIPTOR, + index=0, + options=None, + serialized_start=93, + serialized_end=166, + methods=[ + _descriptor.MethodDescriptor( + name='SayHello', + full_name='helloworld.Greeter.SayHello', + index=0, + containing_service=None, + input_type=_HELLOREQUEST, + output_type=_HELLOREPLY, + options=None, + ), +]) +_sym_db.RegisterServiceDescriptor(_GREETER) + +DESCRIPTOR.services_by_name['Greeter'] = _GREETER + +# @@protoc_insertion_point(module_scope) diff --git a/examples/python/multiplex/helloworld_pb2_grpc.py b/examples/python/multiplex/helloworld_pb2_grpc.py new file mode 100644 index 00000000..18e07d16 --- /dev/null +++ b/examples/python/multiplex/helloworld_pb2_grpc.py @@ -0,0 +1,46 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +import grpc + +import helloworld_pb2 as helloworld__pb2 + + +class GreeterStub(object): + """The greeting service definition. + """ + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.SayHello = channel.unary_unary( + '/helloworld.Greeter/SayHello', + request_serializer=helloworld__pb2.HelloRequest.SerializeToString, + response_deserializer=helloworld__pb2.HelloReply.FromString, + ) + + +class GreeterServicer(object): + """The greeting service definition. + """ + + def SayHello(self, request, context): + """Sends a greeting + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_GreeterServicer_to_server(servicer, server): + rpc_method_handlers = { + 'SayHello': grpc.unary_unary_rpc_method_handler( + servicer.SayHello, + request_deserializer=helloworld__pb2.HelloRequest.FromString, + response_serializer=helloworld__pb2.HelloReply.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'helloworld.Greeter', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) diff --git a/examples/python/multiplex/multiplex_client.py b/examples/python/multiplex/multiplex_client.py new file mode 100644 index 00000000..37083cf3 --- /dev/null +++ b/examples/python/multiplex/multiplex_client.py @@ -0,0 +1,131 @@ +# Copyright 2016 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""A client that makes both Greeter and RouteGuide RPCs.""" + +from __future__ import print_function + +import random +import time +import logging + +import grpc + +import helloworld_pb2 +import helloworld_pb2_grpc +import route_guide_pb2 +import route_guide_pb2_grpc +import route_guide_resources + + +def make_route_note(message, latitude, longitude): + return route_guide_pb2.RouteNote( + message=message, + location=route_guide_pb2.Point(latitude=latitude, longitude=longitude)) + + +def guide_get_one_feature(route_guide_stub, point): + feature = route_guide_stub.GetFeature(point) + if not feature.location: + print("Server returned incomplete feature") + return + + if feature.name: + print("Feature called %s at %s" % (feature.name, feature.location)) + else: + print("Found no feature at %s" % feature.location) + + +def guide_get_feature(route_guide_stub): + guide_get_one_feature( + route_guide_stub, + route_guide_pb2.Point(latitude=409146138, longitude=-746188906)) + guide_get_one_feature(route_guide_stub, + route_guide_pb2.Point(latitude=0, longitude=0)) + + +def guide_list_features(route_guide_stub): + rectangle = route_guide_pb2.Rectangle( + lo=route_guide_pb2.Point(latitude=400000000, longitude=-750000000), + hi=route_guide_pb2.Point(latitude=420000000, longitude=-730000000)) + print("Looking for features between 40, -75 and 42, -73") + + features = route_guide_stub.ListFeatures(rectangle) + + for feature in features: + print("Feature called %s at %s" % (feature.name, feature.location)) + + +def generate_route(feature_list): + for _ in range(0, 10): + random_feature = feature_list[random.randint(0, len(feature_list) - 1)] + print("Visiting point %s" % random_feature.location) + yield random_feature.location + time.sleep(random.uniform(0.5, 1.5)) + + +def guide_record_route(route_guide_stub): + feature_list = route_guide_resources.read_route_guide_database() + + route_iterator = generate_route(feature_list) + route_summary = route_guide_stub.RecordRoute(route_iterator) + print("Finished trip with %s points " % route_summary.point_count) + print("Passed %s features " % route_summary.feature_count) + print("Travelled %s meters " % route_summary.distance) + print("It took %s seconds " % route_summary.elapsed_time) + + +def generate_messages(): + messages = [ + make_route_note("First message", 0, 0), + make_route_note("Second message", 0, 1), + make_route_note("Third message", 1, 0), + make_route_note("Fourth message", 0, 0), + make_route_note("Fifth message", 1, 0), + ] + for msg in messages: + print("Sending %s at %s" % (msg.message, msg.location)) + yield msg + time.sleep(random.uniform(0.5, 1.0)) + + +def guide_route_chat(route_guide_stub): + responses = route_guide_stub.RouteChat(generate_messages()) + for response in responses: + print("Received message %s at %s" % + (response.message, response.location)) + + +def run(): + # NOTE(gRPC Python Team): .close() is possible on a channel and should be + # used in circumstances in which the with statement does not fit the needs + # of the code. + with grpc.insecure_channel('localhost:50051') as channel: + greeter_stub = helloworld_pb2_grpc.GreeterStub(channel) + route_guide_stub = route_guide_pb2_grpc.RouteGuideStub(channel) + greeter_response = greeter_stub.SayHello( + helloworld_pb2.HelloRequest(name='you')) + print("Greeter client received: " + greeter_response.message) + print("-------------- GetFeature --------------") + guide_get_feature(route_guide_stub) + print("-------------- ListFeatures --------------") + guide_list_features(route_guide_stub) + print("-------------- RecordRoute --------------") + guide_record_route(route_guide_stub) + print("-------------- RouteChat --------------") + guide_route_chat(route_guide_stub) + + +if __name__ == '__main__': + logging.basicConfig() + run() diff --git a/examples/python/multiplex/multiplex_server.py b/examples/python/multiplex/multiplex_server.py new file mode 100644 index 00000000..9499af50 --- /dev/null +++ b/examples/python/multiplex/multiplex_server.py @@ -0,0 +1,134 @@ +# Copyright 2016 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""A gRPC server servicing both Greeter and RouteGuide RPCs.""" + +from concurrent import futures +import time +import math +import logging + +import grpc + +import helloworld_pb2 +import helloworld_pb2_grpc +import route_guide_pb2 +import route_guide_pb2_grpc +import route_guide_resources + + +def _get_feature(feature_db, point): + """Returns Feature at given location or None.""" + for feature in feature_db: + if feature.location == point: + return feature + return None + + +def _get_distance(start, end): + """Distance between two points.""" + coord_factor = 10000000.0 + lat_1 = start.latitude / coord_factor + lat_2 = end.latitude / coord_factor + lon_1 = start.longitude / coord_factor + lon_2 = end.longitude / coord_factor + lat_rad_1 = math.radians(lat_1) + lat_rad_2 = math.radians(lat_2) + delta_lat_rad = math.radians(lat_2 - lat_1) + delta_lon_rad = math.radians(lon_2 - lon_1) + + a = (pow(math.sin(delta_lat_rad / 2), 2) + + (math.cos(lat_rad_1) * math.cos(lat_rad_2) * + pow(math.sin(delta_lon_rad / 2), 2))) + c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a)) + R = 6371000 + # metres + return R * c + + +class _GreeterServicer(helloworld_pb2_grpc.GreeterServicer): + + def SayHello(self, request, context): + return helloworld_pb2.HelloReply( + message='Hello, {}!'.format(request.name)) + + +class _RouteGuideServicer(route_guide_pb2_grpc.RouteGuideServicer): + """Provides methods that implement functionality of route guide server.""" + + def __init__(self): + self.db = route_guide_resources.read_route_guide_database() + + def GetFeature(self, request, context): + feature = _get_feature(self.db, request) + if feature is None: + return route_guide_pb2.Feature(name="", location=request) + else: + return feature + + def ListFeatures(self, request, context): + left = min(request.lo.longitude, request.hi.longitude) + right = max(request.lo.longitude, request.hi.longitude) + top = max(request.lo.latitude, request.hi.latitude) + bottom = min(request.lo.latitude, request.hi.latitude) + for feature in self.db: + if (feature.location.longitude >= left and + feature.location.longitude <= right and + feature.location.latitude >= bottom and + feature.location.latitude <= top): + yield feature + + def RecordRoute(self, request_iterator, context): + point_count = 0 + feature_count = 0 + distance = 0.0 + prev_point = None + + start_time = time.time() + for point in request_iterator: + point_count += 1 + if _get_feature(self.db, point): + feature_count += 1 + if prev_point: + distance += _get_distance(prev_point, point) + prev_point = point + + elapsed_time = time.time() - start_time + return route_guide_pb2.RouteSummary(point_count=point_count, + feature_count=feature_count, + distance=int(distance), + elapsed_time=int(elapsed_time)) + + def RouteChat(self, request_iterator, context): + prev_notes = [] + for new_note in request_iterator: + for prev_note in prev_notes: + if prev_note.location == new_note.location: + yield prev_note + prev_notes.append(new_note) + + +def serve(): + server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) + helloworld_pb2_grpc.add_GreeterServicer_to_server(_GreeterServicer(), + server) + route_guide_pb2_grpc.add_RouteGuideServicer_to_server( + _RouteGuideServicer(), server) + server.add_insecure_port('[::]:50051') + server.start() + server.wait_for_termination() + + +if __name__ == '__main__': + logging.basicConfig() + serve() diff --git a/examples/python/multiplex/route_guide_db.json b/examples/python/multiplex/route_guide_db.json new file mode 100644 index 00000000..9d6a980a --- /dev/null +++ b/examples/python/multiplex/route_guide_db.json @@ -0,0 +1,601 @@ +[{ + "location": { + "latitude": 407838351, + "longitude": -746143763 + }, + "name": "Patriots Path, Mendham, NJ 07945, USA" +}, { + "location": { + "latitude": 408122808, + "longitude": -743999179 + }, + "name": "101 New Jersey 10, Whippany, NJ 07981, USA" +}, { + "location": { + "latitude": 413628156, + "longitude": -749015468 + }, + "name": "U.S. 6, Shohola, PA 18458, USA" +}, { + "location": { + "latitude": 419999544, + "longitude": -740371136 + }, + "name": "5 Conners Road, Kingston, NY 12401, USA" +}, { + "location": { + "latitude": 414008389, + "longitude": -743951297 + }, + "name": "Mid Hudson Psychiatric Center, New Hampton, NY 10958, USA" +}, { + "location": { + "latitude": 419611318, + "longitude": -746524769 + }, + "name": "287 Flugertown Road, Livingston Manor, NY 12758, USA" +}, { + "location": { + "latitude": 406109563, + "longitude": -742186778 + }, + "name": "4001 Tremley Point Road, Linden, NJ 07036, USA" +}, { + "location": { + "latitude": 416802456, + "longitude": -742370183 + }, + "name": "352 South Mountain Road, Wallkill, NY 12589, USA" +}, { + "location": { + "latitude": 412950425, + "longitude": -741077389 + }, + "name": "Bailey Turn Road, Harriman, NY 10926, USA" +}, { + "location": { + "latitude": 412144655, + "longitude": -743949739 + }, + "name": "193-199 Wawayanda Road, Hewitt, NJ 07421, USA" +}, { + "location": { + "latitude": 415736605, + "longitude": -742847522 + }, + "name": "406-496 Ward Avenue, Pine Bush, NY 12566, USA" +}, { + "location": { + "latitude": 413843930, + "longitude": -740501726 + }, + "name": "162 Merrill Road, Highland Mills, NY 10930, USA" +}, { + "location": { + "latitude": 410873075, + "longitude": -744459023 + }, + "name": "Clinton Road, West Milford, NJ 07480, USA" +}, { + "location": { + "latitude": 412346009, + "longitude": -744026814 + }, + "name": "16 Old Brook Lane, Warwick, NY 10990, USA" +}, { + "location": { + "latitude": 402948455, + "longitude": -747903913 + }, + "name": "3 Drake Lane, Pennington, NJ 08534, USA" +}, { + "location": { + "latitude": 406337092, + "longitude": -740122226 + }, + "name": "6324 8th Avenue, Brooklyn, NY 11220, USA" +}, { + "location": { + "latitude": 406421967, + "longitude": -747727624 + }, + "name": "1 Merck Access Road, Whitehouse Station, NJ 08889, USA" +}, { + "location": { + "latitude": 416318082, + "longitude": -749677716 + }, + "name": "78-98 Schalck Road, Narrowsburg, NY 12764, USA" +}, { + "location": { + "latitude": 415301720, + "longitude": -748416257 + }, + "name": "282 Lakeview Drive Road, Highland Lake, NY 12743, USA" +}, { + "location": { + "latitude": 402647019, + "longitude": -747071791 + }, + "name": "330 Evelyn Avenue, Hamilton Township, NJ 08619, USA" +}, { + "location": { + "latitude": 412567807, + "longitude": -741058078 + }, + "name": "New York State Reference Route 987E, Southfields, NY 10975, USA" +}, { + "location": { + "latitude": 416855156, + "longitude": -744420597 + }, + "name": "103-271 Tempaloni Road, Ellenville, NY 12428, USA" +}, { + "location": { + "latitude": 404663628, + "longitude": -744820157 + }, + "name": "1300 Airport Road, North Brunswick Township, NJ 08902, USA" +}, { + "location": { + "latitude": 407113723, + "longitude": -749746483 + }, + "name": "" +}, { + "location": { + "latitude": 402133926, + "longitude": -743613249 + }, + "name": "" +}, { + "location": { + "latitude": 400273442, + "longitude": -741220915 + }, + "name": "" +}, { + "location": { + "latitude": 411236786, + "longitude": -744070769 + }, + "name": "" +}, { + "location": { + "latitude": 411633782, + "longitude": -746784970 + }, + "name": "211-225 Plains Road, Augusta, NJ 07822, USA" +}, { + "location": { + "latitude": 415830701, + "longitude": -742952812 + }, + "name": "" +}, { + "location": { + "latitude": 413447164, + "longitude": -748712898 + }, + "name": "165 Pedersen Ridge Road, Milford, PA 18337, USA" +}, { + "location": { + "latitude": 405047245, + "longitude": -749800722 + }, + "name": "100-122 Locktown Road, Frenchtown, NJ 08825, USA" +}, { + "location": { + "latitude": 418858923, + "longitude": -746156790 + }, + "name": "" +}, { + "location": { + "latitude": 417951888, + "longitude": -748484944 + }, + "name": "650-652 Willi Hill Road, Swan Lake, NY 12783, USA" +}, { + "location": { + "latitude": 407033786, + "longitude": -743977337 + }, + "name": "26 East 3rd Street, New Providence, NJ 07974, USA" +}, { + "location": { + "latitude": 417548014, + "longitude": -740075041 + }, + "name": "" +}, { + "location": { + "latitude": 410395868, + "longitude": -744972325 + }, + "name": "" +}, { + "location": { + "latitude": 404615353, + "longitude": -745129803 + }, + "name": "" +}, { + "location": { + "latitude": 406589790, + "longitude": -743560121 + }, + "name": "611 Lawrence Avenue, Westfield, NJ 07090, USA" +}, { + "location": { + "latitude": 414653148, + "longitude": -740477477 + }, + "name": "18 Lannis Avenue, New Windsor, NY 12553, USA" +}, { + "location": { + "latitude": 405957808, + "longitude": -743255336 + }, + "name": "82-104 Amherst Avenue, Colonia, NJ 07067, USA" +}, { + "location": { + "latitude": 411733589, + "longitude": -741648093 + }, + "name": "170 Seven Lakes Drive, Sloatsburg, NY 10974, USA" +}, { + "location": { + "latitude": 412676291, + "longitude": -742606606 + }, + "name": "1270 Lakes Road, Monroe, NY 10950, USA" +}, { + "location": { + "latitude": 409224445, + "longitude": -748286738 + }, + "name": "509-535 Alphano Road, Great Meadows, NJ 07838, USA" +}, { + "location": { + "latitude": 406523420, + "longitude": -742135517 + }, + "name": "652 Garden Street, Elizabeth, NJ 07202, USA" +}, { + "location": { + "latitude": 401827388, + "longitude": -740294537 + }, + "name": "349 Sea Spray Court, Neptune City, NJ 07753, USA" +}, { + "location": { + "latitude": 410564152, + "longitude": -743685054 + }, + "name": "13-17 Stanley Street, West Milford, NJ 07480, USA" +}, { + "location": { + "latitude": 408472324, + "longitude": -740726046 + }, + "name": "47 Industrial Avenue, Teterboro, NJ 07608, USA" +}, { + "location": { + "latitude": 412452168, + "longitude": -740214052 + }, + "name": "5 White Oak Lane, Stony Point, NY 10980, USA" +}, { + "location": { + "latitude": 409146138, + "longitude": -746188906 + }, + "name": "Berkshire Valley Management Area Trail, Jefferson, NJ, USA" +}, { + "location": { + "latitude": 404701380, + "longitude": -744781745 + }, + "name": "1007 Jersey Avenue, New Brunswick, NJ 08901, USA" +}, { + "location": { + "latitude": 409642566, + "longitude": -746017679 + }, + "name": "6 East Emerald Isle Drive, Lake Hopatcong, NJ 07849, USA" +}, { + "location": { + "latitude": 408031728, + "longitude": -748645385 + }, + "name": "1358-1474 New Jersey 57, Port Murray, NJ 07865, USA" +}, { + "location": { + "latitude": 413700272, + "longitude": -742135189 + }, + "name": "367 Prospect Road, Chester, NY 10918, USA" +}, { + "location": { + "latitude": 404310607, + "longitude": -740282632 + }, + "name": "10 Simon Lake Drive, Atlantic Highlands, NJ 07716, USA" +}, { + "location": { + "latitude": 409319800, + "longitude": -746201391 + }, + "name": "11 Ward Street, Mount Arlington, NJ 07856, USA" +}, { + "location": { + "latitude": 406685311, + "longitude": -742108603 + }, + "name": "300-398 Jefferson Avenue, Elizabeth, NJ 07201, USA" +}, { + "location": { + "latitude": 419018117, + "longitude": -749142781 + }, + "name": "43 Dreher Road, Roscoe, NY 12776, USA" +}, { + "location": { + "latitude": 412856162, + "longitude": -745148837 + }, + "name": "Swan Street, Pine Island, NY 10969, USA" +}, { + "location": { + "latitude": 416560744, + "longitude": -746721964 + }, + "name": "66 Pleasantview Avenue, Monticello, NY 12701, USA" +}, { + "location": { + "latitude": 405314270, + "longitude": -749836354 + }, + "name": "" +}, { + "location": { + "latitude": 414219548, + "longitude": -743327440 + }, + "name": "" +}, { + "location": { + "latitude": 415534177, + "longitude": -742900616 + }, + "name": "565 Winding Hills Road, Montgomery, NY 12549, USA" +}, { + "location": { + "latitude": 406898530, + "longitude": -749127080 + }, + "name": "231 Rocky Run Road, Glen Gardner, NJ 08826, USA" +}, { + "location": { + "latitude": 407586880, + "longitude": -741670168 + }, + "name": "100 Mount Pleasant Avenue, Newark, NJ 07104, USA" +}, { + "location": { + "latitude": 400106455, + "longitude": -742870190 + }, + "name": "517-521 Huntington Drive, Manchester Township, NJ 08759, USA" +}, { + "location": { + "latitude": 400066188, + "longitude": -746793294 + }, + "name": "" +}, { + "location": { + "latitude": 418803880, + "longitude": -744102673 + }, + "name": "40 Mountain Road, Napanoch, NY 12458, USA" +}, { + "location": { + "latitude": 414204288, + "longitude": -747895140 + }, + "name": "" +}, { + "location": { + "latitude": 414777405, + "longitude": -740615601 + }, + "name": "" +}, { + "location": { + "latitude": 415464475, + "longitude": -747175374 + }, + "name": "48 North Road, Forestburgh, NY 12777, USA" +}, { + "location": { + "latitude": 404062378, + "longitude": -746376177 + }, + "name": "" +}, { + "location": { + "latitude": 405688272, + "longitude": -749285130 + }, + "name": "" +}, { + "location": { + "latitude": 400342070, + "longitude": -748788996 + }, + "name": "" +}, { + "location": { + "latitude": 401809022, + "longitude": -744157964 + }, + "name": "" +}, { + "location": { + "latitude": 404226644, + "longitude": -740517141 + }, + "name": "9 Thompson Avenue, Leonardo, NJ 07737, USA" +}, { + "location": { + "latitude": 410322033, + "longitude": -747871659 + }, + "name": "" +}, { + "location": { + "latitude": 407100674, + "longitude": -747742727 + }, + "name": "" +}, { + "location": { + "latitude": 418811433, + "longitude": -741718005 + }, + "name": "213 Bush Road, Stone Ridge, NY 12484, USA" +}, { + "location": { + "latitude": 415034302, + "longitude": -743850945 + }, + "name": "" +}, { + "location": { + "latitude": 411349992, + "longitude": -743694161 + }, + "name": "" +}, { + "location": { + "latitude": 404839914, + "longitude": -744759616 + }, + "name": "1-17 Bergen Court, New Brunswick, NJ 08901, USA" +}, { + "location": { + "latitude": 414638017, + "longitude": -745957854 + }, + "name": "35 Oakland Valley Road, Cuddebackville, NY 12729, USA" +}, { + "location": { + "latitude": 412127800, + "longitude": -740173578 + }, + "name": "" +}, { + "location": { + "latitude": 401263460, + "longitude": -747964303 + }, + "name": "" +}, { + "location": { + "latitude": 412843391, + "longitude": -749086026 + }, + "name": "" +}, { + "location": { + "latitude": 418512773, + "longitude": -743067823 + }, + "name": "" +}, { + "location": { + "latitude": 404318328, + "longitude": -740835638 + }, + "name": "42-102 Main Street, Belford, NJ 07718, USA" +}, { + "location": { + "latitude": 419020746, + "longitude": -741172328 + }, + "name": "" +}, { + "location": { + "latitude": 404080723, + "longitude": -746119569 + }, + "name": "" +}, { + "location": { + "latitude": 401012643, + "longitude": -744035134 + }, + "name": "" +}, { + "location": { + "latitude": 404306372, + "longitude": -741079661 + }, + "name": "" +}, { + "location": { + "latitude": 403966326, + "longitude": -748519297 + }, + "name": "" +}, { + "location": { + "latitude": 405002031, + "longitude": -748407866 + }, + "name": "" +}, { + "location": { + "latitude": 409532885, + "longitude": -742200683 + }, + "name": "" +}, { + "location": { + "latitude": 416851321, + "longitude": -742674555 + }, + "name": "" +}, { + "location": { + "latitude": 406411633, + "longitude": -741722051 + }, + "name": "3387 Richmond Terrace, Staten Island, NY 10303, USA" +}, { + "location": { + "latitude": 413069058, + "longitude": -744597778 + }, + "name": "261 Van Sickle Road, Goshen, NY 10924, USA" +}, { + "location": { + "latitude": 418465462, + "longitude": -746859398 + }, + "name": "" +}, { + "location": { + "latitude": 411733222, + "longitude": -744228360 + }, + "name": "" +}, { + "location": { + "latitude": 410248224, + "longitude": -747127767 + }, + "name": "3 Hasta Way, Newton, NJ 07860, USA" +}] diff --git a/examples/python/multiplex/route_guide_pb2.py b/examples/python/multiplex/route_guide_pb2.py new file mode 100644 index 00000000..fbbc194a --- /dev/null +++ b/examples/python/multiplex/route_guide_pb2.py @@ -0,0 +1,331 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: route_guide.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +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='route_guide.proto', + package='routeguide', + syntax='proto3', + serialized_pb=_b('\n\x11route_guide.proto\x12\nrouteguide\",\n\x05Point\x12\x10\n\x08latitude\x18\x01 \x01(\x05\x12\x11\n\tlongitude\x18\x02 \x01(\x05\"I\n\tRectangle\x12\x1d\n\x02lo\x18\x01 \x01(\x0b\x32\x11.routeguide.Point\x12\x1d\n\x02hi\x18\x02 \x01(\x0b\x32\x11.routeguide.Point\"<\n\x07\x46\x65\x61ture\x12\x0c\n\x04name\x18\x01 \x01(\t\x12#\n\x08location\x18\x02 \x01(\x0b\x32\x11.routeguide.Point\"A\n\tRouteNote\x12#\n\x08location\x18\x01 \x01(\x0b\x32\x11.routeguide.Point\x12\x0f\n\x07message\x18\x02 \x01(\t\"b\n\x0cRouteSummary\x12\x13\n\x0bpoint_count\x18\x01 \x01(\x05\x12\x15\n\rfeature_count\x18\x02 \x01(\x05\x12\x10\n\x08\x64istance\x18\x03 \x01(\x05\x12\x14\n\x0c\x65lapsed_time\x18\x04 \x01(\x05\x32\x85\x02\n\nRouteGuide\x12\x36\n\nGetFeature\x12\x11.routeguide.Point\x1a\x13.routeguide.Feature\"\x00\x12>\n\x0cListFeatures\x12\x15.routeguide.Rectangle\x1a\x13.routeguide.Feature\"\x00\x30\x01\x12>\n\x0bRecordRoute\x12\x11.routeguide.Point\x1a\x18.routeguide.RouteSummary\"\x00(\x01\x12?\n\tRouteChat\x12\x15.routeguide.RouteNote\x1a\x15.routeguide.RouteNote\"\x00(\x01\x30\x01\x42\x36\n\x1bio.grpc.examples.routeguideB\x0fRouteGuideProtoP\x01\xa2\x02\x03RTGb\x06proto3') +) + + + + +_POINT = _descriptor.Descriptor( + name='Point', + full_name='routeguide.Point', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='latitude', full_name='routeguide.Point.latitude', 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='longitude', full_name='routeguide.Point.longitude', 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), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=33, + serialized_end=77, +) + + +_RECTANGLE = _descriptor.Descriptor( + name='Rectangle', + full_name='routeguide.Rectangle', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='lo', full_name='routeguide.Rectangle.lo', 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='hi', full_name='routeguide.Rectangle.hi', 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=79, + serialized_end=152, +) + + +_FEATURE = _descriptor.Descriptor( + name='Feature', + full_name='routeguide.Feature', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='routeguide.Feature.name', index=0, + number=1, 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='location', full_name='routeguide.Feature.location', 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=154, + serialized_end=214, +) + + +_ROUTENOTE = _descriptor.Descriptor( + name='RouteNote', + full_name='routeguide.RouteNote', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='location', full_name='routeguide.RouteNote.location', 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='message', full_name='routeguide.RouteNote.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=216, + serialized_end=281, +) + + +_ROUTESUMMARY = _descriptor.Descriptor( + name='RouteSummary', + full_name='routeguide.RouteSummary', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='point_count', full_name='routeguide.RouteSummary.point_count', 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='feature_count', full_name='routeguide.RouteSummary.feature_count', 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='distance', full_name='routeguide.RouteSummary.distance', index=2, + number=3, 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='elapsed_time', full_name='routeguide.RouteSummary.elapsed_time', index=3, + number=4, 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=283, + serialized_end=381, +) + +_RECTANGLE.fields_by_name['lo'].message_type = _POINT +_RECTANGLE.fields_by_name['hi'].message_type = _POINT +_FEATURE.fields_by_name['location'].message_type = _POINT +_ROUTENOTE.fields_by_name['location'].message_type = _POINT +DESCRIPTOR.message_types_by_name['Point'] = _POINT +DESCRIPTOR.message_types_by_name['Rectangle'] = _RECTANGLE +DESCRIPTOR.message_types_by_name['Feature'] = _FEATURE +DESCRIPTOR.message_types_by_name['RouteNote'] = _ROUTENOTE +DESCRIPTOR.message_types_by_name['RouteSummary'] = _ROUTESUMMARY +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +Point = _reflection.GeneratedProtocolMessageType('Point', (_message.Message,), dict( + DESCRIPTOR = _POINT, + __module__ = 'route_guide_pb2' + # @@protoc_insertion_point(class_scope:routeguide.Point) + )) +_sym_db.RegisterMessage(Point) + +Rectangle = _reflection.GeneratedProtocolMessageType('Rectangle', (_message.Message,), dict( + DESCRIPTOR = _RECTANGLE, + __module__ = 'route_guide_pb2' + # @@protoc_insertion_point(class_scope:routeguide.Rectangle) + )) +_sym_db.RegisterMessage(Rectangle) + +Feature = _reflection.GeneratedProtocolMessageType('Feature', (_message.Message,), dict( + DESCRIPTOR = _FEATURE, + __module__ = 'route_guide_pb2' + # @@protoc_insertion_point(class_scope:routeguide.Feature) + )) +_sym_db.RegisterMessage(Feature) + +RouteNote = _reflection.GeneratedProtocolMessageType('RouteNote', (_message.Message,), dict( + DESCRIPTOR = _ROUTENOTE, + __module__ = 'route_guide_pb2' + # @@protoc_insertion_point(class_scope:routeguide.RouteNote) + )) +_sym_db.RegisterMessage(RouteNote) + +RouteSummary = _reflection.GeneratedProtocolMessageType('RouteSummary', (_message.Message,), dict( + DESCRIPTOR = _ROUTESUMMARY, + __module__ = 'route_guide_pb2' + # @@protoc_insertion_point(class_scope:routeguide.RouteSummary) + )) +_sym_db.RegisterMessage(RouteSummary) + + +DESCRIPTOR.has_options = True +DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\033io.grpc.examples.routeguideB\017RouteGuideProtoP\001\242\002\003RTG')) + +_ROUTEGUIDE = _descriptor.ServiceDescriptor( + name='RouteGuide', + full_name='routeguide.RouteGuide', + file=DESCRIPTOR, + index=0, + options=None, + serialized_start=384, + serialized_end=645, + methods=[ + _descriptor.MethodDescriptor( + name='GetFeature', + full_name='routeguide.RouteGuide.GetFeature', + index=0, + containing_service=None, + input_type=_POINT, + output_type=_FEATURE, + options=None, + ), + _descriptor.MethodDescriptor( + name='ListFeatures', + full_name='routeguide.RouteGuide.ListFeatures', + index=1, + containing_service=None, + input_type=_RECTANGLE, + output_type=_FEATURE, + options=None, + ), + _descriptor.MethodDescriptor( + name='RecordRoute', + full_name='routeguide.RouteGuide.RecordRoute', + index=2, + containing_service=None, + input_type=_POINT, + output_type=_ROUTESUMMARY, + options=None, + ), + _descriptor.MethodDescriptor( + name='RouteChat', + full_name='routeguide.RouteGuide.RouteChat', + index=3, + containing_service=None, + input_type=_ROUTENOTE, + output_type=_ROUTENOTE, + options=None, + ), +]) +_sym_db.RegisterServiceDescriptor(_ROUTEGUIDE) + +DESCRIPTOR.services_by_name['RouteGuide'] = _ROUTEGUIDE + +# @@protoc_insertion_point(module_scope) diff --git a/examples/python/multiplex/route_guide_pb2_grpc.py b/examples/python/multiplex/route_guide_pb2_grpc.py new file mode 100644 index 00000000..05c1b793 --- /dev/null +++ b/examples/python/multiplex/route_guide_pb2_grpc.py @@ -0,0 +1,113 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +import grpc + +import route_guide_pb2 as route__guide__pb2 + + +class RouteGuideStub(object): + """Interface exported by the server. + """ + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.GetFeature = channel.unary_unary( + '/routeguide.RouteGuide/GetFeature', + request_serializer=route__guide__pb2.Point.SerializeToString, + response_deserializer=route__guide__pb2.Feature.FromString, + ) + self.ListFeatures = channel.unary_stream( + '/routeguide.RouteGuide/ListFeatures', + request_serializer=route__guide__pb2.Rectangle.SerializeToString, + response_deserializer=route__guide__pb2.Feature.FromString, + ) + self.RecordRoute = channel.stream_unary( + '/routeguide.RouteGuide/RecordRoute', + request_serializer=route__guide__pb2.Point.SerializeToString, + response_deserializer=route__guide__pb2.RouteSummary.FromString, + ) + self.RouteChat = channel.stream_stream( + '/routeguide.RouteGuide/RouteChat', + request_serializer=route__guide__pb2.RouteNote.SerializeToString, + response_deserializer=route__guide__pb2.RouteNote.FromString, + ) + + +class RouteGuideServicer(object): + """Interface exported by the server. + """ + + def GetFeature(self, request, context): + """A simple RPC. + + Obtains the feature at a given position. + + A feature with an empty name is returned if there's no feature at the given + position. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListFeatures(self, request, context): + """A server-to-client streaming RPC. + + Obtains the Features available within the given Rectangle. Results are + streamed rather than returned at once (e.g. in a response message with a + repeated field), as the rectangle may cover a large area and contain a + huge number of features. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def RecordRoute(self, request_iterator, context): + """A client-to-server streaming RPC. + + Accepts a stream of Points on a route being traversed, returning a + RouteSummary when traversal is completed. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def RouteChat(self, request_iterator, context): + """A Bidirectional streaming RPC. + + Accepts a stream of RouteNotes sent while a route is being traversed, + while receiving other RouteNotes (e.g. from other users). + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_RouteGuideServicer_to_server(servicer, server): + rpc_method_handlers = { + 'GetFeature': grpc.unary_unary_rpc_method_handler( + servicer.GetFeature, + request_deserializer=route__guide__pb2.Point.FromString, + response_serializer=route__guide__pb2.Feature.SerializeToString, + ), + 'ListFeatures': grpc.unary_stream_rpc_method_handler( + servicer.ListFeatures, + request_deserializer=route__guide__pb2.Rectangle.FromString, + response_serializer=route__guide__pb2.Feature.SerializeToString, + ), + 'RecordRoute': grpc.stream_unary_rpc_method_handler( + servicer.RecordRoute, + request_deserializer=route__guide__pb2.Point.FromString, + response_serializer=route__guide__pb2.RouteSummary.SerializeToString, + ), + 'RouteChat': grpc.stream_stream_rpc_method_handler( + servicer.RouteChat, + request_deserializer=route__guide__pb2.RouteNote.FromString, + response_serializer=route__guide__pb2.RouteNote.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'routeguide.RouteGuide', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) diff --git a/examples/python/multiplex/route_guide_resources.py b/examples/python/multiplex/route_guide_resources.py new file mode 100644 index 00000000..ace85d6f --- /dev/null +++ b/examples/python/multiplex/route_guide_resources.py @@ -0,0 +1,37 @@ +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Common resources used in the gRPC route guide example.""" + +import json + +import route_guide_pb2 + + +def read_route_guide_database(): + """Reads the route guide database. + + Returns: + The full contents of the route guide database as a sequence of + route_guide_pb2.Features. + """ + feature_list = [] + with open("route_guide_db.json") as route_guide_db_file: + for item in json.load(route_guide_db_file): + feature = route_guide_pb2.Feature( + name=item["name"], + location=route_guide_pb2.Point( + latitude=item["location"]["latitude"], + longitude=item["location"]["longitude"])) + feature_list.append(feature) + return feature_list diff --git a/examples/python/multiplex/run_codegen.py b/examples/python/multiplex/run_codegen.py new file mode 100644 index 00000000..be8915fe --- /dev/null +++ b/examples/python/multiplex/run_codegen.py @@ -0,0 +1,31 @@ +# Copyright 2016 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Generates protocol messages and gRPC stubs.""" + +from grpc_tools import protoc + +protoc.main(( + '', + '-I../../protos', + '--python_out=.', + '--grpc_python_out=.', + '../../protos/helloworld.proto', +)) +protoc.main(( + '', + '-I../../protos', + '--python_out=.', + '--grpc_python_out=.', + '../../protos/route_guide.proto', +)) diff --git a/examples/python/multiprocessing/BUILD b/examples/python/multiprocessing/BUILD new file mode 100644 index 00000000..1d831e72 --- /dev/null +++ b/examples/python/multiprocessing/BUILD @@ -0,0 +1,76 @@ +# gRPC Bazel BUILD file. +# +# Copyright 2019 The gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("@rules_proto//proto:defs.bzl", "proto_library") +load("//bazel:python_rules.bzl", "py_grpc_library", "py_proto_library") + +proto_library( + name = "prime_proto", + srcs = ["prime.proto"], +) + +py_proto_library( + name = "prime_proto_pb2", + deps = [":prime_proto"], +) + +py_grpc_library( + name = "prime_proto_pb2_grpc", + srcs = [":prime_proto"], + deps = [":prime_proto_pb2"], +) + +py_binary( + name = "client", + testonly = 1, + srcs = ["client.py"], + imports = ["."], + python_version = "PY3", + srcs_version = "PY3", + deps = [ + ":prime_proto_pb2", + ":prime_proto_pb2_grpc", + "//src/python/grpcio/grpc:grpcio", + ], +) + +py_binary( + name = "server", + testonly = 1, + srcs = ["server.py"], + imports = ["."], + python_version = "PY3", + srcs_version = "PY3", + deps = [ + "//src/python/grpcio/grpc:grpcio", + ":prime_proto_pb2", + ":prime_proto_pb2_grpc", + ] + select({ + "//conditions:default": ["@futures//:futures"], + "//:python3": [], + }), +) + +py_test( + name = "test/_multiprocessing_example_test", + size = "small", + srcs = ["test/_multiprocessing_example_test.py"], + data = [ + ":client", + ":server", + ], + python_version = "PY3", +) diff --git a/examples/python/multiprocessing/README.md b/examples/python/multiprocessing/README.md new file mode 100644 index 00000000..5dce50ad --- /dev/null +++ b/examples/python/multiprocessing/README.md @@ -0,0 +1,74 @@ +## Multiprocessing with gRPC Python + +Multiprocessing allows application developers to sidestep the Python global +interpreter lock and achieve true parallelism on multicore systems. +Unfortunately, using multiprocessing and gRPC Python is not yet as simple as +instantiating your server with a `futures.ProcessPoolExecutor`. + +The library is implemented as a C extension, maintaining much of the state that +drives the system in native code. As such, upon calling +[`fork`](http://man7.org/linux/man-pages/man2/fork.2.html), any threads in a +critical section may leave the state of the gRPC library invalid in the child +process. See this [excellent research +paper](https://www.microsoft.com/en-us/research/uploads/prod/2019/04/fork-hotos19.pdf) +for a thorough discussion of the topic. + +Calling `fork` without `exec` in your process *is* supported +before any gRPC servers have been instantiated. Application developers can +take advantage of this to parallelize their CPU-intensive operations. + +## Calculating Prime Numbers with Multiple Processes + +This example calculates the first 10,000 prime numbers as an RPC. We instantiate +one server per subprocess, balancing requests between the servers using the +[`SO_REUSEPORT`](https://lwn.net/Articles/542629/) socket option. + +```python +_PROCESS_COUNT = multiprocessing.cpu_count() +``` + +On the server side, we detect the number of CPUs available on the system and +spawn exactly that many child processes. If we spin up fewer, we won't be taking +full advantage of the hardware resources available. + +## Running the Example + +To run the server, +[ensure `bazel` is installed](https://docs.bazel.build/versions/master/install.html) +and run: + +``` +bazel run //examples/python/multiprocessing:server & +``` + +Note the address at which the server is running. For example, + +``` +... +[PID 107153] Binding to '[::]:33915' +[PID 107507] Starting new server. +[PID 107508] Starting new server. +... +``` + +Note that several servers have been started, each with its own PID. + +Now, start the client by running + +``` +bazel run //examples/python/multiprocessing:client -- [SERVER_ADDRESS] +``` + +For example, + +``` +bazel run //examples/python/multiprocessing:client -- [::]:33915 +``` + +Alternatively, generate code using the following and then run the client and server +directly: + +```python +cd examples/python/helloworld +python -m grpc_tools.protoc -I . prime.proto --python_out=. --grpc_python_out=. +``` diff --git a/examples/python/multiprocessing/client.py b/examples/python/multiprocessing/client.py new file mode 100644 index 00000000..7676bd4e --- /dev/null +++ b/examples/python/multiprocessing/client.py @@ -0,0 +1,93 @@ +# Copyright 2019 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""An example of multiprocessing concurrency with gRPC.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import atexit +import logging +import multiprocessing +import operator +import sys + +import grpc + +import prime_pb2 +import prime_pb2_grpc + +_PROCESS_COUNT = 8 +_MAXIMUM_CANDIDATE = 10000 + +# Each worker process initializes a single channel after forking. +# It's regrettable, but to ensure that each subprocess only has to instantiate +# a single channel to be reused across all RPCs, we use globals. +_worker_channel_singleton = None +_worker_stub_singleton = None + +_LOGGER = logging.getLogger(__name__) + + +def _shutdown_worker(): + _LOGGER.info('Shutting worker process down.') + if _worker_channel_singleton is not None: + _worker_channel_singleton.stop() + + +def _initialize_worker(server_address): + global _worker_channel_singleton # pylint: disable=global-statement + global _worker_stub_singleton # pylint: disable=global-statement + _LOGGER.info('Initializing worker process.') + _worker_channel_singleton = grpc.insecure_channel(server_address) + _worker_stub_singleton = prime_pb2_grpc.PrimeCheckerStub( + _worker_channel_singleton) + atexit.register(_shutdown_worker) + + +def _run_worker_query(primality_candidate): + _LOGGER.info('Checking primality of %s.', primality_candidate) + return _worker_stub_singleton.check( + prime_pb2.PrimeCandidate(candidate=primality_candidate)) + + +def _calculate_primes(server_address): + worker_pool = multiprocessing.Pool(processes=_PROCESS_COUNT, + initializer=_initialize_worker, + initargs=(server_address,)) + check_range = range(2, _MAXIMUM_CANDIDATE) + primality = worker_pool.map(_run_worker_query, check_range) + primes = zip(check_range, map(operator.attrgetter('isPrime'), primality)) + return tuple(primes) + + +def main(): + msg = 'Determine the primality of the first {} integers.'.format( + _MAXIMUM_CANDIDATE) + parser = argparse.ArgumentParser(description=msg) + parser.add_argument('server_address', + help='The address of the server (e.g. localhost:50051)') + args = parser.parse_args() + primes = _calculate_primes(args.server_address) + print(primes) + + +if __name__ == '__main__': + handler = logging.StreamHandler(sys.stdout) + formatter = logging.Formatter('[PID %(process)d] %(message)s') + handler.setFormatter(formatter) + _LOGGER.addHandler(handler) + _LOGGER.setLevel(logging.INFO) + main() diff --git a/examples/python/multiprocessing/prime.proto b/examples/python/multiprocessing/prime.proto new file mode 100644 index 00000000..4ef232f8 --- /dev/null +++ b/examples/python/multiprocessing/prime.proto @@ -0,0 +1,35 @@ +// Copyright 2019 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package prime; + +// A candidate integer for primality testing. +message PrimeCandidate { + // The candidate. + int64 candidate = 1; +} + +// The primality of the requested integer candidate. +message Primality { + // Is the candidate prime? + bool isPrime = 1; +} + +// Service to check primality. +service PrimeChecker { + // Determines the primality of an integer. + rpc check (PrimeCandidate) returns (Primality) {} +} diff --git a/examples/python/multiprocessing/server.py b/examples/python/multiprocessing/server.py new file mode 100644 index 00000000..a5ee0075 --- /dev/null +++ b/examples/python/multiprocessing/server.py @@ -0,0 +1,117 @@ +# Copyright 2019 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""An example of multiprocess concurrency with gRPC.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from concurrent import futures +import contextlib +import datetime +import logging +import math +import multiprocessing +import time +import socket +import sys + +import grpc + +import prime_pb2 +import prime_pb2_grpc + +_LOGGER = logging.getLogger(__name__) + +_ONE_DAY = datetime.timedelta(days=1) +_PROCESS_COUNT = multiprocessing.cpu_count() +_THREAD_CONCURRENCY = _PROCESS_COUNT + + +def is_prime(n): + for i in range(2, int(math.ceil(math.sqrt(n)))): + if n % i == 0: + return False + else: + return True + + +class PrimeChecker(prime_pb2_grpc.PrimeCheckerServicer): + + def check(self, request, context): + _LOGGER.info('Determining primality of %s', request.candidate) + return prime_pb2.Primality(isPrime=is_prime(request.candidate)) + + +def _wait_forever(server): + try: + while True: + time.sleep(_ONE_DAY.total_seconds()) + except KeyboardInterrupt: + server.stop(None) + + +def _run_server(bind_address): + """Start a server in a subprocess.""" + _LOGGER.info('Starting new server.') + options = (('grpc.so_reuseport', 1),) + + server = grpc.server(futures.ThreadPoolExecutor( + max_workers=_THREAD_CONCURRENCY,), + options=options) + prime_pb2_grpc.add_PrimeCheckerServicer_to_server(PrimeChecker(), server) + server.add_insecure_port(bind_address) + server.start() + _wait_forever(server) + + +@contextlib.contextmanager +def _reserve_port(): + """Find and reserve a port for all subprocesses to use.""" + sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM) + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) + if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT) == 0: + raise RuntimeError("Failed to set SO_REUSEPORT.") + sock.bind(('', 0)) + try: + yield sock.getsockname()[1] + finally: + sock.close() + + +def main(): + with _reserve_port() as port: + bind_address = 'localhost:{}'.format(port) + _LOGGER.info("Binding to '%s'", bind_address) + sys.stdout.flush() + workers = [] + for _ in range(_PROCESS_COUNT): + # NOTE: It is imperative that the worker subprocesses be forked before + # any gRPC servers start up. See + # https://github.com/grpc/grpc/issues/16001 for more details. + worker = multiprocessing.Process(target=_run_server, + args=(bind_address,)) + worker.start() + workers.append(worker) + for worker in workers: + worker.join() + + +if __name__ == '__main__': + handler = logging.StreamHandler(sys.stdout) + formatter = logging.Formatter('[PID %(process)d] %(message)s') + handler.setFormatter(formatter) + _LOGGER.addHandler(handler) + _LOGGER.setLevel(logging.INFO) + main() diff --git a/examples/python/multiprocessing/test/_multiprocessing_example_test.py b/examples/python/multiprocessing/test/_multiprocessing_example_test.py new file mode 100644 index 00000000..b8b77141 --- /dev/null +++ b/examples/python/multiprocessing/test/_multiprocessing_example_test.py @@ -0,0 +1,74 @@ +# Copyright 2019 the gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Test for multiprocessing example.""" + +import ast +import logging +import math +import os +import re +import subprocess +import tempfile +import unittest + +_BINARY_DIR = os.path.realpath( + os.path.join(os.path.dirname(os.path.abspath(__file__)), '..')) +_SERVER_PATH = os.path.join(_BINARY_DIR, 'server') +_CLIENT_PATH = os.path.join(_BINARY_DIR, 'client') + + +def is_prime(n): + for i in range(2, int(math.ceil(math.sqrt(n)))): + if n % i == 0: + return False + else: + return True + + +def _get_server_address(server_stream): + while True: + server_stream.seek(0) + line = server_stream.readline() + while line: + matches = re.search('Binding to \'(.+)\'', line) + if matches is not None: + return matches.groups()[0] + line = server_stream.readline() + + +class MultiprocessingExampleTest(unittest.TestCase): + + def test_multiprocessing_example(self): + server_stdout = tempfile.TemporaryFile(mode='r') + server_process = subprocess.Popen((_SERVER_PATH,), stdout=server_stdout) + server_address = _get_server_address(server_stdout) + client_stdout = tempfile.TemporaryFile(mode='r') + client_process = subprocess.Popen(( + _CLIENT_PATH, + server_address, + ), + stdout=client_stdout) + client_process.wait() + server_process.terminate() + client_stdout.seek(0) + results = ast.literal_eval(client_stdout.read().strip().split('\n')[-1]) + values = tuple(result[0] for result in results) + self.assertSequenceEqual(range(2, 10000), values) + for result in results: + self.assertEqual(is_prime(result[0]), result[1]) + + +if __name__ == '__main__': + logging.basicConfig() + unittest.main(verbosity=2) diff --git a/examples/python/route_guide/.gitignore b/examples/python/route_guide/.gitignore new file mode 100644 index 00000000..0d20b648 --- /dev/null +++ b/examples/python/route_guide/.gitignore @@ -0,0 +1 @@ +*.pyc diff --git a/examples/python/route_guide/README.md b/examples/python/route_guide/README.md new file mode 100644 index 00000000..890e66eb --- /dev/null +++ b/examples/python/route_guide/README.md @@ -0,0 +1 @@ +[This code's documentation lives on the grpc.io site.](https://grpc.io/docs/tutorials/basic/python.html) diff --git a/examples/python/route_guide/route_guide_client.py b/examples/python/route_guide/route_guide_client.py new file mode 100644 index 00000000..6103c535 --- /dev/null +++ b/examples/python/route_guide/route_guide_client.py @@ -0,0 +1,120 @@ +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""The Python implementation of the gRPC route guide client.""" + +from __future__ import print_function + +import random +import logging + +import grpc + +import route_guide_pb2 +import route_guide_pb2_grpc +import route_guide_resources + + +def make_route_note(message, latitude, longitude): + return route_guide_pb2.RouteNote( + message=message, + location=route_guide_pb2.Point(latitude=latitude, longitude=longitude)) + + +def guide_get_one_feature(stub, point): + feature = stub.GetFeature(point) + if not feature.location: + print("Server returned incomplete feature") + return + + if feature.name: + print("Feature called %s at %s" % (feature.name, feature.location)) + else: + print("Found no feature at %s" % feature.location) + + +def guide_get_feature(stub): + guide_get_one_feature( + stub, route_guide_pb2.Point(latitude=409146138, longitude=-746188906)) + guide_get_one_feature(stub, route_guide_pb2.Point(latitude=0, longitude=0)) + + +def guide_list_features(stub): + rectangle = route_guide_pb2.Rectangle( + lo=route_guide_pb2.Point(latitude=400000000, longitude=-750000000), + hi=route_guide_pb2.Point(latitude=420000000, longitude=-730000000)) + print("Looking for features between 40, -75 and 42, -73") + + features = stub.ListFeatures(rectangle) + + for feature in features: + print("Feature called %s at %s" % (feature.name, feature.location)) + + +def generate_route(feature_list): + for _ in range(0, 10): + random_feature = feature_list[random.randint(0, len(feature_list) - 1)] + print("Visiting point %s" % random_feature.location) + yield random_feature.location + + +def guide_record_route(stub): + feature_list = route_guide_resources.read_route_guide_database() + + route_iterator = generate_route(feature_list) + route_summary = stub.RecordRoute(route_iterator) + print("Finished trip with %s points " % route_summary.point_count) + print("Passed %s features " % route_summary.feature_count) + print("Travelled %s meters " % route_summary.distance) + print("It took %s seconds " % route_summary.elapsed_time) + + +def generate_messages(): + messages = [ + make_route_note("First message", 0, 0), + make_route_note("Second message", 0, 1), + make_route_note("Third message", 1, 0), + make_route_note("Fourth message", 0, 0), + make_route_note("Fifth message", 1, 0), + ] + for msg in messages: + print("Sending %s at %s" % (msg.message, msg.location)) + yield msg + + +def guide_route_chat(stub): + responses = stub.RouteChat(generate_messages()) + for response in responses: + print("Received message %s at %s" % + (response.message, response.location)) + + +def run(): + # NOTE(gRPC Python Team): .close() is possible on a channel and should be + # used in circumstances in which the with statement does not fit the needs + # of the code. + with grpc.insecure_channel('localhost:50051') as channel: + stub = route_guide_pb2_grpc.RouteGuideStub(channel) + print("-------------- GetFeature --------------") + guide_get_feature(stub) + print("-------------- ListFeatures --------------") + guide_list_features(stub) + print("-------------- RecordRoute --------------") + guide_record_route(stub) + print("-------------- RouteChat --------------") + guide_route_chat(stub) + + +if __name__ == '__main__': + logging.basicConfig() + run() diff --git a/examples/python/route_guide/route_guide_db.json b/examples/python/route_guide/route_guide_db.json new file mode 100644 index 00000000..9d6a980a --- /dev/null +++ b/examples/python/route_guide/route_guide_db.json @@ -0,0 +1,601 @@ +[{ + "location": { + "latitude": 407838351, + "longitude": -746143763 + }, + "name": "Patriots Path, Mendham, NJ 07945, USA" +}, { + "location": { + "latitude": 408122808, + "longitude": -743999179 + }, + "name": "101 New Jersey 10, Whippany, NJ 07981, USA" +}, { + "location": { + "latitude": 413628156, + "longitude": -749015468 + }, + "name": "U.S. 6, Shohola, PA 18458, USA" +}, { + "location": { + "latitude": 419999544, + "longitude": -740371136 + }, + "name": "5 Conners Road, Kingston, NY 12401, USA" +}, { + "location": { + "latitude": 414008389, + "longitude": -743951297 + }, + "name": "Mid Hudson Psychiatric Center, New Hampton, NY 10958, USA" +}, { + "location": { + "latitude": 419611318, + "longitude": -746524769 + }, + "name": "287 Flugertown Road, Livingston Manor, NY 12758, USA" +}, { + "location": { + "latitude": 406109563, + "longitude": -742186778 + }, + "name": "4001 Tremley Point Road, Linden, NJ 07036, USA" +}, { + "location": { + "latitude": 416802456, + "longitude": -742370183 + }, + "name": "352 South Mountain Road, Wallkill, NY 12589, USA" +}, { + "location": { + "latitude": 412950425, + "longitude": -741077389 + }, + "name": "Bailey Turn Road, Harriman, NY 10926, USA" +}, { + "location": { + "latitude": 412144655, + "longitude": -743949739 + }, + "name": "193-199 Wawayanda Road, Hewitt, NJ 07421, USA" +}, { + "location": { + "latitude": 415736605, + "longitude": -742847522 + }, + "name": "406-496 Ward Avenue, Pine Bush, NY 12566, USA" +}, { + "location": { + "latitude": 413843930, + "longitude": -740501726 + }, + "name": "162 Merrill Road, Highland Mills, NY 10930, USA" +}, { + "location": { + "latitude": 410873075, + "longitude": -744459023 + }, + "name": "Clinton Road, West Milford, NJ 07480, USA" +}, { + "location": { + "latitude": 412346009, + "longitude": -744026814 + }, + "name": "16 Old Brook Lane, Warwick, NY 10990, USA" +}, { + "location": { + "latitude": 402948455, + "longitude": -747903913 + }, + "name": "3 Drake Lane, Pennington, NJ 08534, USA" +}, { + "location": { + "latitude": 406337092, + "longitude": -740122226 + }, + "name": "6324 8th Avenue, Brooklyn, NY 11220, USA" +}, { + "location": { + "latitude": 406421967, + "longitude": -747727624 + }, + "name": "1 Merck Access Road, Whitehouse Station, NJ 08889, USA" +}, { + "location": { + "latitude": 416318082, + "longitude": -749677716 + }, + "name": "78-98 Schalck Road, Narrowsburg, NY 12764, USA" +}, { + "location": { + "latitude": 415301720, + "longitude": -748416257 + }, + "name": "282 Lakeview Drive Road, Highland Lake, NY 12743, USA" +}, { + "location": { + "latitude": 402647019, + "longitude": -747071791 + }, + "name": "330 Evelyn Avenue, Hamilton Township, NJ 08619, USA" +}, { + "location": { + "latitude": 412567807, + "longitude": -741058078 + }, + "name": "New York State Reference Route 987E, Southfields, NY 10975, USA" +}, { + "location": { + "latitude": 416855156, + "longitude": -744420597 + }, + "name": "103-271 Tempaloni Road, Ellenville, NY 12428, USA" +}, { + "location": { + "latitude": 404663628, + "longitude": -744820157 + }, + "name": "1300 Airport Road, North Brunswick Township, NJ 08902, USA" +}, { + "location": { + "latitude": 407113723, + "longitude": -749746483 + }, + "name": "" +}, { + "location": { + "latitude": 402133926, + "longitude": -743613249 + }, + "name": "" +}, { + "location": { + "latitude": 400273442, + "longitude": -741220915 + }, + "name": "" +}, { + "location": { + "latitude": 411236786, + "longitude": -744070769 + }, + "name": "" +}, { + "location": { + "latitude": 411633782, + "longitude": -746784970 + }, + "name": "211-225 Plains Road, Augusta, NJ 07822, USA" +}, { + "location": { + "latitude": 415830701, + "longitude": -742952812 + }, + "name": "" +}, { + "location": { + "latitude": 413447164, + "longitude": -748712898 + }, + "name": "165 Pedersen Ridge Road, Milford, PA 18337, USA" +}, { + "location": { + "latitude": 405047245, + "longitude": -749800722 + }, + "name": "100-122 Locktown Road, Frenchtown, NJ 08825, USA" +}, { + "location": { + "latitude": 418858923, + "longitude": -746156790 + }, + "name": "" +}, { + "location": { + "latitude": 417951888, + "longitude": -748484944 + }, + "name": "650-652 Willi Hill Road, Swan Lake, NY 12783, USA" +}, { + "location": { + "latitude": 407033786, + "longitude": -743977337 + }, + "name": "26 East 3rd Street, New Providence, NJ 07974, USA" +}, { + "location": { + "latitude": 417548014, + "longitude": -740075041 + }, + "name": "" +}, { + "location": { + "latitude": 410395868, + "longitude": -744972325 + }, + "name": "" +}, { + "location": { + "latitude": 404615353, + "longitude": -745129803 + }, + "name": "" +}, { + "location": { + "latitude": 406589790, + "longitude": -743560121 + }, + "name": "611 Lawrence Avenue, Westfield, NJ 07090, USA" +}, { + "location": { + "latitude": 414653148, + "longitude": -740477477 + }, + "name": "18 Lannis Avenue, New Windsor, NY 12553, USA" +}, { + "location": { + "latitude": 405957808, + "longitude": -743255336 + }, + "name": "82-104 Amherst Avenue, Colonia, NJ 07067, USA" +}, { + "location": { + "latitude": 411733589, + "longitude": -741648093 + }, + "name": "170 Seven Lakes Drive, Sloatsburg, NY 10974, USA" +}, { + "location": { + "latitude": 412676291, + "longitude": -742606606 + }, + "name": "1270 Lakes Road, Monroe, NY 10950, USA" +}, { + "location": { + "latitude": 409224445, + "longitude": -748286738 + }, + "name": "509-535 Alphano Road, Great Meadows, NJ 07838, USA" +}, { + "location": { + "latitude": 406523420, + "longitude": -742135517 + }, + "name": "652 Garden Street, Elizabeth, NJ 07202, USA" +}, { + "location": { + "latitude": 401827388, + "longitude": -740294537 + }, + "name": "349 Sea Spray Court, Neptune City, NJ 07753, USA" +}, { + "location": { + "latitude": 410564152, + "longitude": -743685054 + }, + "name": "13-17 Stanley Street, West Milford, NJ 07480, USA" +}, { + "location": { + "latitude": 408472324, + "longitude": -740726046 + }, + "name": "47 Industrial Avenue, Teterboro, NJ 07608, USA" +}, { + "location": { + "latitude": 412452168, + "longitude": -740214052 + }, + "name": "5 White Oak Lane, Stony Point, NY 10980, USA" +}, { + "location": { + "latitude": 409146138, + "longitude": -746188906 + }, + "name": "Berkshire Valley Management Area Trail, Jefferson, NJ, USA" +}, { + "location": { + "latitude": 404701380, + "longitude": -744781745 + }, + "name": "1007 Jersey Avenue, New Brunswick, NJ 08901, USA" +}, { + "location": { + "latitude": 409642566, + "longitude": -746017679 + }, + "name": "6 East Emerald Isle Drive, Lake Hopatcong, NJ 07849, USA" +}, { + "location": { + "latitude": 408031728, + "longitude": -748645385 + }, + "name": "1358-1474 New Jersey 57, Port Murray, NJ 07865, USA" +}, { + "location": { + "latitude": 413700272, + "longitude": -742135189 + }, + "name": "367 Prospect Road, Chester, NY 10918, USA" +}, { + "location": { + "latitude": 404310607, + "longitude": -740282632 + }, + "name": "10 Simon Lake Drive, Atlantic Highlands, NJ 07716, USA" +}, { + "location": { + "latitude": 409319800, + "longitude": -746201391 + }, + "name": "11 Ward Street, Mount Arlington, NJ 07856, USA" +}, { + "location": { + "latitude": 406685311, + "longitude": -742108603 + }, + "name": "300-398 Jefferson Avenue, Elizabeth, NJ 07201, USA" +}, { + "location": { + "latitude": 419018117, + "longitude": -749142781 + }, + "name": "43 Dreher Road, Roscoe, NY 12776, USA" +}, { + "location": { + "latitude": 412856162, + "longitude": -745148837 + }, + "name": "Swan Street, Pine Island, NY 10969, USA" +}, { + "location": { + "latitude": 416560744, + "longitude": -746721964 + }, + "name": "66 Pleasantview Avenue, Monticello, NY 12701, USA" +}, { + "location": { + "latitude": 405314270, + "longitude": -749836354 + }, + "name": "" +}, { + "location": { + "latitude": 414219548, + "longitude": -743327440 + }, + "name": "" +}, { + "location": { + "latitude": 415534177, + "longitude": -742900616 + }, + "name": "565 Winding Hills Road, Montgomery, NY 12549, USA" +}, { + "location": { + "latitude": 406898530, + "longitude": -749127080 + }, + "name": "231 Rocky Run Road, Glen Gardner, NJ 08826, USA" +}, { + "location": { + "latitude": 407586880, + "longitude": -741670168 + }, + "name": "100 Mount Pleasant Avenue, Newark, NJ 07104, USA" +}, { + "location": { + "latitude": 400106455, + "longitude": -742870190 + }, + "name": "517-521 Huntington Drive, Manchester Township, NJ 08759, USA" +}, { + "location": { + "latitude": 400066188, + "longitude": -746793294 + }, + "name": "" +}, { + "location": { + "latitude": 418803880, + "longitude": -744102673 + }, + "name": "40 Mountain Road, Napanoch, NY 12458, USA" +}, { + "location": { + "latitude": 414204288, + "longitude": -747895140 + }, + "name": "" +}, { + "location": { + "latitude": 414777405, + "longitude": -740615601 + }, + "name": "" +}, { + "location": { + "latitude": 415464475, + "longitude": -747175374 + }, + "name": "48 North Road, Forestburgh, NY 12777, USA" +}, { + "location": { + "latitude": 404062378, + "longitude": -746376177 + }, + "name": "" +}, { + "location": { + "latitude": 405688272, + "longitude": -749285130 + }, + "name": "" +}, { + "location": { + "latitude": 400342070, + "longitude": -748788996 + }, + "name": "" +}, { + "location": { + "latitude": 401809022, + "longitude": -744157964 + }, + "name": "" +}, { + "location": { + "latitude": 404226644, + "longitude": -740517141 + }, + "name": "9 Thompson Avenue, Leonardo, NJ 07737, USA" +}, { + "location": { + "latitude": 410322033, + "longitude": -747871659 + }, + "name": "" +}, { + "location": { + "latitude": 407100674, + "longitude": -747742727 + }, + "name": "" +}, { + "location": { + "latitude": 418811433, + "longitude": -741718005 + }, + "name": "213 Bush Road, Stone Ridge, NY 12484, USA" +}, { + "location": { + "latitude": 415034302, + "longitude": -743850945 + }, + "name": "" +}, { + "location": { + "latitude": 411349992, + "longitude": -743694161 + }, + "name": "" +}, { + "location": { + "latitude": 404839914, + "longitude": -744759616 + }, + "name": "1-17 Bergen Court, New Brunswick, NJ 08901, USA" +}, { + "location": { + "latitude": 414638017, + "longitude": -745957854 + }, + "name": "35 Oakland Valley Road, Cuddebackville, NY 12729, USA" +}, { + "location": { + "latitude": 412127800, + "longitude": -740173578 + }, + "name": "" +}, { + "location": { + "latitude": 401263460, + "longitude": -747964303 + }, + "name": "" +}, { + "location": { + "latitude": 412843391, + "longitude": -749086026 + }, + "name": "" +}, { + "location": { + "latitude": 418512773, + "longitude": -743067823 + }, + "name": "" +}, { + "location": { + "latitude": 404318328, + "longitude": -740835638 + }, + "name": "42-102 Main Street, Belford, NJ 07718, USA" +}, { + "location": { + "latitude": 419020746, + "longitude": -741172328 + }, + "name": "" +}, { + "location": { + "latitude": 404080723, + "longitude": -746119569 + }, + "name": "" +}, { + "location": { + "latitude": 401012643, + "longitude": -744035134 + }, + "name": "" +}, { + "location": { + "latitude": 404306372, + "longitude": -741079661 + }, + "name": "" +}, { + "location": { + "latitude": 403966326, + "longitude": -748519297 + }, + "name": "" +}, { + "location": { + "latitude": 405002031, + "longitude": -748407866 + }, + "name": "" +}, { + "location": { + "latitude": 409532885, + "longitude": -742200683 + }, + "name": "" +}, { + "location": { + "latitude": 416851321, + "longitude": -742674555 + }, + "name": "" +}, { + "location": { + "latitude": 406411633, + "longitude": -741722051 + }, + "name": "3387 Richmond Terrace, Staten Island, NY 10303, USA" +}, { + "location": { + "latitude": 413069058, + "longitude": -744597778 + }, + "name": "261 Van Sickle Road, Goshen, NY 10924, USA" +}, { + "location": { + "latitude": 418465462, + "longitude": -746859398 + }, + "name": "" +}, { + "location": { + "latitude": 411733222, + "longitude": -744228360 + }, + "name": "" +}, { + "location": { + "latitude": 410248224, + "longitude": -747127767 + }, + "name": "3 Hasta Way, Newton, NJ 07860, USA" +}] diff --git a/examples/python/route_guide/route_guide_pb2.py b/examples/python/route_guide/route_guide_pb2.py new file mode 100644 index 00000000..fbbc194a --- /dev/null +++ b/examples/python/route_guide/route_guide_pb2.py @@ -0,0 +1,331 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: route_guide.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +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='route_guide.proto', + package='routeguide', + syntax='proto3', + serialized_pb=_b('\n\x11route_guide.proto\x12\nrouteguide\",\n\x05Point\x12\x10\n\x08latitude\x18\x01 \x01(\x05\x12\x11\n\tlongitude\x18\x02 \x01(\x05\"I\n\tRectangle\x12\x1d\n\x02lo\x18\x01 \x01(\x0b\x32\x11.routeguide.Point\x12\x1d\n\x02hi\x18\x02 \x01(\x0b\x32\x11.routeguide.Point\"<\n\x07\x46\x65\x61ture\x12\x0c\n\x04name\x18\x01 \x01(\t\x12#\n\x08location\x18\x02 \x01(\x0b\x32\x11.routeguide.Point\"A\n\tRouteNote\x12#\n\x08location\x18\x01 \x01(\x0b\x32\x11.routeguide.Point\x12\x0f\n\x07message\x18\x02 \x01(\t\"b\n\x0cRouteSummary\x12\x13\n\x0bpoint_count\x18\x01 \x01(\x05\x12\x15\n\rfeature_count\x18\x02 \x01(\x05\x12\x10\n\x08\x64istance\x18\x03 \x01(\x05\x12\x14\n\x0c\x65lapsed_time\x18\x04 \x01(\x05\x32\x85\x02\n\nRouteGuide\x12\x36\n\nGetFeature\x12\x11.routeguide.Point\x1a\x13.routeguide.Feature\"\x00\x12>\n\x0cListFeatures\x12\x15.routeguide.Rectangle\x1a\x13.routeguide.Feature\"\x00\x30\x01\x12>\n\x0bRecordRoute\x12\x11.routeguide.Point\x1a\x18.routeguide.RouteSummary\"\x00(\x01\x12?\n\tRouteChat\x12\x15.routeguide.RouteNote\x1a\x15.routeguide.RouteNote\"\x00(\x01\x30\x01\x42\x36\n\x1bio.grpc.examples.routeguideB\x0fRouteGuideProtoP\x01\xa2\x02\x03RTGb\x06proto3') +) + + + + +_POINT = _descriptor.Descriptor( + name='Point', + full_name='routeguide.Point', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='latitude', full_name='routeguide.Point.latitude', 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='longitude', full_name='routeguide.Point.longitude', 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), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=33, + serialized_end=77, +) + + +_RECTANGLE = _descriptor.Descriptor( + name='Rectangle', + full_name='routeguide.Rectangle', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='lo', full_name='routeguide.Rectangle.lo', 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='hi', full_name='routeguide.Rectangle.hi', 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=79, + serialized_end=152, +) + + +_FEATURE = _descriptor.Descriptor( + name='Feature', + full_name='routeguide.Feature', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='routeguide.Feature.name', index=0, + number=1, 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='location', full_name='routeguide.Feature.location', 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=154, + serialized_end=214, +) + + +_ROUTENOTE = _descriptor.Descriptor( + name='RouteNote', + full_name='routeguide.RouteNote', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='location', full_name='routeguide.RouteNote.location', 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='message', full_name='routeguide.RouteNote.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=216, + serialized_end=281, +) + + +_ROUTESUMMARY = _descriptor.Descriptor( + name='RouteSummary', + full_name='routeguide.RouteSummary', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='point_count', full_name='routeguide.RouteSummary.point_count', 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='feature_count', full_name='routeguide.RouteSummary.feature_count', 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='distance', full_name='routeguide.RouteSummary.distance', index=2, + number=3, 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='elapsed_time', full_name='routeguide.RouteSummary.elapsed_time', index=3, + number=4, 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=283, + serialized_end=381, +) + +_RECTANGLE.fields_by_name['lo'].message_type = _POINT +_RECTANGLE.fields_by_name['hi'].message_type = _POINT +_FEATURE.fields_by_name['location'].message_type = _POINT +_ROUTENOTE.fields_by_name['location'].message_type = _POINT +DESCRIPTOR.message_types_by_name['Point'] = _POINT +DESCRIPTOR.message_types_by_name['Rectangle'] = _RECTANGLE +DESCRIPTOR.message_types_by_name['Feature'] = _FEATURE +DESCRIPTOR.message_types_by_name['RouteNote'] = _ROUTENOTE +DESCRIPTOR.message_types_by_name['RouteSummary'] = _ROUTESUMMARY +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +Point = _reflection.GeneratedProtocolMessageType('Point', (_message.Message,), dict( + DESCRIPTOR = _POINT, + __module__ = 'route_guide_pb2' + # @@protoc_insertion_point(class_scope:routeguide.Point) + )) +_sym_db.RegisterMessage(Point) + +Rectangle = _reflection.GeneratedProtocolMessageType('Rectangle', (_message.Message,), dict( + DESCRIPTOR = _RECTANGLE, + __module__ = 'route_guide_pb2' + # @@protoc_insertion_point(class_scope:routeguide.Rectangle) + )) +_sym_db.RegisterMessage(Rectangle) + +Feature = _reflection.GeneratedProtocolMessageType('Feature', (_message.Message,), dict( + DESCRIPTOR = _FEATURE, + __module__ = 'route_guide_pb2' + # @@protoc_insertion_point(class_scope:routeguide.Feature) + )) +_sym_db.RegisterMessage(Feature) + +RouteNote = _reflection.GeneratedProtocolMessageType('RouteNote', (_message.Message,), dict( + DESCRIPTOR = _ROUTENOTE, + __module__ = 'route_guide_pb2' + # @@protoc_insertion_point(class_scope:routeguide.RouteNote) + )) +_sym_db.RegisterMessage(RouteNote) + +RouteSummary = _reflection.GeneratedProtocolMessageType('RouteSummary', (_message.Message,), dict( + DESCRIPTOR = _ROUTESUMMARY, + __module__ = 'route_guide_pb2' + # @@protoc_insertion_point(class_scope:routeguide.RouteSummary) + )) +_sym_db.RegisterMessage(RouteSummary) + + +DESCRIPTOR.has_options = True +DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\033io.grpc.examples.routeguideB\017RouteGuideProtoP\001\242\002\003RTG')) + +_ROUTEGUIDE = _descriptor.ServiceDescriptor( + name='RouteGuide', + full_name='routeguide.RouteGuide', + file=DESCRIPTOR, + index=0, + options=None, + serialized_start=384, + serialized_end=645, + methods=[ + _descriptor.MethodDescriptor( + name='GetFeature', + full_name='routeguide.RouteGuide.GetFeature', + index=0, + containing_service=None, + input_type=_POINT, + output_type=_FEATURE, + options=None, + ), + _descriptor.MethodDescriptor( + name='ListFeatures', + full_name='routeguide.RouteGuide.ListFeatures', + index=1, + containing_service=None, + input_type=_RECTANGLE, + output_type=_FEATURE, + options=None, + ), + _descriptor.MethodDescriptor( + name='RecordRoute', + full_name='routeguide.RouteGuide.RecordRoute', + index=2, + containing_service=None, + input_type=_POINT, + output_type=_ROUTESUMMARY, + options=None, + ), + _descriptor.MethodDescriptor( + name='RouteChat', + full_name='routeguide.RouteGuide.RouteChat', + index=3, + containing_service=None, + input_type=_ROUTENOTE, + output_type=_ROUTENOTE, + options=None, + ), +]) +_sym_db.RegisterServiceDescriptor(_ROUTEGUIDE) + +DESCRIPTOR.services_by_name['RouteGuide'] = _ROUTEGUIDE + +# @@protoc_insertion_point(module_scope) diff --git a/examples/python/route_guide/route_guide_pb2_grpc.py b/examples/python/route_guide/route_guide_pb2_grpc.py new file mode 100644 index 00000000..05c1b793 --- /dev/null +++ b/examples/python/route_guide/route_guide_pb2_grpc.py @@ -0,0 +1,113 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +import grpc + +import route_guide_pb2 as route__guide__pb2 + + +class RouteGuideStub(object): + """Interface exported by the server. + """ + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.GetFeature = channel.unary_unary( + '/routeguide.RouteGuide/GetFeature', + request_serializer=route__guide__pb2.Point.SerializeToString, + response_deserializer=route__guide__pb2.Feature.FromString, + ) + self.ListFeatures = channel.unary_stream( + '/routeguide.RouteGuide/ListFeatures', + request_serializer=route__guide__pb2.Rectangle.SerializeToString, + response_deserializer=route__guide__pb2.Feature.FromString, + ) + self.RecordRoute = channel.stream_unary( + '/routeguide.RouteGuide/RecordRoute', + request_serializer=route__guide__pb2.Point.SerializeToString, + response_deserializer=route__guide__pb2.RouteSummary.FromString, + ) + self.RouteChat = channel.stream_stream( + '/routeguide.RouteGuide/RouteChat', + request_serializer=route__guide__pb2.RouteNote.SerializeToString, + response_deserializer=route__guide__pb2.RouteNote.FromString, + ) + + +class RouteGuideServicer(object): + """Interface exported by the server. + """ + + def GetFeature(self, request, context): + """A simple RPC. + + Obtains the feature at a given position. + + A feature with an empty name is returned if there's no feature at the given + position. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListFeatures(self, request, context): + """A server-to-client streaming RPC. + + Obtains the Features available within the given Rectangle. Results are + streamed rather than returned at once (e.g. in a response message with a + repeated field), as the rectangle may cover a large area and contain a + huge number of features. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def RecordRoute(self, request_iterator, context): + """A client-to-server streaming RPC. + + Accepts a stream of Points on a route being traversed, returning a + RouteSummary when traversal is completed. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def RouteChat(self, request_iterator, context): + """A Bidirectional streaming RPC. + + Accepts a stream of RouteNotes sent while a route is being traversed, + while receiving other RouteNotes (e.g. from other users). + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_RouteGuideServicer_to_server(servicer, server): + rpc_method_handlers = { + 'GetFeature': grpc.unary_unary_rpc_method_handler( + servicer.GetFeature, + request_deserializer=route__guide__pb2.Point.FromString, + response_serializer=route__guide__pb2.Feature.SerializeToString, + ), + 'ListFeatures': grpc.unary_stream_rpc_method_handler( + servicer.ListFeatures, + request_deserializer=route__guide__pb2.Rectangle.FromString, + response_serializer=route__guide__pb2.Feature.SerializeToString, + ), + 'RecordRoute': grpc.stream_unary_rpc_method_handler( + servicer.RecordRoute, + request_deserializer=route__guide__pb2.Point.FromString, + response_serializer=route__guide__pb2.RouteSummary.SerializeToString, + ), + 'RouteChat': grpc.stream_stream_rpc_method_handler( + servicer.RouteChat, + request_deserializer=route__guide__pb2.RouteNote.FromString, + response_serializer=route__guide__pb2.RouteNote.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'routeguide.RouteGuide', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) diff --git a/examples/python/route_guide/route_guide_resources.py b/examples/python/route_guide/route_guide_resources.py new file mode 100644 index 00000000..ace85d6f --- /dev/null +++ b/examples/python/route_guide/route_guide_resources.py @@ -0,0 +1,37 @@ +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Common resources used in the gRPC route guide example.""" + +import json + +import route_guide_pb2 + + +def read_route_guide_database(): + """Reads the route guide database. + + Returns: + The full contents of the route guide database as a sequence of + route_guide_pb2.Features. + """ + feature_list = [] + with open("route_guide_db.json") as route_guide_db_file: + for item in json.load(route_guide_db_file): + feature = route_guide_pb2.Feature( + name=item["name"], + location=route_guide_pb2.Point( + latitude=item["location"]["latitude"], + longitude=item["location"]["longitude"])) + feature_list.append(feature) + return feature_list diff --git a/examples/python/route_guide/route_guide_server.py b/examples/python/route_guide/route_guide_server.py new file mode 100644 index 00000000..ab6b63e4 --- /dev/null +++ b/examples/python/route_guide/route_guide_server.py @@ -0,0 +1,124 @@ +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""The Python implementation of the gRPC route guide server.""" + +from concurrent import futures +import time +import math +import logging + +import grpc + +import route_guide_pb2 +import route_guide_pb2_grpc +import route_guide_resources + + +def get_feature(feature_db, point): + """Returns Feature at given location or None.""" + for feature in feature_db: + if feature.location == point: + return feature + return None + + +def get_distance(start, end): + """Distance between two points.""" + coord_factor = 10000000.0 + lat_1 = start.latitude / coord_factor + lat_2 = end.latitude / coord_factor + lon_1 = start.longitude / coord_factor + lon_2 = end.longitude / coord_factor + lat_rad_1 = math.radians(lat_1) + lat_rad_2 = math.radians(lat_2) + delta_lat_rad = math.radians(lat_2 - lat_1) + delta_lon_rad = math.radians(lon_2 - lon_1) + + # Formula is based on http://mathforum.org/library/drmath/view/51879.html + a = (pow(math.sin(delta_lat_rad / 2), 2) + + (math.cos(lat_rad_1) * math.cos(lat_rad_2) * + pow(math.sin(delta_lon_rad / 2), 2))) + c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a)) + R = 6371000 + # metres + return R * c + + +class RouteGuideServicer(route_guide_pb2_grpc.RouteGuideServicer): + """Provides methods that implement functionality of route guide server.""" + + def __init__(self): + self.db = route_guide_resources.read_route_guide_database() + + def GetFeature(self, request, context): + feature = get_feature(self.db, request) + if feature is None: + return route_guide_pb2.Feature(name="", location=request) + else: + return feature + + def ListFeatures(self, request, context): + left = min(request.lo.longitude, request.hi.longitude) + right = max(request.lo.longitude, request.hi.longitude) + top = max(request.lo.latitude, request.hi.latitude) + bottom = min(request.lo.latitude, request.hi.latitude) + for feature in self.db: + if (feature.location.longitude >= left and + feature.location.longitude <= right and + feature.location.latitude >= bottom and + feature.location.latitude <= top): + yield feature + + def RecordRoute(self, request_iterator, context): + point_count = 0 + feature_count = 0 + distance = 0.0 + prev_point = None + + start_time = time.time() + for point in request_iterator: + point_count += 1 + if get_feature(self.db, point): + feature_count += 1 + if prev_point: + distance += get_distance(prev_point, point) + prev_point = point + + elapsed_time = time.time() - start_time + return route_guide_pb2.RouteSummary(point_count=point_count, + feature_count=feature_count, + distance=int(distance), + elapsed_time=int(elapsed_time)) + + def RouteChat(self, request_iterator, context): + prev_notes = [] + for new_note in request_iterator: + for prev_note in prev_notes: + if prev_note.location == new_note.location: + yield prev_note + prev_notes.append(new_note) + + +def serve(): + server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) + route_guide_pb2_grpc.add_RouteGuideServicer_to_server( + RouteGuideServicer(), server) + server.add_insecure_port('[::]:50051') + server.start() + server.wait_for_termination() + + +if __name__ == '__main__': + logging.basicConfig() + serve() diff --git a/examples/python/route_guide/run_codegen.py b/examples/python/route_guide/run_codegen.py new file mode 100644 index 00000000..8df562d3 --- /dev/null +++ b/examples/python/route_guide/run_codegen.py @@ -0,0 +1,24 @@ +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Runs protoc with the gRPC plugin to generate messages and gRPC stubs.""" + +from grpc_tools import protoc + +protoc.main(( + '', + '-I../../protos', + '--python_out=.', + '--grpc_python_out=.', + '../../protos/route_guide.proto', +)) diff --git a/examples/python/wait_for_ready/BUILD.bazel b/examples/python/wait_for_ready/BUILD.bazel new file mode 100644 index 00000000..0892b367 --- /dev/null +++ b/examples/python/wait_for_ready/BUILD.bazel @@ -0,0 +1,34 @@ +# Copyright 2019 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("@grpc_python_dependencies//:requirements.bzl", "requirement") + +py_library( + name = "wait_for_ready_example", + testonly = 1, + srcs = ["wait_for_ready_example.py"], + deps = [ + "//examples:helloworld_py_pb2", + "//examples:helloworld_py_pb2_grpc", + "//src/python/grpcio/grpc:grpcio", + ], +) + +py_test( + name = "test/_wait_for_ready_example_test", + size = "small", + srcs = ["test/_wait_for_ready_example_test.py"], + python_version = "PY3", + deps = [":wait_for_ready_example"], +) diff --git a/examples/python/wait_for_ready/README.md b/examples/python/wait_for_ready/README.md new file mode 100644 index 00000000..6e873d22 --- /dev/null +++ b/examples/python/wait_for_ready/README.md @@ -0,0 +1,32 @@ +# gRPC Python Example for Wait-for-ready + +The default behavior of an RPC is to fail instantly if the server is not ready yet. This example demonstrates how to change that behavior. + + +### Definition of 'wait-for-ready' semantics +> If an RPC is issued but the channel is in TRANSIENT_FAILURE or SHUTDOWN states, the RPC is unable to be transmitted promptly. By default, gRPC implementations SHOULD fail such RPCs immediately. This is known as "fail fast," but the usage of the term is historical. RPCs SHOULD NOT fail as a result of the channel being in other states (CONNECTING, READY, or IDLE). +> +> gRPC implementations MAY provide a per-RPC option to not fail RPCs as a result of the channel being in TRANSIENT_FAILURE state. Instead, the implementation queues the RPCs until the channel is READY. This is known as "wait for ready." The RPCs SHOULD still fail before READY if there are unrelated reasons, such as the channel is SHUTDOWN or the RPC's deadline is reached. +> +> From https://github.com/grpc/grpc/blob/master/doc/wait-for-ready.md + + +### Use cases for 'wait-for-ready' + +When developers spin up gRPC clients and servers at the same time, it is very like to fail first couple RPC calls due to unavailability of the server. If developers failed to prepare for this situation, the result can be catastrophic. But with 'wait-for-ready' semantics, developers can initialize the client and server in any order, especially useful in testing. + +Also, developers may ensure the server is up before starting client. But in some cases like transient network failure may result in a temporary unavailability of the server. With 'wait-for-ready' semantics, those RPC calls will automatically wait until the server is ready to accept incoming requests. + + +### DEMO Snippets + +```Python +# Per RPC level +stub = ...Stub(...) + +stub.important_transaction_1(..., wait_for_ready=True) +stub.unimportant_transaction_2(...) +stub.important_transaction_3(..., wait_for_ready=True) +stub.unimportant_transaction_4(...) +# The unimportant transactions can be status report, or health check, etc. +``` diff --git a/examples/python/wait_for_ready/test/_wait_for_ready_example_test.py b/examples/python/wait_for_ready/test/_wait_for_ready_example_test.py new file mode 100644 index 00000000..03e83a12 --- /dev/null +++ b/examples/python/wait_for_ready/test/_wait_for_ready_example_test.py @@ -0,0 +1,31 @@ +# Copyright 2019 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Tests of the wait-for-ready example.""" + +import unittest +import logging + +from examples.python.wait_for_ready import wait_for_ready_example + + +class WaitForReadyExampleTest(unittest.TestCase): + + def test_wait_for_ready_example(self): + wait_for_ready_example.main() + # No unhandled exception raised, no deadlock, test passed! + + +if __name__ == '__main__': + logging.basicConfig() + unittest.main(verbosity=2) diff --git a/examples/python/wait_for_ready/wait_for_ready_example.py b/examples/python/wait_for_ready/wait_for_ready_example.py new file mode 100644 index 00000000..db2aeaf6 --- /dev/null +++ b/examples/python/wait_for_ready/wait_for_ready_example.py @@ -0,0 +1,114 @@ +# Copyright 2019 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""The Python example of utilizing wait-for-ready flag.""" + +from __future__ import print_function +import logging +from concurrent import futures +from contextlib import contextmanager +import socket +import threading + +import grpc + +from examples import helloworld_pb2 +from examples import helloworld_pb2_grpc + +_LOGGER = logging.getLogger(__name__) +_LOGGER.setLevel(logging.INFO) + + +@contextmanager +def get_free_loopback_tcp_port(): + if socket.has_ipv6: + tcp_socket = socket.socket(socket.AF_INET6) + else: + tcp_socket = socket.socket(socket.AF_INET) + tcp_socket.bind(('', 0)) + address_tuple = tcp_socket.getsockname() + yield "localhost:%s" % (address_tuple[1]) + tcp_socket.close() + + +class Greeter(helloworld_pb2_grpc.GreeterServicer): + + def SayHello(self, request, unused_context): + return helloworld_pb2.HelloReply(message='Hello, %s!' % request.name) + + +def create_server(server_address): + server = grpc.server(futures.ThreadPoolExecutor()) + helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server) + bound_port = server.add_insecure_port(server_address) + assert bound_port == int(server_address.split(':')[-1]) + return server + + +def process(stub, wait_for_ready=None): + try: + response = stub.SayHello(helloworld_pb2.HelloRequest(name='you'), + wait_for_ready=wait_for_ready) + message = response.message + except grpc.RpcError as rpc_error: + assert rpc_error.code() == grpc.StatusCode.UNAVAILABLE + assert not wait_for_ready + message = rpc_error + else: + assert wait_for_ready + _LOGGER.info("Wait-for-ready %s, client received: %s", + "enabled" if wait_for_ready else "disabled", message) + + +def main(): + # Pick a random free port + with get_free_loopback_tcp_port() as server_address: + + # Register connectivity event to notify main thread + transient_failure_event = threading.Event() + + def wait_for_transient_failure(channel_connectivity): + if channel_connectivity == grpc.ChannelConnectivity.TRANSIENT_FAILURE: + transient_failure_event.set() + + # Create gRPC channel + channel = grpc.insecure_channel(server_address) + channel.subscribe(wait_for_transient_failure) + stub = helloworld_pb2_grpc.GreeterStub(channel) + + # Fire an RPC without wait_for_ready + thread_disabled_wait_for_ready = threading.Thread(target=process, + args=(stub, False)) + thread_disabled_wait_for_ready.start() + # Fire an RPC with wait_for_ready + thread_enabled_wait_for_ready = threading.Thread(target=process, + args=(stub, True)) + thread_enabled_wait_for_ready.start() + + # Wait for the channel entering TRANSIENT FAILURE state. + transient_failure_event.wait() + server = create_server(server_address) + server.start() + + # Expected to fail with StatusCode.UNAVAILABLE. + thread_disabled_wait_for_ready.join() + # Expected to success. + thread_enabled_wait_for_ready.join() + + server.stop(None) + channel.close() + + +if __name__ == '__main__': + logging.basicConfig(level=logging.INFO) + main() diff --git a/examples/python/xds/README.md b/examples/python/xds/README.md new file mode 100644 index 00000000..cd9587a4 --- /dev/null +++ b/examples/python/xds/README.md @@ -0,0 +1,103 @@ +gRPC Hostname Example +===================== + +The hostname example is a Hello World server whose response includes its +hostname. It also supports health and reflection services. This makes it a good +server to test infrastructure, like load balancing. This example depends on a +gRPC version of 1.28.1 or newer. + +### Run the Server + +1. Navigate to this directory: + +```sh +cd grpc/examples/python/xds +``` + +2. Run the server + +```sh +virtualenv venv -p python3 +source venv/bin/activate +pip install -r requirements.txt +python server.py +``` + +### Run the Client + +1. Set up xDS configuration. + +After configuring your xDS server to track the gRPC server we just started, +create a bootstrap file as desribed in [gRFC A27](https://github.com/grpc/proposal/blob/master/A27-xds-global-load-balancing.md): + +``` +{ + xds_servers": [ + { + "server_uri": , + "channel_creds": [ + { + "type": , + "config": + } + ] + } + ], + "node": +} +``` + +2. Point the `GRPC_XDS_BOOTSTRAP` environment variable at the bootstrap file: + +``` +export GRPC_XDS_BOOTSTRAP=/etc/xds-bootstrap.json +``` + +3. Run the client: + +``` +python client.py xds-experimental:///my-backend +``` + +### Verifying Configuration with a CLI Tool + +Alternatively, `grpcurl` can be used to verify your server. If you don't have it, +install [`grpcurl`](https://github.com/fullstorydev/grpcurl/releases). This will allow +you to manually test the service. + +Be sure to set up the bootstrap file and `GRPC_XDS_BOOTSTRAP` as in the previous +section. + +1. Verify the server's application-layer service: + +```sh +> grpcurl --plaintext -d '{"name": "you"}' localhost:50051 +{ + "message": "Hello you from rbell.svl.corp.google.com!" +} +``` + +2. Verify that all services are available via reflection: + +```sh +> grpcurl --plaintext localhost:50051 list +grpc.health.v1.Health +grpc.reflection.v1alpha.ServerReflection +helloworld.Greeter +``` + +3. Verify that all services are reporting healthy: + +```sh +> grpcurl --plaintext -d '{"service": "helloworld.Greeter"}' localhost:50051 +grpc.health.v1.Health/Check +{ + "status": "SERVING" +} + +> grpcurl --plaintext -d '{"service": ""}' localhost:50051 +grpc.health.v1.Health/Check +{ + "status": "SERVING" +} +``` diff --git a/examples/python/xds/client.py b/examples/python/xds/client.py new file mode 100644 index 00000000..ee300265 --- /dev/null +++ b/examples/python/xds/client.py @@ -0,0 +1,42 @@ +# Copyright 2020 The gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""The Python implementation of the GRPC helloworld.Greeter client.""" + +from __future__ import print_function +import logging +import argparse + +import grpc + +import helloworld_pb2 +import helloworld_pb2_grpc + +_DESCRIPTION = "Get a greeting from a server." + + +def run(server_address): + with grpc.insecure_channel(server_address) as channel: + stub = helloworld_pb2_grpc.GreeterStub(channel) + response = stub.SayHello(helloworld_pb2.HelloRequest(name='you')) + print("Greeter client received: " + response.message) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description=_DESCRIPTION) + parser.add_argument("server", + default=None, + help="The address of the server.") + args = parser.parse_args() + logging.basicConfig() + run(args.server) diff --git a/examples/python/xds/helloworld_pb2.py b/examples/python/xds/helloworld_pb2.py new file mode 100644 index 00000000..e18ab9ac --- /dev/null +++ b/examples/python/xds/helloworld_pb2.py @@ -0,0 +1,134 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: helloworld.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +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='helloworld.proto', + package='helloworld', + syntax='proto3', + serialized_pb=_b('\n\x10helloworld.proto\x12\nhelloworld\"\x1c\n\x0cHelloRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"\x1d\n\nHelloReply\x12\x0f\n\x07message\x18\x01 \x01(\t2I\n\x07Greeter\x12>\n\x08SayHello\x12\x18.helloworld.HelloRequest\x1a\x16.helloworld.HelloReply\"\x00\x42\x36\n\x1bio.grpc.examples.helloworldB\x0fHelloWorldProtoP\x01\xa2\x02\x03HLWb\x06proto3') +) + + + + +_HELLOREQUEST = _descriptor.Descriptor( + name='HelloRequest', + full_name='helloworld.HelloRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='helloworld.HelloRequest.name', index=0, + number=1, 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=32, + serialized_end=60, +) + + +_HELLOREPLY = _descriptor.Descriptor( + name='HelloReply', + full_name='helloworld.HelloReply', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='message', full_name='helloworld.HelloReply.message', index=0, + number=1, 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=62, + serialized_end=91, +) + +DESCRIPTOR.message_types_by_name['HelloRequest'] = _HELLOREQUEST +DESCRIPTOR.message_types_by_name['HelloReply'] = _HELLOREPLY +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +HelloRequest = _reflection.GeneratedProtocolMessageType('HelloRequest', (_message.Message,), dict( + DESCRIPTOR = _HELLOREQUEST, + __module__ = 'helloworld_pb2' + # @@protoc_insertion_point(class_scope:helloworld.HelloRequest) + )) +_sym_db.RegisterMessage(HelloRequest) + +HelloReply = _reflection.GeneratedProtocolMessageType('HelloReply', (_message.Message,), dict( + DESCRIPTOR = _HELLOREPLY, + __module__ = 'helloworld_pb2' + # @@protoc_insertion_point(class_scope:helloworld.HelloReply) + )) +_sym_db.RegisterMessage(HelloReply) + + +DESCRIPTOR.has_options = True +DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\033io.grpc.examples.helloworldB\017HelloWorldProtoP\001\242\002\003HLW')) + +_GREETER = _descriptor.ServiceDescriptor( + name='Greeter', + full_name='helloworld.Greeter', + file=DESCRIPTOR, + index=0, + options=None, + serialized_start=93, + serialized_end=166, + methods=[ + _descriptor.MethodDescriptor( + name='SayHello', + full_name='helloworld.Greeter.SayHello', + index=0, + containing_service=None, + input_type=_HELLOREQUEST, + output_type=_HELLOREPLY, + options=None, + ), +]) +_sym_db.RegisterServiceDescriptor(_GREETER) + +DESCRIPTOR.services_by_name['Greeter'] = _GREETER + +# @@protoc_insertion_point(module_scope) diff --git a/examples/python/xds/helloworld_pb2_grpc.py b/examples/python/xds/helloworld_pb2_grpc.py new file mode 100644 index 00000000..18e07d16 --- /dev/null +++ b/examples/python/xds/helloworld_pb2_grpc.py @@ -0,0 +1,46 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +import grpc + +import helloworld_pb2 as helloworld__pb2 + + +class GreeterStub(object): + """The greeting service definition. + """ + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.SayHello = channel.unary_unary( + '/helloworld.Greeter/SayHello', + request_serializer=helloworld__pb2.HelloRequest.SerializeToString, + response_deserializer=helloworld__pb2.HelloReply.FromString, + ) + + +class GreeterServicer(object): + """The greeting service definition. + """ + + def SayHello(self, request, context): + """Sends a greeting + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_GreeterServicer_to_server(servicer, server): + rpc_method_handlers = { + 'SayHello': grpc.unary_unary_rpc_method_handler( + servicer.SayHello, + request_deserializer=helloworld__pb2.HelloRequest.FromString, + response_serializer=helloworld__pb2.HelloReply.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'helloworld.Greeter', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) diff --git a/examples/python/xds/requirements.txt b/examples/python/xds/requirements.txt new file mode 100644 index 00000000..7ba651e3 --- /dev/null +++ b/examples/python/xds/requirements.txt @@ -0,0 +1,5 @@ +grpcio>=1.28.1 +protobuf +grpcio-reflection +grpcio-health-checking + diff --git a/examples/python/xds/server.py b/examples/python/xds/server.py new file mode 100644 index 00000000..75043857 --- /dev/null +++ b/examples/python/xds/server.py @@ -0,0 +1,94 @@ +# Copyright 2020 The gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""The Python implementation of the GRPC helloworld.Greeter server.""" + +from concurrent import futures +import argparse +import logging +import multiprocessing +import socket + +import grpc + +import helloworld_pb2 +import helloworld_pb2_grpc + +from grpc_reflection.v1alpha import reflection +from grpc_health.v1 import health +from grpc_health.v1 import health_pb2 +from grpc_health.v1 import health_pb2_grpc + +_DESCRIPTION = "A general purpose dummy server." + + +class Greeter(helloworld_pb2_grpc.GreeterServicer): + + def __init__(self, hostname: str): + self._hostname = hostname if hostname else socket.gethostname() + + def SayHello(self, request: helloworld_pb2.HelloRequest, + context: grpc.ServicerContext) -> helloworld_pb2.HelloReply: + return helloworld_pb2.HelloReply( + message=f"Hello {request.name} from {self._hostname}!") + + +def serve(port: int, hostname: str): + server = grpc.server( + futures.ThreadPoolExecutor(max_workers=multiprocessing.cpu_count())) + + # Add the application servicer to the server. + helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(hostname), server) + + # Create a health check servicer. We use the non-blocking implementation + # to avoid thread starvation. + health_servicer = health.HealthServicer( + experimental_non_blocking=True, + experimental_thread_pool=futures.ThreadPoolExecutor(max_workers=1)) + health_pb2_grpc.add_HealthServicer_to_server(health_servicer, server) + + # Create a tuple of all of the services we want to export via reflection. + services = tuple( + service.full_name + for service in helloworld_pb2.DESCRIPTOR.services_by_name.values()) + ( + reflection.SERVICE_NAME, health.SERVICE_NAME) + + # Add the reflection service to the server. + reflection.enable_server_reflection(services, server) + server.add_insecure_port(f"[::]:{port}") + server.start() + + # Mark all services as healthy. + overall_server_health = "" + for service in services + (overall_server_health,): + health_servicer.set(service, health_pb2.HealthCheckResponse.SERVING) + + # Park the main application thread. + server.wait_for_termination() + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description=_DESCRIPTION) + parser.add_argument("port", + default=50051, + type=int, + nargs="?", + help="The port on which to listen.") + parser.add_argument("hostname", + type=str, + default=None, + nargs="?", + help="The name clients will see in responses.") + args = parser.parse_args() + logging.basicConfig() + serve(args.port, args.hostname) diff --git a/examples/ruby/.gitignore b/examples/ruby/.gitignore new file mode 100644 index 00000000..62fcb4fa --- /dev/null +++ b/examples/ruby/.gitignore @@ -0,0 +1,15 @@ +/.bundle/ +/.yardoc +/Gemfile.lock +/_yardoc/ +/coverage/ +/doc/ +/pkg/ +/spec/reports/ +/tmp/ +*.bundle +*.so +*.o +*.a +mkmf.log +vendor diff --git a/examples/ruby/Gemfile b/examples/ruby/Gemfile new file mode 100644 index 00000000..e75f0f61 --- /dev/null +++ b/examples/ruby/Gemfile @@ -0,0 +1,6 @@ +# -*- ruby -*- +# encoding: utf-8 + +source 'https://rubygems.org/' + +gemspec diff --git a/examples/ruby/README.md b/examples/ruby/README.md new file mode 100644 index 00000000..c6af1a5a --- /dev/null +++ b/examples/ruby/README.md @@ -0,0 +1,63 @@ +gRPC in 3 minutes (Ruby) +======================== + +BACKGROUND +------------- +For this sample, we've already generated the server and client stubs from [helloworld.proto][] + +PREREQUISITES +------------- + +- Ruby 2.x +This requires Ruby 2.x, as the gRPC API surface uses keyword args. +If you don't have that installed locally, you can use [RVM][] to use Ruby 2.x for testing without upgrading the version of Ruby on your whole system. +RVM is also useful if you don't have the necessary privileges to update your system's Ruby. + + ```sh + $ # RVM installation as specified at https://rvm.io/rvm/install + $ gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 + $ \curl -sSL https://get.rvm.io | bash -s stable --ruby=ruby-2 + $ + $ # follow the instructions to ensure that your're using the latest stable version of Ruby + $ # and that the rvm command is installed + ``` +- *N.B* Make sure your run `source $HOME/.rvm/scripts/rvm` as instructed to complete the set-up of RVM. + +INSTALL +------- +- [Install gRPC Ruby][] + +- Use bundler to install the example package's dependencies + + ```sh + $ # from this directory + $ gem install bundler # if you don't already have bundler available + $ bundle install + ``` + +Try it! +------- + +- Run the server + + ```sh + $ # from this directory + $ bundle exec ./greeter_server.rb & + ``` + +- Run the client + + ```sh + $ # from this directory + $ bundle exec ./greeter_client.rb + ``` + +Tutorial +-------- + +You can find a more detailed tutorial in [gRPC Basics: Ruby][] + +[helloworld.proto]:../protos/helloworld.proto +[RVM]:https://www.rvm.io/ +[Install gRPC ruby]:../../src/ruby#installation +[gRPC Basics: Ruby]:https://grpc.io/docs/tutorials/basic/ruby.html diff --git a/examples/ruby/errors_and_cancellation/README.md b/examples/ruby/errors_and_cancellation/README.md new file mode 100644 index 00000000..661bd847 --- /dev/null +++ b/examples/ruby/errors_and_cancellation/README.md @@ -0,0 +1,25 @@ +# Errors and Cancelletion code samples for grpc-ruby + +The examples in this directory show use of grpc errors. + +On the server side, errors are returned from service +implementations by raising a certain `GRPC::BadStatus` exception. + +On the client side, GRPC errors get raised when either: + * the call completes (unary and client-streaming call types) + * the response `Enumerable` is iterated through (server-streaming and + bidi call types). + +## To run the examples here: + +Start the server: + +``` +> ruby error_examples_server.rb +``` + +Then run the client: + +``` +> ruby error_examples_client.rb +``` diff --git a/examples/ruby/errors_and_cancellation/error_examples_client.rb b/examples/ruby/errors_and_cancellation/error_examples_client.rb new file mode 100755 index 00000000..49b4a4f8 --- /dev/null +++ b/examples/ruby/errors_and_cancellation/error_examples_client.rb @@ -0,0 +1,102 @@ +#!/usr/bin/env ruby + +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Sample app that connects to an error-throwing implementation of +# Route Guide service. +# +# Usage: $ path/to/route_guide_client.rb + +this_dir = File.expand_path(File.dirname(__FILE__)) +lib_dir = File.join(File.dirname(this_dir), 'lib') +$LOAD_PATH.unshift(lib_dir) unless $LOAD_PATH.include?(lib_dir) + +require 'grpc' +require 'route_guide_services_pb' + +include Routeguide + +def run_get_feature_expect_error(stub) + resp = stub.get_feature(Point.new) +end + +def run_list_features_expect_error(stub) + resps = stub.list_features(Rectangle.new) + + # NOOP iteration to pick up error + resps.each { } +end + +def run_record_route_expect_error(stub) + stub.record_route([]) +end + +def run_route_chat_expect_error(stub) + resps = stub.route_chat([]) + + # NOOP iteration to pick up error + resps.each { } +end + +def main + stub = RouteGuide::Stub.new('localhost:50051', :this_channel_is_insecure) + + begin + run_get_feature_expect_error(stub) + rescue GRPC::BadStatus => e + puts "===== GetFeature exception: =====" + puts e.inspect + puts "e.code: #{e.code}" + puts "e.details: #{e.details}" + puts "e.metadata: #{e.metadata}" + puts "=================================" + end + + begin + run_list_features_expect_error(stub) + rescue GRPC::BadStatus => e + error = true + puts "===== ListFeatures exception: =====" + puts e.inspect + puts "e.code: #{e.code}" + puts "e.details: #{e.details}" + puts "e.metadata: #{e.metadata}" + puts "=================================" + end + + begin + run_route_chat_expect_error(stub) + rescue GRPC::BadStatus => e + puts "==== RouteChat exception: ====" + puts e.inspect + puts "e.code: #{e.code}" + puts "e.details: #{e.details}" + puts "e.metadata: #{e.metadata}" + puts "=================================" + end + + begin + run_record_route_expect_error(stub) + rescue GRPC::BadStatus => e + puts "==== RecordRoute exception: ====" + puts e.inspect + puts "e.code: #{e.code}" + puts "e.details: #{e.details}" + puts "e.metadata: #{e.metadata}" + puts "=================================" + end +end + +main diff --git a/examples/ruby/errors_and_cancellation/error_examples_server.rb b/examples/ruby/errors_and_cancellation/error_examples_server.rb new file mode 100755 index 00000000..29a2e1ad --- /dev/null +++ b/examples/ruby/errors_and_cancellation/error_examples_server.rb @@ -0,0 +1,61 @@ +#!/usr/bin/env ruby +# -*- coding: utf-8 -*- + +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Error-throwing implementation of Route Guide service. +# +# Usage: $ path/to/route_guide_server.rb + +this_dir = File.expand_path(File.dirname(__FILE__)) +lib_dir = File.join(File.dirname(this_dir), 'lib') +$LOAD_PATH.unshift(lib_dir) unless $LOAD_PATH.include?(lib_dir) + +require 'grpc' +require 'route_guide_services_pb' + +include Routeguide + +include GRPC::Core::StatusCodes + +# CanellingandErrorReturningServiceImpl provides an implementation of the RouteGuide service. +class CancellingAndErrorReturningServerImpl < RouteGuide::Service + # def get_feature + # Note get_feature isn't implemented in this subclass, so the server + # will get a gRPC UNIMPLEMENTED error when it's called. + + def list_features(rectangle, _call) + raise "string appears on the client in the 'details' field of a 'GRPC::Unknown' exception" + end + + def record_route(call) + raise GRPC::BadStatus.new_status_exception(CANCELLED) + end + + def route_chat(notes) + raise GRPC::BadStatus.new_status_exception(ABORTED, details = 'arbitrary', metadata = {somekey: 'val'}) + end +end + +def main + port = '0.0.0.0:50051' + s = GRPC::RpcServer.new + s.add_http2_port(port, :this_port_is_insecure) + GRPC.logger.info("... running insecurely on #{port}") + s.handle(CancellingAndErrorReturningServerImpl.new) + s.run_till_terminated +end + +main diff --git a/examples/ruby/greeter_client.rb b/examples/ruby/greeter_client.rb new file mode 100755 index 00000000..33a2e795 --- /dev/null +++ b/examples/ruby/greeter_client.rb @@ -0,0 +1,40 @@ +#!/usr/bin/env ruby + +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Sample app that connects to a Greeter service. +# +# Usage: $ path/to/greeter_client.rb + +this_dir = File.expand_path(File.dirname(__FILE__)) +lib_dir = File.join(this_dir, 'lib') +$LOAD_PATH.unshift(lib_dir) unless $LOAD_PATH.include?(lib_dir) + +require 'grpc' +require 'helloworld_services_pb' + +def main + user = ARGV.size > 0 ? ARGV[0] : 'world' + hostname = ARGV.size > 1 ? ARGV[1] : 'localhost:50051' + stub = Helloworld::Greeter::Stub.new(hostname, :this_channel_is_insecure) + begin + message = stub.say_hello(Helloworld::HelloRequest.new(name: user)).message + p "Greeting: #{message}" + rescue GRPC::BadStatus => e + abort "ERROR: #{e.message}" + end +end + +main diff --git a/examples/ruby/greeter_server.rb b/examples/ruby/greeter_server.rb new file mode 100755 index 00000000..52904297 --- /dev/null +++ b/examples/ruby/greeter_server.rb @@ -0,0 +1,48 @@ +#!/usr/bin/env ruby + +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Sample gRPC server that implements the Greeter::Helloworld service. +# +# Usage: $ path/to/greeter_server.rb + +this_dir = File.expand_path(File.dirname(__FILE__)) +lib_dir = File.join(this_dir, 'lib') +$LOAD_PATH.unshift(lib_dir) unless $LOAD_PATH.include?(lib_dir) + +require 'grpc' +require 'helloworld_services_pb' + +# GreeterServer is simple server that implements the Helloworld Greeter server. +class GreeterServer < Helloworld::Greeter::Service + # say_hello implements the SayHello rpc method. + def say_hello(hello_req, _unused_call) + Helloworld::HelloReply.new(message: "Hello #{hello_req.name}") + end +end + +# main starts an RpcServer that receives requests to GreeterServer at the sample +# server port. +def main + s = GRPC::RpcServer.new + s.add_http2_port('0.0.0.0:50051', :this_port_is_insecure) + s.handle(GreeterServer) + # Runs the server with SIGHUP, SIGINT and SIGQUIT signal handlers to + # gracefully shutdown. + # User could also choose to run server via call to run_till_terminated + s.run_till_terminated_or_interrupted([1, 'int', 'SIGQUIT']) +end + +main diff --git a/examples/ruby/grpc-demo.gemspec b/examples/ruby/grpc-demo.gemspec new file mode 100644 index 00000000..703d391f --- /dev/null +++ b/examples/ruby/grpc-demo.gemspec @@ -0,0 +1,23 @@ +# -*- ruby -*- +# encoding: utf-8 + +Gem::Specification.new do |s| + s.name = 'grpc-demo' + s.version = '1.0.0' + s.authors = ['gRPC Authors'] + s.email = 'temiola@google.com' + s.homepage = 'https://github.com/grpc/grpc' + s.summary = 'gRPC Ruby overview sample' + s.description = 'Simple demo of using gRPC from Ruby' + + s.files = `git ls-files -- ruby/*`.split("\n") + s.executables = `git ls-files -- ruby/greeter*.rb ruby/route_guide/*.rb`.split("\n").map do |f| + File.basename(f) + end + s.require_paths = ['lib'] + s.platform = Gem::Platform::RUBY + + s.add_dependency 'grpc', '~> 1.0' + s.add_dependency 'multi_json', '~> 1.13.1' + s.add_development_dependency 'bundler', '>= 1.9' +end diff --git a/examples/ruby/lib/helloworld_pb.rb b/examples/ruby/lib/helloworld_pb.rb new file mode 100644 index 00000000..82bdd78e --- /dev/null +++ b/examples/ruby/lib/helloworld_pb.rb @@ -0,0 +1,18 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: helloworld.proto + +require 'google/protobuf' + +Google::Protobuf::DescriptorPool.generated_pool.build do + add_message "helloworld.HelloRequest" do + optional :name, :string, 1 + end + add_message "helloworld.HelloReply" do + optional :message, :string, 1 + end +end + +module Helloworld + HelloRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("helloworld.HelloRequest").msgclass + HelloReply = Google::Protobuf::DescriptorPool.generated_pool.lookup("helloworld.HelloReply").msgclass +end diff --git a/examples/ruby/lib/helloworld_services_pb.rb b/examples/ruby/lib/helloworld_services_pb.rb new file mode 100644 index 00000000..4f933e24 --- /dev/null +++ b/examples/ruby/lib/helloworld_services_pb.rb @@ -0,0 +1,39 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# Source: helloworld.proto for package 'helloworld' +# Original file comments: +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +require 'grpc' +require 'helloworld_pb' + +module Helloworld + module Greeter + # The greeting service definition. + class Service + + include GRPC::GenericService + + self.marshal_class_method = :encode + self.unmarshal_class_method = :decode + self.service_name = 'helloworld.Greeter' + + # Sends a greeting + rpc :SayHello, HelloRequest, HelloReply + end + + Stub = Service.rpc_stub_class + end +end diff --git a/examples/ruby/lib/route_guide_pb.rb b/examples/ruby/lib/route_guide_pb.rb new file mode 100644 index 00000000..424395c4 --- /dev/null +++ b/examples/ruby/lib/route_guide_pb.rb @@ -0,0 +1,37 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: route_guide.proto + +require 'google/protobuf' + +Google::Protobuf::DescriptorPool.generated_pool.build do + add_message "routeguide.Point" do + optional :latitude, :int32, 1 + optional :longitude, :int32, 2 + end + add_message "routeguide.Rectangle" do + optional :lo, :message, 1, "routeguide.Point" + optional :hi, :message, 2, "routeguide.Point" + end + add_message "routeguide.Feature" do + optional :name, :string, 1 + optional :location, :message, 2, "routeguide.Point" + end + add_message "routeguide.RouteNote" do + optional :location, :message, 1, "routeguide.Point" + optional :message, :string, 2 + end + add_message "routeguide.RouteSummary" do + optional :point_count, :int32, 1 + optional :feature_count, :int32, 2 + optional :distance, :int32, 3 + optional :elapsed_time, :int32, 4 + end +end + +module Routeguide + Point = Google::Protobuf::DescriptorPool.generated_pool.lookup("routeguide.Point").msgclass + Rectangle = Google::Protobuf::DescriptorPool.generated_pool.lookup("routeguide.Rectangle").msgclass + Feature = Google::Protobuf::DescriptorPool.generated_pool.lookup("routeguide.Feature").msgclass + RouteNote = Google::Protobuf::DescriptorPool.generated_pool.lookup("routeguide.RouteNote").msgclass + RouteSummary = Google::Protobuf::DescriptorPool.generated_pool.lookup("routeguide.RouteSummary").msgclass +end diff --git a/examples/ruby/lib/route_guide_services_pb.rb b/examples/ruby/lib/route_guide_services_pb.rb new file mode 100644 index 00000000..cc36d397 --- /dev/null +++ b/examples/ruby/lib/route_guide_services_pb.rb @@ -0,0 +1,61 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# Source: route_guide.proto for package 'routeguide' +# Original file comments: +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +require 'grpc' +require 'route_guide_pb' + +module Routeguide + module RouteGuide + # Interface exported by the server. + class Service + + include GRPC::GenericService + + self.marshal_class_method = :encode + self.unmarshal_class_method = :decode + self.service_name = 'routeguide.RouteGuide' + + # A simple RPC. + # + # Obtains the feature at a given position. + # + # A feature with an empty name is returned if there's no feature at the given + # position. + rpc :GetFeature, Point, Feature + # A server-to-client streaming RPC. + # + # Obtains the Features available within the given Rectangle. Results are + # streamed rather than returned at once (e.g. in a response message with a + # repeated field), as the rectangle may cover a large area and contain a + # huge number of features. + rpc :ListFeatures, Rectangle, stream(Feature) + # A client-to-server streaming RPC. + # + # Accepts a stream of Points on a route being traversed, returning a + # RouteSummary when traversal is completed. + rpc :RecordRoute, stream(Point), RouteSummary + # A Bidirectional streaming RPC. + # + # Accepts a stream of RouteNotes sent while a route is being traversed, + # while receiving other RouteNotes (e.g. from other users). + rpc :RouteChat, stream(RouteNote), stream(RouteNote) + end + + Stub = Service.rpc_stub_class + end +end diff --git a/examples/ruby/pubsub/.gitignore b/examples/ruby/pubsub/.gitignore new file mode 100644 index 00000000..62fcb4fa --- /dev/null +++ b/examples/ruby/pubsub/.gitignore @@ -0,0 +1,15 @@ +/.bundle/ +/.yardoc +/Gemfile.lock +/_yardoc/ +/coverage/ +/doc/ +/pkg/ +/spec/reports/ +/tmp/ +*.bundle +*.so +*.o +*.a +mkmf.log +vendor diff --git a/examples/ruby/pubsub/Gemfile b/examples/ruby/pubsub/Gemfile new file mode 100644 index 00000000..4ee8ffe3 --- /dev/null +++ b/examples/ruby/pubsub/Gemfile @@ -0,0 +1,4 @@ +source 'https://rubygems.org/' + +gem 'grpc', '~> 1.0' +gem 'googleauth', '>= 0.5.1', '< 0.7' diff --git a/examples/ruby/pubsub/google/protobuf/empty.rb b/examples/ruby/pubsub/google/protobuf/empty.rb new file mode 100644 index 00000000..4743bded --- /dev/null +++ b/examples/ruby/pubsub/google/protobuf/empty.rb @@ -0,0 +1,29 @@ +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/protobuf/empty.proto + +require 'google/protobuf' + +Google::Protobuf::DescriptorPool.generated_pool.build do + add_message "google.protobuf.Empty" do + end +end + +module Google + module Protobuf + Empty = Google::Protobuf::DescriptorPool.generated_pool.lookup("google.protobuf.Empty").msgclass + end +end diff --git a/examples/ruby/pubsub/pubsub_demo.rb b/examples/ruby/pubsub/pubsub_demo.rb new file mode 100755 index 00000000..c565771d --- /dev/null +++ b/examples/ruby/pubsub/pubsub_demo.rb @@ -0,0 +1,241 @@ +#!/usr/bin/env ruby + +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# pubsub_demo demos accesses the Google PubSub API via its gRPC interface +# +# $ GOOGLE_APPLICATION_CREDENTIALS= \ +# path/to/pubsub_demo.rb \ +# [--action= ] +# +# There are options related to the chosen action, see #parse_args below. +# - the possible actions are given by the method names of NamedAction class +# - the default action is list_some_topics + +this_dir = File.expand_path(File.dirname(__FILE__)) +lib_dir = File.join(File.dirname(File.dirname(this_dir)), 'lib') +$LOAD_PATH.unshift(lib_dir) unless $LOAD_PATH.include?(lib_dir) +$LOAD_PATH.unshift(this_dir) unless $LOAD_PATH.include?(this_dir) + +require 'optparse' + +require 'grpc' +require 'googleauth' +require 'google/protobuf' + +require 'google/protobuf/empty' +require 'tech/pubsub/proto/pubsub' +require 'tech/pubsub/proto/pubsub_services' + +# creates a SSL Credentials from the production certificates. +def ssl_creds + GRPC::Core::ChannelCredentials.new() +end + +# Builds the metadata authentication update proc. +def auth_proc(opts) + auth_creds = Google::Auth.get_application_default + return auth_creds.updater_proc +end + +# Creates a stub for accessing the publisher service. +def publisher_stub(opts) + address = "#{opts.host}:#{opts.port}" + stub_clz = Tech::Pubsub::PublisherService::Stub # shorter + GRPC.logger.info("... access PublisherService at #{address}") + call_creds = GRPC::Core::CallCredentials.new(auth_proc(opts)) + combined_creds = ssl_creds.compose(call_creds) + stub_clz.new(address, creds: combined_creds, + GRPC::Core::Channel::SSL_TARGET => opts.host) +end + +# Creates a stub for accessing the subscriber service. +def subscriber_stub(opts) + address = "#{opts.host}:#{opts.port}" + stub_clz = Tech::Pubsub::SubscriberService::Stub # shorter + GRPC.logger.info("... access SubscriberService at #{address}") + call_creds = GRPC::Core::CallCredentials.new(auth_proc(opts)) + combined_creds = ssl_creds.compose(call_creds) + stub_clz.new(address, creds: combined_creds, + GRPC::Core::Channel::SSL_TARGET => opts.host) +end + +# defines methods corresponding to each interop test case. +class NamedActions + include Tech::Pubsub + + # Initializes NamedActions + # + # @param pub [Stub] a stub for accessing the publisher service + # @param sub [Stub] a stub for accessing the publisher service + # @param args [Args] provides access to the command line + def initialize(pub, sub, args) + @pub = pub + @sub = sub + @args = args + end + + # Removes the test topic if it exists + def remove_topic + name = test_topic_name + p "... removing Topic #{name}" + @pub.delete_topic(DeleteTopicRequest.new(topic: name)) + p "removed Topic: #{name} OK" + rescue GRPC::BadStatus => e + p "Could not delete a topics: rpc failed with '#{e}'" + end + + # Creates a test topic + def create_topic + name = test_topic_name + p "... creating Topic #{name}" + resp = @pub.create_topic(Topic.new(name: name)) + p "created Topic: #{resp.name} OK" + rescue GRPC::BadStatus => e + p "Could not create a topics: rpc failed with '#{e}'" + end + + # Lists topics in the project + def list_some_topics + p 'Listing topics' + p '-------------_' + list_project_topics.topic.each { |t| p t.name } + rescue GRPC::BadStatus => e + p "Could not list topics: rpc failed with '#{e}'" + end + + # Checks if a topics exists in a project + def check_exists + name = test_topic_name + p "... checking for topic #{name}" + exists = topic_exists?(name) + p "#{name} is a topic" if exists + p "#{name} is not a topic" unless exists + rescue GRPC::BadStatus => e + p "Could not check for a topics: rpc failed with '#{e}'" + end + + # Publishes some messages + def random_pub_sub + topic_name, sub_name = test_topic_name, test_sub_name + create_topic_if_needed(topic_name) + @sub.create_subscription(Subscription.new(name: sub_name, + topic: topic_name)) + msg_count = rand(10..30) + msg_count.times do |x| + msg = PubsubMessage.new(data: "message #{x}") + @pub.publish(PublishRequest.new(topic: topic_name, message: msg)) + end + p "Sent #{msg_count} messages to #{topic_name}, checking for them now." + batch = @sub.pull_batch(PullBatchRequest.new(subscription: sub_name, + max_events: msg_count)) + ack_ids = batch.pull_responses.map { |x| x.ack_id } + p "Got #{ack_ids.size} messages; acknowledging them.." + @sub.acknowledge(AcknowledgeRequest.new(subscription: sub_name, + ack_id: ack_ids)) + p "Test messages were acknowledged OK, deleting the subscription" + del_req = DeleteSubscriptionRequest.new(subscription: sub_name) + @sub.delete_subscription(del_req) + rescue GRPC::BadStatus => e + p "Could not do random pub sub: rpc failed with '#{e}'" + end + + private + + # test_topic_name is the topic name to use in this test. + def test_topic_name + unless @args.topic_name.nil? + return "/topics/#{@args.project_id}/#{@args.topic_name}" + end + now_text = Time.now.utc.strftime('%Y%m%d%H%M%S%L') + "/topics/#{@args.project_id}/#{ENV['USER']}-#{now_text}" + end + + # test_sub_name is the subscription name to use in this test. + def test_sub_name + unless @args.sub_name.nil? + return "/subscriptions/#{@args.project_id}/#{@args.sub_name}" + end + now_text = Time.now.utc.strftime('%Y%m%d%H%M%S%L') + "/subscriptions/#{@args.project_id}/#{ENV['USER']}-#{now_text}" + end + + # determines if the topic name exists + def topic_exists?(name) + topics = list_project_topics.topic.map { |t| t.name } + topics.include?(name) + end + + def create_topic_if_needed(name) + return if topic_exists?(name) + @pub.create_topic(Topic.new(name: name)) + end + + def list_project_topics + q = "cloud.googleapis.com/project in (/projects/#{@args.project_id})" + @pub.list_topics(ListTopicsRequest.new(query: q)) + end +end + +# Args is used to hold the command line info. +Args = Struct.new(:host, :port, :action, :project_id, :topic_name, + :sub_name) + +# validates the command line options, returning them as an Arg. +def parse_args + args = Args.new('pubsub-staging.googleapis.com', + 443, 'list_some_topics', 'stoked-keyword-656') + OptionParser.new do |opts| + opts.on('--server_host SERVER_HOST', 'server hostname') do |v| + args.host = v + end + opts.on('--server_port SERVER_PORT', 'server port') do |v| + args.port = v + end + + # instance_methods(false) gives only the methods defined in that class. + scenes = NamedActions.instance_methods(false).map { |t| t.to_s } + scene_list = scenes.join(',') + opts.on("--action CODE", scenes, {}, 'pick a demo action', + " (#{scene_list})") do |v| + args.action = v + end + + # Set the remaining values. + %w(project_id topic_name sub_name).each do |o| + opts.on("--#{o} VALUE", "#{o}") do |v| + args[o] = v + end + end + end.parse! + _check_args(args) +end + +def _check_args(args) + %w(host port action).each do |a| + if args[a].nil? + raise OptionParser::MissingArgument.new("please specify --#{a}") + end + end + args +end + +def main + args = parse_args + pub, sub = publisher_stub(args), subscriber_stub(args) + NamedActions.new(pub, sub, args).method(args.action).call +end + +main diff --git a/examples/ruby/pubsub/tech/pubsub/proto/pubsub.rb b/examples/ruby/pubsub/tech/pubsub/proto/pubsub.rb new file mode 100644 index 00000000..73a0d5d9 --- /dev/null +++ b/examples/ruby/pubsub/tech/pubsub/proto/pubsub.rb @@ -0,0 +1,159 @@ +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: tech/pubsub/proto/pubsub.proto + +require 'google/protobuf' + +require 'google/protobuf/empty' +Google::Protobuf::DescriptorPool.generated_pool.build do + add_message "tech.pubsub.Topic" do + optional :name, :string, 1 + end + add_message "tech.pubsub.PubsubMessage" do + optional :data, :string, 1 + optional :message_id, :string, 3 + end + add_message "tech.pubsub.GetTopicRequest" do + optional :topic, :string, 1 + end + add_message "tech.pubsub.PublishRequest" do + optional :topic, :string, 1 + optional :message, :message, 2, "tech.pubsub.PubsubMessage" + end + add_message "tech.pubsub.PublishBatchRequest" do + optional :topic, :string, 1 + repeated :messages, :message, 2, "tech.pubsub.PubsubMessage" + end + add_message "tech.pubsub.PublishBatchResponse" do + repeated :message_ids, :string, 1 + end + add_message "tech.pubsub.ListTopicsRequest" do + optional :query, :string, 1 + optional :max_results, :int32, 2 + optional :page_token, :string, 3 + end + add_message "tech.pubsub.ListTopicsResponse" do + repeated :topic, :message, 1, "tech.pubsub.Topic" + optional :next_page_token, :string, 2 + end + add_message "tech.pubsub.DeleteTopicRequest" do + optional :topic, :string, 1 + end + add_message "tech.pubsub.Subscription" do + optional :name, :string, 1 + optional :topic, :string, 2 + optional :query, :string, 3 + optional :truncation_policy, :message, 4, "tech.pubsub.Subscription.TruncationPolicy" + optional :push_config, :message, 5, "tech.pubsub.PushConfig" + optional :ack_deadline_seconds, :int32, 6 + optional :garbage_collect_seconds, :int64, 7 + end + add_message "tech.pubsub.Subscription.TruncationPolicy" do + optional :max_bytes, :int64, 1 + optional :max_age_seconds, :int64, 2 + end + add_message "tech.pubsub.PushConfig" do + optional :push_endpoint, :string, 1 + end + add_message "tech.pubsub.PubsubEvent" do + optional :subscription, :string, 1 + optional :message, :message, 2, "tech.pubsub.PubsubMessage" + optional :truncated, :bool, 3 + optional :deleted, :bool, 4 + end + add_message "tech.pubsub.GetSubscriptionRequest" do + optional :subscription, :string, 1 + end + add_message "tech.pubsub.ListSubscriptionsRequest" do + optional :query, :string, 1 + optional :max_results, :int32, 3 + optional :page_token, :string, 4 + end + add_message "tech.pubsub.ListSubscriptionsResponse" do + repeated :subscription, :message, 1, "tech.pubsub.Subscription" + optional :next_page_token, :string, 2 + end + add_message "tech.pubsub.TruncateSubscriptionRequest" do + optional :subscription, :string, 1 + end + add_message "tech.pubsub.DeleteSubscriptionRequest" do + optional :subscription, :string, 1 + end + add_message "tech.pubsub.ModifyPushConfigRequest" do + optional :subscription, :string, 1 + optional :push_config, :message, 2, "tech.pubsub.PushConfig" + end + add_message "tech.pubsub.PullRequest" do + optional :subscription, :string, 1 + optional :return_immediately, :bool, 2 + end + add_message "tech.pubsub.PullResponse" do + optional :ack_id, :string, 1 + optional :pubsub_event, :message, 2, "tech.pubsub.PubsubEvent" + end + add_message "tech.pubsub.PullBatchRequest" do + optional :subscription, :string, 1 + optional :return_immediately, :bool, 2 + optional :max_events, :int32, 3 + end + add_message "tech.pubsub.PullBatchResponse" do + repeated :pull_responses, :message, 2, "tech.pubsub.PullResponse" + end + add_message "tech.pubsub.ModifyAckDeadlineRequest" do + optional :subscription, :string, 1 + optional :ack_id, :string, 2 + optional :ack_deadline_seconds, :int32, 3 + end + add_message "tech.pubsub.AcknowledgeRequest" do + optional :subscription, :string, 1 + repeated :ack_id, :string, 2 + end + add_message "tech.pubsub.NackRequest" do + optional :subscription, :string, 1 + repeated :ack_id, :string, 2 + end +end + +module Tech + module Pubsub + Topic = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.Topic").msgclass + PubsubMessage = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.PubsubMessage").msgclass + GetTopicRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.GetTopicRequest").msgclass + PublishRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.PublishRequest").msgclass + PublishBatchRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.PublishBatchRequest").msgclass + PublishBatchResponse = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.PublishBatchResponse").msgclass + ListTopicsRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.ListTopicsRequest").msgclass + ListTopicsResponse = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.ListTopicsResponse").msgclass + DeleteTopicRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.DeleteTopicRequest").msgclass + Subscription = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.Subscription").msgclass + Subscription::TruncationPolicy = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.Subscription.TruncationPolicy").msgclass + PushConfig = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.PushConfig").msgclass + PubsubEvent = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.PubsubEvent").msgclass + GetSubscriptionRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.GetSubscriptionRequest").msgclass + ListSubscriptionsRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.ListSubscriptionsRequest").msgclass + ListSubscriptionsResponse = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.ListSubscriptionsResponse").msgclass + TruncateSubscriptionRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.TruncateSubscriptionRequest").msgclass + DeleteSubscriptionRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.DeleteSubscriptionRequest").msgclass + ModifyPushConfigRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.ModifyPushConfigRequest").msgclass + PullRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.PullRequest").msgclass + PullResponse = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.PullResponse").msgclass + PullBatchRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.PullBatchRequest").msgclass + PullBatchResponse = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.PullBatchResponse").msgclass + ModifyAckDeadlineRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.ModifyAckDeadlineRequest").msgclass + AcknowledgeRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.AcknowledgeRequest").msgclass + NackRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.NackRequest").msgclass + end +end diff --git a/examples/ruby/pubsub/tech/pubsub/proto/pubsub_services.rb b/examples/ruby/pubsub/tech/pubsub/proto/pubsub_services.rb new file mode 100644 index 00000000..b34db57b --- /dev/null +++ b/examples/ruby/pubsub/tech/pubsub/proto/pubsub_services.rb @@ -0,0 +1,88 @@ +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Generated by the protocol buffer compiler. DO NOT EDIT! +# Source: tech/pubsub/proto/pubsub.proto for package 'tech.pubsub' + +require 'grpc' +require 'google/protobuf/empty' +require 'tech/pubsub/proto/pubsub' + +module Tech + module Pubsub + module PublisherService + + # TODO: add proto service documentation here + class Service + + include GRPC::GenericService + + self.marshal_class_method = :encode + self.unmarshal_class_method = :decode + self.service_name = 'tech.pubsub.PublisherService' + + rpc :CreateTopic, Topic, Topic + rpc :Publish, PublishRequest, Google::Protobuf::Empty + rpc :PublishBatch, PublishBatchRequest, PublishBatchResponse + rpc :GetTopic, GetTopicRequest, Topic + rpc :ListTopics, ListTopicsRequest, ListTopicsResponse + rpc :DeleteTopic, DeleteTopicRequest, Google::Protobuf::Empty + end + + Stub = Service.rpc_stub_class + end + module SubscriberService + + # TODO: add proto service documentation here + class Service + + include GRPC::GenericService + + self.marshal_class_method = :encode + self.unmarshal_class_method = :decode + self.service_name = 'tech.pubsub.SubscriberService' + + rpc :CreateSubscription, Subscription, Subscription + rpc :GetSubscription, GetSubscriptionRequest, Subscription + rpc :ListSubscriptions, ListSubscriptionsRequest, ListSubscriptionsResponse + rpc :DeleteSubscription, DeleteSubscriptionRequest, Google::Protobuf::Empty + rpc :TruncateSubscription, TruncateSubscriptionRequest, Google::Protobuf::Empty + rpc :ModifyPushConfig, ModifyPushConfigRequest, Google::Protobuf::Empty + rpc :Pull, PullRequest, PullResponse + rpc :PullBatch, PullBatchRequest, PullBatchResponse + rpc :ModifyAckDeadline, ModifyAckDeadlineRequest, Google::Protobuf::Empty + rpc :Acknowledge, AcknowledgeRequest, Google::Protobuf::Empty + rpc :Nack, NackRequest, Google::Protobuf::Empty + end + + Stub = Service.rpc_stub_class + end + module PushEndpointService + + # TODO: add proto service documentation here + class Service + + include GRPC::GenericService + + self.marshal_class_method = :encode + self.unmarshal_class_method = :decode + self.service_name = 'tech.pubsub.PushEndpointService' + + rpc :HandlePubsubEvent, PubsubEvent, Google::Protobuf::Empty + end + + Stub = Service.rpc_stub_class + end + end +end diff --git a/examples/ruby/route_guide/README.md b/examples/ruby/route_guide/README.md new file mode 100644 index 00000000..12537c85 --- /dev/null +++ b/examples/ruby/route_guide/README.md @@ -0,0 +1,6 @@ +# gRPC Basics: Ruby sample code + +The files in this folder are the samples used in [gRPC Basics: Ruby][], +a detailed tutorial for using gRPC in Ruby. + +[gRPC Basics: Ruby]:https://grpc.io/docs/tutorials/basic/ruby.html diff --git a/examples/ruby/route_guide/route_guide_client.rb b/examples/ruby/route_guide/route_guide_client.rb new file mode 100755 index 00000000..7f9c012a --- /dev/null +++ b/examples/ruby/route_guide/route_guide_client.rb @@ -0,0 +1,164 @@ +#!/usr/bin/env ruby + +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Sample app that connects to a Route Guide service. +# +# Usage: $ path/to/route_guide_client.rb path/to/route_guide_db.json & + +this_dir = File.expand_path(File.dirname(__FILE__)) +lib_dir = File.join(File.dirname(this_dir), 'lib') +$LOAD_PATH.unshift(lib_dir) unless $LOAD_PATH.include?(lib_dir) + +require 'grpc' +require 'multi_json' +require 'route_guide_services_pb' + +include Routeguide + +GET_FEATURE_POINTS = [ + Point.new(latitude: 409_146_138, longitude: -746_188_906), + Point.new(latitude: 0, longitude: 0) +] + +# runs a GetFeature rpc. +# +# - once with a point known to be present in the sample route database +# - once with a point that is not in the sample database +def run_get_feature(stub) + p 'GetFeature' + p '----------' + GET_FEATURE_POINTS.each do |pt| + resp = stub.get_feature(pt) + if resp.name != '' + p "- found '#{resp.name}' at #{pt.inspect}" + else + p "- found nothing at #{pt.inspect}" + end + end +end + +LIST_FEATURES_RECT = Rectangle.new( + lo: Point.new(latitude: 400_000_000, longitude: -750_000_000), + hi: Point.new(latitude: 420_000_000, longitude: -730_000_000)) + +# runs a ListFeatures rpc. +# +# - the rectangle to chosen to include most of the known features +# in the sample db. +def run_list_features(stub) + p 'ListFeatures' + p '------------' + resps = stub.list_features(LIST_FEATURES_RECT) + resps.each do |r| + p "- found '#{r.name}' at #{r.location.inspect}" + end +end + +# RandomRoute provides an Enumerable that yields a random 'route' of points +# from a list of Features. +class RandomRoute + def initialize(features, size) + @features = features + @size = size + end + + # yields a point, waiting between 0 and 1 seconds between each yield + # + # @return an Enumerable that yields a random point + def each + return enum_for(:each) unless block_given? + @size.times do + json_feature = @features[rand(0..@features.length)] + next if json_feature.nil? + location = json_feature['location'] + pt = Point.new( + Hash[location.each_pair.map { |k, v| [k.to_sym, v] }]) + p "- next point is #{pt.inspect}" + yield pt + sleep(rand(0..1)) + end + end +end + +# runs a RecordRoute rpc. +# +# - the rectangle to chosen to include most of the known features +# in the sample db. +def run_record_route(stub, features) + p 'RecordRoute' + p '-----------' + points_on_route = 10 # arbitrary + reqs = RandomRoute.new(features, points_on_route) + resp = stub.record_route(reqs.each) + p "summary: #{resp.inspect}" +end + +ROUTE_CHAT_NOTES = [ + RouteNote.new(message: 'doh - a deer', + location: Point.new(latitude: 0, longitude: 0)), + RouteNote.new(message: 'ray - a drop of golden sun', + location: Point.new(latitude: 0, longitude: 1)), + RouteNote.new(message: 'me - the name I call myself', + location: Point.new(latitude: 1, longitude: 0)), + RouteNote.new(message: 'fa - a longer way to run', + location: Point.new(latitude: 1, longitude: 1)), + RouteNote.new(message: 'soh - with needle and a thread', + location: Point.new(latitude: 0, longitude: 1)) +] + +# runs a RouteChat rpc. +# +# sends a canned set of route notes and prints out the responses. +def run_route_chat(stub) + p 'Route Chat' + p '----------' + sleeping_enumerator = SleepingEnumerator.new(ROUTE_CHAT_NOTES, 1) + stub.route_chat(sleeping_enumerator.each_item) { |r| p "received #{r.inspect}" } +end + +# SleepingEnumerator yields through items, and sleeps between each one +class SleepingEnumerator + def initialize(items, delay) + @items = items + @delay = delay + end + def each_item + return enum_for(:each_item) unless block_given? + @items.each do |item| + sleep @delay + p "next item to send is #{item.inspect}" + yield item + end + end +end + +def main + stub = RouteGuide::Stub.new('localhost:50051', :this_channel_is_insecure) + run_get_feature(stub) + run_list_features(stub) + run_route_chat(stub) + if ARGV.length == 0 + p 'no feature database; skipping record_route' + exit + end + raw_data = [] + File.open(ARGV[0]) do |f| + raw_data = MultiJson.load(f.read) + end + run_record_route(stub, raw_data) +end + +main diff --git a/examples/ruby/route_guide/route_guide_server.rb b/examples/ruby/route_guide/route_guide_server.rb new file mode 100755 index 00000000..ffcebd84 --- /dev/null +++ b/examples/ruby/route_guide/route_guide_server.rb @@ -0,0 +1,181 @@ +#!/usr/bin/env ruby +# -*- coding: utf-8 -*- + +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Sample app that connects to a Route Guide service. +# +# Usage: $ path/to/route_guide_server.rb path/to/route_guide_db.json & + +this_dir = File.expand_path(File.dirname(__FILE__)) +lib_dir = File.join(File.dirname(this_dir), 'lib') +$LOAD_PATH.unshift(lib_dir) unless $LOAD_PATH.include?(lib_dir) + +require 'grpc' +require 'multi_json' +require 'route_guide_services_pb' + +include Routeguide +COORD_FACTOR = 1e7 +RADIUS = 637_100 + +# Determines the distance between two points. +# The formula is based on http://mathforum.org/library/drmath/view/51879.html. +def calculate_distance(point_a, point_b) + to_radians = proc { |x| x * Math::PI / 180 } + lat_a = to_radians.call(point_a.latitude / COORD_FACTOR) + lat_b = to_radians.call(point_b.latitude / COORD_FACTOR) + lon_a = to_radians.call(point_a.longitude / COORD_FACTOR) + lon_b = to_radians.call(point_b.longitude / COORD_FACTOR) + delta_lat = lat_a - lat_b + delta_lon = lon_a - lon_b + a = Math.sin(delta_lat / 2)**2 + + Math.cos(lat_a) * Math.cos(lat_b) + + Math.sin(delta_lon / 2)**2 + (2 * RADIUS * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))).to_i +end + +# RectangleEnum provides an Enumerator of the points in a feature_db within a +# given Rectangle. +class RectangleEnum + # @param [Hash] feature_db + # @param [Rectangle] bounds + def initialize(feature_db, bounds) + @feature_db = feature_db + @bounds = bounds + lats = [@bounds.lo.latitude, @bounds.hi.latitude] + longs = [@bounds.lo.longitude, @bounds.hi.longitude] + @lo_lat, @hi_lat = lats.min, lats.max + @lo_long, @hi_long = longs.min, longs.max + end + + # in? determines if location lies within the bounds of this instances + # Rectangle. + def in?(location) + location['longitude'] >= @lo_long && + location['longitude'] <= @hi_long && + location['latitude'] >= @lo_lat && + location['latitude'] <= @hi_lat + end + + # each yields the features in the instances feature_db that lie within the + # instance rectangle. + def each + return enum_for(:each) unless block_given? + @feature_db.each_pair do |location, name| + next unless in?(location) + next if name.nil? || name == '' + pt = Point.new( + Hash[location.each_pair.map { |k, v| [k.to_sym, v] }]) + yield Feature.new(location: pt, name: name) + end + end +end + +# ServerImpl provides an implementation of the RouteGuide service. +class ServerImpl < RouteGuide::Service + # @param [Hash] feature_db {location => name} + def initialize(feature_db) + @feature_db = feature_db + @received_notes = Hash.new { |h, k| h[k] = [] } + end + + def get_feature(point, _call) + name = @feature_db[{ + 'longitude' => point.longitude, + 'latitude' => point.latitude }] || '' + Feature.new(location: point, name: name) + end + + def list_features(rectangle, _call) + RectangleEnum.new(@feature_db, rectangle).each + end + + def record_route(call) + started, elapsed_time = 0, 0 + distance, count, features, last = 0, 0, 0, nil + call.each_remote_read do |point| + count += 1 + name = @feature_db[{ + 'longitude' => point.longitude, + 'latitude' => point.latitude }] || '' + features += 1 unless name == '' + if last.nil? + last = point + started = Time.now.to_i + next + end + elapsed_time = Time.now.to_i - started + distance += calculate_distance(point, last) + last = point + end + RouteSummary.new(point_count: count, + feature_count: features, + distance: distance, + elapsed_time: elapsed_time) + end + + def route_chat(notes) + RouteChatEnumerator.new(notes, @received_notes).each_item + end +end + +class RouteChatEnumerator + def initialize(notes, received_notes) + @notes = notes + @received_notes = received_notes + end + def each_item + return enum_for(:each_item) unless block_given? + begin + @notes.each do |n| + key = { + 'latitude' => n.location.latitude, + 'longitude' => n.location.longitude + } + earlier_msgs = @received_notes[key] + @received_notes[key] << n.message + # send back the earlier messages at this point + earlier_msgs.each do |r| + yield RouteNote.new(location: n.location, message: r) + end + end + rescue StandardError => e + fail e # signal completion via an error + end + end +end + +def main + if ARGV.length == 0 + fail 'Please specify the path to the route_guide json database' + end + raw_data = [] + File.open(ARGV[0]) do |f| + raw_data = MultiJson.load(f.read) + end + feature_db = Hash[raw_data.map { |x| [x['location'], x['name']] }] + port = '0.0.0.0:50051' + s = GRPC::RpcServer.new + s.add_http2_port(port, :this_port_is_insecure) + GRPC.logger.info("... running insecurely on #{port}") + s.handle(ServerImpl.new(feature_db)) + # Runs the server with SIGHUP, SIGINT and SIGQUIT signal handlers to + # gracefully shutdown. + # User could also choose to run server via call to run_till_terminated + s.run_till_terminated_or_interrupted([1, 'int', 'SIGQUIT']) +end + +main diff --git a/examples/ruby/without_protobuf/README.md b/examples/ruby/without_protobuf/README.md new file mode 100644 index 00000000..f9611648 --- /dev/null +++ b/examples/ruby/without_protobuf/README.md @@ -0,0 +1,6 @@ +gRPC (Ruby) without protobuf +======================== + +This directory contains a simple example of using gRPC without protobuf. + +This is mainly intended to show basic usage of the GRPC::GenericService module diff --git a/examples/ruby/without_protobuf/echo_client.rb b/examples/ruby/without_protobuf/echo_client.rb new file mode 100755 index 00000000..7932aab2 --- /dev/null +++ b/examples/ruby/without_protobuf/echo_client.rb @@ -0,0 +1,34 @@ +#!/usr/bin/env ruby + +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Sample app that connects to a 'EchoWithoutProtobuf' service. +# +# Usage: $ path/to/echo_client.rb + +this_dir = File.expand_path(File.dirname(__FILE__)) +$LOAD_PATH.unshift(this_dir) unless $LOAD_PATH.include?(this_dir) + +require 'grpc' +require 'echo_services_noprotobuf' + +def main + stub = EchoWithoutProtobuf::Stub.new('localhost:50051', :this_channel_is_insecure) + user = ARGV.size > 0 ? ARGV[0] : 'world' + message = stub.echo("hello #{user}") + p "Response: #{message}" +end + +main diff --git a/examples/ruby/without_protobuf/echo_server.rb b/examples/ruby/without_protobuf/echo_server.rb new file mode 100755 index 00000000..e9933e24 --- /dev/null +++ b/examples/ruby/without_protobuf/echo_server.rb @@ -0,0 +1,44 @@ +#!/usr/bin/env ruby + +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Sample gRPC server that implements the EchoWithoutProtobuf service. +# +# Usage: $ path/to/echo_server.rb + +this_dir = File.expand_path(File.dirname(__FILE__)) +$LOAD_PATH.unshift(this_dir) unless $LOAD_PATH.include?(this_dir) + +require 'grpc' +require 'echo_services_noprotobuf' + +# EchoServer is simple server that implements the EchoWithoutProtobuf server. +class EchoServer < EchoWithoutProtobuf::Service + # echo implements the EchoWithoutProtobuf 'Echo' rpc method. + def echo(echo_req, _unused_call) + echo_req + end +end + +# main starts an RpcServer that receives requests to EchoWithoutProtobuf at the sample +# server port. +def main + s = GRPC::RpcServer.new + s.add_http2_port('0.0.0.0:50051', :this_port_is_insecure) + s.handle(EchoServer) + s.run_till_terminated +end + +main diff --git a/examples/ruby/without_protobuf/echo_services_noprotobuf.rb b/examples/ruby/without_protobuf/echo_services_noprotobuf.rb new file mode 100644 index 00000000..e2c22749 --- /dev/null +++ b/examples/ruby/without_protobuf/echo_services_noprotobuf.rb @@ -0,0 +1,34 @@ +# Original file comments: +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +require 'grpc' + +module EchoWithoutProtobuf + # The 'echo without protobuf' service definition. + class Service + + include GRPC::GenericService + + self.marshal_class_method = :try_convert + self.unmarshal_class_method = :try_convert + self.service_name = 'EchoWithoutProtobuf' + + # Request and response are plain strings + rpc :Echo, String, String + end + + Stub = Service.rpc_stub_class +end diff --git a/gRPC-C++.podspec b/gRPC-C++.podspec new file mode 100644 index 00000000..1cff2acc --- /dev/null +++ b/gRPC-C++.podspec @@ -0,0 +1,1133 @@ +# This file has been automatically generated from a template file. +# Please make modifications to `templates/gRPC-C++.podspec.template` +# instead. This file can be regenerated from the template by running +# `tools/buildgen/generate_projects.sh`. + +# gRPC C++ CocoaPods podspec +# +# Copyright 2017 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +Pod::Spec.new do |s| + s.name = 'gRPC-C++' + # TODO (mxyan): use version that match gRPC version when pod is stabilized + version = '1.30.2' + s.version = version + s.summary = 'gRPC C++ library' + s.homepage = 'https://grpc.io' + s.license = 'Apache License, Version 2.0' + s.authors = { 'The gRPC contributors' => 'grpc-packages@google.com' } + + s.source = { + :git => 'https://github.com/grpc/grpc.git', + :tag => "v#{version}", + } + + s.ios.deployment_target = '7.0' + s.osx.deployment_target = '10.9' + s.tvos.deployment_target = '10.0' + + s.requires_arc = false + + name = 'grpcpp' + # Use `grpcpp` as framework name so that `#include ` works when built as + # framework. + s.module_name = name + + # Add include prefix `grpcpp` so that `#include ` works when built as static + # library. + s.header_dir = name + + s.pod_target_xcconfig = { + 'HEADER_SEARCH_PATHS' => '"$(inherited)" "$(PODS_TARGET_SRCROOT)/include"', + 'USER_HEADER_SEARCH_PATHS' => '"$(PODS_TARGET_SRCROOT)"', + 'GCC_PREPROCESSOR_DEFINITIONS' => '"$(inherited)" "COCOAPODS=1"', + 'CLANG_WARN_STRICT_PROTOTYPES' => 'NO', + 'CLANG_WARN_DOCUMENTATION_COMMENTS' => 'NO', + + # If we don't set these two settings, `include/grpc/support/time.h` and + # `src/core/lib/support/string.h` shadow the system `` and ``, breaking the + # build. + 'USE_HEADERMAP' => 'NO', + 'ALWAYS_SEARCH_USER_PATHS' => 'NO', + } + + s.libraries = 'c++' + s.compiler_flags = '-Wno-comma' + + s.default_subspecs = 'Interface', 'Implementation' + + # Certificates, to be able to establish TLS connections: + s.resource_bundles = { 'gRPCCertificates-Cpp' => ['etc/roots.pem'] } + + s.header_mappings_dir = 'include/grpcpp' + + s.subspec 'Interface' do |ss| + ss.header_mappings_dir = 'include/grpcpp' + + ss.source_files = 'include/grpcpp/alarm.h', + 'include/grpcpp/alarm_impl.h', + 'include/grpcpp/channel.h', + 'include/grpcpp/channel_impl.h', + 'include/grpcpp/client_context.h', + 'include/grpcpp/completion_queue.h', + 'include/grpcpp/completion_queue_impl.h', + 'include/grpcpp/create_channel.h', + 'include/grpcpp/create_channel_impl.h', + 'include/grpcpp/create_channel_posix.h', + 'include/grpcpp/create_channel_posix_impl.h', + 'include/grpcpp/ext/health_check_service_server_builder_option.h', + 'include/grpcpp/generic/async_generic_service.h', + 'include/grpcpp/generic/generic_stub.h', + 'include/grpcpp/generic/generic_stub_impl.h', + 'include/grpcpp/grpcpp.h', + 'include/grpcpp/health_check_service_interface.h', + 'include/grpcpp/health_check_service_interface_impl.h', + 'include/grpcpp/impl/call.h', + 'include/grpcpp/impl/channel_argument_option.h', + 'include/grpcpp/impl/client_unary_call.h', + 'include/grpcpp/impl/codegen/async_generic_service.h', + 'include/grpcpp/impl/codegen/async_stream.h', + 'include/grpcpp/impl/codegen/async_stream_impl.h', + 'include/grpcpp/impl/codegen/async_unary_call.h', + 'include/grpcpp/impl/codegen/async_unary_call_impl.h', + 'include/grpcpp/impl/codegen/byte_buffer.h', + 'include/grpcpp/impl/codegen/call.h', + 'include/grpcpp/impl/codegen/call_hook.h', + 'include/grpcpp/impl/codegen/call_op_set.h', + 'include/grpcpp/impl/codegen/call_op_set_interface.h', + 'include/grpcpp/impl/codegen/callback_common.h', + 'include/grpcpp/impl/codegen/channel_interface.h', + 'include/grpcpp/impl/codegen/client_callback.h', + 'include/grpcpp/impl/codegen/client_callback_impl.h', + 'include/grpcpp/impl/codegen/client_context.h', + 'include/grpcpp/impl/codegen/client_context_impl.h', + 'include/grpcpp/impl/codegen/client_interceptor.h', + 'include/grpcpp/impl/codegen/client_unary_call.h', + 'include/grpcpp/impl/codegen/completion_queue.h', + 'include/grpcpp/impl/codegen/completion_queue_impl.h', + 'include/grpcpp/impl/codegen/completion_queue_tag.h', + 'include/grpcpp/impl/codegen/config.h', + 'include/grpcpp/impl/codegen/core_codegen.h', + 'include/grpcpp/impl/codegen/core_codegen_interface.h', + 'include/grpcpp/impl/codegen/create_auth_context.h', + 'include/grpcpp/impl/codegen/delegating_channel.h', + 'include/grpcpp/impl/codegen/grpc_library.h', + 'include/grpcpp/impl/codegen/intercepted_channel.h', + 'include/grpcpp/impl/codegen/interceptor.h', + 'include/grpcpp/impl/codegen/interceptor_common.h', + 'include/grpcpp/impl/codegen/message_allocator.h', + 'include/grpcpp/impl/codegen/metadata_map.h', + 'include/grpcpp/impl/codegen/method_handler.h', + 'include/grpcpp/impl/codegen/method_handler_impl.h', + 'include/grpcpp/impl/codegen/rpc_method.h', + 'include/grpcpp/impl/codegen/rpc_service_method.h', + 'include/grpcpp/impl/codegen/security/auth_context.h', + 'include/grpcpp/impl/codegen/serialization_traits.h', + 'include/grpcpp/impl/codegen/server_callback.h', + 'include/grpcpp/impl/codegen/server_callback_handlers.h', + 'include/grpcpp/impl/codegen/server_callback_impl.h', + 'include/grpcpp/impl/codegen/server_context.h', + 'include/grpcpp/impl/codegen/server_context_impl.h', + 'include/grpcpp/impl/codegen/server_interceptor.h', + 'include/grpcpp/impl/codegen/server_interface.h', + 'include/grpcpp/impl/codegen/service_type.h', + 'include/grpcpp/impl/codegen/slice.h', + 'include/grpcpp/impl/codegen/status.h', + 'include/grpcpp/impl/codegen/status_code_enum.h', + 'include/grpcpp/impl/codegen/string_ref.h', + 'include/grpcpp/impl/codegen/stub_options.h', + 'include/grpcpp/impl/codegen/sync.h', + 'include/grpcpp/impl/codegen/sync_stream.h', + 'include/grpcpp/impl/codegen/sync_stream_impl.h', + 'include/grpcpp/impl/codegen/time.h', + 'include/grpcpp/impl/grpc_library.h', + 'include/grpcpp/impl/method_handler_impl.h', + 'include/grpcpp/impl/rpc_method.h', + 'include/grpcpp/impl/rpc_service_method.h', + 'include/grpcpp/impl/serialization_traits.h', + 'include/grpcpp/impl/server_builder_option.h', + 'include/grpcpp/impl/server_builder_option_impl.h', + 'include/grpcpp/impl/server_builder_plugin.h', + 'include/grpcpp/impl/server_initializer.h', + 'include/grpcpp/impl/server_initializer_impl.h', + 'include/grpcpp/impl/service_type.h', + 'include/grpcpp/resource_quota.h', + 'include/grpcpp/resource_quota_impl.h', + 'include/grpcpp/security/auth_context.h', + 'include/grpcpp/security/auth_metadata_processor.h', + 'include/grpcpp/security/auth_metadata_processor_impl.h', + 'include/grpcpp/security/credentials.h', + 'include/grpcpp/security/credentials_impl.h', + 'include/grpcpp/security/server_credentials.h', + 'include/grpcpp/security/server_credentials_impl.h', + 'include/grpcpp/security/tls_credentials_options.h', + 'include/grpcpp/server.h', + 'include/grpcpp/server_builder.h', + 'include/grpcpp/server_builder_impl.h', + 'include/grpcpp/server_context.h', + 'include/grpcpp/server_impl.h', + 'include/grpcpp/server_posix.h', + 'include/grpcpp/server_posix_impl.h', + 'include/grpcpp/support/async_stream.h', + 'include/grpcpp/support/async_stream_impl.h', + 'include/grpcpp/support/async_unary_call.h', + 'include/grpcpp/support/async_unary_call_impl.h', + 'include/grpcpp/support/byte_buffer.h', + 'include/grpcpp/support/channel_arguments.h', + 'include/grpcpp/support/channel_arguments_impl.h', + 'include/grpcpp/support/client_callback.h', + 'include/grpcpp/support/client_callback_impl.h', + 'include/grpcpp/support/client_interceptor.h', + 'include/grpcpp/support/config.h', + 'include/grpcpp/support/interceptor.h', + 'include/grpcpp/support/message_allocator.h', + 'include/grpcpp/support/method_handler.h', + 'include/grpcpp/support/proto_buffer_reader.h', + 'include/grpcpp/support/proto_buffer_writer.h', + 'include/grpcpp/support/server_callback.h', + 'include/grpcpp/support/server_callback_impl.h', + 'include/grpcpp/support/server_interceptor.h', + 'include/grpcpp/support/slice.h', + 'include/grpcpp/support/status.h', + 'include/grpcpp/support/status_code_enum.h', + 'include/grpcpp/support/string_ref.h', + 'include/grpcpp/support/stub_options.h', + 'include/grpcpp/support/sync_stream.h', + 'include/grpcpp/support/sync_stream_impl.h', + 'include/grpcpp/support/time.h', + 'include/grpcpp/support/validate_service_config.h' + end + + s.subspec 'Implementation' do |ss| + ss.header_mappings_dir = '.' + ss.dependency "#{s.name}/Interface", version + ss.dependency 'gRPC-Core', version + abseil_version = '1.20200225.0' + ss.dependency 'abseil/container/inlined_vector', abseil_version + ss.dependency 'abseil/memory/memory', abseil_version + ss.dependency 'abseil/strings/str_format', abseil_version + ss.dependency 'abseil/strings/strings', abseil_version + ss.dependency 'abseil/time/time', abseil_version + ss.dependency 'abseil/types/optional', abseil_version + + ss.source_files = 'src/core/ext/filters/client_channel/backend_metric.h', + 'src/core/ext/filters/client_channel/backup_poller.h', + 'src/core/ext/filters/client_channel/client_channel.h', + 'src/core/ext/filters/client_channel/client_channel_channelz.h', + 'src/core/ext/filters/client_channel/client_channel_factory.h', + 'src/core/ext/filters/client_channel/connector.h', + 'src/core/ext/filters/client_channel/global_subchannel_pool.h', + 'src/core/ext/filters/client_channel/health/health_check_client.h', + 'src/core/ext/filters/client_channel/http_connect_handshaker.h', + 'src/core/ext/filters/client_channel/http_proxy.h', + 'src/core/ext/filters/client_channel/lb_policy.h', + 'src/core/ext/filters/client_channel/lb_policy/address_filtering.h', + 'src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h', + 'src/core/ext/filters/client_channel/lb_policy/subchannel_list.h', + 'src/core/ext/filters/client_channel/lb_policy/xds/xds.h', + 'src/core/ext/filters/client_channel/lb_policy_factory.h', + 'src/core/ext/filters/client_channel/lb_policy_registry.h', + 'src/core/ext/filters/client_channel/local_subchannel_pool.h', + 'src/core/ext/filters/client_channel/parse_address.h', + 'src/core/ext/filters/client_channel/proxy_mapper.h', + 'src/core/ext/filters/client_channel/proxy_mapper_registry.h', + 'src/core/ext/filters/client_channel/resolver.h', + 'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h', + 'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h', + 'src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h', + 'src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h', + 'src/core/ext/filters/client_channel/resolver_factory.h', + 'src/core/ext/filters/client_channel/resolver_registry.h', + 'src/core/ext/filters/client_channel/resolver_result_parsing.h', + 'src/core/ext/filters/client_channel/resolving_lb_policy.h', + 'src/core/ext/filters/client_channel/retry_throttle.h', + 'src/core/ext/filters/client_channel/server_address.h', + 'src/core/ext/filters/client_channel/service_config.h', + 'src/core/ext/filters/client_channel/service_config_call_data.h', + 'src/core/ext/filters/client_channel/service_config_parser.h', + 'src/core/ext/filters/client_channel/subchannel.h', + 'src/core/ext/filters/client_channel/subchannel_interface.h', + 'src/core/ext/filters/client_channel/subchannel_pool_interface.h', + 'src/core/ext/filters/client_channel/xds/xds_api.h', + 'src/core/ext/filters/client_channel/xds/xds_bootstrap.h', + 'src/core/ext/filters/client_channel/xds/xds_channel.h', + 'src/core/ext/filters/client_channel/xds/xds_channel_args.h', + 'src/core/ext/filters/client_channel/xds/xds_client.h', + 'src/core/ext/filters/client_channel/xds/xds_client_stats.h', + 'src/core/ext/filters/deadline/deadline_filter.h', + 'src/core/ext/filters/http/client/http_client_filter.h', + 'src/core/ext/filters/http/client_authority_filter.h', + 'src/core/ext/filters/http/message_compress/message_compress_filter.h', + 'src/core/ext/filters/http/message_compress/message_decompress_filter.h', + 'src/core/ext/filters/http/server/http_server_filter.h', + 'src/core/ext/filters/max_age/max_age_filter.h', + 'src/core/ext/filters/message_size/message_size_filter.h', + 'src/core/ext/filters/workarounds/workaround_cronet_compression_filter.h', + 'src/core/ext/filters/workarounds/workaround_utils.h', + 'src/core/ext/transport/chttp2/alpn/alpn.h', + 'src/core/ext/transport/chttp2/client/authority.h', + 'src/core/ext/transport/chttp2/client/chttp2_connector.h', + 'src/core/ext/transport/chttp2/server/chttp2_server.h', + 'src/core/ext/transport/chttp2/transport/bin_decoder.h', + 'src/core/ext/transport/chttp2/transport/bin_encoder.h', + 'src/core/ext/transport/chttp2/transport/chttp2_transport.h', + 'src/core/ext/transport/chttp2/transport/context_list.h', + 'src/core/ext/transport/chttp2/transport/flow_control.h', + 'src/core/ext/transport/chttp2/transport/frame.h', + 'src/core/ext/transport/chttp2/transport/frame_data.h', + 'src/core/ext/transport/chttp2/transport/frame_goaway.h', + 'src/core/ext/transport/chttp2/transport/frame_ping.h', + 'src/core/ext/transport/chttp2/transport/frame_rst_stream.h', + 'src/core/ext/transport/chttp2/transport/frame_settings.h', + 'src/core/ext/transport/chttp2/transport/frame_window_update.h', + 'src/core/ext/transport/chttp2/transport/hpack_encoder.h', + 'src/core/ext/transport/chttp2/transport/hpack_parser.h', + 'src/core/ext/transport/chttp2/transport/hpack_table.h', + 'src/core/ext/transport/chttp2/transport/http2_settings.h', + 'src/core/ext/transport/chttp2/transport/huffsyms.h', + 'src/core/ext/transport/chttp2/transport/incoming_metadata.h', + 'src/core/ext/transport/chttp2/transport/internal.h', + 'src/core/ext/transport/chttp2/transport/stream_map.h', + 'src/core/ext/transport/chttp2/transport/varint.h', + 'src/core/ext/transport/inproc/inproc_transport.h', + 'src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h', + 'src/core/ext/upb-generated/envoy/annotations/resource.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/cds.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/eds.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/lds.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/listener.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/rds.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/route.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/route/route.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/srds.upb.h', + 'src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h', + 'src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h', + 'src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h', + 'src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h', + 'src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h', + 'src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h', + 'src/core/ext/upb-generated/envoy/type/http.upb.h', + 'src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h', + 'src/core/ext/upb-generated/envoy/type/matcher/string.upb.h', + 'src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.h', + 'src/core/ext/upb-generated/envoy/type/percent.upb.h', + 'src/core/ext/upb-generated/envoy/type/range.upb.h', + 'src/core/ext/upb-generated/envoy/type/semantic_version.upb.h', + 'src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.h', + 'src/core/ext/upb-generated/gogoproto/gogo.upb.h', + 'src/core/ext/upb-generated/google/api/annotations.upb.h', + 'src/core/ext/upb-generated/google/api/http.upb.h', + 'src/core/ext/upb-generated/google/protobuf/any.upb.h', + 'src/core/ext/upb-generated/google/protobuf/descriptor.upb.h', + 'src/core/ext/upb-generated/google/protobuf/duration.upb.h', + 'src/core/ext/upb-generated/google/protobuf/empty.upb.h', + 'src/core/ext/upb-generated/google/protobuf/struct.upb.h', + 'src/core/ext/upb-generated/google/protobuf/timestamp.upb.h', + 'src/core/ext/upb-generated/google/protobuf/wrappers.upb.h', + 'src/core/ext/upb-generated/google/rpc/status.upb.h', + 'src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h', + 'src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h', + 'src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h', + 'src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h', + 'src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h', + 'src/core/ext/upb-generated/udpa/annotations/migrate.upb.h', + 'src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h', + 'src/core/ext/upb-generated/udpa/annotations/status.upb.h', + 'src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h', + 'src/core/ext/upb-generated/validate/validate.upb.h', + 'src/core/lib/avl/avl.h', + 'src/core/lib/backoff/backoff.h', + 'src/core/lib/channel/channel_args.h', + 'src/core/lib/channel/channel_stack.h', + 'src/core/lib/channel/channel_stack_builder.h', + 'src/core/lib/channel/channel_trace.h', + 'src/core/lib/channel/channelz.h', + 'src/core/lib/channel/channelz_registry.h', + 'src/core/lib/channel/connected_channel.h', + 'src/core/lib/channel/context.h', + 'src/core/lib/channel/handshaker.h', + 'src/core/lib/channel/handshaker_factory.h', + 'src/core/lib/channel/handshaker_registry.h', + 'src/core/lib/channel/status_util.h', + 'src/core/lib/compression/algorithm_metadata.h', + 'src/core/lib/compression/compression_args.h', + 'src/core/lib/compression/compression_internal.h', + 'src/core/lib/compression/message_compress.h', + 'src/core/lib/compression/stream_compression.h', + 'src/core/lib/compression/stream_compression_gzip.h', + 'src/core/lib/compression/stream_compression_identity.h', + 'src/core/lib/debug/stats.h', + 'src/core/lib/debug/stats_data.h', + 'src/core/lib/debug/trace.h', + 'src/core/lib/gpr/alloc.h', + 'src/core/lib/gpr/arena.h', + 'src/core/lib/gpr/env.h', + 'src/core/lib/gpr/murmur_hash.h', + 'src/core/lib/gpr/spinlock.h', + 'src/core/lib/gpr/string.h', + 'src/core/lib/gpr/string_windows.h', + 'src/core/lib/gpr/time_precise.h', + 'src/core/lib/gpr/tls.h', + 'src/core/lib/gpr/tls_gcc.h', + 'src/core/lib/gpr/tls_msvc.h', + 'src/core/lib/gpr/tls_pthread.h', + 'src/core/lib/gpr/tmpfile.h', + 'src/core/lib/gpr/useful.h', + 'src/core/lib/gprpp/arena.h', + 'src/core/lib/gprpp/atomic.h', + 'src/core/lib/gprpp/debug_location.h', + 'src/core/lib/gprpp/fork.h', + 'src/core/lib/gprpp/global_config.h', + 'src/core/lib/gprpp/global_config_custom.h', + 'src/core/lib/gprpp/global_config_env.h', + 'src/core/lib/gprpp/global_config_generic.h', + 'src/core/lib/gprpp/host_port.h', + 'src/core/lib/gprpp/manual_constructor.h', + 'src/core/lib/gprpp/map.h', + 'src/core/lib/gprpp/memory.h', + 'src/core/lib/gprpp/mpscq.h', + 'src/core/lib/gprpp/orphanable.h', + 'src/core/lib/gprpp/ref_counted.h', + 'src/core/lib/gprpp/ref_counted_ptr.h', + 'src/core/lib/gprpp/sync.h', + 'src/core/lib/gprpp/thd.h', + 'src/core/lib/http/format_request.h', + 'src/core/lib/http/httpcli.h', + 'src/core/lib/http/parser.h', + 'src/core/lib/iomgr/block_annotate.h', + 'src/core/lib/iomgr/buffer_list.h', + 'src/core/lib/iomgr/call_combiner.h', + 'src/core/lib/iomgr/cfstream_handle.h', + 'src/core/lib/iomgr/closure.h', + 'src/core/lib/iomgr/combiner.h', + 'src/core/lib/iomgr/dynamic_annotations.h', + 'src/core/lib/iomgr/endpoint.h', + 'src/core/lib/iomgr/endpoint_cfstream.h', + 'src/core/lib/iomgr/endpoint_pair.h', + 'src/core/lib/iomgr/error.h', + 'src/core/lib/iomgr/error_cfstream.h', + 'src/core/lib/iomgr/error_internal.h', + 'src/core/lib/iomgr/ev_apple.h', + 'src/core/lib/iomgr/ev_epoll1_linux.h', + 'src/core/lib/iomgr/ev_epollex_linux.h', + 'src/core/lib/iomgr/ev_poll_posix.h', + 'src/core/lib/iomgr/ev_posix.h', + 'src/core/lib/iomgr/exec_ctx.h', + 'src/core/lib/iomgr/executor.h', + 'src/core/lib/iomgr/executor/mpmcqueue.h', + 'src/core/lib/iomgr/executor/threadpool.h', + 'src/core/lib/iomgr/gethostname.h', + 'src/core/lib/iomgr/grpc_if_nametoindex.h', + 'src/core/lib/iomgr/internal_errqueue.h', + 'src/core/lib/iomgr/iocp_windows.h', + 'src/core/lib/iomgr/iomgr.h', + 'src/core/lib/iomgr/iomgr_custom.h', + 'src/core/lib/iomgr/iomgr_internal.h', + 'src/core/lib/iomgr/iomgr_posix.h', + 'src/core/lib/iomgr/is_epollexclusive_available.h', + 'src/core/lib/iomgr/load_file.h', + 'src/core/lib/iomgr/lockfree_event.h', + 'src/core/lib/iomgr/nameser.h', + 'src/core/lib/iomgr/poller/eventmanager_libuv.h', + 'src/core/lib/iomgr/polling_entity.h', + 'src/core/lib/iomgr/pollset.h', + 'src/core/lib/iomgr/pollset_custom.h', + 'src/core/lib/iomgr/pollset_set.h', + 'src/core/lib/iomgr/pollset_set_custom.h', + 'src/core/lib/iomgr/pollset_set_windows.h', + 'src/core/lib/iomgr/pollset_uv.h', + 'src/core/lib/iomgr/pollset_windows.h', + 'src/core/lib/iomgr/port.h', + 'src/core/lib/iomgr/python_util.h', + 'src/core/lib/iomgr/resolve_address.h', + 'src/core/lib/iomgr/resolve_address_custom.h', + 'src/core/lib/iomgr/resource_quota.h', + 'src/core/lib/iomgr/sockaddr.h', + 'src/core/lib/iomgr/sockaddr_custom.h', + 'src/core/lib/iomgr/sockaddr_posix.h', + 'src/core/lib/iomgr/sockaddr_utils.h', + 'src/core/lib/iomgr/sockaddr_windows.h', + 'src/core/lib/iomgr/socket_factory_posix.h', + 'src/core/lib/iomgr/socket_mutator.h', + 'src/core/lib/iomgr/socket_utils.h', + 'src/core/lib/iomgr/socket_utils_posix.h', + 'src/core/lib/iomgr/socket_windows.h', + 'src/core/lib/iomgr/sys_epoll_wrapper.h', + 'src/core/lib/iomgr/tcp_client.h', + 'src/core/lib/iomgr/tcp_client_posix.h', + 'src/core/lib/iomgr/tcp_custom.h', + 'src/core/lib/iomgr/tcp_posix.h', + 'src/core/lib/iomgr/tcp_server.h', + 'src/core/lib/iomgr/tcp_server_utils_posix.h', + 'src/core/lib/iomgr/tcp_windows.h', + 'src/core/lib/iomgr/time_averaged_stats.h', + 'src/core/lib/iomgr/timer.h', + 'src/core/lib/iomgr/timer_custom.h', + 'src/core/lib/iomgr/timer_generic.h', + 'src/core/lib/iomgr/timer_heap.h', + 'src/core/lib/iomgr/timer_manager.h', + 'src/core/lib/iomgr/udp_server.h', + 'src/core/lib/iomgr/unix_sockets_posix.h', + 'src/core/lib/iomgr/wakeup_fd_pipe.h', + 'src/core/lib/iomgr/wakeup_fd_posix.h', + 'src/core/lib/iomgr/work_serializer.h', + 'src/core/lib/json/json.h', + 'src/core/lib/profiling/timers.h', + 'src/core/lib/security/context/security_context.h', + 'src/core/lib/security/credentials/alts/alts_credentials.h', + 'src/core/lib/security/credentials/alts/check_gcp_environment.h', + 'src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h', + 'src/core/lib/security/credentials/composite/composite_credentials.h', + 'src/core/lib/security/credentials/credentials.h', + 'src/core/lib/security/credentials/fake/fake_credentials.h', + 'src/core/lib/security/credentials/google_default/google_default_credentials.h', + 'src/core/lib/security/credentials/iam/iam_credentials.h', + 'src/core/lib/security/credentials/jwt/json_token.h', + 'src/core/lib/security/credentials/jwt/jwt_credentials.h', + 'src/core/lib/security/credentials/jwt/jwt_verifier.h', + 'src/core/lib/security/credentials/local/local_credentials.h', + 'src/core/lib/security/credentials/oauth2/oauth2_credentials.h', + 'src/core/lib/security/credentials/plugin/plugin_credentials.h', + 'src/core/lib/security/credentials/ssl/ssl_credentials.h', + 'src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h', + 'src/core/lib/security/credentials/tls/tls_credentials.h', + 'src/core/lib/security/security_connector/alts/alts_security_connector.h', + 'src/core/lib/security/security_connector/fake/fake_security_connector.h', + 'src/core/lib/security/security_connector/load_system_roots.h', + 'src/core/lib/security/security_connector/load_system_roots_linux.h', + 'src/core/lib/security/security_connector/local/local_security_connector.h', + 'src/core/lib/security/security_connector/security_connector.h', + 'src/core/lib/security/security_connector/ssl/ssl_security_connector.h', + 'src/core/lib/security/security_connector/ssl_utils.h', + 'src/core/lib/security/security_connector/ssl_utils_config.h', + 'src/core/lib/security/security_connector/tls/tls_security_connector.h', + 'src/core/lib/security/transport/auth_filters.h', + 'src/core/lib/security/transport/secure_endpoint.h', + 'src/core/lib/security/transport/security_handshaker.h', + 'src/core/lib/security/transport/target_authority_table.h', + 'src/core/lib/security/transport/tsi_error.h', + 'src/core/lib/security/util/json_util.h', + 'src/core/lib/slice/b64.h', + 'src/core/lib/slice/percent_encoding.h', + 'src/core/lib/slice/slice_hash_table.h', + 'src/core/lib/slice/slice_internal.h', + 'src/core/lib/slice/slice_string_helpers.h', + 'src/core/lib/slice/slice_utils.h', + 'src/core/lib/slice/slice_weak_hash_table.h', + 'src/core/lib/surface/api_trace.h', + 'src/core/lib/surface/call.h', + 'src/core/lib/surface/call_test_only.h', + 'src/core/lib/surface/channel.h', + 'src/core/lib/surface/channel_init.h', + 'src/core/lib/surface/channel_stack_type.h', + 'src/core/lib/surface/completion_queue.h', + 'src/core/lib/surface/completion_queue_factory.h', + 'src/core/lib/surface/event_string.h', + 'src/core/lib/surface/init.h', + 'src/core/lib/surface/lame_client.h', + 'src/core/lib/surface/server.h', + 'src/core/lib/surface/validate_metadata.h', + 'src/core/lib/transport/bdp_estimator.h', + 'src/core/lib/transport/byte_stream.h', + 'src/core/lib/transport/connectivity_state.h', + 'src/core/lib/transport/error_utils.h', + 'src/core/lib/transport/http2_errors.h', + 'src/core/lib/transport/metadata.h', + 'src/core/lib/transport/metadata_batch.h', + 'src/core/lib/transport/pid_controller.h', + 'src/core/lib/transport/static_metadata.h', + 'src/core/lib/transport/status_conversion.h', + 'src/core/lib/transport/status_metadata.h', + 'src/core/lib/transport/timeout_encoding.h', + 'src/core/lib/transport/transport.h', + 'src/core/lib/transport/transport_impl.h', + 'src/core/lib/uri/uri_parser.h', + 'src/core/tsi/alts/crypt/gsec.h', + 'src/core/tsi/alts/frame_protector/alts_counter.h', + 'src/core/tsi/alts/frame_protector/alts_crypter.h', + 'src/core/tsi/alts/frame_protector/alts_frame_protector.h', + 'src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.h', + 'src/core/tsi/alts/frame_protector/frame_handler.h', + 'src/core/tsi/alts/handshaker/alts_handshaker_client.h', + 'src/core/tsi/alts/handshaker/alts_shared_resource.h', + 'src/core/tsi/alts/handshaker/alts_tsi_handshaker.h', + 'src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h', + 'src/core/tsi/alts/handshaker/alts_tsi_utils.h', + 'src/core/tsi/alts/handshaker/transport_security_common_api.h', + 'src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.h', + 'src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.h', + 'src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol.h', + 'src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h', + 'src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.h', + 'src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h', + 'src/core/tsi/fake_transport_security.h', + 'src/core/tsi/local_transport_security.h', + 'src/core/tsi/ssl/session_cache/ssl_session.h', + 'src/core/tsi/ssl/session_cache/ssl_session_cache.h', + 'src/core/tsi/ssl_transport_security.h', + 'src/core/tsi/ssl_types.h', + 'src/core/tsi/transport_security.h', + 'src/core/tsi/transport_security_grpc.h', + 'src/core/tsi/transport_security_interface.h', + 'src/cpp/client/channel_cc.cc', + 'src/cpp/client/client_context.cc', + 'src/cpp/client/client_interceptor.cc', + 'src/cpp/client/create_channel.cc', + 'src/cpp/client/create_channel_internal.cc', + 'src/cpp/client/create_channel_internal.h', + 'src/cpp/client/create_channel_posix.cc', + 'src/cpp/client/credentials_cc.cc', + 'src/cpp/client/insecure_credentials.cc', + 'src/cpp/client/secure_credentials.cc', + 'src/cpp/client/secure_credentials.h', + 'src/cpp/codegen/codegen_init.cc', + 'src/cpp/common/alarm.cc', + 'src/cpp/common/auth_property_iterator.cc', + 'src/cpp/common/channel_arguments.cc', + 'src/cpp/common/channel_filter.cc', + 'src/cpp/common/channel_filter.h', + 'src/cpp/common/completion_queue_cc.cc', + 'src/cpp/common/core_codegen.cc', + 'src/cpp/common/resource_quota_cc.cc', + 'src/cpp/common/rpc_method.cc', + 'src/cpp/common/secure_auth_context.cc', + 'src/cpp/common/secure_auth_context.h', + 'src/cpp/common/secure_channel_arguments.cc', + 'src/cpp/common/secure_create_auth_context.cc', + 'src/cpp/common/tls_credentials_options.cc', + 'src/cpp/common/tls_credentials_options_util.cc', + 'src/cpp/common/tls_credentials_options_util.h', + 'src/cpp/common/validate_service_config.cc', + 'src/cpp/common/version_cc.cc', + 'src/cpp/server/async_generic_service.cc', + 'src/cpp/server/channel_argument_option.cc', + 'src/cpp/server/create_default_thread_pool.cc', + 'src/cpp/server/dynamic_thread_pool.cc', + 'src/cpp/server/dynamic_thread_pool.h', + 'src/cpp/server/external_connection_acceptor_impl.cc', + 'src/cpp/server/external_connection_acceptor_impl.h', + 'src/cpp/server/health/default_health_check_service.cc', + 'src/cpp/server/health/default_health_check_service.h', + 'src/cpp/server/health/health_check_service.cc', + 'src/cpp/server/health/health_check_service_server_builder_option.cc', + 'src/cpp/server/insecure_server_credentials.cc', + 'src/cpp/server/secure_server_credentials.cc', + 'src/cpp/server/secure_server_credentials.h', + 'src/cpp/server/server_builder.cc', + 'src/cpp/server/server_callback.cc', + 'src/cpp/server/server_cc.cc', + 'src/cpp/server/server_context.cc', + 'src/cpp/server/server_credentials.cc', + 'src/cpp/server/server_posix.cc', + 'src/cpp/server/thread_pool_interface.h', + 'src/cpp/thread_manager/thread_manager.cc', + 'src/cpp/thread_manager/thread_manager.h', + 'src/cpp/util/byte_buffer_cc.cc', + 'src/cpp/util/status.cc', + 'src/cpp/util/string_ref.cc', + 'src/cpp/util/time_cc.cc', + 'third_party/upb/upb/decode.h', + 'third_party/upb/upb/encode.h', + 'third_party/upb/upb/generated_util.h', + 'third_party/upb/upb/msg.h', + 'third_party/upb/upb/port_def.inc', + 'third_party/upb/upb/port_undef.inc', + 'third_party/upb/upb/table.int.h', + 'third_party/upb/upb/upb.h' + + ss.private_header_files = 'src/core/ext/filters/client_channel/backend_metric.h', + 'src/core/ext/filters/client_channel/backup_poller.h', + 'src/core/ext/filters/client_channel/client_channel.h', + 'src/core/ext/filters/client_channel/client_channel_channelz.h', + 'src/core/ext/filters/client_channel/client_channel_factory.h', + 'src/core/ext/filters/client_channel/connector.h', + 'src/core/ext/filters/client_channel/global_subchannel_pool.h', + 'src/core/ext/filters/client_channel/health/health_check_client.h', + 'src/core/ext/filters/client_channel/http_connect_handshaker.h', + 'src/core/ext/filters/client_channel/http_proxy.h', + 'src/core/ext/filters/client_channel/lb_policy.h', + 'src/core/ext/filters/client_channel/lb_policy/address_filtering.h', + 'src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h', + 'src/core/ext/filters/client_channel/lb_policy/subchannel_list.h', + 'src/core/ext/filters/client_channel/lb_policy/xds/xds.h', + 'src/core/ext/filters/client_channel/lb_policy_factory.h', + 'src/core/ext/filters/client_channel/lb_policy_registry.h', + 'src/core/ext/filters/client_channel/local_subchannel_pool.h', + 'src/core/ext/filters/client_channel/parse_address.h', + 'src/core/ext/filters/client_channel/proxy_mapper.h', + 'src/core/ext/filters/client_channel/proxy_mapper_registry.h', + 'src/core/ext/filters/client_channel/resolver.h', + 'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h', + 'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h', + 'src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h', + 'src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h', + 'src/core/ext/filters/client_channel/resolver_factory.h', + 'src/core/ext/filters/client_channel/resolver_registry.h', + 'src/core/ext/filters/client_channel/resolver_result_parsing.h', + 'src/core/ext/filters/client_channel/resolving_lb_policy.h', + 'src/core/ext/filters/client_channel/retry_throttle.h', + 'src/core/ext/filters/client_channel/server_address.h', + 'src/core/ext/filters/client_channel/service_config.h', + 'src/core/ext/filters/client_channel/service_config_call_data.h', + 'src/core/ext/filters/client_channel/service_config_parser.h', + 'src/core/ext/filters/client_channel/subchannel.h', + 'src/core/ext/filters/client_channel/subchannel_interface.h', + 'src/core/ext/filters/client_channel/subchannel_pool_interface.h', + 'src/core/ext/filters/client_channel/xds/xds_api.h', + 'src/core/ext/filters/client_channel/xds/xds_bootstrap.h', + 'src/core/ext/filters/client_channel/xds/xds_channel.h', + 'src/core/ext/filters/client_channel/xds/xds_channel_args.h', + 'src/core/ext/filters/client_channel/xds/xds_client.h', + 'src/core/ext/filters/client_channel/xds/xds_client_stats.h', + 'src/core/ext/filters/deadline/deadline_filter.h', + 'src/core/ext/filters/http/client/http_client_filter.h', + 'src/core/ext/filters/http/client_authority_filter.h', + 'src/core/ext/filters/http/message_compress/message_compress_filter.h', + 'src/core/ext/filters/http/message_compress/message_decompress_filter.h', + 'src/core/ext/filters/http/server/http_server_filter.h', + 'src/core/ext/filters/max_age/max_age_filter.h', + 'src/core/ext/filters/message_size/message_size_filter.h', + 'src/core/ext/filters/workarounds/workaround_cronet_compression_filter.h', + 'src/core/ext/filters/workarounds/workaround_utils.h', + 'src/core/ext/transport/chttp2/alpn/alpn.h', + 'src/core/ext/transport/chttp2/client/authority.h', + 'src/core/ext/transport/chttp2/client/chttp2_connector.h', + 'src/core/ext/transport/chttp2/server/chttp2_server.h', + 'src/core/ext/transport/chttp2/transport/bin_decoder.h', + 'src/core/ext/transport/chttp2/transport/bin_encoder.h', + 'src/core/ext/transport/chttp2/transport/chttp2_transport.h', + 'src/core/ext/transport/chttp2/transport/context_list.h', + 'src/core/ext/transport/chttp2/transport/flow_control.h', + 'src/core/ext/transport/chttp2/transport/frame.h', + 'src/core/ext/transport/chttp2/transport/frame_data.h', + 'src/core/ext/transport/chttp2/transport/frame_goaway.h', + 'src/core/ext/transport/chttp2/transport/frame_ping.h', + 'src/core/ext/transport/chttp2/transport/frame_rst_stream.h', + 'src/core/ext/transport/chttp2/transport/frame_settings.h', + 'src/core/ext/transport/chttp2/transport/frame_window_update.h', + 'src/core/ext/transport/chttp2/transport/hpack_encoder.h', + 'src/core/ext/transport/chttp2/transport/hpack_parser.h', + 'src/core/ext/transport/chttp2/transport/hpack_table.h', + 'src/core/ext/transport/chttp2/transport/http2_settings.h', + 'src/core/ext/transport/chttp2/transport/huffsyms.h', + 'src/core/ext/transport/chttp2/transport/incoming_metadata.h', + 'src/core/ext/transport/chttp2/transport/internal.h', + 'src/core/ext/transport/chttp2/transport/stream_map.h', + 'src/core/ext/transport/chttp2/transport/varint.h', + 'src/core/ext/transport/inproc/inproc_transport.h', + 'src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h', + 'src/core/ext/upb-generated/envoy/annotations/resource.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/cds.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/eds.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/lds.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/listener.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/rds.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/route.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/route/route.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/srds.upb.h', + 'src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h', + 'src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h', + 'src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h', + 'src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h', + 'src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h', + 'src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h', + 'src/core/ext/upb-generated/envoy/type/http.upb.h', + 'src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h', + 'src/core/ext/upb-generated/envoy/type/matcher/string.upb.h', + 'src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.h', + 'src/core/ext/upb-generated/envoy/type/percent.upb.h', + 'src/core/ext/upb-generated/envoy/type/range.upb.h', + 'src/core/ext/upb-generated/envoy/type/semantic_version.upb.h', + 'src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.h', + 'src/core/ext/upb-generated/gogoproto/gogo.upb.h', + 'src/core/ext/upb-generated/google/api/annotations.upb.h', + 'src/core/ext/upb-generated/google/api/http.upb.h', + 'src/core/ext/upb-generated/google/protobuf/any.upb.h', + 'src/core/ext/upb-generated/google/protobuf/descriptor.upb.h', + 'src/core/ext/upb-generated/google/protobuf/duration.upb.h', + 'src/core/ext/upb-generated/google/protobuf/empty.upb.h', + 'src/core/ext/upb-generated/google/protobuf/struct.upb.h', + 'src/core/ext/upb-generated/google/protobuf/timestamp.upb.h', + 'src/core/ext/upb-generated/google/protobuf/wrappers.upb.h', + 'src/core/ext/upb-generated/google/rpc/status.upb.h', + 'src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h', + 'src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h', + 'src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h', + 'src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h', + 'src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h', + 'src/core/ext/upb-generated/udpa/annotations/migrate.upb.h', + 'src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h', + 'src/core/ext/upb-generated/udpa/annotations/status.upb.h', + 'src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h', + 'src/core/ext/upb-generated/validate/validate.upb.h', + 'src/core/lib/avl/avl.h', + 'src/core/lib/backoff/backoff.h', + 'src/core/lib/channel/channel_args.h', + 'src/core/lib/channel/channel_stack.h', + 'src/core/lib/channel/channel_stack_builder.h', + 'src/core/lib/channel/channel_trace.h', + 'src/core/lib/channel/channelz.h', + 'src/core/lib/channel/channelz_registry.h', + 'src/core/lib/channel/connected_channel.h', + 'src/core/lib/channel/context.h', + 'src/core/lib/channel/handshaker.h', + 'src/core/lib/channel/handshaker_factory.h', + 'src/core/lib/channel/handshaker_registry.h', + 'src/core/lib/channel/status_util.h', + 'src/core/lib/compression/algorithm_metadata.h', + 'src/core/lib/compression/compression_args.h', + 'src/core/lib/compression/compression_internal.h', + 'src/core/lib/compression/message_compress.h', + 'src/core/lib/compression/stream_compression.h', + 'src/core/lib/compression/stream_compression_gzip.h', + 'src/core/lib/compression/stream_compression_identity.h', + 'src/core/lib/debug/stats.h', + 'src/core/lib/debug/stats_data.h', + 'src/core/lib/debug/trace.h', + 'src/core/lib/gpr/alloc.h', + 'src/core/lib/gpr/arena.h', + 'src/core/lib/gpr/env.h', + 'src/core/lib/gpr/murmur_hash.h', + 'src/core/lib/gpr/spinlock.h', + 'src/core/lib/gpr/string.h', + 'src/core/lib/gpr/string_windows.h', + 'src/core/lib/gpr/time_precise.h', + 'src/core/lib/gpr/tls.h', + 'src/core/lib/gpr/tls_gcc.h', + 'src/core/lib/gpr/tls_msvc.h', + 'src/core/lib/gpr/tls_pthread.h', + 'src/core/lib/gpr/tmpfile.h', + 'src/core/lib/gpr/useful.h', + 'src/core/lib/gprpp/arena.h', + 'src/core/lib/gprpp/atomic.h', + 'src/core/lib/gprpp/debug_location.h', + 'src/core/lib/gprpp/fork.h', + 'src/core/lib/gprpp/global_config.h', + 'src/core/lib/gprpp/global_config_custom.h', + 'src/core/lib/gprpp/global_config_env.h', + 'src/core/lib/gprpp/global_config_generic.h', + 'src/core/lib/gprpp/host_port.h', + 'src/core/lib/gprpp/manual_constructor.h', + 'src/core/lib/gprpp/map.h', + 'src/core/lib/gprpp/memory.h', + 'src/core/lib/gprpp/mpscq.h', + 'src/core/lib/gprpp/orphanable.h', + 'src/core/lib/gprpp/ref_counted.h', + 'src/core/lib/gprpp/ref_counted_ptr.h', + 'src/core/lib/gprpp/sync.h', + 'src/core/lib/gprpp/thd.h', + 'src/core/lib/http/format_request.h', + 'src/core/lib/http/httpcli.h', + 'src/core/lib/http/parser.h', + 'src/core/lib/iomgr/block_annotate.h', + 'src/core/lib/iomgr/buffer_list.h', + 'src/core/lib/iomgr/call_combiner.h', + 'src/core/lib/iomgr/cfstream_handle.h', + 'src/core/lib/iomgr/closure.h', + 'src/core/lib/iomgr/combiner.h', + 'src/core/lib/iomgr/dynamic_annotations.h', + 'src/core/lib/iomgr/endpoint.h', + 'src/core/lib/iomgr/endpoint_cfstream.h', + 'src/core/lib/iomgr/endpoint_pair.h', + 'src/core/lib/iomgr/error.h', + 'src/core/lib/iomgr/error_cfstream.h', + 'src/core/lib/iomgr/error_internal.h', + 'src/core/lib/iomgr/ev_apple.h', + 'src/core/lib/iomgr/ev_epoll1_linux.h', + 'src/core/lib/iomgr/ev_epollex_linux.h', + 'src/core/lib/iomgr/ev_poll_posix.h', + 'src/core/lib/iomgr/ev_posix.h', + 'src/core/lib/iomgr/exec_ctx.h', + 'src/core/lib/iomgr/executor.h', + 'src/core/lib/iomgr/executor/mpmcqueue.h', + 'src/core/lib/iomgr/executor/threadpool.h', + 'src/core/lib/iomgr/gethostname.h', + 'src/core/lib/iomgr/grpc_if_nametoindex.h', + 'src/core/lib/iomgr/internal_errqueue.h', + 'src/core/lib/iomgr/iocp_windows.h', + 'src/core/lib/iomgr/iomgr.h', + 'src/core/lib/iomgr/iomgr_custom.h', + 'src/core/lib/iomgr/iomgr_internal.h', + 'src/core/lib/iomgr/iomgr_posix.h', + 'src/core/lib/iomgr/is_epollexclusive_available.h', + 'src/core/lib/iomgr/load_file.h', + 'src/core/lib/iomgr/lockfree_event.h', + 'src/core/lib/iomgr/nameser.h', + 'src/core/lib/iomgr/poller/eventmanager_libuv.h', + 'src/core/lib/iomgr/polling_entity.h', + 'src/core/lib/iomgr/pollset.h', + 'src/core/lib/iomgr/pollset_custom.h', + 'src/core/lib/iomgr/pollset_set.h', + 'src/core/lib/iomgr/pollset_set_custom.h', + 'src/core/lib/iomgr/pollset_set_windows.h', + 'src/core/lib/iomgr/pollset_uv.h', + 'src/core/lib/iomgr/pollset_windows.h', + 'src/core/lib/iomgr/port.h', + 'src/core/lib/iomgr/python_util.h', + 'src/core/lib/iomgr/resolve_address.h', + 'src/core/lib/iomgr/resolve_address_custom.h', + 'src/core/lib/iomgr/resource_quota.h', + 'src/core/lib/iomgr/sockaddr.h', + 'src/core/lib/iomgr/sockaddr_custom.h', + 'src/core/lib/iomgr/sockaddr_posix.h', + 'src/core/lib/iomgr/sockaddr_utils.h', + 'src/core/lib/iomgr/sockaddr_windows.h', + 'src/core/lib/iomgr/socket_factory_posix.h', + 'src/core/lib/iomgr/socket_mutator.h', + 'src/core/lib/iomgr/socket_utils.h', + 'src/core/lib/iomgr/socket_utils_posix.h', + 'src/core/lib/iomgr/socket_windows.h', + 'src/core/lib/iomgr/sys_epoll_wrapper.h', + 'src/core/lib/iomgr/tcp_client.h', + 'src/core/lib/iomgr/tcp_client_posix.h', + 'src/core/lib/iomgr/tcp_custom.h', + 'src/core/lib/iomgr/tcp_posix.h', + 'src/core/lib/iomgr/tcp_server.h', + 'src/core/lib/iomgr/tcp_server_utils_posix.h', + 'src/core/lib/iomgr/tcp_windows.h', + 'src/core/lib/iomgr/time_averaged_stats.h', + 'src/core/lib/iomgr/timer.h', + 'src/core/lib/iomgr/timer_custom.h', + 'src/core/lib/iomgr/timer_generic.h', + 'src/core/lib/iomgr/timer_heap.h', + 'src/core/lib/iomgr/timer_manager.h', + 'src/core/lib/iomgr/udp_server.h', + 'src/core/lib/iomgr/unix_sockets_posix.h', + 'src/core/lib/iomgr/wakeup_fd_pipe.h', + 'src/core/lib/iomgr/wakeup_fd_posix.h', + 'src/core/lib/iomgr/work_serializer.h', + 'src/core/lib/json/json.h', + 'src/core/lib/profiling/timers.h', + 'src/core/lib/security/context/security_context.h', + 'src/core/lib/security/credentials/alts/alts_credentials.h', + 'src/core/lib/security/credentials/alts/check_gcp_environment.h', + 'src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h', + 'src/core/lib/security/credentials/composite/composite_credentials.h', + 'src/core/lib/security/credentials/credentials.h', + 'src/core/lib/security/credentials/fake/fake_credentials.h', + 'src/core/lib/security/credentials/google_default/google_default_credentials.h', + 'src/core/lib/security/credentials/iam/iam_credentials.h', + 'src/core/lib/security/credentials/jwt/json_token.h', + 'src/core/lib/security/credentials/jwt/jwt_credentials.h', + 'src/core/lib/security/credentials/jwt/jwt_verifier.h', + 'src/core/lib/security/credentials/local/local_credentials.h', + 'src/core/lib/security/credentials/oauth2/oauth2_credentials.h', + 'src/core/lib/security/credentials/plugin/plugin_credentials.h', + 'src/core/lib/security/credentials/ssl/ssl_credentials.h', + 'src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h', + 'src/core/lib/security/credentials/tls/tls_credentials.h', + 'src/core/lib/security/security_connector/alts/alts_security_connector.h', + 'src/core/lib/security/security_connector/fake/fake_security_connector.h', + 'src/core/lib/security/security_connector/load_system_roots.h', + 'src/core/lib/security/security_connector/load_system_roots_linux.h', + 'src/core/lib/security/security_connector/local/local_security_connector.h', + 'src/core/lib/security/security_connector/security_connector.h', + 'src/core/lib/security/security_connector/ssl/ssl_security_connector.h', + 'src/core/lib/security/security_connector/ssl_utils.h', + 'src/core/lib/security/security_connector/ssl_utils_config.h', + 'src/core/lib/security/security_connector/tls/tls_security_connector.h', + 'src/core/lib/security/transport/auth_filters.h', + 'src/core/lib/security/transport/secure_endpoint.h', + 'src/core/lib/security/transport/security_handshaker.h', + 'src/core/lib/security/transport/target_authority_table.h', + 'src/core/lib/security/transport/tsi_error.h', + 'src/core/lib/security/util/json_util.h', + 'src/core/lib/slice/b64.h', + 'src/core/lib/slice/percent_encoding.h', + 'src/core/lib/slice/slice_hash_table.h', + 'src/core/lib/slice/slice_internal.h', + 'src/core/lib/slice/slice_string_helpers.h', + 'src/core/lib/slice/slice_utils.h', + 'src/core/lib/slice/slice_weak_hash_table.h', + 'src/core/lib/surface/api_trace.h', + 'src/core/lib/surface/call.h', + 'src/core/lib/surface/call_test_only.h', + 'src/core/lib/surface/channel.h', + 'src/core/lib/surface/channel_init.h', + 'src/core/lib/surface/channel_stack_type.h', + 'src/core/lib/surface/completion_queue.h', + 'src/core/lib/surface/completion_queue_factory.h', + 'src/core/lib/surface/event_string.h', + 'src/core/lib/surface/init.h', + 'src/core/lib/surface/lame_client.h', + 'src/core/lib/surface/server.h', + 'src/core/lib/surface/validate_metadata.h', + 'src/core/lib/transport/bdp_estimator.h', + 'src/core/lib/transport/byte_stream.h', + 'src/core/lib/transport/connectivity_state.h', + 'src/core/lib/transport/error_utils.h', + 'src/core/lib/transport/http2_errors.h', + 'src/core/lib/transport/metadata.h', + 'src/core/lib/transport/metadata_batch.h', + 'src/core/lib/transport/pid_controller.h', + 'src/core/lib/transport/static_metadata.h', + 'src/core/lib/transport/status_conversion.h', + 'src/core/lib/transport/status_metadata.h', + 'src/core/lib/transport/timeout_encoding.h', + 'src/core/lib/transport/transport.h', + 'src/core/lib/transport/transport_impl.h', + 'src/core/lib/uri/uri_parser.h', + 'src/core/tsi/alts/crypt/gsec.h', + 'src/core/tsi/alts/frame_protector/alts_counter.h', + 'src/core/tsi/alts/frame_protector/alts_crypter.h', + 'src/core/tsi/alts/frame_protector/alts_frame_protector.h', + 'src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.h', + 'src/core/tsi/alts/frame_protector/frame_handler.h', + 'src/core/tsi/alts/handshaker/alts_handshaker_client.h', + 'src/core/tsi/alts/handshaker/alts_shared_resource.h', + 'src/core/tsi/alts/handshaker/alts_tsi_handshaker.h', + 'src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h', + 'src/core/tsi/alts/handshaker/alts_tsi_utils.h', + 'src/core/tsi/alts/handshaker/transport_security_common_api.h', + 'src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.h', + 'src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.h', + 'src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol.h', + 'src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h', + 'src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.h', + 'src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h', + 'src/core/tsi/fake_transport_security.h', + 'src/core/tsi/local_transport_security.h', + 'src/core/tsi/ssl/session_cache/ssl_session.h', + 'src/core/tsi/ssl/session_cache/ssl_session_cache.h', + 'src/core/tsi/ssl_transport_security.h', + 'src/core/tsi/ssl_types.h', + 'src/core/tsi/transport_security.h', + 'src/core/tsi/transport_security_grpc.h', + 'src/core/tsi/transport_security_interface.h', + 'src/cpp/client/create_channel_internal.h', + 'src/cpp/client/secure_credentials.h', + 'src/cpp/common/channel_filter.h', + 'src/cpp/common/secure_auth_context.h', + 'src/cpp/common/tls_credentials_options_util.h', + 'src/cpp/server/dynamic_thread_pool.h', + 'src/cpp/server/external_connection_acceptor_impl.h', + 'src/cpp/server/health/default_health_check_service.h', + 'src/cpp/server/secure_server_credentials.h', + 'src/cpp/server/thread_pool_interface.h', + 'src/cpp/thread_manager/thread_manager.h', + 'third_party/upb/upb/decode.h', + 'third_party/upb/upb/encode.h', + 'third_party/upb/upb/generated_util.h', + 'third_party/upb/upb/msg.h', + 'third_party/upb/upb/port_def.inc', + 'third_party/upb/upb/port_undef.inc', + 'third_party/upb/upb/table.int.h', + 'third_party/upb/upb/upb.h' + end + + s.subspec 'Protobuf' do |ss| + ss.header_mappings_dir = 'include/grpcpp' + ss.dependency "#{s.name}/Interface", version + + ss.source_files = 'include/grpcpp/impl/codegen/config_protobuf.h', + 'include/grpcpp/impl/codegen/proto_buffer_reader.h', + 'include/grpcpp/impl/codegen/proto_buffer_writer.h', + 'include/grpcpp/impl/codegen/proto_utils.h' + end + + s.subspec 'Cronet-Interface' do |ss| + ss.header_mappings_dir = 'include/grpcpp' + ss.public_header_files = "include/grpcpp/security/cronet_credentials.h", + "include/grpcpp/security/cronet_credentials_impl.h" + ss.source_files = "include/grpcpp/security/cronet_credentials.h", + "include/grpcpp/security/cronet_credentials_impl.h" + end + + s.subspec 'Cronet-Implementation' do |ss| + ss.header_mappings_dir = '.' + ss.dependency "#{s.name}/Cronet-Interface", version + ss.dependency "#{s.name}/Implementation", version + + ss.dependency 'gRPC-Core/Cronet-Implementation', version + + ss.source_files = "src/cpp/client/cronet_credentials.cc" + end + + s.prepare_command = <<-END_OF_COMMAND + sed -E -i '' 's;#include ;#if COCOAPODS==1\\\n #include \\\n#else\\\n #include \\\n#endif;g' $(find src/core -type f \\( -path '*.h' -or -path '*.cc' \\) -print | xargs grep -H -c '#include 'grpc-packages@google.com' } + + s.source = { + :git => 'https://github.com/grpc/grpc.git', + :tag => "v#{version}", + :submodules => true, + } + + # gRPC podspecs depend on fix for https://github.com/CocoaPods/CocoaPods/issues/6024, + # which was released in Cocoapods v1.2.0. + s.cocoapods_version = '>= 1.2.0' + + s.ios.deployment_target = '7.0' + s.osx.deployment_target = '10.9' + s.tvos.deployment_target = '10.0' + s.watchos.deployment_target = '4.0' + + s.requires_arc = false + + name = 'grpc' + + # When creating a dynamic framework, name it grpc.framework instead of gRPC-Core.framework. + # This lets users write their includes like `#include ` as opposed to `#include + # `. + s.module_name = name + + # When creating a dynamic framework, copy the headers under `include/grpc/` into the root of + # the `Headers/` directory of the framework (i.e., not under `Headers/include/grpc`). + # + # TODO(jcanizales): Debug why this doesn't work on macOS. + s.header_mappings_dir = 'include/grpc' + + # The above has an undesired effect when creating a static library: It forces users to write + # includes like `#include `. `s.header_dir` adds a path prefix to that, and + # because Cocoapods lets omit the pod name when including headers of static libraries, the + # following lets users write `#include `. + s.header_dir = name + + # The module map created automatically by Cocoapods doesn't work for C libraries like gRPC-Core. + s.module_map = 'include/grpc/module.modulemap' + + # To compile the library, we need the user headers search path (quoted includes) to point to the + # root of the repo, and the system headers search path (angled includes) to point to `include/`. + # Cocoapods effectively clones the repo under `/Pods/gRPC-Core/`, and sets a build + # variable called `$(PODS_ROOT)` to `/Pods/`, so we use that. + # + # Relying on the file structure under $(PODS_ROOT) isn't officially supported in Cocoapods, as it + # is taken as an implementation detail. We've asked for an alternative, and have been told that + # what we're doing should keep working: https://github.com/CocoaPods/CocoaPods/issues/4386 + # + # The `src_root` value of `$(PODS_ROOT)/gRPC-Core` assumes Cocoapods is installing this pod from + # its remote repo. For local development of this library, enabled by using `:path` in the Podfile, + # that assumption is wrong. In such case, the following settings need to be reset with the + # appropriate value of `src_root`. This can be accomplished in the `pre_install` hook of the + # Podfile; see `src/objective-c/tests/Podfile` for an example. + src_root = '$(PODS_ROOT)/gRPC-Core' + s.pod_target_xcconfig = { + 'GRPC_SRC_ROOT' => src_root, + 'HEADER_SEARCH_PATHS' => '"$(inherited)" "$(GRPC_SRC_ROOT)/include"', + 'USER_HEADER_SEARCH_PATHS' => '"$(GRPC_SRC_ROOT)"', + # If we don't set these two settings, `include/grpc/support/time.h` and + # `src/core/lib/gpr/string.h` shadow the system `` and ``, breaking the + # build. + 'USE_HEADERMAP' => 'NO', + 'ALWAYS_SEARCH_USER_PATHS' => 'NO', + 'GCC_PREPROCESSOR_DEFINITIONS' => '"$(inherited)" "COCOAPODS=1"', + 'CLANG_WARN_STRICT_PROTOTYPES' => 'NO', + } + + s.default_subspecs = 'Interface', 'Implementation' + s.compiler_flags = '-DGRPC_ARES=0 -Wno-comma' + s.libraries = 'c++' + + # Like many other C libraries, gRPC-Core has its public headers under `include//` and its + # sources and private headers in other directories outside `include/`. Cocoapods' linter doesn't + # allow any header to be listed outside the `header_mappings_dir` (even though doing so works in + # practice). Because we need our `header_mappings_dir` to be `include/grpc/` for the reason + # mentioned above, we work around the linter limitation by dividing the pod into two subspecs, one + # for public headers and the other for implementation. Each gets its own `header_mappings_dir`, + # making the linter happy. + # + # The list of source files is generated by a template: `templates/gRPC-Core.podspec.template`. It + # can be regenerated from the template by running `tools/buildgen/generate_projects.sh`. + s.subspec 'Interface' do |ss| + ss.header_mappings_dir = 'include/grpc' + + ss.source_files = 'include/grpc/byte_buffer.h', + 'include/grpc/byte_buffer_reader.h', + 'include/grpc/census.h', + 'include/grpc/compression.h', + 'include/grpc/fork.h', + 'include/grpc/grpc.h', + 'include/grpc/grpc_posix.h', + 'include/grpc/grpc_security.h', + 'include/grpc/grpc_security_constants.h', + 'include/grpc/impl/codegen/atm.h', + 'include/grpc/impl/codegen/atm_gcc_atomic.h', + 'include/grpc/impl/codegen/atm_gcc_sync.h', + 'include/grpc/impl/codegen/atm_windows.h', + 'include/grpc/impl/codegen/byte_buffer.h', + 'include/grpc/impl/codegen/byte_buffer_reader.h', + 'include/grpc/impl/codegen/compression_types.h', + 'include/grpc/impl/codegen/connectivity_state.h', + 'include/grpc/impl/codegen/fork.h', + 'include/grpc/impl/codegen/gpr_slice.h', + 'include/grpc/impl/codegen/gpr_types.h', + 'include/grpc/impl/codegen/grpc_types.h', + 'include/grpc/impl/codegen/log.h', + 'include/grpc/impl/codegen/port_platform.h', + 'include/grpc/impl/codegen/propagation_bits.h', + 'include/grpc/impl/codegen/slice.h', + 'include/grpc/impl/codegen/status.h', + 'include/grpc/impl/codegen/sync.h', + 'include/grpc/impl/codegen/sync_abseil.h', + 'include/grpc/impl/codegen/sync_custom.h', + 'include/grpc/impl/codegen/sync_generic.h', + 'include/grpc/impl/codegen/sync_posix.h', + 'include/grpc/impl/codegen/sync_windows.h', + 'include/grpc/load_reporting.h', + 'include/grpc/slice.h', + 'include/grpc/slice_buffer.h', + 'include/grpc/status.h', + 'include/grpc/support/alloc.h', + 'include/grpc/support/atm.h', + 'include/grpc/support/atm_gcc_atomic.h', + 'include/grpc/support/atm_gcc_sync.h', + 'include/grpc/support/atm_windows.h', + 'include/grpc/support/cpu.h', + 'include/grpc/support/log.h', + 'include/grpc/support/log_windows.h', + 'include/grpc/support/port_platform.h', + 'include/grpc/support/string_util.h', + 'include/grpc/support/sync.h', + 'include/grpc/support/sync_abseil.h', + 'include/grpc/support/sync_custom.h', + 'include/grpc/support/sync_generic.h', + 'include/grpc/support/sync_posix.h', + 'include/grpc/support/sync_windows.h', + 'include/grpc/support/thd_id.h', + 'include/grpc/support/time.h', + 'include/grpc/support/workaround_list.h' + end + s.subspec 'Implementation' do |ss| + ss.header_mappings_dir = '.' + ss.libraries = 'z' + ss.dependency "#{s.name}/Interface", version + ss.dependency 'BoringSSL-GRPC', '0.0.9' + abseil_version = '1.20200225.0' + ss.dependency 'abseil/container/inlined_vector', abseil_version + ss.dependency 'abseil/memory/memory', abseil_version + ss.dependency 'abseil/strings/str_format', abseil_version + ss.dependency 'abseil/strings/strings', abseil_version + ss.dependency 'abseil/time/time', abseil_version + ss.dependency 'abseil/types/optional', abseil_version + ss.compiler_flags = '-DBORINGSSL_PREFIX=GRPC' + + ss.source_files = 'src/core/ext/filters/census/grpc_context.cc', + 'src/core/ext/filters/client_channel/backend_metric.cc', + 'src/core/ext/filters/client_channel/backend_metric.h', + 'src/core/ext/filters/client_channel/backup_poller.cc', + 'src/core/ext/filters/client_channel/backup_poller.h', + 'src/core/ext/filters/client_channel/channel_connectivity.cc', + 'src/core/ext/filters/client_channel/client_channel.cc', + 'src/core/ext/filters/client_channel/client_channel.h', + 'src/core/ext/filters/client_channel/client_channel_channelz.cc', + 'src/core/ext/filters/client_channel/client_channel_channelz.h', + 'src/core/ext/filters/client_channel/client_channel_factory.cc', + 'src/core/ext/filters/client_channel/client_channel_factory.h', + 'src/core/ext/filters/client_channel/client_channel_plugin.cc', + 'src/core/ext/filters/client_channel/connector.h', + 'src/core/ext/filters/client_channel/global_subchannel_pool.cc', + 'src/core/ext/filters/client_channel/global_subchannel_pool.h', + 'src/core/ext/filters/client_channel/health/health_check_client.cc', + 'src/core/ext/filters/client_channel/health/health_check_client.h', + 'src/core/ext/filters/client_channel/http_connect_handshaker.cc', + 'src/core/ext/filters/client_channel/http_connect_handshaker.h', + 'src/core/ext/filters/client_channel/http_proxy.cc', + 'src/core/ext/filters/client_channel/http_proxy.h', + 'src/core/ext/filters/client_channel/lb_policy.cc', + 'src/core/ext/filters/client_channel/lb_policy.h', + 'src/core/ext/filters/client_channel/lb_policy/address_filtering.cc', + 'src/core/ext/filters/client_channel/lb_policy/address_filtering.h', + 'src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc', + 'src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h', + 'src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc', + 'src/core/ext/filters/client_channel/lb_policy/priority/priority.cc', + 'src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc', + 'src/core/ext/filters/client_channel/lb_policy/subchannel_list.h', + 'src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc', + 'src/core/ext/filters/client_channel/lb_policy/xds/cds.cc', + 'src/core/ext/filters/client_channel/lb_policy/xds/eds.cc', + 'src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc', + 'src/core/ext/filters/client_channel/lb_policy/xds/xds.h', + 'src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc', + 'src/core/ext/filters/client_channel/lb_policy_factory.h', + 'src/core/ext/filters/client_channel/lb_policy_registry.cc', + 'src/core/ext/filters/client_channel/lb_policy_registry.h', + 'src/core/ext/filters/client_channel/local_subchannel_pool.cc', + 'src/core/ext/filters/client_channel/local_subchannel_pool.h', + 'src/core/ext/filters/client_channel/parse_address.cc', + 'src/core/ext/filters/client_channel/parse_address.h', + 'src/core/ext/filters/client_channel/proxy_mapper.h', + 'src/core/ext/filters/client_channel/proxy_mapper_registry.cc', + 'src/core/ext/filters/client_channel/proxy_mapper_registry.h', + 'src/core/ext/filters/client_channel/resolver.cc', + 'src/core/ext/filters/client_channel/resolver.h', + 'src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc', + 'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc', + 'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h', + 'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc', + 'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc', + 'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc', + 'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc', + 'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h', + 'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc', + 'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc', + 'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc', + 'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc', + 'src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc', + 'src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h', + 'src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc', + 'src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc', + 'src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h', + 'src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc', + 'src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc', + 'src/core/ext/filters/client_channel/resolver_factory.h', + 'src/core/ext/filters/client_channel/resolver_registry.cc', + 'src/core/ext/filters/client_channel/resolver_registry.h', + 'src/core/ext/filters/client_channel/resolver_result_parsing.cc', + 'src/core/ext/filters/client_channel/resolver_result_parsing.h', + 'src/core/ext/filters/client_channel/resolving_lb_policy.cc', + 'src/core/ext/filters/client_channel/resolving_lb_policy.h', + 'src/core/ext/filters/client_channel/retry_throttle.cc', + 'src/core/ext/filters/client_channel/retry_throttle.h', + 'src/core/ext/filters/client_channel/server_address.cc', + 'src/core/ext/filters/client_channel/server_address.h', + 'src/core/ext/filters/client_channel/service_config.cc', + 'src/core/ext/filters/client_channel/service_config.h', + 'src/core/ext/filters/client_channel/service_config_call_data.h', + 'src/core/ext/filters/client_channel/service_config_parser.cc', + 'src/core/ext/filters/client_channel/service_config_parser.h', + 'src/core/ext/filters/client_channel/subchannel.cc', + 'src/core/ext/filters/client_channel/subchannel.h', + 'src/core/ext/filters/client_channel/subchannel_interface.h', + 'src/core/ext/filters/client_channel/subchannel_pool_interface.cc', + 'src/core/ext/filters/client_channel/subchannel_pool_interface.h', + 'src/core/ext/filters/client_channel/xds/xds_api.cc', + 'src/core/ext/filters/client_channel/xds/xds_api.h', + 'src/core/ext/filters/client_channel/xds/xds_bootstrap.cc', + 'src/core/ext/filters/client_channel/xds/xds_bootstrap.h', + 'src/core/ext/filters/client_channel/xds/xds_channel.h', + 'src/core/ext/filters/client_channel/xds/xds_channel_args.h', + 'src/core/ext/filters/client_channel/xds/xds_channel_secure.cc', + 'src/core/ext/filters/client_channel/xds/xds_client.cc', + 'src/core/ext/filters/client_channel/xds/xds_client.h', + 'src/core/ext/filters/client_channel/xds/xds_client_stats.cc', + 'src/core/ext/filters/client_channel/xds/xds_client_stats.h', + 'src/core/ext/filters/client_idle/client_idle_filter.cc', + 'src/core/ext/filters/deadline/deadline_filter.cc', + 'src/core/ext/filters/deadline/deadline_filter.h', + 'src/core/ext/filters/http/client/http_client_filter.cc', + 'src/core/ext/filters/http/client/http_client_filter.h', + 'src/core/ext/filters/http/client_authority_filter.cc', + 'src/core/ext/filters/http/client_authority_filter.h', + 'src/core/ext/filters/http/http_filters_plugin.cc', + 'src/core/ext/filters/http/message_compress/message_compress_filter.cc', + 'src/core/ext/filters/http/message_compress/message_compress_filter.h', + 'src/core/ext/filters/http/message_compress/message_decompress_filter.cc', + 'src/core/ext/filters/http/message_compress/message_decompress_filter.h', + 'src/core/ext/filters/http/server/http_server_filter.cc', + 'src/core/ext/filters/http/server/http_server_filter.h', + 'src/core/ext/filters/max_age/max_age_filter.cc', + 'src/core/ext/filters/max_age/max_age_filter.h', + 'src/core/ext/filters/message_size/message_size_filter.cc', + 'src/core/ext/filters/message_size/message_size_filter.h', + 'src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc', + 'src/core/ext/filters/workarounds/workaround_cronet_compression_filter.h', + 'src/core/ext/filters/workarounds/workaround_utils.cc', + 'src/core/ext/filters/workarounds/workaround_utils.h', + 'src/core/ext/transport/chttp2/alpn/alpn.cc', + 'src/core/ext/transport/chttp2/alpn/alpn.h', + 'src/core/ext/transport/chttp2/client/authority.cc', + 'src/core/ext/transport/chttp2/client/authority.h', + 'src/core/ext/transport/chttp2/client/chttp2_connector.cc', + 'src/core/ext/transport/chttp2/client/chttp2_connector.h', + 'src/core/ext/transport/chttp2/client/insecure/channel_create.cc', + 'src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc', + 'src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc', + 'src/core/ext/transport/chttp2/server/chttp2_server.cc', + 'src/core/ext/transport/chttp2/server/chttp2_server.h', + 'src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc', + 'src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc', + 'src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc', + 'src/core/ext/transport/chttp2/transport/bin_decoder.cc', + 'src/core/ext/transport/chttp2/transport/bin_decoder.h', + 'src/core/ext/transport/chttp2/transport/bin_encoder.cc', + 'src/core/ext/transport/chttp2/transport/bin_encoder.h', + 'src/core/ext/transport/chttp2/transport/chttp2_plugin.cc', + 'src/core/ext/transport/chttp2/transport/chttp2_transport.cc', + 'src/core/ext/transport/chttp2/transport/chttp2_transport.h', + 'src/core/ext/transport/chttp2/transport/context_list.cc', + 'src/core/ext/transport/chttp2/transport/context_list.h', + 'src/core/ext/transport/chttp2/transport/flow_control.cc', + 'src/core/ext/transport/chttp2/transport/flow_control.h', + 'src/core/ext/transport/chttp2/transport/frame.h', + 'src/core/ext/transport/chttp2/transport/frame_data.cc', + 'src/core/ext/transport/chttp2/transport/frame_data.h', + 'src/core/ext/transport/chttp2/transport/frame_goaway.cc', + 'src/core/ext/transport/chttp2/transport/frame_goaway.h', + 'src/core/ext/transport/chttp2/transport/frame_ping.cc', + 'src/core/ext/transport/chttp2/transport/frame_ping.h', + 'src/core/ext/transport/chttp2/transport/frame_rst_stream.cc', + 'src/core/ext/transport/chttp2/transport/frame_rst_stream.h', + 'src/core/ext/transport/chttp2/transport/frame_settings.cc', + 'src/core/ext/transport/chttp2/transport/frame_settings.h', + 'src/core/ext/transport/chttp2/transport/frame_window_update.cc', + 'src/core/ext/transport/chttp2/transport/frame_window_update.h', + 'src/core/ext/transport/chttp2/transport/hpack_encoder.cc', + 'src/core/ext/transport/chttp2/transport/hpack_encoder.h', + 'src/core/ext/transport/chttp2/transport/hpack_parser.cc', + 'src/core/ext/transport/chttp2/transport/hpack_parser.h', + 'src/core/ext/transport/chttp2/transport/hpack_table.cc', + 'src/core/ext/transport/chttp2/transport/hpack_table.h', + 'src/core/ext/transport/chttp2/transport/http2_settings.cc', + 'src/core/ext/transport/chttp2/transport/http2_settings.h', + 'src/core/ext/transport/chttp2/transport/huffsyms.cc', + 'src/core/ext/transport/chttp2/transport/huffsyms.h', + 'src/core/ext/transport/chttp2/transport/incoming_metadata.cc', + 'src/core/ext/transport/chttp2/transport/incoming_metadata.h', + 'src/core/ext/transport/chttp2/transport/internal.h', + 'src/core/ext/transport/chttp2/transport/parsing.cc', + 'src/core/ext/transport/chttp2/transport/stream_lists.cc', + 'src/core/ext/transport/chttp2/transport/stream_map.cc', + 'src/core/ext/transport/chttp2/transport/stream_map.h', + 'src/core/ext/transport/chttp2/transport/varint.cc', + 'src/core/ext/transport/chttp2/transport/varint.h', + 'src/core/ext/transport/chttp2/transport/writing.cc', + 'src/core/ext/transport/inproc/inproc_plugin.cc', + 'src/core/ext/transport/inproc/inproc_transport.cc', + 'src/core/ext/transport/inproc/inproc_transport.h', + 'src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c', + 'src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h', + 'src/core/ext/upb-generated/envoy/annotations/resource.upb.c', + 'src/core/ext/upb-generated/envoy/annotations/resource.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/cds.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/cds.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/eds.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/eds.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/lds.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/lds.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/listener.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/listener.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/rds.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/rds.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/route.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/route.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/route/route.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/srds.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/srds.upb.h', + 'src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c', + 'src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h', + 'src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c', + 'src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h', + 'src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c', + 'src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h', + 'src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c', + 'src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h', + 'src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c', + 'src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h', + 'src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c', + 'src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h', + 'src/core/ext/upb-generated/envoy/type/http.upb.c', + 'src/core/ext/upb-generated/envoy/type/http.upb.h', + 'src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c', + 'src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h', + 'src/core/ext/upb-generated/envoy/type/matcher/string.upb.c', + 'src/core/ext/upb-generated/envoy/type/matcher/string.upb.h', + 'src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c', + 'src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.h', + 'src/core/ext/upb-generated/envoy/type/percent.upb.c', + 'src/core/ext/upb-generated/envoy/type/percent.upb.h', + 'src/core/ext/upb-generated/envoy/type/range.upb.c', + 'src/core/ext/upb-generated/envoy/type/range.upb.h', + 'src/core/ext/upb-generated/envoy/type/semantic_version.upb.c', + 'src/core/ext/upb-generated/envoy/type/semantic_version.upb.h', + 'src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c', + 'src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.h', + 'src/core/ext/upb-generated/gogoproto/gogo.upb.c', + 'src/core/ext/upb-generated/gogoproto/gogo.upb.h', + 'src/core/ext/upb-generated/google/api/annotations.upb.c', + 'src/core/ext/upb-generated/google/api/annotations.upb.h', + 'src/core/ext/upb-generated/google/api/http.upb.c', + 'src/core/ext/upb-generated/google/api/http.upb.h', + 'src/core/ext/upb-generated/google/protobuf/any.upb.c', + 'src/core/ext/upb-generated/google/protobuf/any.upb.h', + 'src/core/ext/upb-generated/google/protobuf/descriptor.upb.c', + 'src/core/ext/upb-generated/google/protobuf/descriptor.upb.h', + 'src/core/ext/upb-generated/google/protobuf/duration.upb.c', + 'src/core/ext/upb-generated/google/protobuf/duration.upb.h', + 'src/core/ext/upb-generated/google/protobuf/empty.upb.c', + 'src/core/ext/upb-generated/google/protobuf/empty.upb.h', + 'src/core/ext/upb-generated/google/protobuf/struct.upb.c', + 'src/core/ext/upb-generated/google/protobuf/struct.upb.h', + 'src/core/ext/upb-generated/google/protobuf/timestamp.upb.c', + 'src/core/ext/upb-generated/google/protobuf/timestamp.upb.h', + 'src/core/ext/upb-generated/google/protobuf/wrappers.upb.c', + 'src/core/ext/upb-generated/google/protobuf/wrappers.upb.h', + 'src/core/ext/upb-generated/google/rpc/status.upb.c', + 'src/core/ext/upb-generated/google/rpc/status.upb.h', + 'src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c', + 'src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h', + 'src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c', + 'src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h', + 'src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c', + 'src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h', + 'src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c', + 'src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h', + 'src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c', + 'src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h', + 'src/core/ext/upb-generated/udpa/annotations/migrate.upb.c', + 'src/core/ext/upb-generated/udpa/annotations/migrate.upb.h', + 'src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c', + 'src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h', + 'src/core/ext/upb-generated/udpa/annotations/status.upb.c', + 'src/core/ext/upb-generated/udpa/annotations/status.upb.h', + 'src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c', + 'src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h', + 'src/core/ext/upb-generated/validate/validate.upb.c', + 'src/core/ext/upb-generated/validate/validate.upb.h', + 'src/core/lib/avl/avl.cc', + 'src/core/lib/avl/avl.h', + 'src/core/lib/backoff/backoff.cc', + 'src/core/lib/backoff/backoff.h', + 'src/core/lib/channel/channel_args.cc', + 'src/core/lib/channel/channel_args.h', + 'src/core/lib/channel/channel_stack.cc', + 'src/core/lib/channel/channel_stack.h', + 'src/core/lib/channel/channel_stack_builder.cc', + 'src/core/lib/channel/channel_stack_builder.h', + 'src/core/lib/channel/channel_trace.cc', + 'src/core/lib/channel/channel_trace.h', + 'src/core/lib/channel/channelz.cc', + 'src/core/lib/channel/channelz.h', + 'src/core/lib/channel/channelz_registry.cc', + 'src/core/lib/channel/channelz_registry.h', + 'src/core/lib/channel/connected_channel.cc', + 'src/core/lib/channel/connected_channel.h', + 'src/core/lib/channel/context.h', + 'src/core/lib/channel/handshaker.cc', + 'src/core/lib/channel/handshaker.h', + 'src/core/lib/channel/handshaker_factory.h', + 'src/core/lib/channel/handshaker_registry.cc', + 'src/core/lib/channel/handshaker_registry.h', + 'src/core/lib/channel/status_util.cc', + 'src/core/lib/channel/status_util.h', + 'src/core/lib/compression/algorithm_metadata.h', + 'src/core/lib/compression/compression.cc', + 'src/core/lib/compression/compression_args.cc', + 'src/core/lib/compression/compression_args.h', + 'src/core/lib/compression/compression_internal.cc', + 'src/core/lib/compression/compression_internal.h', + 'src/core/lib/compression/message_compress.cc', + 'src/core/lib/compression/message_compress.h', + 'src/core/lib/compression/stream_compression.cc', + 'src/core/lib/compression/stream_compression.h', + 'src/core/lib/compression/stream_compression_gzip.cc', + 'src/core/lib/compression/stream_compression_gzip.h', + 'src/core/lib/compression/stream_compression_identity.cc', + 'src/core/lib/compression/stream_compression_identity.h', + 'src/core/lib/debug/stats.cc', + 'src/core/lib/debug/stats.h', + 'src/core/lib/debug/stats_data.cc', + 'src/core/lib/debug/stats_data.h', + 'src/core/lib/debug/trace.cc', + 'src/core/lib/debug/trace.h', + 'src/core/lib/gpr/alloc.cc', + 'src/core/lib/gpr/alloc.h', + 'src/core/lib/gpr/arena.h', + 'src/core/lib/gpr/atm.cc', + 'src/core/lib/gpr/cpu_iphone.cc', + 'src/core/lib/gpr/cpu_linux.cc', + 'src/core/lib/gpr/cpu_posix.cc', + 'src/core/lib/gpr/cpu_windows.cc', + 'src/core/lib/gpr/env.h', + 'src/core/lib/gpr/env_linux.cc', + 'src/core/lib/gpr/env_posix.cc', + 'src/core/lib/gpr/env_windows.cc', + 'src/core/lib/gpr/log.cc', + 'src/core/lib/gpr/log_android.cc', + 'src/core/lib/gpr/log_linux.cc', + 'src/core/lib/gpr/log_posix.cc', + 'src/core/lib/gpr/log_windows.cc', + 'src/core/lib/gpr/murmur_hash.cc', + 'src/core/lib/gpr/murmur_hash.h', + 'src/core/lib/gpr/spinlock.h', + 'src/core/lib/gpr/string.cc', + 'src/core/lib/gpr/string.h', + 'src/core/lib/gpr/string_posix.cc', + 'src/core/lib/gpr/string_util_windows.cc', + 'src/core/lib/gpr/string_windows.cc', + 'src/core/lib/gpr/string_windows.h', + 'src/core/lib/gpr/sync.cc', + 'src/core/lib/gpr/sync_abseil.cc', + 'src/core/lib/gpr/sync_posix.cc', + 'src/core/lib/gpr/sync_windows.cc', + 'src/core/lib/gpr/time.cc', + 'src/core/lib/gpr/time_posix.cc', + 'src/core/lib/gpr/time_precise.cc', + 'src/core/lib/gpr/time_precise.h', + 'src/core/lib/gpr/time_windows.cc', + 'src/core/lib/gpr/tls.h', + 'src/core/lib/gpr/tls_gcc.h', + 'src/core/lib/gpr/tls_msvc.h', + 'src/core/lib/gpr/tls_pthread.cc', + 'src/core/lib/gpr/tls_pthread.h', + 'src/core/lib/gpr/tmpfile.h', + 'src/core/lib/gpr/tmpfile_msys.cc', + 'src/core/lib/gpr/tmpfile_posix.cc', + 'src/core/lib/gpr/tmpfile_windows.cc', + 'src/core/lib/gpr/useful.h', + 'src/core/lib/gpr/wrap_memcpy.cc', + 'src/core/lib/gprpp/arena.cc', + 'src/core/lib/gprpp/arena.h', + 'src/core/lib/gprpp/atomic.h', + 'src/core/lib/gprpp/debug_location.h', + 'src/core/lib/gprpp/fork.cc', + 'src/core/lib/gprpp/fork.h', + 'src/core/lib/gprpp/global_config.h', + 'src/core/lib/gprpp/global_config_custom.h', + 'src/core/lib/gprpp/global_config_env.cc', + 'src/core/lib/gprpp/global_config_env.h', + 'src/core/lib/gprpp/global_config_generic.h', + 'src/core/lib/gprpp/host_port.cc', + 'src/core/lib/gprpp/host_port.h', + 'src/core/lib/gprpp/manual_constructor.h', + 'src/core/lib/gprpp/map.h', + 'src/core/lib/gprpp/memory.h', + 'src/core/lib/gprpp/mpscq.cc', + 'src/core/lib/gprpp/mpscq.h', + 'src/core/lib/gprpp/orphanable.h', + 'src/core/lib/gprpp/ref_counted.h', + 'src/core/lib/gprpp/ref_counted_ptr.h', + 'src/core/lib/gprpp/sync.h', + 'src/core/lib/gprpp/thd.h', + 'src/core/lib/gprpp/thd_posix.cc', + 'src/core/lib/gprpp/thd_windows.cc', + 'src/core/lib/http/format_request.cc', + 'src/core/lib/http/format_request.h', + 'src/core/lib/http/httpcli.cc', + 'src/core/lib/http/httpcli.h', + 'src/core/lib/http/httpcli_security_connector.cc', + 'src/core/lib/http/parser.cc', + 'src/core/lib/http/parser.h', + 'src/core/lib/iomgr/block_annotate.h', + 'src/core/lib/iomgr/buffer_list.cc', + 'src/core/lib/iomgr/buffer_list.h', + 'src/core/lib/iomgr/call_combiner.cc', + 'src/core/lib/iomgr/call_combiner.h', + 'src/core/lib/iomgr/cfstream_handle.cc', + 'src/core/lib/iomgr/cfstream_handle.h', + 'src/core/lib/iomgr/closure.h', + 'src/core/lib/iomgr/combiner.cc', + 'src/core/lib/iomgr/combiner.h', + 'src/core/lib/iomgr/dualstack_socket_posix.cc', + 'src/core/lib/iomgr/dynamic_annotations.h', + 'src/core/lib/iomgr/endpoint.cc', + 'src/core/lib/iomgr/endpoint.h', + 'src/core/lib/iomgr/endpoint_cfstream.cc', + 'src/core/lib/iomgr/endpoint_cfstream.h', + 'src/core/lib/iomgr/endpoint_pair.h', + 'src/core/lib/iomgr/endpoint_pair_posix.cc', + 'src/core/lib/iomgr/endpoint_pair_uv.cc', + 'src/core/lib/iomgr/endpoint_pair_windows.cc', + 'src/core/lib/iomgr/error.cc', + 'src/core/lib/iomgr/error.h', + 'src/core/lib/iomgr/error_cfstream.cc', + 'src/core/lib/iomgr/error_cfstream.h', + 'src/core/lib/iomgr/error_internal.h', + 'src/core/lib/iomgr/ev_apple.cc', + 'src/core/lib/iomgr/ev_apple.h', + 'src/core/lib/iomgr/ev_epoll1_linux.cc', + 'src/core/lib/iomgr/ev_epoll1_linux.h', + 'src/core/lib/iomgr/ev_epollex_linux.cc', + 'src/core/lib/iomgr/ev_epollex_linux.h', + 'src/core/lib/iomgr/ev_poll_posix.cc', + 'src/core/lib/iomgr/ev_poll_posix.h', + 'src/core/lib/iomgr/ev_posix.cc', + 'src/core/lib/iomgr/ev_posix.h', + 'src/core/lib/iomgr/ev_windows.cc', + 'src/core/lib/iomgr/exec_ctx.cc', + 'src/core/lib/iomgr/exec_ctx.h', + 'src/core/lib/iomgr/executor.cc', + 'src/core/lib/iomgr/executor.h', + 'src/core/lib/iomgr/executor/mpmcqueue.cc', + 'src/core/lib/iomgr/executor/mpmcqueue.h', + 'src/core/lib/iomgr/executor/threadpool.cc', + 'src/core/lib/iomgr/executor/threadpool.h', + 'src/core/lib/iomgr/fork_posix.cc', + 'src/core/lib/iomgr/fork_windows.cc', + 'src/core/lib/iomgr/gethostname.h', + 'src/core/lib/iomgr/gethostname_fallback.cc', + 'src/core/lib/iomgr/gethostname_host_name_max.cc', + 'src/core/lib/iomgr/gethostname_sysconf.cc', + 'src/core/lib/iomgr/grpc_if_nametoindex.h', + 'src/core/lib/iomgr/grpc_if_nametoindex_posix.cc', + 'src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc', + 'src/core/lib/iomgr/internal_errqueue.cc', + 'src/core/lib/iomgr/internal_errqueue.h', + 'src/core/lib/iomgr/iocp_windows.cc', + 'src/core/lib/iomgr/iocp_windows.h', + 'src/core/lib/iomgr/iomgr.cc', + 'src/core/lib/iomgr/iomgr.h', + 'src/core/lib/iomgr/iomgr_custom.cc', + 'src/core/lib/iomgr/iomgr_custom.h', + 'src/core/lib/iomgr/iomgr_internal.cc', + 'src/core/lib/iomgr/iomgr_internal.h', + 'src/core/lib/iomgr/iomgr_posix.cc', + 'src/core/lib/iomgr/iomgr_posix.h', + 'src/core/lib/iomgr/iomgr_posix_cfstream.cc', + 'src/core/lib/iomgr/iomgr_uv.cc', + 'src/core/lib/iomgr/iomgr_windows.cc', + 'src/core/lib/iomgr/is_epollexclusive_available.cc', + 'src/core/lib/iomgr/is_epollexclusive_available.h', + 'src/core/lib/iomgr/load_file.cc', + 'src/core/lib/iomgr/load_file.h', + 'src/core/lib/iomgr/lockfree_event.cc', + 'src/core/lib/iomgr/lockfree_event.h', + 'src/core/lib/iomgr/nameser.h', + 'src/core/lib/iomgr/poller/eventmanager_libuv.cc', + 'src/core/lib/iomgr/poller/eventmanager_libuv.h', + 'src/core/lib/iomgr/polling_entity.cc', + 'src/core/lib/iomgr/polling_entity.h', + 'src/core/lib/iomgr/pollset.cc', + 'src/core/lib/iomgr/pollset.h', + 'src/core/lib/iomgr/pollset_custom.cc', + 'src/core/lib/iomgr/pollset_custom.h', + 'src/core/lib/iomgr/pollset_set.cc', + 'src/core/lib/iomgr/pollset_set.h', + 'src/core/lib/iomgr/pollset_set_custom.cc', + 'src/core/lib/iomgr/pollset_set_custom.h', + 'src/core/lib/iomgr/pollset_set_windows.cc', + 'src/core/lib/iomgr/pollset_set_windows.h', + 'src/core/lib/iomgr/pollset_uv.cc', + 'src/core/lib/iomgr/pollset_uv.h', + 'src/core/lib/iomgr/pollset_windows.cc', + 'src/core/lib/iomgr/pollset_windows.h', + 'src/core/lib/iomgr/port.h', + 'src/core/lib/iomgr/python_util.h', + 'src/core/lib/iomgr/resolve_address.cc', + 'src/core/lib/iomgr/resolve_address.h', + 'src/core/lib/iomgr/resolve_address_custom.cc', + 'src/core/lib/iomgr/resolve_address_custom.h', + 'src/core/lib/iomgr/resolve_address_posix.cc', + 'src/core/lib/iomgr/resolve_address_windows.cc', + 'src/core/lib/iomgr/resource_quota.cc', + 'src/core/lib/iomgr/resource_quota.h', + 'src/core/lib/iomgr/sockaddr.h', + 'src/core/lib/iomgr/sockaddr_custom.h', + 'src/core/lib/iomgr/sockaddr_posix.h', + 'src/core/lib/iomgr/sockaddr_utils.cc', + 'src/core/lib/iomgr/sockaddr_utils.h', + 'src/core/lib/iomgr/sockaddr_windows.h', + 'src/core/lib/iomgr/socket_factory_posix.cc', + 'src/core/lib/iomgr/socket_factory_posix.h', + 'src/core/lib/iomgr/socket_mutator.cc', + 'src/core/lib/iomgr/socket_mutator.h', + 'src/core/lib/iomgr/socket_utils.h', + 'src/core/lib/iomgr/socket_utils_common_posix.cc', + 'src/core/lib/iomgr/socket_utils_linux.cc', + 'src/core/lib/iomgr/socket_utils_posix.cc', + 'src/core/lib/iomgr/socket_utils_posix.h', + 'src/core/lib/iomgr/socket_utils_uv.cc', + 'src/core/lib/iomgr/socket_utils_windows.cc', + 'src/core/lib/iomgr/socket_windows.cc', + 'src/core/lib/iomgr/socket_windows.h', + 'src/core/lib/iomgr/sys_epoll_wrapper.h', + 'src/core/lib/iomgr/tcp_client.cc', + 'src/core/lib/iomgr/tcp_client.h', + 'src/core/lib/iomgr/tcp_client_cfstream.cc', + 'src/core/lib/iomgr/tcp_client_custom.cc', + 'src/core/lib/iomgr/tcp_client_posix.cc', + 'src/core/lib/iomgr/tcp_client_posix.h', + 'src/core/lib/iomgr/tcp_client_windows.cc', + 'src/core/lib/iomgr/tcp_custom.cc', + 'src/core/lib/iomgr/tcp_custom.h', + 'src/core/lib/iomgr/tcp_posix.cc', + 'src/core/lib/iomgr/tcp_posix.h', + 'src/core/lib/iomgr/tcp_server.cc', + 'src/core/lib/iomgr/tcp_server.h', + 'src/core/lib/iomgr/tcp_server_custom.cc', + 'src/core/lib/iomgr/tcp_server_posix.cc', + 'src/core/lib/iomgr/tcp_server_utils_posix.h', + 'src/core/lib/iomgr/tcp_server_utils_posix_common.cc', + 'src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc', + 'src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc', + 'src/core/lib/iomgr/tcp_server_windows.cc', + 'src/core/lib/iomgr/tcp_uv.cc', + 'src/core/lib/iomgr/tcp_windows.cc', + 'src/core/lib/iomgr/tcp_windows.h', + 'src/core/lib/iomgr/time_averaged_stats.cc', + 'src/core/lib/iomgr/time_averaged_stats.h', + 'src/core/lib/iomgr/timer.cc', + 'src/core/lib/iomgr/timer.h', + 'src/core/lib/iomgr/timer_custom.cc', + 'src/core/lib/iomgr/timer_custom.h', + 'src/core/lib/iomgr/timer_generic.cc', + 'src/core/lib/iomgr/timer_generic.h', + 'src/core/lib/iomgr/timer_heap.cc', + 'src/core/lib/iomgr/timer_heap.h', + 'src/core/lib/iomgr/timer_manager.cc', + 'src/core/lib/iomgr/timer_manager.h', + 'src/core/lib/iomgr/timer_uv.cc', + 'src/core/lib/iomgr/udp_server.cc', + 'src/core/lib/iomgr/udp_server.h', + 'src/core/lib/iomgr/unix_sockets_posix.cc', + 'src/core/lib/iomgr/unix_sockets_posix.h', + 'src/core/lib/iomgr/unix_sockets_posix_noop.cc', + 'src/core/lib/iomgr/wakeup_fd_eventfd.cc', + 'src/core/lib/iomgr/wakeup_fd_nospecial.cc', + 'src/core/lib/iomgr/wakeup_fd_pipe.cc', + 'src/core/lib/iomgr/wakeup_fd_pipe.h', + 'src/core/lib/iomgr/wakeup_fd_posix.cc', + 'src/core/lib/iomgr/wakeup_fd_posix.h', + 'src/core/lib/iomgr/work_serializer.cc', + 'src/core/lib/iomgr/work_serializer.h', + 'src/core/lib/json/json.h', + 'src/core/lib/json/json_reader.cc', + 'src/core/lib/json/json_writer.cc', + 'src/core/lib/profiling/basic_timers.cc', + 'src/core/lib/profiling/stap_timers.cc', + 'src/core/lib/profiling/timers.h', + 'src/core/lib/security/context/security_context.cc', + 'src/core/lib/security/context/security_context.h', + 'src/core/lib/security/credentials/alts/alts_credentials.cc', + 'src/core/lib/security/credentials/alts/alts_credentials.h', + 'src/core/lib/security/credentials/alts/check_gcp_environment.cc', + 'src/core/lib/security/credentials/alts/check_gcp_environment.h', + 'src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc', + 'src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc', + 'src/core/lib/security/credentials/alts/check_gcp_environment_windows.cc', + 'src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc', + 'src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc', + 'src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h', + 'src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc', + 'src/core/lib/security/credentials/composite/composite_credentials.cc', + 'src/core/lib/security/credentials/composite/composite_credentials.h', + 'src/core/lib/security/credentials/credentials.cc', + 'src/core/lib/security/credentials/credentials.h', + 'src/core/lib/security/credentials/credentials_metadata.cc', + 'src/core/lib/security/credentials/fake/fake_credentials.cc', + 'src/core/lib/security/credentials/fake/fake_credentials.h', + 'src/core/lib/security/credentials/google_default/credentials_generic.cc', + 'src/core/lib/security/credentials/google_default/google_default_credentials.cc', + 'src/core/lib/security/credentials/google_default/google_default_credentials.h', + 'src/core/lib/security/credentials/iam/iam_credentials.cc', + 'src/core/lib/security/credentials/iam/iam_credentials.h', + 'src/core/lib/security/credentials/jwt/json_token.cc', + 'src/core/lib/security/credentials/jwt/json_token.h', + 'src/core/lib/security/credentials/jwt/jwt_credentials.cc', + 'src/core/lib/security/credentials/jwt/jwt_credentials.h', + 'src/core/lib/security/credentials/jwt/jwt_verifier.cc', + 'src/core/lib/security/credentials/jwt/jwt_verifier.h', + 'src/core/lib/security/credentials/local/local_credentials.cc', + 'src/core/lib/security/credentials/local/local_credentials.h', + 'src/core/lib/security/credentials/oauth2/oauth2_credentials.cc', + 'src/core/lib/security/credentials/oauth2/oauth2_credentials.h', + 'src/core/lib/security/credentials/plugin/plugin_credentials.cc', + 'src/core/lib/security/credentials/plugin/plugin_credentials.h', + 'src/core/lib/security/credentials/ssl/ssl_credentials.cc', + 'src/core/lib/security/credentials/ssl/ssl_credentials.h', + 'src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc', + 'src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h', + 'src/core/lib/security/credentials/tls/tls_credentials.cc', + 'src/core/lib/security/credentials/tls/tls_credentials.h', + 'src/core/lib/security/security_connector/alts/alts_security_connector.cc', + 'src/core/lib/security/security_connector/alts/alts_security_connector.h', + 'src/core/lib/security/security_connector/fake/fake_security_connector.cc', + 'src/core/lib/security/security_connector/fake/fake_security_connector.h', + 'src/core/lib/security/security_connector/load_system_roots.h', + 'src/core/lib/security/security_connector/load_system_roots_fallback.cc', + 'src/core/lib/security/security_connector/load_system_roots_linux.cc', + 'src/core/lib/security/security_connector/load_system_roots_linux.h', + 'src/core/lib/security/security_connector/local/local_security_connector.cc', + 'src/core/lib/security/security_connector/local/local_security_connector.h', + 'src/core/lib/security/security_connector/security_connector.cc', + 'src/core/lib/security/security_connector/security_connector.h', + 'src/core/lib/security/security_connector/ssl/ssl_security_connector.cc', + 'src/core/lib/security/security_connector/ssl/ssl_security_connector.h', + 'src/core/lib/security/security_connector/ssl_utils.cc', + 'src/core/lib/security/security_connector/ssl_utils.h', + 'src/core/lib/security/security_connector/ssl_utils_config.cc', + 'src/core/lib/security/security_connector/ssl_utils_config.h', + 'src/core/lib/security/security_connector/tls/tls_security_connector.cc', + 'src/core/lib/security/security_connector/tls/tls_security_connector.h', + 'src/core/lib/security/transport/auth_filters.h', + 'src/core/lib/security/transport/client_auth_filter.cc', + 'src/core/lib/security/transport/secure_endpoint.cc', + 'src/core/lib/security/transport/secure_endpoint.h', + 'src/core/lib/security/transport/security_handshaker.cc', + 'src/core/lib/security/transport/security_handshaker.h', + 'src/core/lib/security/transport/server_auth_filter.cc', + 'src/core/lib/security/transport/target_authority_table.cc', + 'src/core/lib/security/transport/target_authority_table.h', + 'src/core/lib/security/transport/tsi_error.cc', + 'src/core/lib/security/transport/tsi_error.h', + 'src/core/lib/security/util/json_util.cc', + 'src/core/lib/security/util/json_util.h', + 'src/core/lib/slice/b64.cc', + 'src/core/lib/slice/b64.h', + 'src/core/lib/slice/percent_encoding.cc', + 'src/core/lib/slice/percent_encoding.h', + 'src/core/lib/slice/slice.cc', + 'src/core/lib/slice/slice_buffer.cc', + 'src/core/lib/slice/slice_hash_table.h', + 'src/core/lib/slice/slice_intern.cc', + 'src/core/lib/slice/slice_internal.h', + 'src/core/lib/slice/slice_string_helpers.cc', + 'src/core/lib/slice/slice_string_helpers.h', + 'src/core/lib/slice/slice_utils.h', + 'src/core/lib/slice/slice_weak_hash_table.h', + 'src/core/lib/surface/api_trace.cc', + 'src/core/lib/surface/api_trace.h', + 'src/core/lib/surface/byte_buffer.cc', + 'src/core/lib/surface/byte_buffer_reader.cc', + 'src/core/lib/surface/call.cc', + 'src/core/lib/surface/call.h', + 'src/core/lib/surface/call_details.cc', + 'src/core/lib/surface/call_log_batch.cc', + 'src/core/lib/surface/call_test_only.h', + 'src/core/lib/surface/channel.cc', + 'src/core/lib/surface/channel.h', + 'src/core/lib/surface/channel_init.cc', + 'src/core/lib/surface/channel_init.h', + 'src/core/lib/surface/channel_ping.cc', + 'src/core/lib/surface/channel_stack_type.cc', + 'src/core/lib/surface/channel_stack_type.h', + 'src/core/lib/surface/completion_queue.cc', + 'src/core/lib/surface/completion_queue.h', + 'src/core/lib/surface/completion_queue_factory.cc', + 'src/core/lib/surface/completion_queue_factory.h', + 'src/core/lib/surface/event_string.cc', + 'src/core/lib/surface/event_string.h', + 'src/core/lib/surface/init.cc', + 'src/core/lib/surface/init.h', + 'src/core/lib/surface/init_secure.cc', + 'src/core/lib/surface/lame_client.cc', + 'src/core/lib/surface/lame_client.h', + 'src/core/lib/surface/metadata_array.cc', + 'src/core/lib/surface/server.cc', + 'src/core/lib/surface/server.h', + 'src/core/lib/surface/validate_metadata.cc', + 'src/core/lib/surface/validate_metadata.h', + 'src/core/lib/surface/version.cc', + 'src/core/lib/transport/bdp_estimator.cc', + 'src/core/lib/transport/bdp_estimator.h', + 'src/core/lib/transport/byte_stream.cc', + 'src/core/lib/transport/byte_stream.h', + 'src/core/lib/transport/connectivity_state.cc', + 'src/core/lib/transport/connectivity_state.h', + 'src/core/lib/transport/error_utils.cc', + 'src/core/lib/transport/error_utils.h', + 'src/core/lib/transport/http2_errors.h', + 'src/core/lib/transport/metadata.cc', + 'src/core/lib/transport/metadata.h', + 'src/core/lib/transport/metadata_batch.cc', + 'src/core/lib/transport/metadata_batch.h', + 'src/core/lib/transport/pid_controller.cc', + 'src/core/lib/transport/pid_controller.h', + 'src/core/lib/transport/static_metadata.cc', + 'src/core/lib/transport/static_metadata.h', + 'src/core/lib/transport/status_conversion.cc', + 'src/core/lib/transport/status_conversion.h', + 'src/core/lib/transport/status_metadata.cc', + 'src/core/lib/transport/status_metadata.h', + 'src/core/lib/transport/timeout_encoding.cc', + 'src/core/lib/transport/timeout_encoding.h', + 'src/core/lib/transport/transport.cc', + 'src/core/lib/transport/transport.h', + 'src/core/lib/transport/transport_impl.h', + 'src/core/lib/transport/transport_op_string.cc', + 'src/core/lib/uri/uri_parser.cc', + 'src/core/lib/uri/uri_parser.h', + 'src/core/plugin_registry/grpc_plugin_registry.cc', + 'src/core/tsi/alts/crypt/aes_gcm.cc', + 'src/core/tsi/alts/crypt/gsec.cc', + 'src/core/tsi/alts/crypt/gsec.h', + 'src/core/tsi/alts/frame_protector/alts_counter.cc', + 'src/core/tsi/alts/frame_protector/alts_counter.h', + 'src/core/tsi/alts/frame_protector/alts_crypter.cc', + 'src/core/tsi/alts/frame_protector/alts_crypter.h', + 'src/core/tsi/alts/frame_protector/alts_frame_protector.cc', + 'src/core/tsi/alts/frame_protector/alts_frame_protector.h', + 'src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.cc', + 'src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.h', + 'src/core/tsi/alts/frame_protector/alts_seal_privacy_integrity_crypter.cc', + 'src/core/tsi/alts/frame_protector/alts_unseal_privacy_integrity_crypter.cc', + 'src/core/tsi/alts/frame_protector/frame_handler.cc', + 'src/core/tsi/alts/frame_protector/frame_handler.h', + 'src/core/tsi/alts/handshaker/alts_handshaker_client.cc', + 'src/core/tsi/alts/handshaker/alts_handshaker_client.h', + 'src/core/tsi/alts/handshaker/alts_shared_resource.cc', + 'src/core/tsi/alts/handshaker/alts_shared_resource.h', + 'src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc', + 'src/core/tsi/alts/handshaker/alts_tsi_handshaker.h', + 'src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h', + 'src/core/tsi/alts/handshaker/alts_tsi_utils.cc', + 'src/core/tsi/alts/handshaker/alts_tsi_utils.h', + 'src/core/tsi/alts/handshaker/transport_security_common_api.cc', + 'src/core/tsi/alts/handshaker/transport_security_common_api.h', + 'src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc', + 'src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.h', + 'src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc', + 'src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.h', + 'src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol.h', + 'src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc', + 'src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h', + 'src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc', + 'src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.h', + 'src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc', + 'src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h', + 'src/core/tsi/fake_transport_security.cc', + 'src/core/tsi/fake_transport_security.h', + 'src/core/tsi/local_transport_security.cc', + 'src/core/tsi/local_transport_security.h', + 'src/core/tsi/ssl/session_cache/ssl_session.h', + 'src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc', + 'src/core/tsi/ssl/session_cache/ssl_session_cache.cc', + 'src/core/tsi/ssl/session_cache/ssl_session_cache.h', + 'src/core/tsi/ssl/session_cache/ssl_session_openssl.cc', + 'src/core/tsi/ssl_transport_security.cc', + 'src/core/tsi/ssl_transport_security.h', + 'src/core/tsi/ssl_types.h', + 'src/core/tsi/transport_security.cc', + 'src/core/tsi/transport_security.h', + 'src/core/tsi/transport_security_grpc.cc', + 'src/core/tsi/transport_security_grpc.h', + 'src/core/tsi/transport_security_interface.h', + 'third_party/upb/upb/decode.c', + 'third_party/upb/upb/decode.h', + 'third_party/upb/upb/encode.c', + 'third_party/upb/upb/encode.h', + 'third_party/upb/upb/generated_util.h', + 'third_party/upb/upb/msg.c', + 'third_party/upb/upb/msg.h', + 'third_party/upb/upb/port.c', + 'third_party/upb/upb/port_def.inc', + 'third_party/upb/upb/port_undef.inc', + 'third_party/upb/upb/table.c', + 'third_party/upb/upb/table.int.h', + 'third_party/upb/upb/upb.c', + 'third_party/upb/upb/upb.h' + ss.private_header_files = 'src/core/ext/filters/client_channel/backend_metric.h', + 'src/core/ext/filters/client_channel/backup_poller.h', + 'src/core/ext/filters/client_channel/client_channel.h', + 'src/core/ext/filters/client_channel/client_channel_channelz.h', + 'src/core/ext/filters/client_channel/client_channel_factory.h', + 'src/core/ext/filters/client_channel/connector.h', + 'src/core/ext/filters/client_channel/global_subchannel_pool.h', + 'src/core/ext/filters/client_channel/health/health_check_client.h', + 'src/core/ext/filters/client_channel/http_connect_handshaker.h', + 'src/core/ext/filters/client_channel/http_proxy.h', + 'src/core/ext/filters/client_channel/lb_policy.h', + 'src/core/ext/filters/client_channel/lb_policy/address_filtering.h', + 'src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h', + 'src/core/ext/filters/client_channel/lb_policy/subchannel_list.h', + 'src/core/ext/filters/client_channel/lb_policy/xds/xds.h', + 'src/core/ext/filters/client_channel/lb_policy_factory.h', + 'src/core/ext/filters/client_channel/lb_policy_registry.h', + 'src/core/ext/filters/client_channel/local_subchannel_pool.h', + 'src/core/ext/filters/client_channel/parse_address.h', + 'src/core/ext/filters/client_channel/proxy_mapper.h', + 'src/core/ext/filters/client_channel/proxy_mapper_registry.h', + 'src/core/ext/filters/client_channel/resolver.h', + 'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h', + 'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h', + 'src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h', + 'src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h', + 'src/core/ext/filters/client_channel/resolver_factory.h', + 'src/core/ext/filters/client_channel/resolver_registry.h', + 'src/core/ext/filters/client_channel/resolver_result_parsing.h', + 'src/core/ext/filters/client_channel/resolving_lb_policy.h', + 'src/core/ext/filters/client_channel/retry_throttle.h', + 'src/core/ext/filters/client_channel/server_address.h', + 'src/core/ext/filters/client_channel/service_config.h', + 'src/core/ext/filters/client_channel/service_config_call_data.h', + 'src/core/ext/filters/client_channel/service_config_parser.h', + 'src/core/ext/filters/client_channel/subchannel.h', + 'src/core/ext/filters/client_channel/subchannel_interface.h', + 'src/core/ext/filters/client_channel/subchannel_pool_interface.h', + 'src/core/ext/filters/client_channel/xds/xds_api.h', + 'src/core/ext/filters/client_channel/xds/xds_bootstrap.h', + 'src/core/ext/filters/client_channel/xds/xds_channel.h', + 'src/core/ext/filters/client_channel/xds/xds_channel_args.h', + 'src/core/ext/filters/client_channel/xds/xds_client.h', + 'src/core/ext/filters/client_channel/xds/xds_client_stats.h', + 'src/core/ext/filters/deadline/deadline_filter.h', + 'src/core/ext/filters/http/client/http_client_filter.h', + 'src/core/ext/filters/http/client_authority_filter.h', + 'src/core/ext/filters/http/message_compress/message_compress_filter.h', + 'src/core/ext/filters/http/message_compress/message_decompress_filter.h', + 'src/core/ext/filters/http/server/http_server_filter.h', + 'src/core/ext/filters/max_age/max_age_filter.h', + 'src/core/ext/filters/message_size/message_size_filter.h', + 'src/core/ext/filters/workarounds/workaround_cronet_compression_filter.h', + 'src/core/ext/filters/workarounds/workaround_utils.h', + 'src/core/ext/transport/chttp2/alpn/alpn.h', + 'src/core/ext/transport/chttp2/client/authority.h', + 'src/core/ext/transport/chttp2/client/chttp2_connector.h', + 'src/core/ext/transport/chttp2/server/chttp2_server.h', + 'src/core/ext/transport/chttp2/transport/bin_decoder.h', + 'src/core/ext/transport/chttp2/transport/bin_encoder.h', + 'src/core/ext/transport/chttp2/transport/chttp2_transport.h', + 'src/core/ext/transport/chttp2/transport/context_list.h', + 'src/core/ext/transport/chttp2/transport/flow_control.h', + 'src/core/ext/transport/chttp2/transport/frame.h', + 'src/core/ext/transport/chttp2/transport/frame_data.h', + 'src/core/ext/transport/chttp2/transport/frame_goaway.h', + 'src/core/ext/transport/chttp2/transport/frame_ping.h', + 'src/core/ext/transport/chttp2/transport/frame_rst_stream.h', + 'src/core/ext/transport/chttp2/transport/frame_settings.h', + 'src/core/ext/transport/chttp2/transport/frame_window_update.h', + 'src/core/ext/transport/chttp2/transport/hpack_encoder.h', + 'src/core/ext/transport/chttp2/transport/hpack_parser.h', + 'src/core/ext/transport/chttp2/transport/hpack_table.h', + 'src/core/ext/transport/chttp2/transport/http2_settings.h', + 'src/core/ext/transport/chttp2/transport/huffsyms.h', + 'src/core/ext/transport/chttp2/transport/incoming_metadata.h', + 'src/core/ext/transport/chttp2/transport/internal.h', + 'src/core/ext/transport/chttp2/transport/stream_map.h', + 'src/core/ext/transport/chttp2/transport/varint.h', + 'src/core/ext/transport/inproc/inproc_transport.h', + 'src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h', + 'src/core/ext/upb-generated/envoy/annotations/resource.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/cds.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/eds.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/lds.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/listener.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/rds.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/route.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/route/route.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/srds.upb.h', + 'src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h', + 'src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h', + 'src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h', + 'src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h', + 'src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h', + 'src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h', + 'src/core/ext/upb-generated/envoy/type/http.upb.h', + 'src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h', + 'src/core/ext/upb-generated/envoy/type/matcher/string.upb.h', + 'src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.h', + 'src/core/ext/upb-generated/envoy/type/percent.upb.h', + 'src/core/ext/upb-generated/envoy/type/range.upb.h', + 'src/core/ext/upb-generated/envoy/type/semantic_version.upb.h', + 'src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.h', + 'src/core/ext/upb-generated/gogoproto/gogo.upb.h', + 'src/core/ext/upb-generated/google/api/annotations.upb.h', + 'src/core/ext/upb-generated/google/api/http.upb.h', + 'src/core/ext/upb-generated/google/protobuf/any.upb.h', + 'src/core/ext/upb-generated/google/protobuf/descriptor.upb.h', + 'src/core/ext/upb-generated/google/protobuf/duration.upb.h', + 'src/core/ext/upb-generated/google/protobuf/empty.upb.h', + 'src/core/ext/upb-generated/google/protobuf/struct.upb.h', + 'src/core/ext/upb-generated/google/protobuf/timestamp.upb.h', + 'src/core/ext/upb-generated/google/protobuf/wrappers.upb.h', + 'src/core/ext/upb-generated/google/rpc/status.upb.h', + 'src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h', + 'src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h', + 'src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h', + 'src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h', + 'src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h', + 'src/core/ext/upb-generated/udpa/annotations/migrate.upb.h', + 'src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h', + 'src/core/ext/upb-generated/udpa/annotations/status.upb.h', + 'src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h', + 'src/core/ext/upb-generated/validate/validate.upb.h', + 'src/core/lib/avl/avl.h', + 'src/core/lib/backoff/backoff.h', + 'src/core/lib/channel/channel_args.h', + 'src/core/lib/channel/channel_stack.h', + 'src/core/lib/channel/channel_stack_builder.h', + 'src/core/lib/channel/channel_trace.h', + 'src/core/lib/channel/channelz.h', + 'src/core/lib/channel/channelz_registry.h', + 'src/core/lib/channel/connected_channel.h', + 'src/core/lib/channel/context.h', + 'src/core/lib/channel/handshaker.h', + 'src/core/lib/channel/handshaker_factory.h', + 'src/core/lib/channel/handshaker_registry.h', + 'src/core/lib/channel/status_util.h', + 'src/core/lib/compression/algorithm_metadata.h', + 'src/core/lib/compression/compression_args.h', + 'src/core/lib/compression/compression_internal.h', + 'src/core/lib/compression/message_compress.h', + 'src/core/lib/compression/stream_compression.h', + 'src/core/lib/compression/stream_compression_gzip.h', + 'src/core/lib/compression/stream_compression_identity.h', + 'src/core/lib/debug/stats.h', + 'src/core/lib/debug/stats_data.h', + 'src/core/lib/debug/trace.h', + 'src/core/lib/gpr/alloc.h', + 'src/core/lib/gpr/arena.h', + 'src/core/lib/gpr/env.h', + 'src/core/lib/gpr/murmur_hash.h', + 'src/core/lib/gpr/spinlock.h', + 'src/core/lib/gpr/string.h', + 'src/core/lib/gpr/string_windows.h', + 'src/core/lib/gpr/time_precise.h', + 'src/core/lib/gpr/tls.h', + 'src/core/lib/gpr/tls_gcc.h', + 'src/core/lib/gpr/tls_msvc.h', + 'src/core/lib/gpr/tls_pthread.h', + 'src/core/lib/gpr/tmpfile.h', + 'src/core/lib/gpr/useful.h', + 'src/core/lib/gprpp/arena.h', + 'src/core/lib/gprpp/atomic.h', + 'src/core/lib/gprpp/debug_location.h', + 'src/core/lib/gprpp/fork.h', + 'src/core/lib/gprpp/global_config.h', + 'src/core/lib/gprpp/global_config_custom.h', + 'src/core/lib/gprpp/global_config_env.h', + 'src/core/lib/gprpp/global_config_generic.h', + 'src/core/lib/gprpp/host_port.h', + 'src/core/lib/gprpp/manual_constructor.h', + 'src/core/lib/gprpp/map.h', + 'src/core/lib/gprpp/memory.h', + 'src/core/lib/gprpp/mpscq.h', + 'src/core/lib/gprpp/orphanable.h', + 'src/core/lib/gprpp/ref_counted.h', + 'src/core/lib/gprpp/ref_counted_ptr.h', + 'src/core/lib/gprpp/sync.h', + 'src/core/lib/gprpp/thd.h', + 'src/core/lib/http/format_request.h', + 'src/core/lib/http/httpcli.h', + 'src/core/lib/http/parser.h', + 'src/core/lib/iomgr/block_annotate.h', + 'src/core/lib/iomgr/buffer_list.h', + 'src/core/lib/iomgr/call_combiner.h', + 'src/core/lib/iomgr/cfstream_handle.h', + 'src/core/lib/iomgr/closure.h', + 'src/core/lib/iomgr/combiner.h', + 'src/core/lib/iomgr/dynamic_annotations.h', + 'src/core/lib/iomgr/endpoint.h', + 'src/core/lib/iomgr/endpoint_cfstream.h', + 'src/core/lib/iomgr/endpoint_pair.h', + 'src/core/lib/iomgr/error.h', + 'src/core/lib/iomgr/error_cfstream.h', + 'src/core/lib/iomgr/error_internal.h', + 'src/core/lib/iomgr/ev_apple.h', + 'src/core/lib/iomgr/ev_epoll1_linux.h', + 'src/core/lib/iomgr/ev_epollex_linux.h', + 'src/core/lib/iomgr/ev_poll_posix.h', + 'src/core/lib/iomgr/ev_posix.h', + 'src/core/lib/iomgr/exec_ctx.h', + 'src/core/lib/iomgr/executor.h', + 'src/core/lib/iomgr/executor/mpmcqueue.h', + 'src/core/lib/iomgr/executor/threadpool.h', + 'src/core/lib/iomgr/gethostname.h', + 'src/core/lib/iomgr/grpc_if_nametoindex.h', + 'src/core/lib/iomgr/internal_errqueue.h', + 'src/core/lib/iomgr/iocp_windows.h', + 'src/core/lib/iomgr/iomgr.h', + 'src/core/lib/iomgr/iomgr_custom.h', + 'src/core/lib/iomgr/iomgr_internal.h', + 'src/core/lib/iomgr/iomgr_posix.h', + 'src/core/lib/iomgr/is_epollexclusive_available.h', + 'src/core/lib/iomgr/load_file.h', + 'src/core/lib/iomgr/lockfree_event.h', + 'src/core/lib/iomgr/nameser.h', + 'src/core/lib/iomgr/poller/eventmanager_libuv.h', + 'src/core/lib/iomgr/polling_entity.h', + 'src/core/lib/iomgr/pollset.h', + 'src/core/lib/iomgr/pollset_custom.h', + 'src/core/lib/iomgr/pollset_set.h', + 'src/core/lib/iomgr/pollset_set_custom.h', + 'src/core/lib/iomgr/pollset_set_windows.h', + 'src/core/lib/iomgr/pollset_uv.h', + 'src/core/lib/iomgr/pollset_windows.h', + 'src/core/lib/iomgr/port.h', + 'src/core/lib/iomgr/python_util.h', + 'src/core/lib/iomgr/resolve_address.h', + 'src/core/lib/iomgr/resolve_address_custom.h', + 'src/core/lib/iomgr/resource_quota.h', + 'src/core/lib/iomgr/sockaddr.h', + 'src/core/lib/iomgr/sockaddr_custom.h', + 'src/core/lib/iomgr/sockaddr_posix.h', + 'src/core/lib/iomgr/sockaddr_utils.h', + 'src/core/lib/iomgr/sockaddr_windows.h', + 'src/core/lib/iomgr/socket_factory_posix.h', + 'src/core/lib/iomgr/socket_mutator.h', + 'src/core/lib/iomgr/socket_utils.h', + 'src/core/lib/iomgr/socket_utils_posix.h', + 'src/core/lib/iomgr/socket_windows.h', + 'src/core/lib/iomgr/sys_epoll_wrapper.h', + 'src/core/lib/iomgr/tcp_client.h', + 'src/core/lib/iomgr/tcp_client_posix.h', + 'src/core/lib/iomgr/tcp_custom.h', + 'src/core/lib/iomgr/tcp_posix.h', + 'src/core/lib/iomgr/tcp_server.h', + 'src/core/lib/iomgr/tcp_server_utils_posix.h', + 'src/core/lib/iomgr/tcp_windows.h', + 'src/core/lib/iomgr/time_averaged_stats.h', + 'src/core/lib/iomgr/timer.h', + 'src/core/lib/iomgr/timer_custom.h', + 'src/core/lib/iomgr/timer_generic.h', + 'src/core/lib/iomgr/timer_heap.h', + 'src/core/lib/iomgr/timer_manager.h', + 'src/core/lib/iomgr/udp_server.h', + 'src/core/lib/iomgr/unix_sockets_posix.h', + 'src/core/lib/iomgr/wakeup_fd_pipe.h', + 'src/core/lib/iomgr/wakeup_fd_posix.h', + 'src/core/lib/iomgr/work_serializer.h', + 'src/core/lib/json/json.h', + 'src/core/lib/profiling/timers.h', + 'src/core/lib/security/context/security_context.h', + 'src/core/lib/security/credentials/alts/alts_credentials.h', + 'src/core/lib/security/credentials/alts/check_gcp_environment.h', + 'src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h', + 'src/core/lib/security/credentials/composite/composite_credentials.h', + 'src/core/lib/security/credentials/credentials.h', + 'src/core/lib/security/credentials/fake/fake_credentials.h', + 'src/core/lib/security/credentials/google_default/google_default_credentials.h', + 'src/core/lib/security/credentials/iam/iam_credentials.h', + 'src/core/lib/security/credentials/jwt/json_token.h', + 'src/core/lib/security/credentials/jwt/jwt_credentials.h', + 'src/core/lib/security/credentials/jwt/jwt_verifier.h', + 'src/core/lib/security/credentials/local/local_credentials.h', + 'src/core/lib/security/credentials/oauth2/oauth2_credentials.h', + 'src/core/lib/security/credentials/plugin/plugin_credentials.h', + 'src/core/lib/security/credentials/ssl/ssl_credentials.h', + 'src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h', + 'src/core/lib/security/credentials/tls/tls_credentials.h', + 'src/core/lib/security/security_connector/alts/alts_security_connector.h', + 'src/core/lib/security/security_connector/fake/fake_security_connector.h', + 'src/core/lib/security/security_connector/load_system_roots.h', + 'src/core/lib/security/security_connector/load_system_roots_linux.h', + 'src/core/lib/security/security_connector/local/local_security_connector.h', + 'src/core/lib/security/security_connector/security_connector.h', + 'src/core/lib/security/security_connector/ssl/ssl_security_connector.h', + 'src/core/lib/security/security_connector/ssl_utils.h', + 'src/core/lib/security/security_connector/ssl_utils_config.h', + 'src/core/lib/security/security_connector/tls/tls_security_connector.h', + 'src/core/lib/security/transport/auth_filters.h', + 'src/core/lib/security/transport/secure_endpoint.h', + 'src/core/lib/security/transport/security_handshaker.h', + 'src/core/lib/security/transport/target_authority_table.h', + 'src/core/lib/security/transport/tsi_error.h', + 'src/core/lib/security/util/json_util.h', + 'src/core/lib/slice/b64.h', + 'src/core/lib/slice/percent_encoding.h', + 'src/core/lib/slice/slice_hash_table.h', + 'src/core/lib/slice/slice_internal.h', + 'src/core/lib/slice/slice_string_helpers.h', + 'src/core/lib/slice/slice_utils.h', + 'src/core/lib/slice/slice_weak_hash_table.h', + 'src/core/lib/surface/api_trace.h', + 'src/core/lib/surface/call.h', + 'src/core/lib/surface/call_test_only.h', + 'src/core/lib/surface/channel.h', + 'src/core/lib/surface/channel_init.h', + 'src/core/lib/surface/channel_stack_type.h', + 'src/core/lib/surface/completion_queue.h', + 'src/core/lib/surface/completion_queue_factory.h', + 'src/core/lib/surface/event_string.h', + 'src/core/lib/surface/init.h', + 'src/core/lib/surface/lame_client.h', + 'src/core/lib/surface/server.h', + 'src/core/lib/surface/validate_metadata.h', + 'src/core/lib/transport/bdp_estimator.h', + 'src/core/lib/transport/byte_stream.h', + 'src/core/lib/transport/connectivity_state.h', + 'src/core/lib/transport/error_utils.h', + 'src/core/lib/transport/http2_errors.h', + 'src/core/lib/transport/metadata.h', + 'src/core/lib/transport/metadata_batch.h', + 'src/core/lib/transport/pid_controller.h', + 'src/core/lib/transport/static_metadata.h', + 'src/core/lib/transport/status_conversion.h', + 'src/core/lib/transport/status_metadata.h', + 'src/core/lib/transport/timeout_encoding.h', + 'src/core/lib/transport/transport.h', + 'src/core/lib/transport/transport_impl.h', + 'src/core/lib/uri/uri_parser.h', + 'src/core/tsi/alts/crypt/gsec.h', + 'src/core/tsi/alts/frame_protector/alts_counter.h', + 'src/core/tsi/alts/frame_protector/alts_crypter.h', + 'src/core/tsi/alts/frame_protector/alts_frame_protector.h', + 'src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.h', + 'src/core/tsi/alts/frame_protector/frame_handler.h', + 'src/core/tsi/alts/handshaker/alts_handshaker_client.h', + 'src/core/tsi/alts/handshaker/alts_shared_resource.h', + 'src/core/tsi/alts/handshaker/alts_tsi_handshaker.h', + 'src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h', + 'src/core/tsi/alts/handshaker/alts_tsi_utils.h', + 'src/core/tsi/alts/handshaker/transport_security_common_api.h', + 'src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.h', + 'src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.h', + 'src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol.h', + 'src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h', + 'src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.h', + 'src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h', + 'src/core/tsi/fake_transport_security.h', + 'src/core/tsi/local_transport_security.h', + 'src/core/tsi/ssl/session_cache/ssl_session.h', + 'src/core/tsi/ssl/session_cache/ssl_session_cache.h', + 'src/core/tsi/ssl_transport_security.h', + 'src/core/tsi/ssl_types.h', + 'src/core/tsi/transport_security.h', + 'src/core/tsi/transport_security_grpc.h', + 'src/core/tsi/transport_security_interface.h', + 'third_party/upb/upb/decode.h', + 'third_party/upb/upb/encode.h', + 'third_party/upb/upb/generated_util.h', + 'third_party/upb/upb/msg.h', + 'third_party/upb/upb/port_def.inc', + 'third_party/upb/upb/port_undef.inc', + 'third_party/upb/upb/table.int.h', + 'third_party/upb/upb/upb.h' + end + + # CFStream is now default. Leaving this subspec only for compatibility purpose. + s.subspec 'CFStream-Implementation' do |ss| + ss.dependency "#{s.name}/Implementation", version + end + + s.subspec 'Cronet-Interface' do |ss| + ss.header_mappings_dir = 'include/grpc' + ss.source_files = 'include/grpc/grpc_cronet.h' + end + + s.subspec 'Cronet-Implementation' do |ss| + ss.header_mappings_dir = '.' + + ss.dependency "#{s.name}/Interface", version + ss.dependency "#{s.name}/Implementation", version + ss.dependency "#{s.name}/Cronet-Interface", version + + ss.source_files = 'src/core/ext/transport/cronet/client/secure/cronet_channel_create.cc', + 'src/core/ext/transport/cronet/client/secure/cronet_channel_create.h', + 'src/core/ext/transport/cronet/transport/cronet_transport.cc', + 'src/core/ext/transport/cronet/transport/cronet_transport.h', + 'third_party/objective_c/Cronet/bidirectional_stream_c.h' + end + + s.subspec 'Tests' do |ss| + ss.header_mappings_dir = '.' + + ss.dependency "#{s.name}/Interface", version + ss.dependency "#{s.name}/Implementation", version + + ss.source_files = 'test/core/end2end/cq_verifier.cc', + 'test/core/end2end/cq_verifier.h', + 'test/core/end2end/data/client_certs.cc', + 'test/core/end2end/data/server1_cert.cc', + 'test/core/end2end/data/server1_key.cc', + 'test/core/end2end/data/ssl_test_data.h', + 'test/core/end2end/data/test_root_cert.cc', + 'test/core/end2end/end2end_test_utils.cc', + 'test/core/end2end/end2end_tests.cc', + 'test/core/end2end/end2end_tests.h', + 'test/core/end2end/fixtures/http_proxy_fixture.cc', + 'test/core/end2end/fixtures/http_proxy_fixture.h', + 'test/core/end2end/fixtures/local_util.cc', + 'test/core/end2end/fixtures/local_util.h', + 'test/core/end2end/fixtures/proxy.cc', + 'test/core/end2end/fixtures/proxy.h', + 'test/core/end2end/tests/authority_not_supported.cc', + 'test/core/end2end/tests/bad_hostname.cc', + 'test/core/end2end/tests/bad_ping.cc', + 'test/core/end2end/tests/binary_metadata.cc', + 'test/core/end2end/tests/call_creds.cc', + 'test/core/end2end/tests/call_host_override.cc', + 'test/core/end2end/tests/cancel_after_accept.cc', + 'test/core/end2end/tests/cancel_after_client_done.cc', + 'test/core/end2end/tests/cancel_after_invoke.cc', + 'test/core/end2end/tests/cancel_after_round_trip.cc', + 'test/core/end2end/tests/cancel_before_invoke.cc', + 'test/core/end2end/tests/cancel_in_a_vacuum.cc', + 'test/core/end2end/tests/cancel_test_helpers.h', + 'test/core/end2end/tests/cancel_with_status.cc', + 'test/core/end2end/tests/channelz.cc', + 'test/core/end2end/tests/client_streaming.cc', + 'test/core/end2end/tests/compressed_payload.cc', + 'test/core/end2end/tests/connectivity.cc', + 'test/core/end2end/tests/default_host.cc', + 'test/core/end2end/tests/disappearing_server.cc', + 'test/core/end2end/tests/empty_batch.cc', + 'test/core/end2end/tests/filter_call_init_fails.cc', + 'test/core/end2end/tests/filter_causes_close.cc', + 'test/core/end2end/tests/filter_context.cc', + 'test/core/end2end/tests/filter_latency.cc', + 'test/core/end2end/tests/filter_status_code.cc', + 'test/core/end2end/tests/graceful_server_shutdown.cc', + 'test/core/end2end/tests/high_initial_seqno.cc', + 'test/core/end2end/tests/hpack_size.cc', + 'test/core/end2end/tests/idempotent_request.cc', + 'test/core/end2end/tests/invoke_large_request.cc', + 'test/core/end2end/tests/keepalive_timeout.cc', + 'test/core/end2end/tests/large_metadata.cc', + 'test/core/end2end/tests/max_concurrent_streams.cc', + 'test/core/end2end/tests/max_connection_age.cc', + 'test/core/end2end/tests/max_connection_idle.cc', + 'test/core/end2end/tests/max_message_length.cc', + 'test/core/end2end/tests/negative_deadline.cc', + 'test/core/end2end/tests/no_error_on_hotpath.cc', + 'test/core/end2end/tests/no_logging.cc', + 'test/core/end2end/tests/no_op.cc', + 'test/core/end2end/tests/payload.cc', + 'test/core/end2end/tests/ping.cc', + 'test/core/end2end/tests/ping_pong_streaming.cc', + 'test/core/end2end/tests/proxy_auth.cc', + 'test/core/end2end/tests/registered_call.cc', + 'test/core/end2end/tests/request_with_flags.cc', + 'test/core/end2end/tests/request_with_payload.cc', + 'test/core/end2end/tests/resource_quota_server.cc', + 'test/core/end2end/tests/retry.cc', + 'test/core/end2end/tests/retry_cancellation.cc', + 'test/core/end2end/tests/retry_disabled.cc', + 'test/core/end2end/tests/retry_exceeds_buffer_size_in_initial_batch.cc', + 'test/core/end2end/tests/retry_exceeds_buffer_size_in_subsequent_batch.cc', + 'test/core/end2end/tests/retry_non_retriable_status.cc', + 'test/core/end2end/tests/retry_non_retriable_status_before_recv_trailing_metadata_started.cc', + 'test/core/end2end/tests/retry_recv_initial_metadata.cc', + 'test/core/end2end/tests/retry_recv_message.cc', + 'test/core/end2end/tests/retry_server_pushback_delay.cc', + 'test/core/end2end/tests/retry_server_pushback_disabled.cc', + 'test/core/end2end/tests/retry_streaming.cc', + 'test/core/end2end/tests/retry_streaming_after_commit.cc', + 'test/core/end2end/tests/retry_streaming_succeeds_before_replay_finished.cc', + 'test/core/end2end/tests/retry_throttled.cc', + 'test/core/end2end/tests/retry_too_many_attempts.cc', + 'test/core/end2end/tests/server_finishes_request.cc', + 'test/core/end2end/tests/shutdown_finishes_calls.cc', + 'test/core/end2end/tests/shutdown_finishes_tags.cc', + 'test/core/end2end/tests/simple_cacheable_request.cc', + 'test/core/end2end/tests/simple_delayed_request.cc', + 'test/core/end2end/tests/simple_metadata.cc', + 'test/core/end2end/tests/simple_request.cc', + 'test/core/end2end/tests/stream_compression_compressed_payload.cc', + 'test/core/end2end/tests/stream_compression_payload.cc', + 'test/core/end2end/tests/stream_compression_ping_pong_streaming.cc', + 'test/core/end2end/tests/streaming_error_response.cc', + 'test/core/end2end/tests/trailing_metadata.cc', + 'test/core/end2end/tests/workaround_cronet_compression.cc', + 'test/core/end2end/tests/write_buffering.cc', + 'test/core/end2end/tests/write_buffering_at_end.cc', + 'test/core/util/cmdline.cc', + 'test/core/util/cmdline.h', + 'test/core/util/debugger_macros.cc', + 'test/core/util/debugger_macros.h', + 'test/core/util/fuzzer_util.cc', + 'test/core/util/fuzzer_util.h', + 'test/core/util/grpc_profiler.cc', + 'test/core/util/grpc_profiler.h', + 'test/core/util/histogram.cc', + 'test/core/util/histogram.h', + 'test/core/util/memory_counters.cc', + 'test/core/util/memory_counters.h', + 'test/core/util/mock_endpoint.cc', + 'test/core/util/mock_endpoint.h', + 'test/core/util/parse_hexstring.cc', + 'test/core/util/parse_hexstring.h', + 'test/core/util/passthru_endpoint.cc', + 'test/core/util/passthru_endpoint.h', + 'test/core/util/port.cc', + 'test/core/util/port.h', + 'test/core/util/port_isolated_runtime_environment.cc', + 'test/core/util/port_server_client.cc', + 'test/core/util/port_server_client.h', + 'test/core/util/reconnect_server.cc', + 'test/core/util/reconnect_server.h', + 'test/core/util/slice_splitter.cc', + 'test/core/util/slice_splitter.h', + 'test/core/util/subprocess.h', + 'test/core/util/subprocess_windows.cc', + 'test/core/util/test_config.cc', + 'test/core/util/test_config.h', + 'test/core/util/test_tcp_server.cc', + 'test/core/util/test_tcp_server.h', + 'test/core/util/tracer_util.cc', + 'test/core/util/tracer_util.h', + 'test/core/util/trickle_endpoint.cc', + 'test/core/util/trickle_endpoint.h' + end + + # TODO (mxyan): Instead of this hack, add include path "third_party" to C core's include path? + s.prepare_command = <<-END_OF_COMMAND + sed -E -i '' 's;#include ;#if COCOAPODS==1\\\n #include \\\n#else\\\n #include \\\n#endif;g' $(find src/core -type f \\( -path '*.h' -or -path '*.cc' \\) -print | xargs grep -H -c '#include 'grpc-packages@google.com' } + + s.source = { + :git => 'https://github.com/grpc/grpc.git', + :tag => "v#{version}", + } + + s.ios.deployment_target = '7.0' + s.osx.deployment_target = '10.9' + s.tvos.deployment_target = '10.0' + s.watchos.deployment_target = '4.0' + + name = 'ProtoRPC' + s.module_name = name + s.header_dir = name + + s.default_subspec = 'Main', 'Legacy', 'Legacy-Header' + + s.subspec 'Legacy-Header' do |ss| + ss.header_mappings_dir = "src/objective-c/ProtoRPC" + ss.public_header_files = "src/objective-c/ProtoRPC/ProtoRPCLegacy.h" + ss.source_files = "src/objective-c/ProtoRPC/ProtoRPCLegacy.h" + end + + s.subspec 'Main' do |ss| + ss.header_mappings_dir = "src/objective-c/ProtoRPC" + ss.dependency "#{s.name}/Legacy-Header", version + ss.dependency 'gRPC/Interface', version + ss.dependency 'Protobuf', '~> 3.0' + + ss.source_files = "src/objective-c/ProtoRPC/ProtoMethod.{h,m}", + "src/objective-c/ProtoRPC/ProtoRPC.{h,m}", + "src/objective-c/ProtoRPC/ProtoService.{h,m}" + end + + s.subspec 'Legacy' do |ss| + ss.header_mappings_dir = "src/objective-c/ProtoRPC" + ss.dependency "#{s.name}/Main", version + ss.dependency "#{s.name}/Legacy-Header", version + ss.dependency 'gRPC/GRPCCore', version + ss.dependency 'gRPC-RxLibrary', version + ss.dependency 'Protobuf', '~> 3.0' + + ss.source_files = "src/objective-c/ProtoRPC/ProtoRPCLegacy.m", + "src/objective-c/ProtoRPC/ProtoServiceLegacy.m" + end + + # CFStream is now default. Leaving this subspec only for compatibility purpose. + s.subspec 'CFStream' do |ss| + ss.dependency "#{s.name}/Legacy", version + end + + s.pod_target_xcconfig = { + # This is needed by all pods that depend on Protobuf: + 'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited) GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1', + # This is needed by all pods that depend on gRPC-RxLibrary: + 'CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES' => 'YES', + 'CLANG_WARN_STRICT_PROTOTYPES' => 'NO', + } +end diff --git a/gRPC-RxLibrary.podspec b/gRPC-RxLibrary.podspec new file mode 100644 index 00000000..b87212a9 --- /dev/null +++ b/gRPC-RxLibrary.podspec @@ -0,0 +1,70 @@ +# This file has been automatically generated from a template file. +# Please make modifications to +# `templates/gRPC-RxLibrary.podspec.template` instead. This file can be +# regenerated from the template by running +# `tools/buildgen/generate_projects.sh`. + +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +Pod::Spec.new do |s| + s.name = 'gRPC-RxLibrary' + version = '1.30.2' + s.version = version + s.summary = 'Reactive Extensions library for iOS/OSX.' + s.homepage = 'https://grpc.io' + s.license = 'Apache License, Version 2.0' + s.authors = { 'The gRPC contributors' => 'grpc-packages@google.com' } + + s.source = { + :git => 'https://github.com/grpc/grpc.git', + :tag => "v#{version}", + } + + s.ios.deployment_target = '7.0' + s.osx.deployment_target = '10.9' + s.tvos.deployment_target = '10.0' + s.watchos.deployment_target = '4.0' + + name = 'RxLibrary' + s.module_name = name + s.header_dir = name + + s.default_subspec = 'Interface', 'Implementation' + + src_dir = 'src/objective-c/RxLibrary' + s.subspec 'Interface' do |ss| + ss.header_mappings_dir = "#{src_dir}" + ss.source_files = "#{src_dir}/*.h" + ss.public_header_files = "#{src_dir}/*.h" + end + + s.subspec 'Implementation' do |ss| + ss.header_mappings_dir = "#{src_dir}" + ss.source_files = "#{src_dir}/*.m", "#{src_dir}/**/*.{h,m}" + ss.private_header_files = "#{src_dir}/**/*.h" + + ss.dependency "#{s.name}/Interface" + end + + src_dir = 'src/objective-c/RxLibrary' + s.source_files = "#{src_dir}/*.{h,m}", "#{src_dir}/**/*.{h,m}" + s.private_header_files = "#{src_dir}/private/*.h" + s.header_mappings_dir = "#{src_dir}" + + s.pod_target_xcconfig = { + 'CLANG_WARN_STRICT_PROTOTYPES' => 'NO', + } +end diff --git a/gRPC.podspec b/gRPC.podspec new file mode 100644 index 00000000..5c2ff46b --- /dev/null +++ b/gRPC.podspec @@ -0,0 +1,184 @@ +# This file has been automatically generated from a template file. +# Please make modifications to `templates/gRPC.podspec.template` +# instead. This file can be regenerated from the template by running +# `tools/buildgen/generate_projects.sh`. + +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +Pod::Spec.new do |s| + s.name = 'gRPC' + version = '1.30.2' + s.version = version + s.summary = 'gRPC client library for iOS/OSX' + s.homepage = 'https://grpc.io' + s.license = 'Apache License, Version 2.0' + s.authors = { 'The gRPC contributors' => 'grpc-packages@google.com' } + + s.source = { + :git => 'https://github.com/grpc/grpc.git', + :tag => "v#{version}", + } + + name = 'GRPCClient' + s.module_name = name + s.header_dir = name + + s.default_subspec = 'Interface', 'GRPCCore', 'Interface-Legacy' + + s.pod_target_xcconfig = { + # This is needed by all pods that depend on gRPC-RxLibrary: + 'CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES' => 'YES', + 'CLANG_WARN_STRICT_PROTOTYPES' => 'NO', + } + + s.ios.deployment_target = '7.0' + s.osx.deployment_target = '10.9' + s.tvos.deployment_target = '10.0' + s.watchos.deployment_target = '4.0' + + s.subspec 'Interface-Legacy' do |ss| + ss.header_mappings_dir = 'src/objective-c/GRPCClient' + + ss.public_header_files = "src/objective-c/GRPCClient/GRPCCall+ChannelArg.h", + "src/objective-c/GRPCClient/GRPCCall+ChannelCredentials.h", + "src/objective-c/GRPCClient/GRPCCall+Cronet.h", + "src/objective-c/GRPCClient/GRPCCall+OAuth2.h", + "src/objective-c/GRPCClient/GRPCCall+Tests.h", + "src/objective-c/GRPCClient/GRPCCallLegacy.h", + "src/objective-c/GRPCClient/GRPCTypes.h" + + ss.source_files = "src/objective-c/GRPCClient/GRPCCall+ChannelArg.h", + "src/objective-c/GRPCClient/GRPCCall+ChannelCredentials.h", + "src/objective-c/GRPCClient/GRPCCall+Cronet.h", + "src/objective-c/GRPCClient/GRPCCall+OAuth2.h", + "src/objective-c/GRPCClient/GRPCCall+Tests.h", + "src/objective-c/GRPCClient/GRPCCallLegacy.h", + "src/objective-c/GRPCClient/GRPCTypes.h", + "src/objective-c/GRPCClient/GRPCTypes.m" + ss.dependency "gRPC-RxLibrary/Interface", version + + ss.ios.deployment_target = '7.0' + ss.osx.deployment_target = '10.9' + ss.tvos.deployment_target = '10.0' + ss.watchos.deployment_target = '4.0' + end + + s.subspec 'Interface' do |ss| + ss.header_mappings_dir = 'src/objective-c/GRPCClient' + + ss.public_header_files = 'src/objective-c/GRPCClient/GRPCCall.h', + 'src/objective-c/GRPCClient/GRPCCall+Interceptor.h', + 'src/objective-c/GRPCClient/GRPCCallOptions.h', + 'src/objective-c/GRPCClient/GRPCInterceptor.h', + 'src/objective-c/GRPCClient/GRPCTransport.h', + 'src/objective-c/GRPCClient/GRPCDispatchable.h', + 'src/objective-c/GRPCClient/version.h' + + ss.source_files = 'src/objective-c/GRPCClient/GRPCCall.h', + 'src/objective-c/GRPCClient/GRPCCall.m', + 'src/objective-c/GRPCClient/GRPCCall+Interceptor.h', + 'src/objective-c/GRPCClient/GRPCCall+Interceptor.m', + 'src/objective-c/GRPCClient/GRPCCallOptions.h', + 'src/objective-c/GRPCClient/GRPCCallOptions.m', + 'src/objective-c/GRPCClient/GRPCDispatchable.h', + 'src/objective-c/GRPCClient/GRPCInterceptor.h', + 'src/objective-c/GRPCClient/GRPCInterceptor.m', + 'src/objective-c/GRPCClient/GRPCTransport.h', + 'src/objective-c/GRPCClient/GRPCTransport.m', + 'src/objective-c/GRPCClient/internal/*.h', + 'src/objective-c/GRPCClient/private/GRPCTransport+Private.h', + 'src/objective-c/GRPCClient/private/GRPCTransport+Private.m', + 'src/objective-c/GRPCClient/version.h' + + ss.dependency "#{s.name}/Interface-Legacy", version + + ss.ios.deployment_target = '7.0' + ss.osx.deployment_target = '10.9' + ss.tvos.deployment_target = '10.0' + ss.watchos.deployment_target = '4.0' + end + + s.subspec 'GRPCCore' do |ss| + ss.header_mappings_dir = 'src/objective-c/GRPCClient' + + ss.public_header_files = 'src/objective-c/GRPCClient/GRPCCall+ChannelCredentials.h', + 'src/objective-c/GRPCClient/GRPCCall+Cronet.h', + 'src/objective-c/GRPCClient/GRPCCall+OAuth2.h', + 'src/objective-c/GRPCClient/GRPCCall+Tests.h', + 'src/objective-c/GRPCClient/GRPCCall+ChannelArg.h' + ss.private_header_files = 'src/objective-c/GRPCClient/private/GRPCCore/*.h' + ss.source_files = 'src/objective-c/GRPCClient/private/GRPCCore/*.{h,m}', + 'src/objective-c/GRPCClient/GRPCCall+ChannelArg.h', + 'src/objective-c/GRPCClient/GRPCCall+ChannelArg.m', + 'src/objective-c/GRPCClient/GRPCCall+ChannelCredentials.h', + 'src/objective-c/GRPCClient/GRPCCall+ChannelCredentials.m', + 'src/objective-c/GRPCClient/GRPCCall+Cronet.h', + 'src/objective-c/GRPCClient/GRPCCall+Cronet.m', + 'src/objective-c/GRPCClient/GRPCCall+OAuth2.h', + 'src/objective-c/GRPCClient/GRPCCall+OAuth2.m', + 'src/objective-c/GRPCClient/GRPCCall+Tests.h', + 'src/objective-c/GRPCClient/GRPCCall+Tests.m', + 'src/objective-c/GRPCClient/GRPCCallLegacy.m' + + # Certificates, to be able to establish TLS connections: + ss.resource_bundles = { 'gRPCCertificates' => ['etc/roots.pem'] } + + ss.dependency "#{s.name}/Interface-Legacy", version + ss.dependency "#{s.name}/Interface", version + ss.dependency 'gRPC-Core', version + ss.dependency 'gRPC-RxLibrary', version + + ss.ios.deployment_target = '7.0' + ss.osx.deployment_target = '10.9' + ss.tvos.deployment_target = '10.0' + ss.watchos.deployment_target = '4.0' + end + + s.subspec 'GRPCCoreCronet' do |ss| + ss.header_mappings_dir = 'src/objective-c/GRPCClient' + + ss.source_files = 'src/objective-c/GRPCClient/GRPCCall+Cronet.h', + 'src/objective-c/GRPCClient/GRPCCall+Cronet.m', + 'src/objective-c/GRPCClient/private/GRPCCore/GRPCCoreCronet/*.{h,m}' + ss.dependency "#{s.name}/GRPCCore", version + ss.dependency 'gRPC-Core/Cronet-Implementation', version + ss.dependency 'CronetFramework' + + ss.ios.deployment_target = '8.0' + end + + # CFStream is now default. Leaving this subspec only for compatibility purpose. + s.subspec 'CFStream' do |ss| + ss.dependency "#{s.name}/GRPCCore", version + + ss.ios.deployment_target = '7.0' + ss.osx.deployment_target = '10.9' + ss.tvos.deployment_target = '10.0' + ss.watchos.deployment_target = '4.0' + end + + s.subspec 'InternalTesting' do |ss| + ss.dependency "#{s.name}/GRPCCore", version + ss.public_header_files = 'src/objective-c/GRPCClient/internal_testing/*.h' + ss.source_files = 'src/objective-c/GRPCClient/internal_testing/*.{h,m}' + ss.header_mappings_dir = 'src/objective-c/GRPCClient' + + ss.ios.deployment_target = '7.0' + ss.osx.deployment_target = '10.9' + ss.tvos.deployment_target = '10.0' + ss.watchos.deployment_target = '4.0' + end +end diff --git a/grpc.bzl b/grpc.bzl new file mode 100644 index 00000000..06de3bca --- /dev/null +++ b/grpc.bzl @@ -0,0 +1,113 @@ +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +Bazel macros to declare gRPC libraries automatically generated from proto files. + +This file declares two macros: +- objc_proto_library +- objc_grpc_library +""" + +def _lower_underscore_to_upper_camel(str): + humps = [] + for hump in str.split("_"): + humps += [hump[0].upper() + hump[1:]] + return "".join(humps) + +def _file_to_upper_camel(src): + elements = src.rpartition("/") + upper_camel = _lower_underscore_to_upper_camel(elements[-1]) + return "".join(elements[:-1] + [upper_camel]) + +def _file_with_extension(src, ext): + elements = src.rpartition("/") + basename = elements[-1].partition(".")[0] + return "".join(elements[:-1] + [basename, ext]) + +def _protoc_invocation(srcs, flags): + """Returns a command line to invoke protoc from a genrule, on the given + sources, using the given flags. + """ + protoc_command = "$(location //external:protoc) -I . " + srcs_params = "" + for src in srcs: + srcs_params += " $(location %s)" % (src) + return protoc_command + flags + srcs_params + +def objc_proto_library(name, srcs, visibility = None): + """Declares an objc_library for the code generated by protoc from the given + proto sources. This generated code doesn't include proto services. + """ + h_files = [] + m_files = [] + for src in srcs: + src = _file_to_upper_camel(src) + h_files += [_file_with_extension(src, ".pbobjc.h")] + m_files += [_file_with_extension(src, ".pbobjc.m")] + + protoc_flags = "--objc_out=$(GENDIR)" + + native.genrule( + name = name + "_codegen", + srcs = srcs + ["//external:protoc"], + outs = h_files + m_files, + cmd = _protoc_invocation(srcs, protoc_flags), + ) + native.objc_library( + name = name, + hdrs = h_files, + includes = ["."], + non_arc_srcs = m_files, + deps = ["//external:protobuf_objc"], + visibility = visibility, + ) + +def objc_grpc_library(name, services, other_messages, visibility = None): + """Declares an objc_library for the code generated by gRPC and protoc from the + given proto sources (services and other_messages). The generated code doesn't + include proto services of the files passed as other_messages. + """ + objc_proto_library(name + "_messages", services + other_messages) + + h_files = [] + m_files = [] + for src in services: + src = _file_to_upper_camel(src) + h_files += [_file_with_extension(src, ".pbrpc.h")] + m_files += [_file_with_extension(src, ".pbrpc.m")] + + protoc_flags = ("--grpc_out=$(GENDIR) --plugin=" + + "protoc-gen-grpc=$(location //external:grpc_protoc_plugin_objc)") + + native.genrule( + name = name + "_codegen", + srcs = services + [ + "//external:grpc_protoc_plugin_objc", + "//external:protoc", + ], + outs = h_files + m_files, + cmd = _protoc_invocation(services, protoc_flags), + ) + native.objc_library( + name = name, + hdrs = h_files, + includes = ["."], + srcs = m_files, + deps = [ + ":" + name + "_messages", + "//external:proto_objc_rpc", + ], + visibility = visibility, + ) diff --git a/grpc.def b/grpc.def new file mode 100644 index 00000000..ad0dca2f --- /dev/null +++ b/grpc.def @@ -0,0 +1,273 @@ +EXPORTS + grpc_compression_algorithm_is_message + grpc_compression_algorithm_is_stream + grpc_compression_algorithm_parse + grpc_compression_algorithm_name + grpc_compression_algorithm_for_level + grpc_compression_options_init + grpc_compression_options_enable_algorithm + grpc_compression_options_disable_algorithm + grpc_compression_options_is_algorithm_enabled + grpc_metadata_array_init + grpc_metadata_array_destroy + grpc_call_details_init + grpc_call_details_destroy + grpc_register_plugin + grpc_init + grpc_shutdown + grpc_is_initialized + grpc_shutdown_blocking + grpc_version_string + grpc_g_stands_for + grpc_completion_queue_factory_lookup + grpc_completion_queue_create_for_next + grpc_completion_queue_create_for_pluck + grpc_completion_queue_create_for_callback + grpc_completion_queue_create + grpc_completion_queue_next + grpc_completion_queue_pluck + grpc_completion_queue_shutdown + grpc_completion_queue_destroy + grpc_completion_queue_thread_local_cache_init + grpc_completion_queue_thread_local_cache_flush + grpc_channel_check_connectivity_state + grpc_channel_num_external_connectivity_watchers + grpc_channel_watch_connectivity_state + grpc_channel_support_connectivity_watcher + grpc_channel_create_call + grpc_channel_ping + grpc_channel_register_call + grpc_channel_create_registered_call + grpc_call_arena_alloc + grpc_call_start_batch + grpc_call_get_peer + grpc_census_call_set_context + grpc_census_call_get_context + grpc_channel_get_target + grpc_channel_get_info + grpc_channel_reset_connect_backoff + grpc_insecure_channel_create + grpc_lame_client_channel_create + grpc_channel_destroy + grpc_call_cancel + grpc_call_cancel_with_status + grpc_call_ref + grpc_call_unref + grpc_server_request_call + grpc_server_register_method + grpc_server_request_registered_call + grpc_server_create + grpc_server_register_completion_queue + grpc_server_add_insecure_http2_port + grpc_server_start + grpc_server_shutdown_and_notify + grpc_server_cancel_all_calls + grpc_server_destroy + grpc_tracer_set_enabled + grpc_header_key_is_legal + grpc_header_nonbin_value_is_legal + grpc_is_binary_header + grpc_call_error_to_string + grpc_resource_quota_create + grpc_resource_quota_ref + grpc_resource_quota_unref + grpc_resource_quota_resize + grpc_resource_quota_set_max_threads + grpc_resource_quota_arg_vtable + grpc_channelz_get_top_channels + grpc_channelz_get_servers + grpc_channelz_get_server + grpc_channelz_get_server_sockets + grpc_channelz_get_channel + grpc_channelz_get_subchannel + grpc_channelz_get_socket + grpc_insecure_channel_create_from_fd + grpc_server_add_insecure_channel_from_fd + grpc_auth_property_iterator_next + grpc_auth_context_property_iterator + grpc_auth_context_peer_identity + grpc_auth_context_find_properties_by_name + grpc_auth_context_peer_identity_property_name + grpc_auth_context_peer_is_authenticated + grpc_call_auth_context + grpc_auth_context_release + grpc_auth_context_add_property + grpc_auth_context_add_cstring_property + grpc_auth_context_set_peer_identity_property_name + grpc_ssl_session_cache_create_lru + grpc_ssl_session_cache_destroy + grpc_ssl_session_cache_create_channel_arg + grpc_channel_credentials_release + grpc_google_default_credentials_create + grpc_set_ssl_roots_override_callback + grpc_ssl_credentials_create + grpc_ssl_credentials_create_ex + grpc_call_credentials_release + grpc_composite_channel_credentials_create + grpc_composite_call_credentials_create + grpc_google_compute_engine_credentials_create + grpc_max_auth_token_lifetime + grpc_service_account_jwt_access_credentials_create + grpc_google_refresh_token_credentials_create + grpc_access_token_credentials_create + grpc_google_iam_credentials_create + grpc_sts_credentials_create + grpc_auth_metadata_context_copy + grpc_auth_metadata_context_reset + grpc_metadata_credentials_create_from_plugin + grpc_secure_channel_create + grpc_server_credentials_release + grpc_ssl_server_certificate_config_create + grpc_ssl_server_certificate_config_destroy + grpc_ssl_server_credentials_create + grpc_ssl_server_credentials_create_ex + grpc_ssl_server_credentials_create_options_using_config + grpc_ssl_server_credentials_create_options_using_config_fetcher + grpc_ssl_server_credentials_options_destroy + grpc_ssl_server_credentials_create_with_options + grpc_server_add_secure_http2_port + grpc_call_set_credentials + grpc_server_credentials_set_auth_metadata_processor + grpc_alts_credentials_client_options_create + grpc_alts_credentials_server_options_create + grpc_alts_credentials_client_options_add_target_service_account + grpc_alts_credentials_options_destroy + grpc_alts_credentials_create + grpc_alts_server_credentials_create + grpc_local_credentials_create + grpc_local_server_credentials_create + grpc_tls_credentials_options_create + grpc_tls_credentials_options_set_cert_request_type + grpc_tls_credentials_options_set_server_verification_option + grpc_tls_credentials_options_set_key_materials_config + grpc_tls_credentials_options_set_credential_reload_config + grpc_tls_credentials_options_set_server_authorization_check_config + grpc_tls_key_materials_config_create + grpc_tls_key_materials_config_set_key_materials + grpc_tls_key_materials_config_set_version + grpc_tls_key_materials_config_get_version + grpc_tls_credential_reload_config_create + grpc_tls_server_authorization_check_config_create + grpc_raw_byte_buffer_create + grpc_raw_compressed_byte_buffer_create + grpc_byte_buffer_copy + grpc_byte_buffer_length + grpc_byte_buffer_destroy + grpc_byte_buffer_reader_init + grpc_byte_buffer_reader_destroy + grpc_byte_buffer_reader_next + grpc_byte_buffer_reader_peek + grpc_byte_buffer_reader_readall + grpc_raw_byte_buffer_from_reader + gpr_log_severity_string + gpr_log + gpr_should_log + gpr_log_message + gpr_set_log_verbosity + gpr_log_verbosity_init + gpr_set_log_function + grpc_slice_ref + grpc_slice_unref + grpc_slice_copy + grpc_slice_new + grpc_slice_new_with_user_data + grpc_slice_new_with_len + grpc_slice_malloc + grpc_slice_malloc_large + grpc_slice_intern + grpc_slice_from_copied_string + grpc_slice_from_copied_buffer + grpc_slice_from_static_string + grpc_slice_from_static_buffer + grpc_slice_sub + grpc_slice_sub_no_ref + grpc_slice_split_tail + grpc_slice_split_tail_maybe_ref + grpc_slice_split_head + grpc_empty_slice + grpc_slice_default_hash_impl + grpc_slice_default_eq_impl + grpc_slice_eq + grpc_slice_cmp + grpc_slice_str_cmp + grpc_slice_buf_start_eq + grpc_slice_rchr + grpc_slice_chr + grpc_slice_slice + grpc_slice_hash + grpc_slice_is_equivalent + grpc_slice_dup + grpc_slice_to_c_string + grpc_slice_buffer_init + grpc_slice_buffer_destroy + grpc_slice_buffer_add + grpc_slice_buffer_add_indexed + grpc_slice_buffer_addn + grpc_slice_buffer_tiny_add + grpc_slice_buffer_pop + grpc_slice_buffer_reset_and_unref + grpc_slice_buffer_swap + grpc_slice_buffer_move_into + grpc_slice_buffer_trim_end + grpc_slice_buffer_move_first + grpc_slice_buffer_move_first_no_ref + grpc_slice_buffer_move_first_into_buffer + grpc_slice_buffer_take_first + grpc_slice_buffer_undo_take_first + gpr_malloc + gpr_zalloc + gpr_free + gpr_realloc + gpr_malloc_aligned + gpr_free_aligned + gpr_cpu_num_cores + gpr_cpu_current_cpu + gpr_format_message + gpr_strdup + gpr_asprintf + gpr_mu_init + gpr_mu_destroy + gpr_mu_lock + gpr_mu_unlock + gpr_mu_trylock + gpr_cv_init + gpr_cv_destroy + gpr_cv_wait + gpr_cv_signal + gpr_cv_broadcast + gpr_once_init + gpr_event_init + gpr_event_set + gpr_event_get + gpr_event_wait + gpr_ref_init + gpr_ref + gpr_ref_non_zero + gpr_refn + gpr_unref + gpr_ref_is_unique + gpr_stats_init + gpr_stats_inc + gpr_stats_read + gpr_thd_currentid + gpr_time_0 + gpr_inf_future + gpr_inf_past + gpr_time_init + gpr_now + gpr_convert_clock_type + gpr_time_cmp + gpr_time_max + gpr_time_min + gpr_time_add + gpr_time_sub + gpr_time_from_micros + gpr_time_from_nanos + gpr_time_from_millis + gpr_time_from_seconds + gpr_time_from_minutes + gpr_time_from_hours + gpr_time_to_millis + gpr_time_similar + gpr_sleep_until + gpr_timespec_to_micros diff --git a/grpc.gemspec b/grpc.gemspec new file mode 100644 index 00000000..af04b9d9 --- /dev/null +++ b/grpc.gemspec @@ -0,0 +1,1695 @@ +# -*- ruby -*- +# encoding: utf-8 +$LOAD_PATH.push File.expand_path('../src/ruby/lib', __FILE__) +require 'grpc/version' + +Gem::Specification.new do |s| + s.name = 'grpc' + s.version = GRPC::VERSION + s.authors = ['gRPC Authors'] + s.email = 'grpc-io@googlegroups.com' + s.homepage = 'https://github.com/google/grpc/tree/master/src/ruby' + s.summary = 'GRPC system in Ruby' + s.description = 'Send RPCs from Ruby using GRPC' + s.license = 'Apache-2.0' + + s.required_ruby_version = '>= 2.3.0' + + s.files = %w( Makefile .yardopts ) + s.files += %w( etc/roots.pem ) + s.files += Dir.glob('src/ruby/bin/**/*') + s.files += Dir.glob('src/ruby/ext/**/*') + s.files += Dir.glob('src/ruby/lib/**/*').reject do |f| + # Binaries are included by rake-compiler and would lead to circular dependencies here + File.fnmatch("**/?.?/grpc_c.so", f) + end + s.files += Dir.glob('src/ruby/pb/**/*').reject do |f| + f.match(%r{^src/ruby/pb/test}) + end + s.files += Dir.glob('include/grpc/**/*') + s.test_files = Dir.glob('src/ruby/spec/**/*') + s.bindir = 'src/ruby/bin' + s.require_paths = %w( src/ruby/lib src/ruby/bin src/ruby/pb ) + s.platform = Gem::Platform::RUBY + + s.add_dependency 'google-protobuf', '~> 3.12' + s.add_dependency 'googleapis-common-protos-types', '~> 1.0' + + s.add_development_dependency 'bundler', '>= 1.9' + s.add_development_dependency 'facter', '~> 2.4' + s.add_development_dependency 'logging', '~> 2.0' + s.add_development_dependency 'simplecov', '~> 0.14.1' + s.add_development_dependency 'rake', '~> 13.0' + s.add_development_dependency 'rake-compiler', '~> 1.1' + s.add_development_dependency 'rake-compiler-dock', '~> 1.0' + s.add_development_dependency 'rspec', '~> 3.6' + s.add_development_dependency 'rubocop', '~> 0.49.1' + s.add_development_dependency 'signet', '~> 0.7' + s.add_development_dependency 'googleauth', '>= 0.5.1', '< 0.10' + + s.extensions = %w(src/ruby/ext/grpc/extconf.rb) + + s.files += %w( include/grpc/byte_buffer.h ) + s.files += %w( include/grpc/byte_buffer_reader.h ) + s.files += %w( include/grpc/census.h ) + s.files += %w( include/grpc/compression.h ) + s.files += %w( include/grpc/fork.h ) + s.files += %w( include/grpc/grpc.h ) + s.files += %w( include/grpc/grpc_posix.h ) + s.files += %w( include/grpc/grpc_security.h ) + s.files += %w( include/grpc/grpc_security_constants.h ) + s.files += %w( include/grpc/impl/codegen/atm.h ) + s.files += %w( include/grpc/impl/codegen/atm_gcc_atomic.h ) + s.files += %w( include/grpc/impl/codegen/atm_gcc_sync.h ) + s.files += %w( include/grpc/impl/codegen/atm_windows.h ) + s.files += %w( include/grpc/impl/codegen/byte_buffer.h ) + s.files += %w( include/grpc/impl/codegen/byte_buffer_reader.h ) + s.files += %w( include/grpc/impl/codegen/compression_types.h ) + s.files += %w( include/grpc/impl/codegen/connectivity_state.h ) + s.files += %w( include/grpc/impl/codegen/fork.h ) + s.files += %w( include/grpc/impl/codegen/gpr_slice.h ) + s.files += %w( include/grpc/impl/codegen/gpr_types.h ) + s.files += %w( include/grpc/impl/codegen/grpc_types.h ) + s.files += %w( include/grpc/impl/codegen/log.h ) + s.files += %w( include/grpc/impl/codegen/port_platform.h ) + s.files += %w( include/grpc/impl/codegen/propagation_bits.h ) + s.files += %w( include/grpc/impl/codegen/slice.h ) + s.files += %w( include/grpc/impl/codegen/status.h ) + s.files += %w( include/grpc/impl/codegen/sync.h ) + s.files += %w( include/grpc/impl/codegen/sync_abseil.h ) + s.files += %w( include/grpc/impl/codegen/sync_custom.h ) + s.files += %w( include/grpc/impl/codegen/sync_generic.h ) + s.files += %w( include/grpc/impl/codegen/sync_posix.h ) + s.files += %w( include/grpc/impl/codegen/sync_windows.h ) + s.files += %w( include/grpc/load_reporting.h ) + s.files += %w( include/grpc/slice.h ) + s.files += %w( include/grpc/slice_buffer.h ) + s.files += %w( include/grpc/status.h ) + s.files += %w( include/grpc/support/alloc.h ) + s.files += %w( include/grpc/support/atm.h ) + s.files += %w( include/grpc/support/atm_gcc_atomic.h ) + s.files += %w( include/grpc/support/atm_gcc_sync.h ) + s.files += %w( include/grpc/support/atm_windows.h ) + s.files += %w( include/grpc/support/cpu.h ) + s.files += %w( include/grpc/support/log.h ) + s.files += %w( include/grpc/support/log_windows.h ) + s.files += %w( include/grpc/support/port_platform.h ) + s.files += %w( include/grpc/support/string_util.h ) + s.files += %w( include/grpc/support/sync.h ) + s.files += %w( include/grpc/support/sync_abseil.h ) + s.files += %w( include/grpc/support/sync_custom.h ) + s.files += %w( include/grpc/support/sync_generic.h ) + s.files += %w( include/grpc/support/sync_posix.h ) + s.files += %w( include/grpc/support/sync_windows.h ) + s.files += %w( include/grpc/support/thd_id.h ) + s.files += %w( include/grpc/support/time.h ) + s.files += %w( include/grpc/support/workaround_list.h ) + s.files += %w( src/core/ext/filters/census/grpc_context.cc ) + s.files += %w( src/core/ext/filters/client_channel/backend_metric.cc ) + s.files += %w( src/core/ext/filters/client_channel/backend_metric.h ) + s.files += %w( src/core/ext/filters/client_channel/backup_poller.cc ) + s.files += %w( src/core/ext/filters/client_channel/backup_poller.h ) + s.files += %w( src/core/ext/filters/client_channel/channel_connectivity.cc ) + s.files += %w( src/core/ext/filters/client_channel/client_channel.cc ) + s.files += %w( src/core/ext/filters/client_channel/client_channel.h ) + s.files += %w( src/core/ext/filters/client_channel/client_channel_channelz.cc ) + s.files += %w( src/core/ext/filters/client_channel/client_channel_channelz.h ) + s.files += %w( src/core/ext/filters/client_channel/client_channel_factory.cc ) + s.files += %w( src/core/ext/filters/client_channel/client_channel_factory.h ) + s.files += %w( src/core/ext/filters/client_channel/client_channel_plugin.cc ) + s.files += %w( src/core/ext/filters/client_channel/connector.h ) + s.files += %w( src/core/ext/filters/client_channel/global_subchannel_pool.cc ) + s.files += %w( src/core/ext/filters/client_channel/global_subchannel_pool.h ) + s.files += %w( src/core/ext/filters/client_channel/health/health_check_client.cc ) + s.files += %w( src/core/ext/filters/client_channel/health/health_check_client.h ) + s.files += %w( src/core/ext/filters/client_channel/http_connect_handshaker.cc ) + s.files += %w( src/core/ext/filters/client_channel/http_connect_handshaker.h ) + s.files += %w( src/core/ext/filters/client_channel/http_proxy.cc ) + s.files += %w( src/core/ext/filters/client_channel/http_proxy.h ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy.cc ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy.h ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/address_filtering.cc ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/address_filtering.h ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/priority/priority.cc ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/subchannel_list.h ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/cds.cc ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/eds.cc ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/xds.h ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy_factory.h ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy_registry.cc ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy_registry.h ) + s.files += %w( src/core/ext/filters/client_channel/local_subchannel_pool.cc ) + s.files += %w( src/core/ext/filters/client_channel/local_subchannel_pool.h ) + s.files += %w( src/core/ext/filters/client_channel/parse_address.cc ) + s.files += %w( src/core/ext/filters/client_channel/parse_address.h ) + s.files += %w( src/core/ext/filters/client_channel/proxy_mapper.h ) + s.files += %w( src/core/ext/filters/client_channel/proxy_mapper_registry.cc ) + s.files += %w( src/core/ext/filters/client_channel/proxy_mapper_registry.h ) + s.files += %w( src/core/ext/filters/client_channel/resolver.cc ) + s.files += %w( src/core/ext/filters/client_channel/resolver.h ) + s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc ) + s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc ) + s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h ) + s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc ) + s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc ) + s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc ) + s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc ) + s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h ) + s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc ) + s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc ) + s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc ) + s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc ) + s.files += %w( src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc ) + s.files += %w( src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h ) + s.files += %w( src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc ) + s.files += %w( src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc ) + s.files += %w( src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h ) + s.files += %w( src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc ) + s.files += %w( src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc ) + s.files += %w( src/core/ext/filters/client_channel/resolver_factory.h ) + s.files += %w( src/core/ext/filters/client_channel/resolver_registry.cc ) + s.files += %w( src/core/ext/filters/client_channel/resolver_registry.h ) + s.files += %w( src/core/ext/filters/client_channel/resolver_result_parsing.cc ) + s.files += %w( src/core/ext/filters/client_channel/resolver_result_parsing.h ) + s.files += %w( src/core/ext/filters/client_channel/resolving_lb_policy.cc ) + s.files += %w( src/core/ext/filters/client_channel/resolving_lb_policy.h ) + s.files += %w( src/core/ext/filters/client_channel/retry_throttle.cc ) + s.files += %w( src/core/ext/filters/client_channel/retry_throttle.h ) + s.files += %w( src/core/ext/filters/client_channel/server_address.cc ) + s.files += %w( src/core/ext/filters/client_channel/server_address.h ) + s.files += %w( src/core/ext/filters/client_channel/service_config.cc ) + s.files += %w( src/core/ext/filters/client_channel/service_config.h ) + s.files += %w( src/core/ext/filters/client_channel/service_config_call_data.h ) + s.files += %w( src/core/ext/filters/client_channel/service_config_parser.cc ) + s.files += %w( src/core/ext/filters/client_channel/service_config_parser.h ) + s.files += %w( src/core/ext/filters/client_channel/subchannel.cc ) + s.files += %w( src/core/ext/filters/client_channel/subchannel.h ) + s.files += %w( src/core/ext/filters/client_channel/subchannel_interface.h ) + s.files += %w( src/core/ext/filters/client_channel/subchannel_pool_interface.cc ) + s.files += %w( src/core/ext/filters/client_channel/subchannel_pool_interface.h ) + s.files += %w( src/core/ext/filters/client_channel/xds/xds_api.cc ) + s.files += %w( src/core/ext/filters/client_channel/xds/xds_api.h ) + s.files += %w( src/core/ext/filters/client_channel/xds/xds_bootstrap.cc ) + s.files += %w( src/core/ext/filters/client_channel/xds/xds_bootstrap.h ) + s.files += %w( src/core/ext/filters/client_channel/xds/xds_channel.h ) + s.files += %w( src/core/ext/filters/client_channel/xds/xds_channel_args.h ) + s.files += %w( src/core/ext/filters/client_channel/xds/xds_channel_secure.cc ) + s.files += %w( src/core/ext/filters/client_channel/xds/xds_client.cc ) + s.files += %w( src/core/ext/filters/client_channel/xds/xds_client.h ) + s.files += %w( src/core/ext/filters/client_channel/xds/xds_client_stats.cc ) + s.files += %w( src/core/ext/filters/client_channel/xds/xds_client_stats.h ) + s.files += %w( src/core/ext/filters/client_idle/client_idle_filter.cc ) + s.files += %w( src/core/ext/filters/deadline/deadline_filter.cc ) + s.files += %w( src/core/ext/filters/deadline/deadline_filter.h ) + s.files += %w( src/core/ext/filters/http/client/http_client_filter.cc ) + s.files += %w( src/core/ext/filters/http/client/http_client_filter.h ) + s.files += %w( src/core/ext/filters/http/client_authority_filter.cc ) + s.files += %w( src/core/ext/filters/http/client_authority_filter.h ) + s.files += %w( src/core/ext/filters/http/http_filters_plugin.cc ) + s.files += %w( src/core/ext/filters/http/message_compress/message_compress_filter.cc ) + s.files += %w( src/core/ext/filters/http/message_compress/message_compress_filter.h ) + s.files += %w( src/core/ext/filters/http/message_compress/message_decompress_filter.cc ) + s.files += %w( src/core/ext/filters/http/message_compress/message_decompress_filter.h ) + s.files += %w( src/core/ext/filters/http/server/http_server_filter.cc ) + s.files += %w( src/core/ext/filters/http/server/http_server_filter.h ) + s.files += %w( src/core/ext/filters/max_age/max_age_filter.cc ) + s.files += %w( src/core/ext/filters/max_age/max_age_filter.h ) + s.files += %w( src/core/ext/filters/message_size/message_size_filter.cc ) + s.files += %w( src/core/ext/filters/message_size/message_size_filter.h ) + s.files += %w( src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc ) + s.files += %w( src/core/ext/filters/workarounds/workaround_cronet_compression_filter.h ) + s.files += %w( src/core/ext/filters/workarounds/workaround_utils.cc ) + s.files += %w( src/core/ext/filters/workarounds/workaround_utils.h ) + s.files += %w( src/core/ext/transport/chttp2/alpn/alpn.cc ) + s.files += %w( src/core/ext/transport/chttp2/alpn/alpn.h ) + s.files += %w( src/core/ext/transport/chttp2/client/authority.cc ) + s.files += %w( src/core/ext/transport/chttp2/client/authority.h ) + s.files += %w( src/core/ext/transport/chttp2/client/chttp2_connector.cc ) + s.files += %w( src/core/ext/transport/chttp2/client/chttp2_connector.h ) + s.files += %w( src/core/ext/transport/chttp2/client/insecure/channel_create.cc ) + s.files += %w( src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc ) + s.files += %w( src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc ) + s.files += %w( src/core/ext/transport/chttp2/server/chttp2_server.cc ) + s.files += %w( src/core/ext/transport/chttp2/server/chttp2_server.h ) + s.files += %w( src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc ) + s.files += %w( src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc ) + s.files += %w( src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/bin_decoder.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/bin_decoder.h ) + s.files += %w( src/core/ext/transport/chttp2/transport/bin_encoder.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/bin_encoder.h ) + s.files += %w( src/core/ext/transport/chttp2/transport/chttp2_plugin.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/chttp2_transport.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/chttp2_transport.h ) + s.files += %w( src/core/ext/transport/chttp2/transport/context_list.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/context_list.h ) + s.files += %w( src/core/ext/transport/chttp2/transport/flow_control.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/flow_control.h ) + s.files += %w( src/core/ext/transport/chttp2/transport/frame.h ) + s.files += %w( src/core/ext/transport/chttp2/transport/frame_data.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/frame_data.h ) + s.files += %w( src/core/ext/transport/chttp2/transport/frame_goaway.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/frame_goaway.h ) + s.files += %w( src/core/ext/transport/chttp2/transport/frame_ping.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/frame_ping.h ) + s.files += %w( src/core/ext/transport/chttp2/transport/frame_rst_stream.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/frame_rst_stream.h ) + s.files += %w( src/core/ext/transport/chttp2/transport/frame_settings.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/frame_settings.h ) + s.files += %w( src/core/ext/transport/chttp2/transport/frame_window_update.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/frame_window_update.h ) + s.files += %w( src/core/ext/transport/chttp2/transport/hpack_encoder.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/hpack_encoder.h ) + s.files += %w( src/core/ext/transport/chttp2/transport/hpack_parser.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/hpack_parser.h ) + s.files += %w( src/core/ext/transport/chttp2/transport/hpack_table.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/hpack_table.h ) + s.files += %w( src/core/ext/transport/chttp2/transport/http2_settings.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/http2_settings.h ) + s.files += %w( src/core/ext/transport/chttp2/transport/huffsyms.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/huffsyms.h ) + s.files += %w( src/core/ext/transport/chttp2/transport/incoming_metadata.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/incoming_metadata.h ) + s.files += %w( src/core/ext/transport/chttp2/transport/internal.h ) + s.files += %w( src/core/ext/transport/chttp2/transport/parsing.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/stream_lists.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/stream_map.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/stream_map.h ) + s.files += %w( src/core/ext/transport/chttp2/transport/varint.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/varint.h ) + s.files += %w( src/core/ext/transport/chttp2/transport/writing.cc ) + s.files += %w( src/core/ext/transport/inproc/inproc_plugin.cc ) + s.files += %w( src/core/ext/transport/inproc/inproc_transport.cc ) + s.files += %w( src/core/ext/transport/inproc/inproc_transport.h ) + s.files += %w( src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/annotations/resource.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/annotations/resource.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cds.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cds.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/eds.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/eds.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/lds.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/lds.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/listener.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/listener.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/rds.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/rds.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/route.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/route.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/route/route.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/srds.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/srds.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/type/http.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/type/http.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/type/matcher/string.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/type/matcher/string.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/type/percent.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/type/percent.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/type/range.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/type/range.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/type/semantic_version.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/type/semantic_version.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.h ) + s.files += %w( src/core/ext/upb-generated/gogoproto/gogo.upb.c ) + s.files += %w( src/core/ext/upb-generated/gogoproto/gogo.upb.h ) + s.files += %w( src/core/ext/upb-generated/google/api/annotations.upb.c ) + s.files += %w( src/core/ext/upb-generated/google/api/annotations.upb.h ) + s.files += %w( src/core/ext/upb-generated/google/api/http.upb.c ) + s.files += %w( src/core/ext/upb-generated/google/api/http.upb.h ) + s.files += %w( src/core/ext/upb-generated/google/protobuf/any.upb.c ) + s.files += %w( src/core/ext/upb-generated/google/protobuf/any.upb.h ) + s.files += %w( src/core/ext/upb-generated/google/protobuf/descriptor.upb.c ) + s.files += %w( src/core/ext/upb-generated/google/protobuf/descriptor.upb.h ) + s.files += %w( src/core/ext/upb-generated/google/protobuf/duration.upb.c ) + s.files += %w( src/core/ext/upb-generated/google/protobuf/duration.upb.h ) + s.files += %w( src/core/ext/upb-generated/google/protobuf/empty.upb.c ) + s.files += %w( src/core/ext/upb-generated/google/protobuf/empty.upb.h ) + s.files += %w( src/core/ext/upb-generated/google/protobuf/struct.upb.c ) + s.files += %w( src/core/ext/upb-generated/google/protobuf/struct.upb.h ) + s.files += %w( src/core/ext/upb-generated/google/protobuf/timestamp.upb.c ) + s.files += %w( src/core/ext/upb-generated/google/protobuf/timestamp.upb.h ) + s.files += %w( src/core/ext/upb-generated/google/protobuf/wrappers.upb.c ) + s.files += %w( src/core/ext/upb-generated/google/protobuf/wrappers.upb.h ) + s.files += %w( src/core/ext/upb-generated/google/rpc/status.upb.c ) + s.files += %w( src/core/ext/upb-generated/google/rpc/status.upb.h ) + s.files += %w( src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c ) + s.files += %w( src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h ) + s.files += %w( src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c ) + s.files += %w( src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h ) + s.files += %w( src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c ) + s.files += %w( src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h ) + s.files += %w( src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c ) + s.files += %w( src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h ) + s.files += %w( src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c ) + s.files += %w( src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h ) + s.files += %w( src/core/ext/upb-generated/udpa/annotations/migrate.upb.c ) + s.files += %w( src/core/ext/upb-generated/udpa/annotations/migrate.upb.h ) + s.files += %w( src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c ) + s.files += %w( src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h ) + s.files += %w( src/core/ext/upb-generated/udpa/annotations/status.upb.c ) + s.files += %w( src/core/ext/upb-generated/udpa/annotations/status.upb.h ) + s.files += %w( src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c ) + s.files += %w( src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h ) + s.files += %w( src/core/ext/upb-generated/validate/validate.upb.c ) + s.files += %w( src/core/ext/upb-generated/validate/validate.upb.h ) + s.files += %w( src/core/lib/avl/avl.cc ) + s.files += %w( src/core/lib/avl/avl.h ) + s.files += %w( src/core/lib/backoff/backoff.cc ) + s.files += %w( src/core/lib/backoff/backoff.h ) + s.files += %w( src/core/lib/channel/channel_args.cc ) + s.files += %w( src/core/lib/channel/channel_args.h ) + s.files += %w( src/core/lib/channel/channel_stack.cc ) + s.files += %w( src/core/lib/channel/channel_stack.h ) + s.files += %w( src/core/lib/channel/channel_stack_builder.cc ) + s.files += %w( src/core/lib/channel/channel_stack_builder.h ) + s.files += %w( src/core/lib/channel/channel_trace.cc ) + s.files += %w( src/core/lib/channel/channel_trace.h ) + s.files += %w( src/core/lib/channel/channelz.cc ) + s.files += %w( src/core/lib/channel/channelz.h ) + s.files += %w( src/core/lib/channel/channelz_registry.cc ) + s.files += %w( src/core/lib/channel/channelz_registry.h ) + s.files += %w( src/core/lib/channel/connected_channel.cc ) + s.files += %w( src/core/lib/channel/connected_channel.h ) + s.files += %w( src/core/lib/channel/context.h ) + s.files += %w( src/core/lib/channel/handshaker.cc ) + s.files += %w( src/core/lib/channel/handshaker.h ) + s.files += %w( src/core/lib/channel/handshaker_factory.h ) + s.files += %w( src/core/lib/channel/handshaker_registry.cc ) + s.files += %w( src/core/lib/channel/handshaker_registry.h ) + s.files += %w( src/core/lib/channel/status_util.cc ) + s.files += %w( src/core/lib/channel/status_util.h ) + s.files += %w( src/core/lib/compression/algorithm_metadata.h ) + s.files += %w( src/core/lib/compression/compression.cc ) + s.files += %w( src/core/lib/compression/compression_args.cc ) + s.files += %w( src/core/lib/compression/compression_args.h ) + s.files += %w( src/core/lib/compression/compression_internal.cc ) + s.files += %w( src/core/lib/compression/compression_internal.h ) + s.files += %w( src/core/lib/compression/message_compress.cc ) + s.files += %w( src/core/lib/compression/message_compress.h ) + s.files += %w( src/core/lib/compression/stream_compression.cc ) + s.files += %w( src/core/lib/compression/stream_compression.h ) + s.files += %w( src/core/lib/compression/stream_compression_gzip.cc ) + s.files += %w( src/core/lib/compression/stream_compression_gzip.h ) + s.files += %w( src/core/lib/compression/stream_compression_identity.cc ) + s.files += %w( src/core/lib/compression/stream_compression_identity.h ) + s.files += %w( src/core/lib/debug/stats.cc ) + s.files += %w( src/core/lib/debug/stats.h ) + s.files += %w( src/core/lib/debug/stats_data.cc ) + s.files += %w( src/core/lib/debug/stats_data.h ) + s.files += %w( src/core/lib/debug/trace.cc ) + s.files += %w( src/core/lib/debug/trace.h ) + s.files += %w( src/core/lib/gpr/alloc.cc ) + s.files += %w( src/core/lib/gpr/alloc.h ) + s.files += %w( src/core/lib/gpr/arena.h ) + s.files += %w( src/core/lib/gpr/atm.cc ) + s.files += %w( src/core/lib/gpr/cpu_iphone.cc ) + s.files += %w( src/core/lib/gpr/cpu_linux.cc ) + s.files += %w( src/core/lib/gpr/cpu_posix.cc ) + s.files += %w( src/core/lib/gpr/cpu_windows.cc ) + s.files += %w( src/core/lib/gpr/env.h ) + s.files += %w( src/core/lib/gpr/env_linux.cc ) + s.files += %w( src/core/lib/gpr/env_posix.cc ) + s.files += %w( src/core/lib/gpr/env_windows.cc ) + s.files += %w( src/core/lib/gpr/log.cc ) + s.files += %w( src/core/lib/gpr/log_android.cc ) + s.files += %w( src/core/lib/gpr/log_linux.cc ) + s.files += %w( src/core/lib/gpr/log_posix.cc ) + s.files += %w( src/core/lib/gpr/log_windows.cc ) + s.files += %w( src/core/lib/gpr/murmur_hash.cc ) + s.files += %w( src/core/lib/gpr/murmur_hash.h ) + s.files += %w( src/core/lib/gpr/spinlock.h ) + s.files += %w( src/core/lib/gpr/string.cc ) + s.files += %w( src/core/lib/gpr/string.h ) + s.files += %w( src/core/lib/gpr/string_posix.cc ) + s.files += %w( src/core/lib/gpr/string_util_windows.cc ) + s.files += %w( src/core/lib/gpr/string_windows.cc ) + s.files += %w( src/core/lib/gpr/string_windows.h ) + s.files += %w( src/core/lib/gpr/sync.cc ) + s.files += %w( src/core/lib/gpr/sync_abseil.cc ) + s.files += %w( src/core/lib/gpr/sync_posix.cc ) + s.files += %w( src/core/lib/gpr/sync_windows.cc ) + s.files += %w( src/core/lib/gpr/time.cc ) + s.files += %w( src/core/lib/gpr/time_posix.cc ) + s.files += %w( src/core/lib/gpr/time_precise.cc ) + s.files += %w( src/core/lib/gpr/time_precise.h ) + s.files += %w( src/core/lib/gpr/time_windows.cc ) + s.files += %w( src/core/lib/gpr/tls.h ) + s.files += %w( src/core/lib/gpr/tls_gcc.h ) + s.files += %w( src/core/lib/gpr/tls_msvc.h ) + s.files += %w( src/core/lib/gpr/tls_pthread.cc ) + s.files += %w( src/core/lib/gpr/tls_pthread.h ) + s.files += %w( src/core/lib/gpr/tmpfile.h ) + s.files += %w( src/core/lib/gpr/tmpfile_msys.cc ) + s.files += %w( src/core/lib/gpr/tmpfile_posix.cc ) + s.files += %w( src/core/lib/gpr/tmpfile_windows.cc ) + s.files += %w( src/core/lib/gpr/useful.h ) + s.files += %w( src/core/lib/gpr/wrap_memcpy.cc ) + s.files += %w( src/core/lib/gprpp/arena.cc ) + s.files += %w( src/core/lib/gprpp/arena.h ) + s.files += %w( src/core/lib/gprpp/atomic.h ) + s.files += %w( src/core/lib/gprpp/debug_location.h ) + s.files += %w( src/core/lib/gprpp/fork.cc ) + s.files += %w( src/core/lib/gprpp/fork.h ) + s.files += %w( src/core/lib/gprpp/global_config.h ) + s.files += %w( src/core/lib/gprpp/global_config_custom.h ) + s.files += %w( src/core/lib/gprpp/global_config_env.cc ) + s.files += %w( src/core/lib/gprpp/global_config_env.h ) + s.files += %w( src/core/lib/gprpp/global_config_generic.h ) + s.files += %w( src/core/lib/gprpp/host_port.cc ) + s.files += %w( src/core/lib/gprpp/host_port.h ) + s.files += %w( src/core/lib/gprpp/manual_constructor.h ) + s.files += %w( src/core/lib/gprpp/map.h ) + s.files += %w( src/core/lib/gprpp/memory.h ) + s.files += %w( src/core/lib/gprpp/mpscq.cc ) + s.files += %w( src/core/lib/gprpp/mpscq.h ) + s.files += %w( src/core/lib/gprpp/orphanable.h ) + s.files += %w( src/core/lib/gprpp/ref_counted.h ) + s.files += %w( src/core/lib/gprpp/ref_counted_ptr.h ) + s.files += %w( src/core/lib/gprpp/sync.h ) + s.files += %w( src/core/lib/gprpp/thd.h ) + s.files += %w( src/core/lib/gprpp/thd_posix.cc ) + s.files += %w( src/core/lib/gprpp/thd_windows.cc ) + s.files += %w( src/core/lib/http/format_request.cc ) + s.files += %w( src/core/lib/http/format_request.h ) + s.files += %w( src/core/lib/http/httpcli.cc ) + s.files += %w( src/core/lib/http/httpcli.h ) + s.files += %w( src/core/lib/http/httpcli_security_connector.cc ) + s.files += %w( src/core/lib/http/parser.cc ) + s.files += %w( src/core/lib/http/parser.h ) + s.files += %w( src/core/lib/iomgr/block_annotate.h ) + s.files += %w( src/core/lib/iomgr/buffer_list.cc ) + s.files += %w( src/core/lib/iomgr/buffer_list.h ) + s.files += %w( src/core/lib/iomgr/call_combiner.cc ) + s.files += %w( src/core/lib/iomgr/call_combiner.h ) + s.files += %w( src/core/lib/iomgr/cfstream_handle.cc ) + s.files += %w( src/core/lib/iomgr/cfstream_handle.h ) + s.files += %w( src/core/lib/iomgr/closure.h ) + s.files += %w( src/core/lib/iomgr/combiner.cc ) + s.files += %w( src/core/lib/iomgr/combiner.h ) + s.files += %w( src/core/lib/iomgr/dualstack_socket_posix.cc ) + s.files += %w( src/core/lib/iomgr/dynamic_annotations.h ) + s.files += %w( src/core/lib/iomgr/endpoint.cc ) + s.files += %w( src/core/lib/iomgr/endpoint.h ) + s.files += %w( src/core/lib/iomgr/endpoint_cfstream.cc ) + s.files += %w( src/core/lib/iomgr/endpoint_cfstream.h ) + s.files += %w( src/core/lib/iomgr/endpoint_pair.h ) + s.files += %w( src/core/lib/iomgr/endpoint_pair_posix.cc ) + s.files += %w( src/core/lib/iomgr/endpoint_pair_uv.cc ) + s.files += %w( src/core/lib/iomgr/endpoint_pair_windows.cc ) + s.files += %w( src/core/lib/iomgr/error.cc ) + s.files += %w( src/core/lib/iomgr/error.h ) + s.files += %w( src/core/lib/iomgr/error_cfstream.cc ) + s.files += %w( src/core/lib/iomgr/error_cfstream.h ) + s.files += %w( src/core/lib/iomgr/error_internal.h ) + s.files += %w( src/core/lib/iomgr/ev_apple.cc ) + s.files += %w( src/core/lib/iomgr/ev_apple.h ) + s.files += %w( src/core/lib/iomgr/ev_epoll1_linux.cc ) + s.files += %w( src/core/lib/iomgr/ev_epoll1_linux.h ) + s.files += %w( src/core/lib/iomgr/ev_epollex_linux.cc ) + s.files += %w( src/core/lib/iomgr/ev_epollex_linux.h ) + s.files += %w( src/core/lib/iomgr/ev_poll_posix.cc ) + s.files += %w( src/core/lib/iomgr/ev_poll_posix.h ) + s.files += %w( src/core/lib/iomgr/ev_posix.cc ) + s.files += %w( src/core/lib/iomgr/ev_posix.h ) + s.files += %w( src/core/lib/iomgr/ev_windows.cc ) + s.files += %w( src/core/lib/iomgr/exec_ctx.cc ) + s.files += %w( src/core/lib/iomgr/exec_ctx.h ) + s.files += %w( src/core/lib/iomgr/executor.cc ) + s.files += %w( src/core/lib/iomgr/executor.h ) + s.files += %w( src/core/lib/iomgr/executor/mpmcqueue.cc ) + s.files += %w( src/core/lib/iomgr/executor/mpmcqueue.h ) + s.files += %w( src/core/lib/iomgr/executor/threadpool.cc ) + s.files += %w( src/core/lib/iomgr/executor/threadpool.h ) + s.files += %w( src/core/lib/iomgr/fork_posix.cc ) + s.files += %w( src/core/lib/iomgr/fork_windows.cc ) + s.files += %w( src/core/lib/iomgr/gethostname.h ) + s.files += %w( src/core/lib/iomgr/gethostname_fallback.cc ) + s.files += %w( src/core/lib/iomgr/gethostname_host_name_max.cc ) + s.files += %w( src/core/lib/iomgr/gethostname_sysconf.cc ) + s.files += %w( src/core/lib/iomgr/grpc_if_nametoindex.h ) + s.files += %w( src/core/lib/iomgr/grpc_if_nametoindex_posix.cc ) + s.files += %w( src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc ) + s.files += %w( src/core/lib/iomgr/internal_errqueue.cc ) + s.files += %w( src/core/lib/iomgr/internal_errqueue.h ) + s.files += %w( src/core/lib/iomgr/iocp_windows.cc ) + s.files += %w( src/core/lib/iomgr/iocp_windows.h ) + s.files += %w( src/core/lib/iomgr/iomgr.cc ) + s.files += %w( src/core/lib/iomgr/iomgr.h ) + s.files += %w( src/core/lib/iomgr/iomgr_custom.cc ) + s.files += %w( src/core/lib/iomgr/iomgr_custom.h ) + s.files += %w( src/core/lib/iomgr/iomgr_internal.cc ) + s.files += %w( src/core/lib/iomgr/iomgr_internal.h ) + s.files += %w( src/core/lib/iomgr/iomgr_posix.cc ) + s.files += %w( src/core/lib/iomgr/iomgr_posix.h ) + s.files += %w( src/core/lib/iomgr/iomgr_posix_cfstream.cc ) + s.files += %w( src/core/lib/iomgr/iomgr_uv.cc ) + s.files += %w( src/core/lib/iomgr/iomgr_windows.cc ) + s.files += %w( src/core/lib/iomgr/is_epollexclusive_available.cc ) + s.files += %w( src/core/lib/iomgr/is_epollexclusive_available.h ) + s.files += %w( src/core/lib/iomgr/load_file.cc ) + s.files += %w( src/core/lib/iomgr/load_file.h ) + s.files += %w( src/core/lib/iomgr/lockfree_event.cc ) + s.files += %w( src/core/lib/iomgr/lockfree_event.h ) + s.files += %w( src/core/lib/iomgr/nameser.h ) + s.files += %w( src/core/lib/iomgr/poller/eventmanager_libuv.cc ) + s.files += %w( src/core/lib/iomgr/poller/eventmanager_libuv.h ) + s.files += %w( src/core/lib/iomgr/polling_entity.cc ) + s.files += %w( src/core/lib/iomgr/polling_entity.h ) + s.files += %w( src/core/lib/iomgr/pollset.cc ) + s.files += %w( src/core/lib/iomgr/pollset.h ) + s.files += %w( src/core/lib/iomgr/pollset_custom.cc ) + s.files += %w( src/core/lib/iomgr/pollset_custom.h ) + s.files += %w( src/core/lib/iomgr/pollset_set.cc ) + s.files += %w( src/core/lib/iomgr/pollset_set.h ) + s.files += %w( src/core/lib/iomgr/pollset_set_custom.cc ) + s.files += %w( src/core/lib/iomgr/pollset_set_custom.h ) + s.files += %w( src/core/lib/iomgr/pollset_set_windows.cc ) + s.files += %w( src/core/lib/iomgr/pollset_set_windows.h ) + s.files += %w( src/core/lib/iomgr/pollset_uv.cc ) + s.files += %w( src/core/lib/iomgr/pollset_uv.h ) + s.files += %w( src/core/lib/iomgr/pollset_windows.cc ) + s.files += %w( src/core/lib/iomgr/pollset_windows.h ) + s.files += %w( src/core/lib/iomgr/port.h ) + s.files += %w( src/core/lib/iomgr/python_util.h ) + s.files += %w( src/core/lib/iomgr/resolve_address.cc ) + s.files += %w( src/core/lib/iomgr/resolve_address.h ) + s.files += %w( src/core/lib/iomgr/resolve_address_custom.cc ) + s.files += %w( src/core/lib/iomgr/resolve_address_custom.h ) + s.files += %w( src/core/lib/iomgr/resolve_address_posix.cc ) + s.files += %w( src/core/lib/iomgr/resolve_address_windows.cc ) + s.files += %w( src/core/lib/iomgr/resource_quota.cc ) + s.files += %w( src/core/lib/iomgr/resource_quota.h ) + s.files += %w( src/core/lib/iomgr/sockaddr.h ) + s.files += %w( src/core/lib/iomgr/sockaddr_custom.h ) + s.files += %w( src/core/lib/iomgr/sockaddr_posix.h ) + s.files += %w( src/core/lib/iomgr/sockaddr_utils.cc ) + s.files += %w( src/core/lib/iomgr/sockaddr_utils.h ) + s.files += %w( src/core/lib/iomgr/sockaddr_windows.h ) + s.files += %w( src/core/lib/iomgr/socket_factory_posix.cc ) + s.files += %w( src/core/lib/iomgr/socket_factory_posix.h ) + s.files += %w( src/core/lib/iomgr/socket_mutator.cc ) + s.files += %w( src/core/lib/iomgr/socket_mutator.h ) + s.files += %w( src/core/lib/iomgr/socket_utils.h ) + s.files += %w( src/core/lib/iomgr/socket_utils_common_posix.cc ) + s.files += %w( src/core/lib/iomgr/socket_utils_linux.cc ) + s.files += %w( src/core/lib/iomgr/socket_utils_posix.cc ) + s.files += %w( src/core/lib/iomgr/socket_utils_posix.h ) + s.files += %w( src/core/lib/iomgr/socket_utils_uv.cc ) + s.files += %w( src/core/lib/iomgr/socket_utils_windows.cc ) + s.files += %w( src/core/lib/iomgr/socket_windows.cc ) + s.files += %w( src/core/lib/iomgr/socket_windows.h ) + s.files += %w( src/core/lib/iomgr/sys_epoll_wrapper.h ) + s.files += %w( src/core/lib/iomgr/tcp_client.cc ) + s.files += %w( src/core/lib/iomgr/tcp_client.h ) + s.files += %w( src/core/lib/iomgr/tcp_client_cfstream.cc ) + s.files += %w( src/core/lib/iomgr/tcp_client_custom.cc ) + s.files += %w( src/core/lib/iomgr/tcp_client_posix.cc ) + s.files += %w( src/core/lib/iomgr/tcp_client_posix.h ) + s.files += %w( src/core/lib/iomgr/tcp_client_windows.cc ) + s.files += %w( src/core/lib/iomgr/tcp_custom.cc ) + s.files += %w( src/core/lib/iomgr/tcp_custom.h ) + s.files += %w( src/core/lib/iomgr/tcp_posix.cc ) + s.files += %w( src/core/lib/iomgr/tcp_posix.h ) + s.files += %w( src/core/lib/iomgr/tcp_server.cc ) + s.files += %w( src/core/lib/iomgr/tcp_server.h ) + s.files += %w( src/core/lib/iomgr/tcp_server_custom.cc ) + s.files += %w( src/core/lib/iomgr/tcp_server_posix.cc ) + s.files += %w( src/core/lib/iomgr/tcp_server_utils_posix.h ) + s.files += %w( src/core/lib/iomgr/tcp_server_utils_posix_common.cc ) + s.files += %w( src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc ) + s.files += %w( src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc ) + s.files += %w( src/core/lib/iomgr/tcp_server_windows.cc ) + s.files += %w( src/core/lib/iomgr/tcp_uv.cc ) + s.files += %w( src/core/lib/iomgr/tcp_windows.cc ) + s.files += %w( src/core/lib/iomgr/tcp_windows.h ) + s.files += %w( src/core/lib/iomgr/time_averaged_stats.cc ) + s.files += %w( src/core/lib/iomgr/time_averaged_stats.h ) + s.files += %w( src/core/lib/iomgr/timer.cc ) + s.files += %w( src/core/lib/iomgr/timer.h ) + s.files += %w( src/core/lib/iomgr/timer_custom.cc ) + s.files += %w( src/core/lib/iomgr/timer_custom.h ) + s.files += %w( src/core/lib/iomgr/timer_generic.cc ) + s.files += %w( src/core/lib/iomgr/timer_generic.h ) + s.files += %w( src/core/lib/iomgr/timer_heap.cc ) + s.files += %w( src/core/lib/iomgr/timer_heap.h ) + s.files += %w( src/core/lib/iomgr/timer_manager.cc ) + s.files += %w( src/core/lib/iomgr/timer_manager.h ) + s.files += %w( src/core/lib/iomgr/timer_uv.cc ) + s.files += %w( src/core/lib/iomgr/udp_server.cc ) + s.files += %w( src/core/lib/iomgr/udp_server.h ) + s.files += %w( src/core/lib/iomgr/unix_sockets_posix.cc ) + s.files += %w( src/core/lib/iomgr/unix_sockets_posix.h ) + s.files += %w( src/core/lib/iomgr/unix_sockets_posix_noop.cc ) + s.files += %w( src/core/lib/iomgr/wakeup_fd_eventfd.cc ) + s.files += %w( src/core/lib/iomgr/wakeup_fd_nospecial.cc ) + s.files += %w( src/core/lib/iomgr/wakeup_fd_pipe.cc ) + s.files += %w( src/core/lib/iomgr/wakeup_fd_pipe.h ) + s.files += %w( src/core/lib/iomgr/wakeup_fd_posix.cc ) + s.files += %w( src/core/lib/iomgr/wakeup_fd_posix.h ) + s.files += %w( src/core/lib/iomgr/work_serializer.cc ) + s.files += %w( src/core/lib/iomgr/work_serializer.h ) + s.files += %w( src/core/lib/json/json.h ) + s.files += %w( src/core/lib/json/json_reader.cc ) + s.files += %w( src/core/lib/json/json_writer.cc ) + s.files += %w( src/core/lib/profiling/basic_timers.cc ) + s.files += %w( src/core/lib/profiling/stap_timers.cc ) + s.files += %w( src/core/lib/profiling/timers.h ) + s.files += %w( src/core/lib/security/context/security_context.cc ) + s.files += %w( src/core/lib/security/context/security_context.h ) + s.files += %w( src/core/lib/security/credentials/alts/alts_credentials.cc ) + s.files += %w( src/core/lib/security/credentials/alts/alts_credentials.h ) + s.files += %w( src/core/lib/security/credentials/alts/check_gcp_environment.cc ) + s.files += %w( src/core/lib/security/credentials/alts/check_gcp_environment.h ) + s.files += %w( src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc ) + s.files += %w( src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc ) + s.files += %w( src/core/lib/security/credentials/alts/check_gcp_environment_windows.cc ) + s.files += %w( src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc ) + s.files += %w( src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc ) + s.files += %w( src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h ) + s.files += %w( src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc ) + s.files += %w( src/core/lib/security/credentials/composite/composite_credentials.cc ) + s.files += %w( src/core/lib/security/credentials/composite/composite_credentials.h ) + s.files += %w( src/core/lib/security/credentials/credentials.cc ) + s.files += %w( src/core/lib/security/credentials/credentials.h ) + s.files += %w( src/core/lib/security/credentials/credentials_metadata.cc ) + s.files += %w( src/core/lib/security/credentials/fake/fake_credentials.cc ) + s.files += %w( src/core/lib/security/credentials/fake/fake_credentials.h ) + s.files += %w( src/core/lib/security/credentials/google_default/credentials_generic.cc ) + s.files += %w( src/core/lib/security/credentials/google_default/google_default_credentials.cc ) + s.files += %w( src/core/lib/security/credentials/google_default/google_default_credentials.h ) + s.files += %w( src/core/lib/security/credentials/iam/iam_credentials.cc ) + s.files += %w( src/core/lib/security/credentials/iam/iam_credentials.h ) + s.files += %w( src/core/lib/security/credentials/jwt/json_token.cc ) + s.files += %w( src/core/lib/security/credentials/jwt/json_token.h ) + s.files += %w( src/core/lib/security/credentials/jwt/jwt_credentials.cc ) + s.files += %w( src/core/lib/security/credentials/jwt/jwt_credentials.h ) + s.files += %w( src/core/lib/security/credentials/jwt/jwt_verifier.cc ) + s.files += %w( src/core/lib/security/credentials/jwt/jwt_verifier.h ) + s.files += %w( src/core/lib/security/credentials/local/local_credentials.cc ) + s.files += %w( src/core/lib/security/credentials/local/local_credentials.h ) + s.files += %w( src/core/lib/security/credentials/oauth2/oauth2_credentials.cc ) + s.files += %w( src/core/lib/security/credentials/oauth2/oauth2_credentials.h ) + s.files += %w( src/core/lib/security/credentials/plugin/plugin_credentials.cc ) + s.files += %w( src/core/lib/security/credentials/plugin/plugin_credentials.h ) + s.files += %w( src/core/lib/security/credentials/ssl/ssl_credentials.cc ) + s.files += %w( src/core/lib/security/credentials/ssl/ssl_credentials.h ) + s.files += %w( src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc ) + s.files += %w( src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h ) + s.files += %w( src/core/lib/security/credentials/tls/tls_credentials.cc ) + s.files += %w( src/core/lib/security/credentials/tls/tls_credentials.h ) + s.files += %w( src/core/lib/security/security_connector/alts/alts_security_connector.cc ) + s.files += %w( src/core/lib/security/security_connector/alts/alts_security_connector.h ) + s.files += %w( src/core/lib/security/security_connector/fake/fake_security_connector.cc ) + s.files += %w( src/core/lib/security/security_connector/fake/fake_security_connector.h ) + s.files += %w( src/core/lib/security/security_connector/load_system_roots.h ) + s.files += %w( src/core/lib/security/security_connector/load_system_roots_fallback.cc ) + s.files += %w( src/core/lib/security/security_connector/load_system_roots_linux.cc ) + s.files += %w( src/core/lib/security/security_connector/load_system_roots_linux.h ) + s.files += %w( src/core/lib/security/security_connector/local/local_security_connector.cc ) + s.files += %w( src/core/lib/security/security_connector/local/local_security_connector.h ) + s.files += %w( src/core/lib/security/security_connector/security_connector.cc ) + s.files += %w( src/core/lib/security/security_connector/security_connector.h ) + s.files += %w( src/core/lib/security/security_connector/ssl/ssl_security_connector.cc ) + s.files += %w( src/core/lib/security/security_connector/ssl/ssl_security_connector.h ) + s.files += %w( src/core/lib/security/security_connector/ssl_utils.cc ) + s.files += %w( src/core/lib/security/security_connector/ssl_utils.h ) + s.files += %w( src/core/lib/security/security_connector/ssl_utils_config.cc ) + s.files += %w( src/core/lib/security/security_connector/ssl_utils_config.h ) + s.files += %w( src/core/lib/security/security_connector/tls/tls_security_connector.cc ) + s.files += %w( src/core/lib/security/security_connector/tls/tls_security_connector.h ) + s.files += %w( src/core/lib/security/transport/auth_filters.h ) + s.files += %w( src/core/lib/security/transport/client_auth_filter.cc ) + s.files += %w( src/core/lib/security/transport/secure_endpoint.cc ) + s.files += %w( src/core/lib/security/transport/secure_endpoint.h ) + s.files += %w( src/core/lib/security/transport/security_handshaker.cc ) + s.files += %w( src/core/lib/security/transport/security_handshaker.h ) + s.files += %w( src/core/lib/security/transport/server_auth_filter.cc ) + s.files += %w( src/core/lib/security/transport/target_authority_table.cc ) + s.files += %w( src/core/lib/security/transport/target_authority_table.h ) + s.files += %w( src/core/lib/security/transport/tsi_error.cc ) + s.files += %w( src/core/lib/security/transport/tsi_error.h ) + s.files += %w( src/core/lib/security/util/json_util.cc ) + s.files += %w( src/core/lib/security/util/json_util.h ) + s.files += %w( src/core/lib/slice/b64.cc ) + s.files += %w( src/core/lib/slice/b64.h ) + s.files += %w( src/core/lib/slice/percent_encoding.cc ) + s.files += %w( src/core/lib/slice/percent_encoding.h ) + s.files += %w( src/core/lib/slice/slice.cc ) + s.files += %w( src/core/lib/slice/slice_buffer.cc ) + s.files += %w( src/core/lib/slice/slice_hash_table.h ) + s.files += %w( src/core/lib/slice/slice_intern.cc ) + s.files += %w( src/core/lib/slice/slice_internal.h ) + s.files += %w( src/core/lib/slice/slice_string_helpers.cc ) + s.files += %w( src/core/lib/slice/slice_string_helpers.h ) + s.files += %w( src/core/lib/slice/slice_utils.h ) + s.files += %w( src/core/lib/slice/slice_weak_hash_table.h ) + s.files += %w( src/core/lib/surface/api_trace.cc ) + s.files += %w( src/core/lib/surface/api_trace.h ) + s.files += %w( src/core/lib/surface/byte_buffer.cc ) + s.files += %w( src/core/lib/surface/byte_buffer_reader.cc ) + s.files += %w( src/core/lib/surface/call.cc ) + s.files += %w( src/core/lib/surface/call.h ) + s.files += %w( src/core/lib/surface/call_details.cc ) + s.files += %w( src/core/lib/surface/call_log_batch.cc ) + s.files += %w( src/core/lib/surface/call_test_only.h ) + s.files += %w( src/core/lib/surface/channel.cc ) + s.files += %w( src/core/lib/surface/channel.h ) + s.files += %w( src/core/lib/surface/channel_init.cc ) + s.files += %w( src/core/lib/surface/channel_init.h ) + s.files += %w( src/core/lib/surface/channel_ping.cc ) + s.files += %w( src/core/lib/surface/channel_stack_type.cc ) + s.files += %w( src/core/lib/surface/channel_stack_type.h ) + s.files += %w( src/core/lib/surface/completion_queue.cc ) + s.files += %w( src/core/lib/surface/completion_queue.h ) + s.files += %w( src/core/lib/surface/completion_queue_factory.cc ) + s.files += %w( src/core/lib/surface/completion_queue_factory.h ) + s.files += %w( src/core/lib/surface/event_string.cc ) + s.files += %w( src/core/lib/surface/event_string.h ) + s.files += %w( src/core/lib/surface/init.cc ) + s.files += %w( src/core/lib/surface/init.h ) + s.files += %w( src/core/lib/surface/init_secure.cc ) + s.files += %w( src/core/lib/surface/lame_client.cc ) + s.files += %w( src/core/lib/surface/lame_client.h ) + s.files += %w( src/core/lib/surface/metadata_array.cc ) + s.files += %w( src/core/lib/surface/server.cc ) + s.files += %w( src/core/lib/surface/server.h ) + s.files += %w( src/core/lib/surface/validate_metadata.cc ) + s.files += %w( src/core/lib/surface/validate_metadata.h ) + s.files += %w( src/core/lib/surface/version.cc ) + s.files += %w( src/core/lib/transport/bdp_estimator.cc ) + s.files += %w( src/core/lib/transport/bdp_estimator.h ) + s.files += %w( src/core/lib/transport/byte_stream.cc ) + s.files += %w( src/core/lib/transport/byte_stream.h ) + s.files += %w( src/core/lib/transport/connectivity_state.cc ) + s.files += %w( src/core/lib/transport/connectivity_state.h ) + s.files += %w( src/core/lib/transport/error_utils.cc ) + s.files += %w( src/core/lib/transport/error_utils.h ) + s.files += %w( src/core/lib/transport/http2_errors.h ) + s.files += %w( src/core/lib/transport/metadata.cc ) + s.files += %w( src/core/lib/transport/metadata.h ) + s.files += %w( src/core/lib/transport/metadata_batch.cc ) + s.files += %w( src/core/lib/transport/metadata_batch.h ) + s.files += %w( src/core/lib/transport/pid_controller.cc ) + s.files += %w( src/core/lib/transport/pid_controller.h ) + s.files += %w( src/core/lib/transport/static_metadata.cc ) + s.files += %w( src/core/lib/transport/static_metadata.h ) + s.files += %w( src/core/lib/transport/status_conversion.cc ) + s.files += %w( src/core/lib/transport/status_conversion.h ) + s.files += %w( src/core/lib/transport/status_metadata.cc ) + s.files += %w( src/core/lib/transport/status_metadata.h ) + s.files += %w( src/core/lib/transport/timeout_encoding.cc ) + s.files += %w( src/core/lib/transport/timeout_encoding.h ) + s.files += %w( src/core/lib/transport/transport.cc ) + s.files += %w( src/core/lib/transport/transport.h ) + s.files += %w( src/core/lib/transport/transport_impl.h ) + s.files += %w( src/core/lib/transport/transport_op_string.cc ) + s.files += %w( src/core/lib/uri/uri_parser.cc ) + s.files += %w( src/core/lib/uri/uri_parser.h ) + s.files += %w( src/core/plugin_registry/grpc_plugin_registry.cc ) + s.files += %w( src/core/tsi/alts/crypt/aes_gcm.cc ) + s.files += %w( src/core/tsi/alts/crypt/gsec.cc ) + s.files += %w( src/core/tsi/alts/crypt/gsec.h ) + s.files += %w( src/core/tsi/alts/frame_protector/alts_counter.cc ) + s.files += %w( src/core/tsi/alts/frame_protector/alts_counter.h ) + s.files += %w( src/core/tsi/alts/frame_protector/alts_crypter.cc ) + s.files += %w( src/core/tsi/alts/frame_protector/alts_crypter.h ) + s.files += %w( src/core/tsi/alts/frame_protector/alts_frame_protector.cc ) + s.files += %w( src/core/tsi/alts/frame_protector/alts_frame_protector.h ) + s.files += %w( src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.cc ) + s.files += %w( src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.h ) + s.files += %w( src/core/tsi/alts/frame_protector/alts_seal_privacy_integrity_crypter.cc ) + s.files += %w( src/core/tsi/alts/frame_protector/alts_unseal_privacy_integrity_crypter.cc ) + s.files += %w( src/core/tsi/alts/frame_protector/frame_handler.cc ) + s.files += %w( src/core/tsi/alts/frame_protector/frame_handler.h ) + s.files += %w( src/core/tsi/alts/handshaker/alts_handshaker_client.cc ) + s.files += %w( src/core/tsi/alts/handshaker/alts_handshaker_client.h ) + s.files += %w( src/core/tsi/alts/handshaker/alts_shared_resource.cc ) + s.files += %w( src/core/tsi/alts/handshaker/alts_shared_resource.h ) + s.files += %w( src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc ) + s.files += %w( src/core/tsi/alts/handshaker/alts_tsi_handshaker.h ) + s.files += %w( src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h ) + s.files += %w( src/core/tsi/alts/handshaker/alts_tsi_utils.cc ) + s.files += %w( src/core/tsi/alts/handshaker/alts_tsi_utils.h ) + s.files += %w( src/core/tsi/alts/handshaker/transport_security_common_api.cc ) + s.files += %w( src/core/tsi/alts/handshaker/transport_security_common_api.h ) + s.files += %w( src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc ) + s.files += %w( src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.h ) + s.files += %w( src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc ) + s.files += %w( src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.h ) + s.files += %w( src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol.h ) + s.files += %w( src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc ) + s.files += %w( src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h ) + s.files += %w( src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc ) + s.files += %w( src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.h ) + s.files += %w( src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc ) + s.files += %w( src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h ) + s.files += %w( src/core/tsi/fake_transport_security.cc ) + s.files += %w( src/core/tsi/fake_transport_security.h ) + s.files += %w( src/core/tsi/local_transport_security.cc ) + s.files += %w( src/core/tsi/local_transport_security.h ) + s.files += %w( src/core/tsi/ssl/session_cache/ssl_session.h ) + s.files += %w( src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc ) + s.files += %w( src/core/tsi/ssl/session_cache/ssl_session_cache.cc ) + s.files += %w( src/core/tsi/ssl/session_cache/ssl_session_cache.h ) + s.files += %w( src/core/tsi/ssl/session_cache/ssl_session_openssl.cc ) + s.files += %w( src/core/tsi/ssl_transport_security.cc ) + s.files += %w( src/core/tsi/ssl_transport_security.h ) + s.files += %w( src/core/tsi/ssl_types.h ) + s.files += %w( src/core/tsi/transport_security.cc ) + s.files += %w( src/core/tsi/transport_security.h ) + s.files += %w( src/core/tsi/transport_security_grpc.cc ) + s.files += %w( src/core/tsi/transport_security_grpc.h ) + s.files += %w( src/core/tsi/transport_security_interface.h ) + s.files += %w( third_party/abseil-cpp/absl/algorithm/algorithm.h ) + s.files += %w( third_party/abseil-cpp/absl/base/attributes.h ) + s.files += %w( third_party/abseil-cpp/absl/base/call_once.h ) + s.files += %w( third_party/abseil-cpp/absl/base/casts.h ) + s.files += %w( third_party/abseil-cpp/absl/base/config.h ) + s.files += %w( third_party/abseil-cpp/absl/base/const_init.h ) + s.files += %w( third_party/abseil-cpp/absl/base/dynamic_annotations.cc ) + s.files += %w( third_party/abseil-cpp/absl/base/dynamic_annotations.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/atomic_hook.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/bits.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/cycleclock.cc ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/cycleclock.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/endian.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/errno_saver.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/hide_ptr.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/identity.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/inline_variable.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/invoke.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/per_thread_tls.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/raw_logging.cc ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/raw_logging.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/scheduling_mode.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/spinlock.cc ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/spinlock.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/spinlock_akaros.inc ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/spinlock_posix.inc ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/spinlock_wait.cc ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/spinlock_wait.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/spinlock_win32.inc ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/sysinfo.cc ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/sysinfo.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/thread_annotations.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/thread_identity.cc ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/thread_identity.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/throw_delegate.cc ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/throw_delegate.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/tsan_mutex_interface.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/unaligned_access.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h ) + s.files += %w( third_party/abseil-cpp/absl/base/log_severity.cc ) + s.files += %w( third_party/abseil-cpp/absl/base/log_severity.h ) + s.files += %w( third_party/abseil-cpp/absl/base/macros.h ) + s.files += %w( third_party/abseil-cpp/absl/base/optimization.h ) + s.files += %w( third_party/abseil-cpp/absl/base/options.h ) + s.files += %w( third_party/abseil-cpp/absl/base/policy_checks.h ) + s.files += %w( third_party/abseil-cpp/absl/base/port.h ) + s.files += %w( third_party/abseil-cpp/absl/base/thread_annotations.h ) + s.files += %w( third_party/abseil-cpp/absl/container/inlined_vector.h ) + s.files += %w( third_party/abseil-cpp/absl/container/internal/compressed_tuple.h ) + s.files += %w( third_party/abseil-cpp/absl/container/internal/inlined_vector.h ) + s.files += %w( third_party/abseil-cpp/absl/memory/memory.h ) + s.files += %w( third_party/abseil-cpp/absl/meta/type_traits.h ) + s.files += %w( third_party/abseil-cpp/absl/numeric/int128.cc ) + s.files += %w( third_party/abseil-cpp/absl/numeric/int128.h ) + s.files += %w( third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc ) + s.files += %w( third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc ) + s.files += %w( third_party/abseil-cpp/absl/strings/ascii.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/ascii.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/charconv.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/charconv.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/escaping.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/escaping.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/char_map.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/charconv_bigint.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/charconv_parse.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/escaping.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/escaping.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/memutil.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/memutil.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/ostringstream.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/ostringstream.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/resize_uninitialized.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/stl_type_traits.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_format/arg.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_format/bind.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_format/checker.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_format/extension.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_format/output.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_format/output.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_format/parser.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_join_internal.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_split_internal.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/utf8.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/utf8.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/match.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/match.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/numbers.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/numbers.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/str_cat.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/str_cat.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/str_format.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/str_join.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/str_replace.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/str_replace.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/str_split.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/str_split.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/string_view.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/string_view.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/strip.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/substitute.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/substitute.h ) + s.files += %w( third_party/abseil-cpp/absl/time/civil_time.cc ) + s.files += %w( third_party/abseil-cpp/absl/time/civil_time.h ) + s.files += %w( third_party/abseil-cpp/absl/time/clock.cc ) + s.files += %w( third_party/abseil-cpp/absl/time/clock.h ) + s.files += %w( third_party/abseil-cpp/absl/time/duration.cc ) + s.files += %w( third_party/abseil-cpp/absl/time/format.cc ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time.h ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/zone_info_source.h ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/civil_time_detail.cc ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.h ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.cc ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.h ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.h ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.h ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.cc ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.h ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/get_current_time_chrono.inc ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/get_current_time_posix.inc ) + s.files += %w( third_party/abseil-cpp/absl/time/time.cc ) + s.files += %w( third_party/abseil-cpp/absl/time/time.h ) + s.files += %w( third_party/abseil-cpp/absl/types/bad_optional_access.cc ) + s.files += %w( third_party/abseil-cpp/absl/types/bad_optional_access.h ) + s.files += %w( third_party/abseil-cpp/absl/types/internal/optional.h ) + s.files += %w( third_party/abseil-cpp/absl/types/internal/span.h ) + s.files += %w( third_party/abseil-cpp/absl/types/optional.h ) + s.files += %w( third_party/abseil-cpp/absl/types/span.h ) + s.files += %w( third_party/abseil-cpp/absl/utility/utility.h ) + s.files += %w( third_party/address_sorting/address_sorting.c ) + s.files += %w( third_party/address_sorting/address_sorting_internal.h ) + s.files += %w( third_party/address_sorting/address_sorting_posix.c ) + s.files += %w( third_party/address_sorting/address_sorting_windows.c ) + s.files += %w( third_party/address_sorting/include/address_sorting/address_sorting.h ) + s.files += %w( third_party/boringssl-with-bazel/err_data.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_dup.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_i2d_fp.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_octet.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_print.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_utf8.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/asn1_locl.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/asn1_par.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/f_string.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/time_support.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/base64/base64.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/bio.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/connect.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/fd.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/file.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/hexdump.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/pair.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/printf.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/socket.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bn_extra/bn_asn1.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bn_extra/convert.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/buf/buf.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bytestring/asn1_compat.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bytestring/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bytestring/unicode.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/chacha/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_extra.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/derive_key.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesccm.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesctrhmac.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesgcmsiv.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_chacha20poly1305.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_null.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc2.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc4.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cmac/cmac.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/conf/conf.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/conf/conf_def.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/conf/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-fuchsia.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-linux.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cpu-arm.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cpu-intel.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cpu-ppc64le.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/crypto.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519_tables.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/curve25519/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/dh/check.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/dh/dh.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/dh/dh_asn1.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/dh/params.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_derive.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_extra.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/ecdsa_extra/ecdsa_asn1.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/engine/engine.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/err/err.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/err/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/digestsign.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/evp.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/evp_ctx.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_dsa_asn1.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_ec.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_ec_asn1.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519_asn1.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_rsa.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_rsa_asn1.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_x25519.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_x25519_asn1.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/pbkdf.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/print.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/sign.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/ex_data.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes_nohw.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/key_wrap.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/mode_wrappers.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/add.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/asm/x86_64-gcc.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bn.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bytes.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/cmp.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/ctx.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div_extra.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/exponentiation.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd_extra.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/generic.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/jacobi.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery_inv.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/mul.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/prime.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/random.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/rsaz_exp.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/rsaz_exp.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/shift.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/sqrt.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/aead.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_des.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/delocate.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/des.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digest.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digests.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/md32_common.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_montgomery.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/felem.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/oct.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64-table.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256_table.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/scalar.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/util.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/wnaf.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdh/ecdh.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/fips_shared_support.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/hmac/hmac.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/is_fips.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cbc.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cfb.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ctr.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm_nohw.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ofb.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/polyval.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/ctrdrbg.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/getrandom_fillin.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/blinding.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/padding.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1-altivec.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/tls/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/tls/kdf.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/hkdf/hkdf.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/hrss/hrss.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/hrss/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/lhash/lhash.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/mem.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/obj/obj.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/obj/obj_dat.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/obj/obj_xref.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pem/pem_all.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pem/pem_info.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pem/pem_oth.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pem/pem_pk8.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pem/pem_pkey.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pem/pem_x509.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pem/pem_xaux.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pkcs7/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pkcs8/p5_pbev2.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/poly1305/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_vec.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pool/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pool/pool.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/rand_extra/forkunsafe.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/rand_extra/fuchsia.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/rc4/rc4.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/refcount_c11.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/refcount_lock.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_asn1.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_print.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/stack/stack.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/thread.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/thread_none.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/thread_pthread.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/thread_win.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/a_digest.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/a_sign.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/a_verify.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/by_dir.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/by_file.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/charmap.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/i2d_pr.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/t_req.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/vpm_int.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_d2.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_def.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_r2x.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_txt.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509name.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509rset.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509spki.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_algor.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_all.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_exten.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_info.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_name.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_pkey.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_req.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_sig.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_spki.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_val.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/ext_dat.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_int.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_lib.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_node.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akeya.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bcons.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_crld.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_extku.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ia5.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_info.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_int.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ncons.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ocsp.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pci.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pcia.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pcons.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pku.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pmaps.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_sxnet.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/aead.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/aes.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/asn1.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/asn1_mac.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/asn1t.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/base.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/base64.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/bio.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/blowfish.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/bn.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/buf.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/buffer.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/bytestring.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/cast.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/chacha.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/cipher.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/cmac.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/conf.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/cpu.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/crypto.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/curve25519.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/des.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/dh.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/digest.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/dsa.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/dtls1.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/e_os2.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/ec.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/ec_key.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/ecdh.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/engine.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/err.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/evp.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/ex_data.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/hkdf.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/hmac.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/hrss.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/is_boringssl.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/lhash.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/md4.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/md5.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/mem.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/nid.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/obj.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/obj_mac.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/objects.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/opensslconf.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/opensslv.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/ossl_typ.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/pem.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/pkcs12.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/poly1305.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/pool.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/rand.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/rc4.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/ripemd.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/rsa.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/safestack.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/sha.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/siphash.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/span.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/srtp.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/ssl.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/ssl3.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/stack.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/thread.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/tls1.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/trust_token.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/type_check.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/x509.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/x509v3.h ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/bio_ssl.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/d1_both.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/d1_lib.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/d1_pkt.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/d1_srtp.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/dtls_method.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/dtls_record.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/handoff.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/handshake.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/handshake_client.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/handshake_server.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/s3_both.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/s3_lib.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/s3_pkt.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_aead_ctx.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_buffer.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_file.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_session.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_stat.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/t1_enc.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/t1_lib.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/tls13_both.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/tls13_client.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/tls13_server.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/tls_method.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/tls_record.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_32.h ) + s.files += %w( third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_64.h ) + s.files += %w( third_party/boringssl-with-bazel/src/third_party/fiat/p256_32.h ) + s.files += %w( third_party/boringssl-with-bazel/src/third_party/fiat/p256_64.h ) + s.files += %w( third_party/cares/ares_build.h ) + s.files += %w( third_party/cares/cares/ares.h ) + s.files += %w( third_party/cares/cares/ares__close_sockets.c ) + s.files += %w( third_party/cares/cares/ares__get_hostent.c ) + s.files += %w( third_party/cares/cares/ares__read_line.c ) + s.files += %w( third_party/cares/cares/ares__timeval.c ) + s.files += %w( third_party/cares/cares/ares_cancel.c ) + s.files += %w( third_party/cares/cares/ares_create_query.c ) + s.files += %w( third_party/cares/cares/ares_data.c ) + s.files += %w( third_party/cares/cares/ares_data.h ) + s.files += %w( third_party/cares/cares/ares_destroy.c ) + s.files += %w( third_party/cares/cares/ares_dns.h ) + s.files += %w( third_party/cares/cares/ares_expand_name.c ) + s.files += %w( third_party/cares/cares/ares_expand_string.c ) + s.files += %w( third_party/cares/cares/ares_fds.c ) + s.files += %w( third_party/cares/cares/ares_free_hostent.c ) + s.files += %w( third_party/cares/cares/ares_free_string.c ) + s.files += %w( third_party/cares/cares/ares_getenv.c ) + s.files += %w( third_party/cares/cares/ares_getenv.h ) + s.files += %w( third_party/cares/cares/ares_gethostbyaddr.c ) + s.files += %w( third_party/cares/cares/ares_gethostbyname.c ) + s.files += %w( third_party/cares/cares/ares_getnameinfo.c ) + s.files += %w( third_party/cares/cares/ares_getopt.c ) + s.files += %w( third_party/cares/cares/ares_getopt.h ) + s.files += %w( third_party/cares/cares/ares_getsock.c ) + s.files += %w( third_party/cares/cares/ares_inet_net_pton.h ) + s.files += %w( third_party/cares/cares/ares_init.c ) + s.files += %w( third_party/cares/cares/ares_iphlpapi.h ) + s.files += %w( third_party/cares/cares/ares_ipv6.h ) + s.files += %w( third_party/cares/cares/ares_library_init.c ) + s.files += %w( third_party/cares/cares/ares_library_init.h ) + s.files += %w( third_party/cares/cares/ares_llist.c ) + s.files += %w( third_party/cares/cares/ares_llist.h ) + s.files += %w( third_party/cares/cares/ares_mkquery.c ) + s.files += %w( third_party/cares/cares/ares_nowarn.c ) + s.files += %w( third_party/cares/cares/ares_nowarn.h ) + s.files += %w( third_party/cares/cares/ares_options.c ) + s.files += %w( third_party/cares/cares/ares_parse_a_reply.c ) + s.files += %w( third_party/cares/cares/ares_parse_aaaa_reply.c ) + s.files += %w( third_party/cares/cares/ares_parse_mx_reply.c ) + s.files += %w( third_party/cares/cares/ares_parse_naptr_reply.c ) + s.files += %w( third_party/cares/cares/ares_parse_ns_reply.c ) + s.files += %w( third_party/cares/cares/ares_parse_ptr_reply.c ) + s.files += %w( third_party/cares/cares/ares_parse_soa_reply.c ) + s.files += %w( third_party/cares/cares/ares_parse_srv_reply.c ) + s.files += %w( third_party/cares/cares/ares_parse_txt_reply.c ) + s.files += %w( third_party/cares/cares/ares_platform.c ) + s.files += %w( third_party/cares/cares/ares_platform.h ) + s.files += %w( third_party/cares/cares/ares_private.h ) + s.files += %w( third_party/cares/cares/ares_process.c ) + s.files += %w( third_party/cares/cares/ares_query.c ) + s.files += %w( third_party/cares/cares/ares_rules.h ) + s.files += %w( third_party/cares/cares/ares_search.c ) + s.files += %w( third_party/cares/cares/ares_send.c ) + s.files += %w( third_party/cares/cares/ares_setup.h ) + s.files += %w( third_party/cares/cares/ares_strcasecmp.c ) + s.files += %w( third_party/cares/cares/ares_strcasecmp.h ) + s.files += %w( third_party/cares/cares/ares_strdup.c ) + s.files += %w( third_party/cares/cares/ares_strdup.h ) + s.files += %w( third_party/cares/cares/ares_strerror.c ) + s.files += %w( third_party/cares/cares/ares_strsplit.c ) + s.files += %w( third_party/cares/cares/ares_strsplit.h ) + s.files += %w( third_party/cares/cares/ares_timeout.c ) + s.files += %w( third_party/cares/cares/ares_version.c ) + s.files += %w( third_party/cares/cares/ares_version.h ) + s.files += %w( third_party/cares/cares/ares_writev.c ) + s.files += %w( third_party/cares/cares/bitncmp.c ) + s.files += %w( third_party/cares/cares/bitncmp.h ) + s.files += %w( third_party/cares/cares/config-win32.h ) + s.files += %w( third_party/cares/cares/inet_net_pton.c ) + s.files += %w( third_party/cares/cares/inet_ntop.c ) + s.files += %w( third_party/cares/cares/setup_once.h ) + s.files += %w( third_party/cares/cares/windows_port.c ) + s.files += %w( third_party/cares/config_darwin/ares_config.h ) + s.files += %w( third_party/cares/config_freebsd/ares_config.h ) + s.files += %w( third_party/cares/config_linux/ares_config.h ) + s.files += %w( third_party/cares/config_openbsd/ares_config.h ) + s.files += %w( third_party/upb/upb/decode.c ) + s.files += %w( third_party/upb/upb/decode.h ) + s.files += %w( third_party/upb/upb/encode.c ) + s.files += %w( third_party/upb/upb/encode.h ) + s.files += %w( third_party/upb/upb/generated_util.h ) + s.files += %w( third_party/upb/upb/msg.c ) + s.files += %w( third_party/upb/upb/msg.h ) + s.files += %w( third_party/upb/upb/port.c ) + s.files += %w( third_party/upb/upb/port_def.inc ) + s.files += %w( third_party/upb/upb/port_undef.inc ) + s.files += %w( third_party/upb/upb/table.c ) + s.files += %w( third_party/upb/upb/table.int.h ) + s.files += %w( third_party/upb/upb/upb.c ) + s.files += %w( third_party/upb/upb/upb.h ) + s.files += %w( third_party/zlib/adler32.c ) + s.files += %w( third_party/zlib/compress.c ) + s.files += %w( third_party/zlib/crc32.c ) + s.files += %w( third_party/zlib/crc32.h ) + s.files += %w( third_party/zlib/deflate.c ) + s.files += %w( third_party/zlib/deflate.h ) + s.files += %w( third_party/zlib/gzclose.c ) + s.files += %w( third_party/zlib/gzguts.h ) + s.files += %w( third_party/zlib/gzlib.c ) + s.files += %w( third_party/zlib/gzread.c ) + s.files += %w( third_party/zlib/gzwrite.c ) + s.files += %w( third_party/zlib/infback.c ) + s.files += %w( third_party/zlib/inffast.c ) + s.files += %w( third_party/zlib/inffast.h ) + s.files += %w( third_party/zlib/inffixed.h ) + s.files += %w( third_party/zlib/inflate.c ) + s.files += %w( third_party/zlib/inflate.h ) + s.files += %w( third_party/zlib/inftrees.c ) + s.files += %w( third_party/zlib/inftrees.h ) + s.files += %w( third_party/zlib/trees.c ) + s.files += %w( third_party/zlib/trees.h ) + s.files += %w( third_party/zlib/uncompr.c ) + s.files += %w( third_party/zlib/zconf.h ) + s.files += %w( third_party/zlib/zlib.h ) + s.files += %w( third_party/zlib/zutil.c ) + s.files += %w( third_party/zlib/zutil.h ) +end diff --git a/grpc.gyp b/grpc.gyp new file mode 100644 index 00000000..b80efd83 --- /dev/null +++ b/grpc.gyp @@ -0,0 +1,1890 @@ +# GRPC GYP build file + +# This file has been automatically generated from a template file. +# Please look at the templates directory instead. +# This file can be regenerated from the template by running +# tools/buildgen/generate_projects.sh + +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +{ + 'variables': { + # The openssl and zlib dependencies must be passed in as variables + # defined in an included gypi file, usually common.gypi. + 'openssl_gyp_target%': 'Please Define openssl_gyp_target variable', + 'zlib_gyp_target%': 'Please Define zlib_gyp_target variable', + + 'grpc_gcov%': 'false', + 'grpc_alpine%': 'false', + }, + 'target_defaults': { + 'configurations': { + 'Release': { + 'cflags': [ + '-O2', + '-Wframe-larger-than=16384', + ], + 'defines': [ + 'NDEBUG', + ], + }, + 'Debug': { + 'cflags': [ + '-O0', + ], + 'defines': [ + '_DEBUG', + 'DEBUG', + ], + }, + }, + 'cflags': [ + '-g', + '-Wall', + '-Wextra', + '-DOSATOMIC_USE_INLINED=1', + '-Ithird_party/abseil-cpp', + '-Ithird_party/upb', + '-Isrc/core/ext/upb-generated', + ], + 'ldflags': [ + '-g', + ], + 'cflags_c': [ + '-Werror', + '-std=c99', + ], + 'cflags_cc': [ + '-Werror', + '-std=c++11', + ], + 'include_dirs': [ + '.', + '../..', + 'include', + ], + 'defines': [ + 'GRPC_ARES=0', + ], + 'dependencies': [ + '<(openssl_gyp_target)', + '<(zlib_gyp_target)', + ], + 'conditions': [ + ['grpc_gcov=="true"', { + 'cflags': [ + '-O0', + '-fprofile-arcs', + '-ftest-coverage', + '-Wno-return-type', + ], + 'defines': [ + '_DEBUG', + 'DEBUG', + 'GPR_GCOV', + ], + 'ldflags': [ + '-fprofile-arcs', + '-ftest-coverage', + '-rdynamic', + '-lstdc++', + ], + }], + ['grpc_alpine=="true"', { + 'defines': [ + 'GPR_MUSL_LIBC_COMPAT' + ] + }], + ['OS == "win"', { + 'defines': [ + '_WIN32_WINNT=0x0600', + 'WIN32_LEAN_AND_MEAN', + '_HAS_EXCEPTIONS=0', + 'UNICODE', + '_UNICODE', + 'NOMINMAX', + ], + 'msvs_settings': { + 'VCCLCompilerTool': { + 'RuntimeLibrary': 1, # static debug + } + }, + "libraries": [ + "ws2_32" + ] + }], + ['OS == "mac"', { + 'xcode_settings': { + 'OTHER_CFLAGS': [ + '-g', + '-Wall', + '-Wextra', + '-DOSATOMIC_USE_INLINED=1', + '-Ithird_party/abseil-cpp', + '-Ithird_party/upb', + '-Isrc/core/ext/upb-generated', + ], + 'OTHER_CPLUSPLUSFLAGS': [ + '-g', + '-Wall', + '-Wextra', + '-DOSATOMIC_USE_INLINED=1', + '-Ithird_party/abseil-cpp', + '-Ithird_party/upb', + '-Isrc/core/ext/upb-generated', + '-stdlib=libc++', + '-std=c++11', + '-Wno-error=deprecated-declarations', + ], + }, + }] + ] + }, + 'targets': [ + { + 'target_name': 'address_sorting', + 'type': 'static_library', + 'dependencies': [ + ], + 'sources': [ + 'third_party/address_sorting/address_sorting.c', + 'third_party/address_sorting/address_sorting_posix.c', + 'third_party/address_sorting/address_sorting_windows.c', + ], + }, + { + 'target_name': 'end2end_nosec_tests', + 'type': 'static_library', + 'dependencies': [ + 'grpc_test_util', + 'grpc', + 'gpr', + 'address_sorting', + 'upb', + ], + 'sources': [ + 'test/core/end2end/cq_verifier.cc', + 'test/core/end2end/data/client_certs.cc', + 'test/core/end2end/data/server1_cert.cc', + 'test/core/end2end/data/server1_key.cc', + 'test/core/end2end/data/test_root_cert.cc', + 'test/core/end2end/end2end_nosec_tests.cc', + 'test/core/end2end/end2end_test_utils.cc', + 'test/core/end2end/fixtures/http_proxy_fixture.cc', + 'test/core/end2end/fixtures/local_util.cc', + 'test/core/end2end/fixtures/proxy.cc', + 'test/core/end2end/tests/authority_not_supported.cc', + 'test/core/end2end/tests/bad_hostname.cc', + 'test/core/end2end/tests/bad_ping.cc', + 'test/core/end2end/tests/binary_metadata.cc', + 'test/core/end2end/tests/call_host_override.cc', + 'test/core/end2end/tests/cancel_after_accept.cc', + 'test/core/end2end/tests/cancel_after_client_done.cc', + 'test/core/end2end/tests/cancel_after_invoke.cc', + 'test/core/end2end/tests/cancel_after_round_trip.cc', + 'test/core/end2end/tests/cancel_before_invoke.cc', + 'test/core/end2end/tests/cancel_in_a_vacuum.cc', + 'test/core/end2end/tests/cancel_with_status.cc', + 'test/core/end2end/tests/channelz.cc', + 'test/core/end2end/tests/client_streaming.cc', + 'test/core/end2end/tests/compressed_payload.cc', + 'test/core/end2end/tests/connectivity.cc', + 'test/core/end2end/tests/default_host.cc', + 'test/core/end2end/tests/disappearing_server.cc', + 'test/core/end2end/tests/empty_batch.cc', + 'test/core/end2end/tests/filter_call_init_fails.cc', + 'test/core/end2end/tests/filter_causes_close.cc', + 'test/core/end2end/tests/filter_context.cc', + 'test/core/end2end/tests/filter_latency.cc', + 'test/core/end2end/tests/filter_status_code.cc', + 'test/core/end2end/tests/graceful_server_shutdown.cc', + 'test/core/end2end/tests/high_initial_seqno.cc', + 'test/core/end2end/tests/hpack_size.cc', + 'test/core/end2end/tests/idempotent_request.cc', + 'test/core/end2end/tests/invoke_large_request.cc', + 'test/core/end2end/tests/keepalive_timeout.cc', + 'test/core/end2end/tests/large_metadata.cc', + 'test/core/end2end/tests/max_concurrent_streams.cc', + 'test/core/end2end/tests/max_connection_age.cc', + 'test/core/end2end/tests/max_connection_idle.cc', + 'test/core/end2end/tests/max_message_length.cc', + 'test/core/end2end/tests/negative_deadline.cc', + 'test/core/end2end/tests/no_error_on_hotpath.cc', + 'test/core/end2end/tests/no_logging.cc', + 'test/core/end2end/tests/no_op.cc', + 'test/core/end2end/tests/payload.cc', + 'test/core/end2end/tests/ping.cc', + 'test/core/end2end/tests/ping_pong_streaming.cc', + 'test/core/end2end/tests/proxy_auth.cc', + 'test/core/end2end/tests/registered_call.cc', + 'test/core/end2end/tests/request_with_flags.cc', + 'test/core/end2end/tests/request_with_payload.cc', + 'test/core/end2end/tests/resource_quota_server.cc', + 'test/core/end2end/tests/retry.cc', + 'test/core/end2end/tests/retry_cancellation.cc', + 'test/core/end2end/tests/retry_disabled.cc', + 'test/core/end2end/tests/retry_exceeds_buffer_size_in_initial_batch.cc', + 'test/core/end2end/tests/retry_exceeds_buffer_size_in_subsequent_batch.cc', + 'test/core/end2end/tests/retry_non_retriable_status.cc', + 'test/core/end2end/tests/retry_non_retriable_status_before_recv_trailing_metadata_started.cc', + 'test/core/end2end/tests/retry_recv_initial_metadata.cc', + 'test/core/end2end/tests/retry_recv_message.cc', + 'test/core/end2end/tests/retry_server_pushback_delay.cc', + 'test/core/end2end/tests/retry_server_pushback_disabled.cc', + 'test/core/end2end/tests/retry_streaming.cc', + 'test/core/end2end/tests/retry_streaming_after_commit.cc', + 'test/core/end2end/tests/retry_streaming_succeeds_before_replay_finished.cc', + 'test/core/end2end/tests/retry_throttled.cc', + 'test/core/end2end/tests/retry_too_many_attempts.cc', + 'test/core/end2end/tests/server_finishes_request.cc', + 'test/core/end2end/tests/shutdown_finishes_calls.cc', + 'test/core/end2end/tests/shutdown_finishes_tags.cc', + 'test/core/end2end/tests/simple_cacheable_request.cc', + 'test/core/end2end/tests/simple_delayed_request.cc', + 'test/core/end2end/tests/simple_metadata.cc', + 'test/core/end2end/tests/simple_request.cc', + 'test/core/end2end/tests/stream_compression_compressed_payload.cc', + 'test/core/end2end/tests/stream_compression_payload.cc', + 'test/core/end2end/tests/stream_compression_ping_pong_streaming.cc', + 'test/core/end2end/tests/streaming_error_response.cc', + 'test/core/end2end/tests/trailing_metadata.cc', + 'test/core/end2end/tests/workaround_cronet_compression.cc', + 'test/core/end2end/tests/write_buffering.cc', + 'test/core/end2end/tests/write_buffering_at_end.cc', + ], + }, + { + 'target_name': 'end2end_tests', + 'type': 'static_library', + 'dependencies': [ + 'grpc_test_util', + 'grpc', + 'gpr', + 'address_sorting', + 'upb', + ], + 'sources': [ + 'test/core/end2end/cq_verifier.cc', + 'test/core/end2end/data/client_certs.cc', + 'test/core/end2end/data/server1_cert.cc', + 'test/core/end2end/data/server1_key.cc', + 'test/core/end2end/data/test_root_cert.cc', + 'test/core/end2end/end2end_test_utils.cc', + 'test/core/end2end/end2end_tests.cc', + 'test/core/end2end/fixtures/http_proxy_fixture.cc', + 'test/core/end2end/fixtures/local_util.cc', + 'test/core/end2end/fixtures/proxy.cc', + 'test/core/end2end/tests/authority_not_supported.cc', + 'test/core/end2end/tests/bad_hostname.cc', + 'test/core/end2end/tests/bad_ping.cc', + 'test/core/end2end/tests/binary_metadata.cc', + 'test/core/end2end/tests/call_creds.cc', + 'test/core/end2end/tests/call_host_override.cc', + 'test/core/end2end/tests/cancel_after_accept.cc', + 'test/core/end2end/tests/cancel_after_client_done.cc', + 'test/core/end2end/tests/cancel_after_invoke.cc', + 'test/core/end2end/tests/cancel_after_round_trip.cc', + 'test/core/end2end/tests/cancel_before_invoke.cc', + 'test/core/end2end/tests/cancel_in_a_vacuum.cc', + 'test/core/end2end/tests/cancel_with_status.cc', + 'test/core/end2end/tests/channelz.cc', + 'test/core/end2end/tests/client_streaming.cc', + 'test/core/end2end/tests/compressed_payload.cc', + 'test/core/end2end/tests/connectivity.cc', + 'test/core/end2end/tests/default_host.cc', + 'test/core/end2end/tests/disappearing_server.cc', + 'test/core/end2end/tests/empty_batch.cc', + 'test/core/end2end/tests/filter_call_init_fails.cc', + 'test/core/end2end/tests/filter_causes_close.cc', + 'test/core/end2end/tests/filter_context.cc', + 'test/core/end2end/tests/filter_latency.cc', + 'test/core/end2end/tests/filter_status_code.cc', + 'test/core/end2end/tests/graceful_server_shutdown.cc', + 'test/core/end2end/tests/high_initial_seqno.cc', + 'test/core/end2end/tests/hpack_size.cc', + 'test/core/end2end/tests/idempotent_request.cc', + 'test/core/end2end/tests/invoke_large_request.cc', + 'test/core/end2end/tests/keepalive_timeout.cc', + 'test/core/end2end/tests/large_metadata.cc', + 'test/core/end2end/tests/max_concurrent_streams.cc', + 'test/core/end2end/tests/max_connection_age.cc', + 'test/core/end2end/tests/max_connection_idle.cc', + 'test/core/end2end/tests/max_message_length.cc', + 'test/core/end2end/tests/negative_deadline.cc', + 'test/core/end2end/tests/no_error_on_hotpath.cc', + 'test/core/end2end/tests/no_logging.cc', + 'test/core/end2end/tests/no_op.cc', + 'test/core/end2end/tests/payload.cc', + 'test/core/end2end/tests/ping.cc', + 'test/core/end2end/tests/ping_pong_streaming.cc', + 'test/core/end2end/tests/proxy_auth.cc', + 'test/core/end2end/tests/registered_call.cc', + 'test/core/end2end/tests/request_with_flags.cc', + 'test/core/end2end/tests/request_with_payload.cc', + 'test/core/end2end/tests/resource_quota_server.cc', + 'test/core/end2end/tests/retry.cc', + 'test/core/end2end/tests/retry_cancellation.cc', + 'test/core/end2end/tests/retry_disabled.cc', + 'test/core/end2end/tests/retry_exceeds_buffer_size_in_initial_batch.cc', + 'test/core/end2end/tests/retry_exceeds_buffer_size_in_subsequent_batch.cc', + 'test/core/end2end/tests/retry_non_retriable_status.cc', + 'test/core/end2end/tests/retry_non_retriable_status_before_recv_trailing_metadata_started.cc', + 'test/core/end2end/tests/retry_recv_initial_metadata.cc', + 'test/core/end2end/tests/retry_recv_message.cc', + 'test/core/end2end/tests/retry_server_pushback_delay.cc', + 'test/core/end2end/tests/retry_server_pushback_disabled.cc', + 'test/core/end2end/tests/retry_streaming.cc', + 'test/core/end2end/tests/retry_streaming_after_commit.cc', + 'test/core/end2end/tests/retry_streaming_succeeds_before_replay_finished.cc', + 'test/core/end2end/tests/retry_throttled.cc', + 'test/core/end2end/tests/retry_too_many_attempts.cc', + 'test/core/end2end/tests/server_finishes_request.cc', + 'test/core/end2end/tests/shutdown_finishes_calls.cc', + 'test/core/end2end/tests/shutdown_finishes_tags.cc', + 'test/core/end2end/tests/simple_cacheable_request.cc', + 'test/core/end2end/tests/simple_delayed_request.cc', + 'test/core/end2end/tests/simple_metadata.cc', + 'test/core/end2end/tests/simple_request.cc', + 'test/core/end2end/tests/stream_compression_compressed_payload.cc', + 'test/core/end2end/tests/stream_compression_payload.cc', + 'test/core/end2end/tests/stream_compression_ping_pong_streaming.cc', + 'test/core/end2end/tests/streaming_error_response.cc', + 'test/core/end2end/tests/trailing_metadata.cc', + 'test/core/end2end/tests/workaround_cronet_compression.cc', + 'test/core/end2end/tests/write_buffering.cc', + 'test/core/end2end/tests/write_buffering_at_end.cc', + ], + }, + { + 'target_name': 'gpr', + 'type': 'static_library', + 'dependencies': [ + 'absl/time:time', + 'absl/strings:strings', + 'absl/strings:str_format', + 'absl/memory:memory', + ], + 'sources': [ + 'src/core/lib/gpr/alloc.cc', + 'src/core/lib/gpr/atm.cc', + 'src/core/lib/gpr/cpu_iphone.cc', + 'src/core/lib/gpr/cpu_linux.cc', + 'src/core/lib/gpr/cpu_posix.cc', + 'src/core/lib/gpr/cpu_windows.cc', + 'src/core/lib/gpr/env_linux.cc', + 'src/core/lib/gpr/env_posix.cc', + 'src/core/lib/gpr/env_windows.cc', + 'src/core/lib/gpr/log.cc', + 'src/core/lib/gpr/log_android.cc', + 'src/core/lib/gpr/log_linux.cc', + 'src/core/lib/gpr/log_posix.cc', + 'src/core/lib/gpr/log_windows.cc', + 'src/core/lib/gpr/murmur_hash.cc', + 'src/core/lib/gpr/string.cc', + 'src/core/lib/gpr/string_posix.cc', + 'src/core/lib/gpr/string_util_windows.cc', + 'src/core/lib/gpr/string_windows.cc', + 'src/core/lib/gpr/sync.cc', + 'src/core/lib/gpr/sync_abseil.cc', + 'src/core/lib/gpr/sync_posix.cc', + 'src/core/lib/gpr/sync_windows.cc', + 'src/core/lib/gpr/time.cc', + 'src/core/lib/gpr/time_posix.cc', + 'src/core/lib/gpr/time_precise.cc', + 'src/core/lib/gpr/time_windows.cc', + 'src/core/lib/gpr/tls_pthread.cc', + 'src/core/lib/gpr/tmpfile_msys.cc', + 'src/core/lib/gpr/tmpfile_posix.cc', + 'src/core/lib/gpr/tmpfile_windows.cc', + 'src/core/lib/gpr/wrap_memcpy.cc', + 'src/core/lib/gprpp/arena.cc', + 'src/core/lib/gprpp/fork.cc', + 'src/core/lib/gprpp/global_config_env.cc', + 'src/core/lib/gprpp/host_port.cc', + 'src/core/lib/gprpp/mpscq.cc', + 'src/core/lib/gprpp/thd_posix.cc', + 'src/core/lib/gprpp/thd_windows.cc', + 'src/core/lib/profiling/basic_timers.cc', + 'src/core/lib/profiling/stap_timers.cc', + ], + }, + { + 'target_name': 'grpc', + 'type': 'static_library', + 'dependencies': [ + 'gpr', + 'address_sorting', + 'upb', + 'absl/types:optional', + 'absl/strings:strings', + 'absl/container:inlined_vector', + ], + 'sources': [ + 'src/core/ext/filters/census/grpc_context.cc', + 'src/core/ext/filters/client_channel/backend_metric.cc', + 'src/core/ext/filters/client_channel/backup_poller.cc', + 'src/core/ext/filters/client_channel/channel_connectivity.cc', + 'src/core/ext/filters/client_channel/client_channel.cc', + 'src/core/ext/filters/client_channel/client_channel_channelz.cc', + 'src/core/ext/filters/client_channel/client_channel_factory.cc', + 'src/core/ext/filters/client_channel/client_channel_plugin.cc', + 'src/core/ext/filters/client_channel/global_subchannel_pool.cc', + 'src/core/ext/filters/client_channel/health/health_check_client.cc', + 'src/core/ext/filters/client_channel/http_connect_handshaker.cc', + 'src/core/ext/filters/client_channel/http_proxy.cc', + 'src/core/ext/filters/client_channel/lb_policy.cc', + 'src/core/ext/filters/client_channel/lb_policy/address_filtering.cc', + 'src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc', + 'src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc', + 'src/core/ext/filters/client_channel/lb_policy/priority/priority.cc', + 'src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc', + 'src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc', + 'src/core/ext/filters/client_channel/lb_policy/xds/cds.cc', + 'src/core/ext/filters/client_channel/lb_policy/xds/eds.cc', + 'src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc', + 'src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc', + 'src/core/ext/filters/client_channel/lb_policy_registry.cc', + 'src/core/ext/filters/client_channel/local_subchannel_pool.cc', + 'src/core/ext/filters/client_channel/parse_address.cc', + 'src/core/ext/filters/client_channel/proxy_mapper_registry.cc', + 'src/core/ext/filters/client_channel/resolver.cc', + 'src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc', + 'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc', + 'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc', + 'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc', + 'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc', + 'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc', + 'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc', + 'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc', + 'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc', + 'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc', + 'src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc', + 'src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc', + 'src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc', + 'src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc', + 'src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc', + 'src/core/ext/filters/client_channel/resolver_registry.cc', + 'src/core/ext/filters/client_channel/resolver_result_parsing.cc', + 'src/core/ext/filters/client_channel/resolving_lb_policy.cc', + 'src/core/ext/filters/client_channel/retry_throttle.cc', + 'src/core/ext/filters/client_channel/server_address.cc', + 'src/core/ext/filters/client_channel/service_config.cc', + 'src/core/ext/filters/client_channel/service_config_parser.cc', + 'src/core/ext/filters/client_channel/subchannel.cc', + 'src/core/ext/filters/client_channel/subchannel_pool_interface.cc', + 'src/core/ext/filters/client_channel/xds/xds_api.cc', + 'src/core/ext/filters/client_channel/xds/xds_bootstrap.cc', + 'src/core/ext/filters/client_channel/xds/xds_channel_secure.cc', + 'src/core/ext/filters/client_channel/xds/xds_client.cc', + 'src/core/ext/filters/client_channel/xds/xds_client_stats.cc', + 'src/core/ext/filters/client_idle/client_idle_filter.cc', + 'src/core/ext/filters/deadline/deadline_filter.cc', + 'src/core/ext/filters/http/client/http_client_filter.cc', + 'src/core/ext/filters/http/client_authority_filter.cc', + 'src/core/ext/filters/http/http_filters_plugin.cc', + 'src/core/ext/filters/http/message_compress/message_compress_filter.cc', + 'src/core/ext/filters/http/message_compress/message_decompress_filter.cc', + 'src/core/ext/filters/http/server/http_server_filter.cc', + 'src/core/ext/filters/max_age/max_age_filter.cc', + 'src/core/ext/filters/message_size/message_size_filter.cc', + 'src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc', + 'src/core/ext/filters/workarounds/workaround_utils.cc', + 'src/core/ext/transport/chttp2/alpn/alpn.cc', + 'src/core/ext/transport/chttp2/client/authority.cc', + 'src/core/ext/transport/chttp2/client/chttp2_connector.cc', + 'src/core/ext/transport/chttp2/client/insecure/channel_create.cc', + 'src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc', + 'src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc', + 'src/core/ext/transport/chttp2/server/chttp2_server.cc', + 'src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc', + 'src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc', + 'src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc', + 'src/core/ext/transport/chttp2/transport/bin_decoder.cc', + 'src/core/ext/transport/chttp2/transport/bin_encoder.cc', + 'src/core/ext/transport/chttp2/transport/chttp2_plugin.cc', + 'src/core/ext/transport/chttp2/transport/chttp2_transport.cc', + 'src/core/ext/transport/chttp2/transport/context_list.cc', + 'src/core/ext/transport/chttp2/transport/flow_control.cc', + 'src/core/ext/transport/chttp2/transport/frame_data.cc', + 'src/core/ext/transport/chttp2/transport/frame_goaway.cc', + 'src/core/ext/transport/chttp2/transport/frame_ping.cc', + 'src/core/ext/transport/chttp2/transport/frame_rst_stream.cc', + 'src/core/ext/transport/chttp2/transport/frame_settings.cc', + 'src/core/ext/transport/chttp2/transport/frame_window_update.cc', + 'src/core/ext/transport/chttp2/transport/hpack_encoder.cc', + 'src/core/ext/transport/chttp2/transport/hpack_parser.cc', + 'src/core/ext/transport/chttp2/transport/hpack_table.cc', + 'src/core/ext/transport/chttp2/transport/http2_settings.cc', + 'src/core/ext/transport/chttp2/transport/huffsyms.cc', + 'src/core/ext/transport/chttp2/transport/incoming_metadata.cc', + 'src/core/ext/transport/chttp2/transport/parsing.cc', + 'src/core/ext/transport/chttp2/transport/stream_lists.cc', + 'src/core/ext/transport/chttp2/transport/stream_map.cc', + 'src/core/ext/transport/chttp2/transport/varint.cc', + 'src/core/ext/transport/chttp2/transport/writing.cc', + 'src/core/ext/transport/inproc/inproc_plugin.cc', + 'src/core/ext/transport/inproc/inproc_transport.cc', + 'src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c', + 'src/core/ext/upb-generated/envoy/annotations/resource.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/cds.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/eds.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/lds.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/listener.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/rds.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/route.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/srds.upb.c', + 'src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c', + 'src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c', + 'src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c', + 'src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c', + 'src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c', + 'src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c', + 'src/core/ext/upb-generated/envoy/type/http.upb.c', + 'src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c', + 'src/core/ext/upb-generated/envoy/type/matcher/string.upb.c', + 'src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c', + 'src/core/ext/upb-generated/envoy/type/percent.upb.c', + 'src/core/ext/upb-generated/envoy/type/range.upb.c', + 'src/core/ext/upb-generated/envoy/type/semantic_version.upb.c', + 'src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c', + 'src/core/ext/upb-generated/gogoproto/gogo.upb.c', + 'src/core/ext/upb-generated/google/api/annotations.upb.c', + 'src/core/ext/upb-generated/google/api/http.upb.c', + 'src/core/ext/upb-generated/google/protobuf/any.upb.c', + 'src/core/ext/upb-generated/google/protobuf/descriptor.upb.c', + 'src/core/ext/upb-generated/google/protobuf/duration.upb.c', + 'src/core/ext/upb-generated/google/protobuf/empty.upb.c', + 'src/core/ext/upb-generated/google/protobuf/struct.upb.c', + 'src/core/ext/upb-generated/google/protobuf/timestamp.upb.c', + 'src/core/ext/upb-generated/google/protobuf/wrappers.upb.c', + 'src/core/ext/upb-generated/google/rpc/status.upb.c', + 'src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c', + 'src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c', + 'src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c', + 'src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c', + 'src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c', + 'src/core/ext/upb-generated/udpa/annotations/migrate.upb.c', + 'src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c', + 'src/core/ext/upb-generated/udpa/annotations/status.upb.c', + 'src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c', + 'src/core/ext/upb-generated/validate/validate.upb.c', + 'src/core/lib/avl/avl.cc', + 'src/core/lib/backoff/backoff.cc', + 'src/core/lib/channel/channel_args.cc', + 'src/core/lib/channel/channel_stack.cc', + 'src/core/lib/channel/channel_stack_builder.cc', + 'src/core/lib/channel/channel_trace.cc', + 'src/core/lib/channel/channelz.cc', + 'src/core/lib/channel/channelz_registry.cc', + 'src/core/lib/channel/connected_channel.cc', + 'src/core/lib/channel/handshaker.cc', + 'src/core/lib/channel/handshaker_registry.cc', + 'src/core/lib/channel/status_util.cc', + 'src/core/lib/compression/compression.cc', + 'src/core/lib/compression/compression_args.cc', + 'src/core/lib/compression/compression_internal.cc', + 'src/core/lib/compression/message_compress.cc', + 'src/core/lib/compression/stream_compression.cc', + 'src/core/lib/compression/stream_compression_gzip.cc', + 'src/core/lib/compression/stream_compression_identity.cc', + 'src/core/lib/debug/stats.cc', + 'src/core/lib/debug/stats_data.cc', + 'src/core/lib/debug/trace.cc', + 'src/core/lib/http/format_request.cc', + 'src/core/lib/http/httpcli.cc', + 'src/core/lib/http/httpcli_security_connector.cc', + 'src/core/lib/http/parser.cc', + 'src/core/lib/iomgr/buffer_list.cc', + 'src/core/lib/iomgr/call_combiner.cc', + 'src/core/lib/iomgr/cfstream_handle.cc', + 'src/core/lib/iomgr/combiner.cc', + 'src/core/lib/iomgr/dualstack_socket_posix.cc', + 'src/core/lib/iomgr/endpoint.cc', + 'src/core/lib/iomgr/endpoint_cfstream.cc', + 'src/core/lib/iomgr/endpoint_pair_posix.cc', + 'src/core/lib/iomgr/endpoint_pair_uv.cc', + 'src/core/lib/iomgr/endpoint_pair_windows.cc', + 'src/core/lib/iomgr/error.cc', + 'src/core/lib/iomgr/error_cfstream.cc', + 'src/core/lib/iomgr/ev_apple.cc', + 'src/core/lib/iomgr/ev_epoll1_linux.cc', + 'src/core/lib/iomgr/ev_epollex_linux.cc', + 'src/core/lib/iomgr/ev_poll_posix.cc', + 'src/core/lib/iomgr/ev_posix.cc', + 'src/core/lib/iomgr/ev_windows.cc', + 'src/core/lib/iomgr/exec_ctx.cc', + 'src/core/lib/iomgr/executor.cc', + 'src/core/lib/iomgr/executor/mpmcqueue.cc', + 'src/core/lib/iomgr/executor/threadpool.cc', + 'src/core/lib/iomgr/fork_posix.cc', + 'src/core/lib/iomgr/fork_windows.cc', + 'src/core/lib/iomgr/gethostname_fallback.cc', + 'src/core/lib/iomgr/gethostname_host_name_max.cc', + 'src/core/lib/iomgr/gethostname_sysconf.cc', + 'src/core/lib/iomgr/grpc_if_nametoindex_posix.cc', + 'src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc', + 'src/core/lib/iomgr/internal_errqueue.cc', + 'src/core/lib/iomgr/iocp_windows.cc', + 'src/core/lib/iomgr/iomgr.cc', + 'src/core/lib/iomgr/iomgr_custom.cc', + 'src/core/lib/iomgr/iomgr_internal.cc', + 'src/core/lib/iomgr/iomgr_posix.cc', + 'src/core/lib/iomgr/iomgr_posix_cfstream.cc', + 'src/core/lib/iomgr/iomgr_uv.cc', + 'src/core/lib/iomgr/iomgr_windows.cc', + 'src/core/lib/iomgr/is_epollexclusive_available.cc', + 'src/core/lib/iomgr/load_file.cc', + 'src/core/lib/iomgr/lockfree_event.cc', + 'src/core/lib/iomgr/poller/eventmanager_libuv.cc', + 'src/core/lib/iomgr/polling_entity.cc', + 'src/core/lib/iomgr/pollset.cc', + 'src/core/lib/iomgr/pollset_custom.cc', + 'src/core/lib/iomgr/pollset_set.cc', + 'src/core/lib/iomgr/pollset_set_custom.cc', + 'src/core/lib/iomgr/pollset_set_windows.cc', + 'src/core/lib/iomgr/pollset_uv.cc', + 'src/core/lib/iomgr/pollset_windows.cc', + 'src/core/lib/iomgr/resolve_address.cc', + 'src/core/lib/iomgr/resolve_address_custom.cc', + 'src/core/lib/iomgr/resolve_address_posix.cc', + 'src/core/lib/iomgr/resolve_address_windows.cc', + 'src/core/lib/iomgr/resource_quota.cc', + 'src/core/lib/iomgr/sockaddr_utils.cc', + 'src/core/lib/iomgr/socket_factory_posix.cc', + 'src/core/lib/iomgr/socket_mutator.cc', + 'src/core/lib/iomgr/socket_utils_common_posix.cc', + 'src/core/lib/iomgr/socket_utils_linux.cc', + 'src/core/lib/iomgr/socket_utils_posix.cc', + 'src/core/lib/iomgr/socket_utils_uv.cc', + 'src/core/lib/iomgr/socket_utils_windows.cc', + 'src/core/lib/iomgr/socket_windows.cc', + 'src/core/lib/iomgr/tcp_client.cc', + 'src/core/lib/iomgr/tcp_client_cfstream.cc', + 'src/core/lib/iomgr/tcp_client_custom.cc', + 'src/core/lib/iomgr/tcp_client_posix.cc', + 'src/core/lib/iomgr/tcp_client_windows.cc', + 'src/core/lib/iomgr/tcp_custom.cc', + 'src/core/lib/iomgr/tcp_posix.cc', + 'src/core/lib/iomgr/tcp_server.cc', + 'src/core/lib/iomgr/tcp_server_custom.cc', + 'src/core/lib/iomgr/tcp_server_posix.cc', + 'src/core/lib/iomgr/tcp_server_utils_posix_common.cc', + 'src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc', + 'src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc', + 'src/core/lib/iomgr/tcp_server_windows.cc', + 'src/core/lib/iomgr/tcp_uv.cc', + 'src/core/lib/iomgr/tcp_windows.cc', + 'src/core/lib/iomgr/time_averaged_stats.cc', + 'src/core/lib/iomgr/timer.cc', + 'src/core/lib/iomgr/timer_custom.cc', + 'src/core/lib/iomgr/timer_generic.cc', + 'src/core/lib/iomgr/timer_heap.cc', + 'src/core/lib/iomgr/timer_manager.cc', + 'src/core/lib/iomgr/timer_uv.cc', + 'src/core/lib/iomgr/udp_server.cc', + 'src/core/lib/iomgr/unix_sockets_posix.cc', + 'src/core/lib/iomgr/unix_sockets_posix_noop.cc', + 'src/core/lib/iomgr/wakeup_fd_eventfd.cc', + 'src/core/lib/iomgr/wakeup_fd_nospecial.cc', + 'src/core/lib/iomgr/wakeup_fd_pipe.cc', + 'src/core/lib/iomgr/wakeup_fd_posix.cc', + 'src/core/lib/iomgr/work_serializer.cc', + 'src/core/lib/json/json_reader.cc', + 'src/core/lib/json/json_writer.cc', + 'src/core/lib/security/context/security_context.cc', + 'src/core/lib/security/credentials/alts/alts_credentials.cc', + 'src/core/lib/security/credentials/alts/check_gcp_environment.cc', + 'src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc', + 'src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc', + 'src/core/lib/security/credentials/alts/check_gcp_environment_windows.cc', + 'src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc', + 'src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc', + 'src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc', + 'src/core/lib/security/credentials/composite/composite_credentials.cc', + 'src/core/lib/security/credentials/credentials.cc', + 'src/core/lib/security/credentials/credentials_metadata.cc', + 'src/core/lib/security/credentials/fake/fake_credentials.cc', + 'src/core/lib/security/credentials/google_default/credentials_generic.cc', + 'src/core/lib/security/credentials/google_default/google_default_credentials.cc', + 'src/core/lib/security/credentials/iam/iam_credentials.cc', + 'src/core/lib/security/credentials/jwt/json_token.cc', + 'src/core/lib/security/credentials/jwt/jwt_credentials.cc', + 'src/core/lib/security/credentials/jwt/jwt_verifier.cc', + 'src/core/lib/security/credentials/local/local_credentials.cc', + 'src/core/lib/security/credentials/oauth2/oauth2_credentials.cc', + 'src/core/lib/security/credentials/plugin/plugin_credentials.cc', + 'src/core/lib/security/credentials/ssl/ssl_credentials.cc', + 'src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc', + 'src/core/lib/security/credentials/tls/tls_credentials.cc', + 'src/core/lib/security/security_connector/alts/alts_security_connector.cc', + 'src/core/lib/security/security_connector/fake/fake_security_connector.cc', + 'src/core/lib/security/security_connector/load_system_roots_fallback.cc', + 'src/core/lib/security/security_connector/load_system_roots_linux.cc', + 'src/core/lib/security/security_connector/local/local_security_connector.cc', + 'src/core/lib/security/security_connector/security_connector.cc', + 'src/core/lib/security/security_connector/ssl/ssl_security_connector.cc', + 'src/core/lib/security/security_connector/ssl_utils.cc', + 'src/core/lib/security/security_connector/ssl_utils_config.cc', + 'src/core/lib/security/security_connector/tls/tls_security_connector.cc', + 'src/core/lib/security/transport/client_auth_filter.cc', + 'src/core/lib/security/transport/secure_endpoint.cc', + 'src/core/lib/security/transport/security_handshaker.cc', + 'src/core/lib/security/transport/server_auth_filter.cc', + 'src/core/lib/security/transport/target_authority_table.cc', + 'src/core/lib/security/transport/tsi_error.cc', + 'src/core/lib/security/util/json_util.cc', + 'src/core/lib/slice/b64.cc', + 'src/core/lib/slice/percent_encoding.cc', + 'src/core/lib/slice/slice.cc', + 'src/core/lib/slice/slice_buffer.cc', + 'src/core/lib/slice/slice_intern.cc', + 'src/core/lib/slice/slice_string_helpers.cc', + 'src/core/lib/surface/api_trace.cc', + 'src/core/lib/surface/byte_buffer.cc', + 'src/core/lib/surface/byte_buffer_reader.cc', + 'src/core/lib/surface/call.cc', + 'src/core/lib/surface/call_details.cc', + 'src/core/lib/surface/call_log_batch.cc', + 'src/core/lib/surface/channel.cc', + 'src/core/lib/surface/channel_init.cc', + 'src/core/lib/surface/channel_ping.cc', + 'src/core/lib/surface/channel_stack_type.cc', + 'src/core/lib/surface/completion_queue.cc', + 'src/core/lib/surface/completion_queue_factory.cc', + 'src/core/lib/surface/event_string.cc', + 'src/core/lib/surface/init.cc', + 'src/core/lib/surface/init_secure.cc', + 'src/core/lib/surface/lame_client.cc', + 'src/core/lib/surface/metadata_array.cc', + 'src/core/lib/surface/server.cc', + 'src/core/lib/surface/validate_metadata.cc', + 'src/core/lib/surface/version.cc', + 'src/core/lib/transport/bdp_estimator.cc', + 'src/core/lib/transport/byte_stream.cc', + 'src/core/lib/transport/connectivity_state.cc', + 'src/core/lib/transport/error_utils.cc', + 'src/core/lib/transport/metadata.cc', + 'src/core/lib/transport/metadata_batch.cc', + 'src/core/lib/transport/pid_controller.cc', + 'src/core/lib/transport/static_metadata.cc', + 'src/core/lib/transport/status_conversion.cc', + 'src/core/lib/transport/status_metadata.cc', + 'src/core/lib/transport/timeout_encoding.cc', + 'src/core/lib/transport/transport.cc', + 'src/core/lib/transport/transport_op_string.cc', + 'src/core/lib/uri/uri_parser.cc', + 'src/core/plugin_registry/grpc_plugin_registry.cc', + 'src/core/tsi/alts/crypt/aes_gcm.cc', + 'src/core/tsi/alts/crypt/gsec.cc', + 'src/core/tsi/alts/frame_protector/alts_counter.cc', + 'src/core/tsi/alts/frame_protector/alts_crypter.cc', + 'src/core/tsi/alts/frame_protector/alts_frame_protector.cc', + 'src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.cc', + 'src/core/tsi/alts/frame_protector/alts_seal_privacy_integrity_crypter.cc', + 'src/core/tsi/alts/frame_protector/alts_unseal_privacy_integrity_crypter.cc', + 'src/core/tsi/alts/frame_protector/frame_handler.cc', + 'src/core/tsi/alts/handshaker/alts_handshaker_client.cc', + 'src/core/tsi/alts/handshaker/alts_shared_resource.cc', + 'src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc', + 'src/core/tsi/alts/handshaker/alts_tsi_utils.cc', + 'src/core/tsi/alts/handshaker/transport_security_common_api.cc', + 'src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc', + 'src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc', + 'src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc', + 'src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc', + 'src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc', + 'src/core/tsi/fake_transport_security.cc', + 'src/core/tsi/local_transport_security.cc', + 'src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc', + 'src/core/tsi/ssl/session_cache/ssl_session_cache.cc', + 'src/core/tsi/ssl/session_cache/ssl_session_openssl.cc', + 'src/core/tsi/ssl_transport_security.cc', + 'src/core/tsi/transport_security.cc', + 'src/core/tsi/transport_security_grpc.cc', + ], + }, + { + 'target_name': 'grpc_csharp_ext', + 'type': 'static_library', + 'dependencies': [ + 'grpc', + 'gpr', + 'address_sorting', + 'upb', + ], + 'sources': [ + 'src/csharp/ext/grpc_csharp_ext.c', + ], + }, + { + 'target_name': 'grpc_test_util', + 'type': 'static_library', + 'dependencies': [ + 'grpc', + 'gpr', + 'address_sorting', + 'upb', + ], + 'sources': [ + 'test/core/util/cmdline.cc', + 'test/core/util/debugger_macros.cc', + 'test/core/util/fuzzer_util.cc', + 'test/core/util/grpc_profiler.cc', + 'test/core/util/histogram.cc', + 'test/core/util/memory_counters.cc', + 'test/core/util/mock_endpoint.cc', + 'test/core/util/parse_hexstring.cc', + 'test/core/util/passthru_endpoint.cc', + 'test/core/util/port.cc', + 'test/core/util/port_isolated_runtime_environment.cc', + 'test/core/util/port_server_client.cc', + 'test/core/util/reconnect_server.cc', + 'test/core/util/slice_splitter.cc', + 'test/core/util/subprocess_posix.cc', + 'test/core/util/subprocess_windows.cc', + 'test/core/util/test_config.cc', + 'test/core/util/test_tcp_server.cc', + 'test/core/util/tracer_util.cc', + 'test/core/util/trickle_endpoint.cc', + ], + }, + { + 'target_name': 'grpc_test_util_unsecure', + 'type': 'static_library', + 'dependencies': [ + 'grpc_unsecure', + 'gpr', + 'address_sorting', + 'upb', + ], + 'sources': [ + 'test/core/util/cmdline.cc', + 'test/core/util/debugger_macros.cc', + 'test/core/util/fuzzer_util.cc', + 'test/core/util/grpc_profiler.cc', + 'test/core/util/histogram.cc', + 'test/core/util/memory_counters.cc', + 'test/core/util/mock_endpoint.cc', + 'test/core/util/parse_hexstring.cc', + 'test/core/util/passthru_endpoint.cc', + 'test/core/util/port.cc', + 'test/core/util/port_isolated_runtime_environment.cc', + 'test/core/util/port_server_client.cc', + 'test/core/util/reconnect_server.cc', + 'test/core/util/slice_splitter.cc', + 'test/core/util/subprocess_posix.cc', + 'test/core/util/subprocess_windows.cc', + 'test/core/util/test_config.cc', + 'test/core/util/test_tcp_server.cc', + 'test/core/util/tracer_util.cc', + 'test/core/util/trickle_endpoint.cc', + ], + }, + { + 'target_name': 'grpc_unsecure', + 'type': 'static_library', + 'dependencies': [ + 'gpr', + 'address_sorting', + 'upb', + 'absl/types:optional', + 'absl/strings:strings', + 'absl/container:inlined_vector', + ], + 'sources': [ + 'src/core/ext/filters/census/grpc_context.cc', + 'src/core/ext/filters/client_channel/backend_metric.cc', + 'src/core/ext/filters/client_channel/backup_poller.cc', + 'src/core/ext/filters/client_channel/channel_connectivity.cc', + 'src/core/ext/filters/client_channel/client_channel.cc', + 'src/core/ext/filters/client_channel/client_channel_channelz.cc', + 'src/core/ext/filters/client_channel/client_channel_factory.cc', + 'src/core/ext/filters/client_channel/client_channel_plugin.cc', + 'src/core/ext/filters/client_channel/global_subchannel_pool.cc', + 'src/core/ext/filters/client_channel/health/health_check_client.cc', + 'src/core/ext/filters/client_channel/http_connect_handshaker.cc', + 'src/core/ext/filters/client_channel/http_proxy.cc', + 'src/core/ext/filters/client_channel/lb_policy.cc', + 'src/core/ext/filters/client_channel/lb_policy/address_filtering.cc', + 'src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.cc', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc', + 'src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc', + 'src/core/ext/filters/client_channel/lb_policy/priority/priority.cc', + 'src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc', + 'src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc', + 'src/core/ext/filters/client_channel/lb_policy/xds/cds.cc', + 'src/core/ext/filters/client_channel/lb_policy/xds/eds.cc', + 'src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc', + 'src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc', + 'src/core/ext/filters/client_channel/lb_policy_registry.cc', + 'src/core/ext/filters/client_channel/local_subchannel_pool.cc', + 'src/core/ext/filters/client_channel/parse_address.cc', + 'src/core/ext/filters/client_channel/proxy_mapper_registry.cc', + 'src/core/ext/filters/client_channel/resolver.cc', + 'src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc', + 'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc', + 'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc', + 'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc', + 'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc', + 'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc', + 'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc', + 'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc', + 'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc', + 'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc', + 'src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc', + 'src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc', + 'src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc', + 'src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc', + 'src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc', + 'src/core/ext/filters/client_channel/resolver_registry.cc', + 'src/core/ext/filters/client_channel/resolver_result_parsing.cc', + 'src/core/ext/filters/client_channel/resolving_lb_policy.cc', + 'src/core/ext/filters/client_channel/retry_throttle.cc', + 'src/core/ext/filters/client_channel/server_address.cc', + 'src/core/ext/filters/client_channel/service_config.cc', + 'src/core/ext/filters/client_channel/service_config_parser.cc', + 'src/core/ext/filters/client_channel/subchannel.cc', + 'src/core/ext/filters/client_channel/subchannel_pool_interface.cc', + 'src/core/ext/filters/client_channel/xds/xds_api.cc', + 'src/core/ext/filters/client_channel/xds/xds_bootstrap.cc', + 'src/core/ext/filters/client_channel/xds/xds_channel.cc', + 'src/core/ext/filters/client_channel/xds/xds_client.cc', + 'src/core/ext/filters/client_channel/xds/xds_client_stats.cc', + 'src/core/ext/filters/client_idle/client_idle_filter.cc', + 'src/core/ext/filters/deadline/deadline_filter.cc', + 'src/core/ext/filters/http/client/http_client_filter.cc', + 'src/core/ext/filters/http/client_authority_filter.cc', + 'src/core/ext/filters/http/http_filters_plugin.cc', + 'src/core/ext/filters/http/message_compress/message_compress_filter.cc', + 'src/core/ext/filters/http/message_compress/message_decompress_filter.cc', + 'src/core/ext/filters/http/server/http_server_filter.cc', + 'src/core/ext/filters/max_age/max_age_filter.cc', + 'src/core/ext/filters/message_size/message_size_filter.cc', + 'src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc', + 'src/core/ext/filters/workarounds/workaround_utils.cc', + 'src/core/ext/transport/chttp2/alpn/alpn.cc', + 'src/core/ext/transport/chttp2/client/authority.cc', + 'src/core/ext/transport/chttp2/client/chttp2_connector.cc', + 'src/core/ext/transport/chttp2/client/insecure/channel_create.cc', + 'src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc', + 'src/core/ext/transport/chttp2/server/chttp2_server.cc', + 'src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc', + 'src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc', + 'src/core/ext/transport/chttp2/transport/bin_decoder.cc', + 'src/core/ext/transport/chttp2/transport/bin_encoder.cc', + 'src/core/ext/transport/chttp2/transport/chttp2_plugin.cc', + 'src/core/ext/transport/chttp2/transport/chttp2_transport.cc', + 'src/core/ext/transport/chttp2/transport/context_list.cc', + 'src/core/ext/transport/chttp2/transport/flow_control.cc', + 'src/core/ext/transport/chttp2/transport/frame_data.cc', + 'src/core/ext/transport/chttp2/transport/frame_goaway.cc', + 'src/core/ext/transport/chttp2/transport/frame_ping.cc', + 'src/core/ext/transport/chttp2/transport/frame_rst_stream.cc', + 'src/core/ext/transport/chttp2/transport/frame_settings.cc', + 'src/core/ext/transport/chttp2/transport/frame_window_update.cc', + 'src/core/ext/transport/chttp2/transport/hpack_encoder.cc', + 'src/core/ext/transport/chttp2/transport/hpack_parser.cc', + 'src/core/ext/transport/chttp2/transport/hpack_table.cc', + 'src/core/ext/transport/chttp2/transport/http2_settings.cc', + 'src/core/ext/transport/chttp2/transport/huffsyms.cc', + 'src/core/ext/transport/chttp2/transport/incoming_metadata.cc', + 'src/core/ext/transport/chttp2/transport/parsing.cc', + 'src/core/ext/transport/chttp2/transport/stream_lists.cc', + 'src/core/ext/transport/chttp2/transport/stream_map.cc', + 'src/core/ext/transport/chttp2/transport/varint.cc', + 'src/core/ext/transport/chttp2/transport/writing.cc', + 'src/core/ext/transport/inproc/inproc_plugin.cc', + 'src/core/ext/transport/inproc/inproc_transport.cc', + 'src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c', + 'src/core/ext/upb-generated/envoy/annotations/resource.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/cds.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/eds.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/lds.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/listener.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/rds.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/route.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/srds.upb.c', + 'src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c', + 'src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c', + 'src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c', + 'src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c', + 'src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c', + 'src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c', + 'src/core/ext/upb-generated/envoy/type/http.upb.c', + 'src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c', + 'src/core/ext/upb-generated/envoy/type/matcher/string.upb.c', + 'src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c', + 'src/core/ext/upb-generated/envoy/type/percent.upb.c', + 'src/core/ext/upb-generated/envoy/type/range.upb.c', + 'src/core/ext/upb-generated/envoy/type/semantic_version.upb.c', + 'src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c', + 'src/core/ext/upb-generated/gogoproto/gogo.upb.c', + 'src/core/ext/upb-generated/google/api/annotations.upb.c', + 'src/core/ext/upb-generated/google/api/http.upb.c', + 'src/core/ext/upb-generated/google/protobuf/any.upb.c', + 'src/core/ext/upb-generated/google/protobuf/descriptor.upb.c', + 'src/core/ext/upb-generated/google/protobuf/duration.upb.c', + 'src/core/ext/upb-generated/google/protobuf/empty.upb.c', + 'src/core/ext/upb-generated/google/protobuf/struct.upb.c', + 'src/core/ext/upb-generated/google/protobuf/timestamp.upb.c', + 'src/core/ext/upb-generated/google/protobuf/wrappers.upb.c', + 'src/core/ext/upb-generated/google/rpc/status.upb.c', + 'src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c', + 'src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c', + 'src/core/ext/upb-generated/udpa/annotations/migrate.upb.c', + 'src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c', + 'src/core/ext/upb-generated/udpa/annotations/status.upb.c', + 'src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c', + 'src/core/ext/upb-generated/validate/validate.upb.c', + 'src/core/lib/avl/avl.cc', + 'src/core/lib/backoff/backoff.cc', + 'src/core/lib/channel/channel_args.cc', + 'src/core/lib/channel/channel_stack.cc', + 'src/core/lib/channel/channel_stack_builder.cc', + 'src/core/lib/channel/channel_trace.cc', + 'src/core/lib/channel/channelz.cc', + 'src/core/lib/channel/channelz_registry.cc', + 'src/core/lib/channel/connected_channel.cc', + 'src/core/lib/channel/handshaker.cc', + 'src/core/lib/channel/handshaker_registry.cc', + 'src/core/lib/channel/status_util.cc', + 'src/core/lib/compression/compression.cc', + 'src/core/lib/compression/compression_args.cc', + 'src/core/lib/compression/compression_internal.cc', + 'src/core/lib/compression/message_compress.cc', + 'src/core/lib/compression/stream_compression.cc', + 'src/core/lib/compression/stream_compression_gzip.cc', + 'src/core/lib/compression/stream_compression_identity.cc', + 'src/core/lib/debug/stats.cc', + 'src/core/lib/debug/stats_data.cc', + 'src/core/lib/debug/trace.cc', + 'src/core/lib/http/format_request.cc', + 'src/core/lib/http/httpcli.cc', + 'src/core/lib/http/parser.cc', + 'src/core/lib/iomgr/buffer_list.cc', + 'src/core/lib/iomgr/call_combiner.cc', + 'src/core/lib/iomgr/cfstream_handle.cc', + 'src/core/lib/iomgr/combiner.cc', + 'src/core/lib/iomgr/dualstack_socket_posix.cc', + 'src/core/lib/iomgr/endpoint.cc', + 'src/core/lib/iomgr/endpoint_cfstream.cc', + 'src/core/lib/iomgr/endpoint_pair_posix.cc', + 'src/core/lib/iomgr/endpoint_pair_uv.cc', + 'src/core/lib/iomgr/endpoint_pair_windows.cc', + 'src/core/lib/iomgr/error.cc', + 'src/core/lib/iomgr/error_cfstream.cc', + 'src/core/lib/iomgr/ev_apple.cc', + 'src/core/lib/iomgr/ev_epoll1_linux.cc', + 'src/core/lib/iomgr/ev_epollex_linux.cc', + 'src/core/lib/iomgr/ev_poll_posix.cc', + 'src/core/lib/iomgr/ev_posix.cc', + 'src/core/lib/iomgr/ev_windows.cc', + 'src/core/lib/iomgr/exec_ctx.cc', + 'src/core/lib/iomgr/executor.cc', + 'src/core/lib/iomgr/executor/mpmcqueue.cc', + 'src/core/lib/iomgr/executor/threadpool.cc', + 'src/core/lib/iomgr/fork_posix.cc', + 'src/core/lib/iomgr/fork_windows.cc', + 'src/core/lib/iomgr/gethostname_fallback.cc', + 'src/core/lib/iomgr/gethostname_host_name_max.cc', + 'src/core/lib/iomgr/gethostname_sysconf.cc', + 'src/core/lib/iomgr/grpc_if_nametoindex_posix.cc', + 'src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc', + 'src/core/lib/iomgr/internal_errqueue.cc', + 'src/core/lib/iomgr/iocp_windows.cc', + 'src/core/lib/iomgr/iomgr.cc', + 'src/core/lib/iomgr/iomgr_custom.cc', + 'src/core/lib/iomgr/iomgr_internal.cc', + 'src/core/lib/iomgr/iomgr_posix.cc', + 'src/core/lib/iomgr/iomgr_posix_cfstream.cc', + 'src/core/lib/iomgr/iomgr_uv.cc', + 'src/core/lib/iomgr/iomgr_windows.cc', + 'src/core/lib/iomgr/is_epollexclusive_available.cc', + 'src/core/lib/iomgr/load_file.cc', + 'src/core/lib/iomgr/lockfree_event.cc', + 'src/core/lib/iomgr/poller/eventmanager_libuv.cc', + 'src/core/lib/iomgr/polling_entity.cc', + 'src/core/lib/iomgr/pollset.cc', + 'src/core/lib/iomgr/pollset_custom.cc', + 'src/core/lib/iomgr/pollset_set.cc', + 'src/core/lib/iomgr/pollset_set_custom.cc', + 'src/core/lib/iomgr/pollset_set_windows.cc', + 'src/core/lib/iomgr/pollset_uv.cc', + 'src/core/lib/iomgr/pollset_windows.cc', + 'src/core/lib/iomgr/resolve_address.cc', + 'src/core/lib/iomgr/resolve_address_custom.cc', + 'src/core/lib/iomgr/resolve_address_posix.cc', + 'src/core/lib/iomgr/resolve_address_windows.cc', + 'src/core/lib/iomgr/resource_quota.cc', + 'src/core/lib/iomgr/sockaddr_utils.cc', + 'src/core/lib/iomgr/socket_factory_posix.cc', + 'src/core/lib/iomgr/socket_mutator.cc', + 'src/core/lib/iomgr/socket_utils_common_posix.cc', + 'src/core/lib/iomgr/socket_utils_linux.cc', + 'src/core/lib/iomgr/socket_utils_posix.cc', + 'src/core/lib/iomgr/socket_utils_uv.cc', + 'src/core/lib/iomgr/socket_utils_windows.cc', + 'src/core/lib/iomgr/socket_windows.cc', + 'src/core/lib/iomgr/tcp_client.cc', + 'src/core/lib/iomgr/tcp_client_cfstream.cc', + 'src/core/lib/iomgr/tcp_client_custom.cc', + 'src/core/lib/iomgr/tcp_client_posix.cc', + 'src/core/lib/iomgr/tcp_client_windows.cc', + 'src/core/lib/iomgr/tcp_custom.cc', + 'src/core/lib/iomgr/tcp_posix.cc', + 'src/core/lib/iomgr/tcp_server.cc', + 'src/core/lib/iomgr/tcp_server_custom.cc', + 'src/core/lib/iomgr/tcp_server_posix.cc', + 'src/core/lib/iomgr/tcp_server_utils_posix_common.cc', + 'src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc', + 'src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc', + 'src/core/lib/iomgr/tcp_server_windows.cc', + 'src/core/lib/iomgr/tcp_uv.cc', + 'src/core/lib/iomgr/tcp_windows.cc', + 'src/core/lib/iomgr/time_averaged_stats.cc', + 'src/core/lib/iomgr/timer.cc', + 'src/core/lib/iomgr/timer_custom.cc', + 'src/core/lib/iomgr/timer_generic.cc', + 'src/core/lib/iomgr/timer_heap.cc', + 'src/core/lib/iomgr/timer_manager.cc', + 'src/core/lib/iomgr/timer_uv.cc', + 'src/core/lib/iomgr/udp_server.cc', + 'src/core/lib/iomgr/unix_sockets_posix.cc', + 'src/core/lib/iomgr/unix_sockets_posix_noop.cc', + 'src/core/lib/iomgr/wakeup_fd_eventfd.cc', + 'src/core/lib/iomgr/wakeup_fd_nospecial.cc', + 'src/core/lib/iomgr/wakeup_fd_pipe.cc', + 'src/core/lib/iomgr/wakeup_fd_posix.cc', + 'src/core/lib/iomgr/work_serializer.cc', + 'src/core/lib/json/json_reader.cc', + 'src/core/lib/json/json_writer.cc', + 'src/core/lib/slice/b64.cc', + 'src/core/lib/slice/percent_encoding.cc', + 'src/core/lib/slice/slice.cc', + 'src/core/lib/slice/slice_buffer.cc', + 'src/core/lib/slice/slice_intern.cc', + 'src/core/lib/slice/slice_string_helpers.cc', + 'src/core/lib/surface/api_trace.cc', + 'src/core/lib/surface/byte_buffer.cc', + 'src/core/lib/surface/byte_buffer_reader.cc', + 'src/core/lib/surface/call.cc', + 'src/core/lib/surface/call_details.cc', + 'src/core/lib/surface/call_log_batch.cc', + 'src/core/lib/surface/channel.cc', + 'src/core/lib/surface/channel_init.cc', + 'src/core/lib/surface/channel_ping.cc', + 'src/core/lib/surface/channel_stack_type.cc', + 'src/core/lib/surface/completion_queue.cc', + 'src/core/lib/surface/completion_queue_factory.cc', + 'src/core/lib/surface/event_string.cc', + 'src/core/lib/surface/init.cc', + 'src/core/lib/surface/init_unsecure.cc', + 'src/core/lib/surface/lame_client.cc', + 'src/core/lib/surface/metadata_array.cc', + 'src/core/lib/surface/server.cc', + 'src/core/lib/surface/validate_metadata.cc', + 'src/core/lib/surface/version.cc', + 'src/core/lib/transport/bdp_estimator.cc', + 'src/core/lib/transport/byte_stream.cc', + 'src/core/lib/transport/connectivity_state.cc', + 'src/core/lib/transport/error_utils.cc', + 'src/core/lib/transport/metadata.cc', + 'src/core/lib/transport/metadata_batch.cc', + 'src/core/lib/transport/pid_controller.cc', + 'src/core/lib/transport/static_metadata.cc', + 'src/core/lib/transport/status_conversion.cc', + 'src/core/lib/transport/status_metadata.cc', + 'src/core/lib/transport/timeout_encoding.cc', + 'src/core/lib/transport/transport.cc', + 'src/core/lib/transport/transport_op_string.cc', + 'src/core/lib/uri/uri_parser.cc', + 'src/core/plugin_registry/grpc_unsecure_plugin_registry.cc', + ], + }, + { + 'target_name': 'benchmark_helpers', + 'type': 'static_library', + 'dependencies': [ + 'grpc_test_util_unsecure', + 'grpc++_unsecure', + 'grpc_unsecure', + 'grpc++_test_config', + 'gpr', + 'address_sorting', + 'upb', + 'benchmark', + ], + 'sources': [ + 'src/proto/grpc/testing/echo.proto', + 'src/proto/grpc/testing/echo_messages.proto', + 'src/proto/grpc/testing/simple_messages.proto', + 'test/cpp/microbenchmarks/helpers.cc', + ], + }, + { + 'target_name': 'grpc++', + 'type': 'static_library', + 'dependencies': [ + 'grpc', + 'gpr', + 'address_sorting', + 'upb', + ], + 'sources': [ + 'src/cpp/client/channel_cc.cc', + 'src/cpp/client/client_context.cc', + 'src/cpp/client/client_interceptor.cc', + 'src/cpp/client/create_channel.cc', + 'src/cpp/client/create_channel_internal.cc', + 'src/cpp/client/create_channel_posix.cc', + 'src/cpp/client/credentials_cc.cc', + 'src/cpp/client/insecure_credentials.cc', + 'src/cpp/client/secure_credentials.cc', + 'src/cpp/codegen/codegen_init.cc', + 'src/cpp/common/alarm.cc', + 'src/cpp/common/auth_property_iterator.cc', + 'src/cpp/common/channel_arguments.cc', + 'src/cpp/common/channel_filter.cc', + 'src/cpp/common/completion_queue_cc.cc', + 'src/cpp/common/core_codegen.cc', + 'src/cpp/common/resource_quota_cc.cc', + 'src/cpp/common/rpc_method.cc', + 'src/cpp/common/secure_auth_context.cc', + 'src/cpp/common/secure_channel_arguments.cc', + 'src/cpp/common/secure_create_auth_context.cc', + 'src/cpp/common/tls_credentials_options.cc', + 'src/cpp/common/tls_credentials_options_util.cc', + 'src/cpp/common/validate_service_config.cc', + 'src/cpp/common/version_cc.cc', + 'src/cpp/server/async_generic_service.cc', + 'src/cpp/server/channel_argument_option.cc', + 'src/cpp/server/create_default_thread_pool.cc', + 'src/cpp/server/dynamic_thread_pool.cc', + 'src/cpp/server/external_connection_acceptor_impl.cc', + 'src/cpp/server/health/default_health_check_service.cc', + 'src/cpp/server/health/health_check_service.cc', + 'src/cpp/server/health/health_check_service_server_builder_option.cc', + 'src/cpp/server/insecure_server_credentials.cc', + 'src/cpp/server/secure_server_credentials.cc', + 'src/cpp/server/server_builder.cc', + 'src/cpp/server/server_callback.cc', + 'src/cpp/server/server_cc.cc', + 'src/cpp/server/server_context.cc', + 'src/cpp/server/server_credentials.cc', + 'src/cpp/server/server_posix.cc', + 'src/cpp/thread_manager/thread_manager.cc', + 'src/cpp/util/byte_buffer_cc.cc', + 'src/cpp/util/status.cc', + 'src/cpp/util/string_ref.cc', + 'src/cpp/util/time_cc.cc', + ], + }, + { + 'target_name': 'grpc++_alts', + 'type': 'static_library', + 'dependencies': [ + 'grpc++', + 'grpc', + 'gpr', + 'address_sorting', + 'upb', + ], + 'sources': [ + 'src/cpp/common/alts_context.cc', + 'src/cpp/common/alts_util.cc', + ], + }, + { + 'target_name': 'grpc++_error_details', + 'type': 'static_library', + 'dependencies': [ + 'grpc++', + 'grpc', + 'gpr', + 'address_sorting', + 'upb', + ], + 'sources': [ + 'src/proto/grpc/status/status.proto', + 'src/cpp/util/error_details.cc', + ], + }, + { + 'target_name': 'grpc++_reflection', + 'type': 'static_library', + 'dependencies': [ + 'grpc++', + 'grpc', + 'gpr', + 'address_sorting', + 'upb', + ], + 'sources': [ + 'src/proto/grpc/reflection/v1alpha/reflection.proto', + 'src/cpp/ext/proto_server_reflection.cc', + 'src/cpp/ext/proto_server_reflection_plugin.cc', + ], + }, + { + 'target_name': 'grpc++_test', + 'type': 'static_library', + 'dependencies': [ + 'grpc++', + 'grpc', + 'gpr', + 'address_sorting', + 'upb', + ], + 'sources': [ + 'src/cpp/client/channel_test_peer.cc', + ], + }, + { + 'target_name': 'grpc++_test_config', + 'type': 'static_library', + 'dependencies': [ + 'gpr', + ], + 'sources': [ + 'test/cpp/util/test_config_cc.cc', + ], + }, + { + 'target_name': 'grpc++_test_util', + 'type': 'static_library', + 'dependencies': [ + 'grpc_test_util', + 'grpc++', + 'grpc', + 'gpr', + 'address_sorting', + 'upb', + ], + 'sources': [ + 'test/core/end2end/data/client_certs.cc', + 'test/core/end2end/data/server1_cert.cc', + 'test/core/end2end/data/server1_key.cc', + 'test/core/end2end/data/test_root_cert.cc', + 'test/cpp/util/byte_buffer_proto_helper.cc', + 'test/cpp/util/create_test_channel.cc', + 'test/cpp/util/string_ref_helper.cc', + 'test/cpp/util/subprocess.cc', + 'test/cpp/util/test_credentials_provider.cc', + ], + }, + { + 'target_name': 'grpc++_unsecure', + 'type': 'static_library', + 'dependencies': [ + 'grpc_unsecure', + 'gpr', + 'address_sorting', + 'upb', + ], + 'sources': [ + 'src/cpp/client/channel_cc.cc', + 'src/cpp/client/client_context.cc', + 'src/cpp/client/client_interceptor.cc', + 'src/cpp/client/create_channel.cc', + 'src/cpp/client/create_channel_internal.cc', + 'src/cpp/client/create_channel_posix.cc', + 'src/cpp/client/credentials_cc.cc', + 'src/cpp/client/insecure_credentials.cc', + 'src/cpp/codegen/codegen_init.cc', + 'src/cpp/common/alarm.cc', + 'src/cpp/common/channel_arguments.cc', + 'src/cpp/common/channel_filter.cc', + 'src/cpp/common/completion_queue_cc.cc', + 'src/cpp/common/core_codegen.cc', + 'src/cpp/common/insecure_create_auth_context.cc', + 'src/cpp/common/resource_quota_cc.cc', + 'src/cpp/common/rpc_method.cc', + 'src/cpp/common/validate_service_config.cc', + 'src/cpp/common/version_cc.cc', + 'src/cpp/server/async_generic_service.cc', + 'src/cpp/server/channel_argument_option.cc', + 'src/cpp/server/create_default_thread_pool.cc', + 'src/cpp/server/dynamic_thread_pool.cc', + 'src/cpp/server/external_connection_acceptor_impl.cc', + 'src/cpp/server/health/default_health_check_service.cc', + 'src/cpp/server/health/health_check_service.cc', + 'src/cpp/server/health/health_check_service_server_builder_option.cc', + 'src/cpp/server/insecure_server_credentials.cc', + 'src/cpp/server/server_builder.cc', + 'src/cpp/server/server_callback.cc', + 'src/cpp/server/server_cc.cc', + 'src/cpp/server/server_context.cc', + 'src/cpp/server/server_credentials.cc', + 'src/cpp/server/server_posix.cc', + 'src/cpp/thread_manager/thread_manager.cc', + 'src/cpp/util/byte_buffer_cc.cc', + 'src/cpp/util/status.cc', + 'src/cpp/util/string_ref.cc', + 'src/cpp/util/time_cc.cc', + ], + }, + { + 'target_name': 'grpc_plugin_support', + 'type': 'static_library', + 'dependencies': [ + ], + 'sources': [ + 'src/compiler/cpp_generator.cc', + 'src/compiler/csharp_generator.cc', + 'src/compiler/node_generator.cc', + 'src/compiler/objective_c_generator.cc', + 'src/compiler/php_generator.cc', + 'src/compiler/python_generator.cc', + 'src/compiler/ruby_generator.cc', + ], + }, + { + 'target_name': 'grpcpp_channelz', + 'type': 'static_library', + 'dependencies': [ + 'grpc++', + 'grpc', + 'gpr', + 'address_sorting', + 'upb', + ], + 'sources': [ + 'src/proto/grpc/channelz/channelz.proto', + 'src/cpp/server/channelz/channelz_service.cc', + 'src/cpp/server/channelz/channelz_service_plugin.cc', + ], + }, + { + 'target_name': 'boringssl', + 'type': 'static_library', + 'dependencies': [ + ], + 'sources': [ + 'third_party/boringssl-with-bazel/err_data.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_dup.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_i2d_fp.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_octet.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_print.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_utf8.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/asn1_par.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/f_string.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/time_support.c', + 'third_party/boringssl-with-bazel/src/crypto/base64/base64.c', + 'third_party/boringssl-with-bazel/src/crypto/bio/bio.c', + 'third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.c', + 'third_party/boringssl-with-bazel/src/crypto/bio/connect.c', + 'third_party/boringssl-with-bazel/src/crypto/bio/fd.c', + 'third_party/boringssl-with-bazel/src/crypto/bio/file.c', + 'third_party/boringssl-with-bazel/src/crypto/bio/hexdump.c', + 'third_party/boringssl-with-bazel/src/crypto/bio/pair.c', + 'third_party/boringssl-with-bazel/src/crypto/bio/printf.c', + 'third_party/boringssl-with-bazel/src/crypto/bio/socket.c', + 'third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c', + 'third_party/boringssl-with-bazel/src/crypto/bn_extra/bn_asn1.c', + 'third_party/boringssl-with-bazel/src/crypto/bn_extra/convert.c', + 'third_party/boringssl-with-bazel/src/crypto/buf/buf.c', + 'third_party/boringssl-with-bazel/src/crypto/bytestring/asn1_compat.c', + 'third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c', + 'third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.c', + 'third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c', + 'third_party/boringssl-with-bazel/src/crypto/bytestring/unicode.c', + 'third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_extra.c', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/derive_key.c', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesccm.c', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesctrhmac.c', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesgcmsiv.c', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_chacha20poly1305.c', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_null.c', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc2.c', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc4.c', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c', + 'third_party/boringssl-with-bazel/src/crypto/cmac/cmac.c', + 'third_party/boringssl-with-bazel/src/crypto/conf/conf.c', + 'third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-fuchsia.c', + 'third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-linux.c', + 'third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c', + 'third_party/boringssl-with-bazel/src/crypto/cpu-arm.c', + 'third_party/boringssl-with-bazel/src/crypto/cpu-intel.c', + 'third_party/boringssl-with-bazel/src/crypto/cpu-ppc64le.c', + 'third_party/boringssl-with-bazel/src/crypto/crypto.c', + 'third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519.c', + 'third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c', + 'third_party/boringssl-with-bazel/src/crypto/dh/check.c', + 'third_party/boringssl-with-bazel/src/crypto/dh/dh.c', + 'third_party/boringssl-with-bazel/src/crypto/dh/dh_asn1.c', + 'third_party/boringssl-with-bazel/src/crypto/dh/params.c', + 'third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c', + 'third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c', + 'third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c', + 'third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.c', + 'third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_derive.c', + 'third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c', + 'third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_extra.c', + 'third_party/boringssl-with-bazel/src/crypto/ecdsa_extra/ecdsa_asn1.c', + 'third_party/boringssl-with-bazel/src/crypto/engine/engine.c', + 'third_party/boringssl-with-bazel/src/crypto/err/err.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/digestsign.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/evp.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/evp_ctx.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/p_dsa_asn1.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/p_ec.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/p_ec_asn1.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519_asn1.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/p_rsa.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/p_rsa_asn1.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/p_x25519.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/p_x25519_asn1.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/pbkdf.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/print.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/sign.c', + 'third_party/boringssl-with-bazel/src/crypto/ex_data.c', + 'third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c', + 'third_party/boringssl-with-bazel/src/crypto/fipsmodule/fips_shared_support.c', + 'third_party/boringssl-with-bazel/src/crypto/fipsmodule/is_fips.c', + 'third_party/boringssl-with-bazel/src/crypto/hkdf/hkdf.c', + 'third_party/boringssl-with-bazel/src/crypto/hrss/hrss.c', + 'third_party/boringssl-with-bazel/src/crypto/lhash/lhash.c', + 'third_party/boringssl-with-bazel/src/crypto/mem.c', + 'third_party/boringssl-with-bazel/src/crypto/obj/obj.c', + 'third_party/boringssl-with-bazel/src/crypto/obj/obj_xref.c', + 'third_party/boringssl-with-bazel/src/crypto/pem/pem_all.c', + 'third_party/boringssl-with-bazel/src/crypto/pem/pem_info.c', + 'third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c', + 'third_party/boringssl-with-bazel/src/crypto/pem/pem_oth.c', + 'third_party/boringssl-with-bazel/src/crypto/pem/pem_pk8.c', + 'third_party/boringssl-with-bazel/src/crypto/pem/pem_pkey.c', + 'third_party/boringssl-with-bazel/src/crypto/pem/pem_x509.c', + 'third_party/boringssl-with-bazel/src/crypto/pem/pem_xaux.c', + 'third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c', + 'third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c', + 'third_party/boringssl-with-bazel/src/crypto/pkcs8/p5_pbev2.c', + 'third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c', + 'third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c', + 'third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.c', + 'third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm.c', + 'third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_vec.c', + 'third_party/boringssl-with-bazel/src/crypto/pool/pool.c', + 'third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c', + 'third_party/boringssl-with-bazel/src/crypto/rand_extra/forkunsafe.c', + 'third_party/boringssl-with-bazel/src/crypto/rand_extra/fuchsia.c', + 'third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c', + 'third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c', + 'third_party/boringssl-with-bazel/src/crypto/rc4/rc4.c', + 'third_party/boringssl-with-bazel/src/crypto/refcount_c11.c', + 'third_party/boringssl-with-bazel/src/crypto/refcount_lock.c', + 'third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_asn1.c', + 'third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_print.c', + 'third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c', + 'third_party/boringssl-with-bazel/src/crypto/stack/stack.c', + 'third_party/boringssl-with-bazel/src/crypto/thread.c', + 'third_party/boringssl-with-bazel/src/crypto/thread_none.c', + 'third_party/boringssl-with-bazel/src/crypto/thread_pthread.c', + 'third_party/boringssl-with-bazel/src/crypto/thread_win.c', + 'third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c', + 'third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/a_digest.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/a_sign.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/a_verify.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/by_dir.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/by_file.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/i2d_pr.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/t_req.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_d2.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_def.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_r2x.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_txt.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509name.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509rset.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509spki.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_algor.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_all.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_exten.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_info.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_name.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_pkey.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_req.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_sig.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_spki.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_val.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_lib.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_node.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akeya.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bcons.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_crld.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_extku.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ia5.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_info.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_int.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ncons.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ocsp.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pci.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pcia.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pcons.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pku.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pmaps.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_sxnet.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c', + 'third_party/boringssl-with-bazel/src/ssl/bio_ssl.cc', + 'third_party/boringssl-with-bazel/src/ssl/d1_both.cc', + 'third_party/boringssl-with-bazel/src/ssl/d1_lib.cc', + 'third_party/boringssl-with-bazel/src/ssl/d1_pkt.cc', + 'third_party/boringssl-with-bazel/src/ssl/d1_srtp.cc', + 'third_party/boringssl-with-bazel/src/ssl/dtls_method.cc', + 'third_party/boringssl-with-bazel/src/ssl/dtls_record.cc', + 'third_party/boringssl-with-bazel/src/ssl/handoff.cc', + 'third_party/boringssl-with-bazel/src/ssl/handshake.cc', + 'third_party/boringssl-with-bazel/src/ssl/handshake_client.cc', + 'third_party/boringssl-with-bazel/src/ssl/handshake_server.cc', + 'third_party/boringssl-with-bazel/src/ssl/s3_both.cc', + 'third_party/boringssl-with-bazel/src/ssl/s3_lib.cc', + 'third_party/boringssl-with-bazel/src/ssl/s3_pkt.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_aead_ctx.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_buffer.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_file.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_session.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_stat.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc', + 'third_party/boringssl-with-bazel/src/ssl/t1_enc.cc', + 'third_party/boringssl-with-bazel/src/ssl/t1_lib.cc', + 'third_party/boringssl-with-bazel/src/ssl/tls13_both.cc', + 'third_party/boringssl-with-bazel/src/ssl/tls13_client.cc', + 'third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc', + 'third_party/boringssl-with-bazel/src/ssl/tls13_server.cc', + 'third_party/boringssl-with-bazel/src/ssl/tls_method.cc', + 'third_party/boringssl-with-bazel/src/ssl/tls_record.cc', + ], + }, + { + 'target_name': 'boringssl_test_util', + 'type': 'static_library', + 'dependencies': [ + ], + 'sources': [ + 'third_party/boringssl-with-bazel/src/crypto/test/file_test.cc', + 'third_party/boringssl-with-bazel/src/crypto/test/malloc.cc', + 'third_party/boringssl-with-bazel/src/crypto/test/test_util.cc', + 'third_party/boringssl-with-bazel/src/crypto/test/wycheproof_util.cc', + ], + }, + { + 'target_name': 'benchmark', + 'type': 'static_library', + 'dependencies': [ + ], + 'sources': [ + 'third_party/benchmark/src/benchmark.cc', + 'third_party/benchmark/src/benchmark_api_internal.cc', + 'third_party/benchmark/src/benchmark_main.cc', + 'third_party/benchmark/src/benchmark_name.cc', + 'third_party/benchmark/src/benchmark_register.cc', + 'third_party/benchmark/src/benchmark_runner.cc', + 'third_party/benchmark/src/colorprint.cc', + 'third_party/benchmark/src/commandlineflags.cc', + 'third_party/benchmark/src/complexity.cc', + 'third_party/benchmark/src/console_reporter.cc', + 'third_party/benchmark/src/counter.cc', + 'third_party/benchmark/src/csv_reporter.cc', + 'third_party/benchmark/src/json_reporter.cc', + 'third_party/benchmark/src/reporter.cc', + 'third_party/benchmark/src/sleep.cc', + 'third_party/benchmark/src/statistics.cc', + 'third_party/benchmark/src/string_util.cc', + 'third_party/benchmark/src/sysinfo.cc', + 'third_party/benchmark/src/timers.cc', + ], + }, + { + 'target_name': 'upb', + 'type': 'static_library', + 'dependencies': [ + ], + 'sources': [ + 'third_party/upb/upb/decode.c', + 'third_party/upb/upb/encode.c', + 'third_party/upb/upb/msg.c', + 'third_party/upb/upb/port.c', + 'third_party/upb/upb/table.c', + 'third_party/upb/upb/upb.c', + ], + }, + { + 'target_name': 'z', + 'type': 'static_library', + 'dependencies': [ + ], + 'sources': [ + 'third_party/zlib/adler32.c', + 'third_party/zlib/compress.c', + 'third_party/zlib/crc32.c', + 'third_party/zlib/deflate.c', + 'third_party/zlib/gzclose.c', + 'third_party/zlib/gzlib.c', + 'third_party/zlib/gzread.c', + 'third_party/zlib/gzwrite.c', + 'third_party/zlib/infback.c', + 'third_party/zlib/inffast.c', + 'third_party/zlib/inflate.c', + 'third_party/zlib/inftrees.c', + 'third_party/zlib/trees.c', + 'third_party/zlib/uncompr.c', + 'third_party/zlib/zutil.c', + ], + }, + ] +} diff --git a/include/grpc++/alarm.h b/include/grpc++/alarm.h new file mode 100644 index 00000000..dce742ee --- /dev/null +++ b/include/grpc++/alarm.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_ALARM_H +#define GRPCXX_ALARM_H + +#include + +#endif // GRPCXX_ALARM_H diff --git a/include/grpc++/channel.h b/include/grpc++/channel.h new file mode 100644 index 00000000..b1154cef --- /dev/null +++ b/include/grpc++/channel.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_CHANNEL_H +#define GRPCXX_CHANNEL_H + +#include + +#endif // GRPCXX_CHANNEL_H diff --git a/include/grpc++/client_context.h b/include/grpc++/client_context.h new file mode 100644 index 00000000..4b236440 --- /dev/null +++ b/include/grpc++/client_context.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_CLIENT_CONTEXT_H +#define GRPCXX_CLIENT_CONTEXT_H + +#include + +#endif // GRPCXX_CLIENT_CONTEXT_H diff --git a/include/grpc++/completion_queue.h b/include/grpc++/completion_queue.h new file mode 100644 index 00000000..98ef18f0 --- /dev/null +++ b/include/grpc++/completion_queue.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_COMPLETION_QUEUE_H +#define GRPCXX_COMPLETION_QUEUE_H + +#include + +#endif // GRPCXX_COMPLETION_QUEUE_H diff --git a/include/grpc++/create_channel.h b/include/grpc++/create_channel.h new file mode 100644 index 00000000..d95f3a97 --- /dev/null +++ b/include/grpc++/create_channel.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_CREATE_CHANNEL_H +#define GRPCXX_CREATE_CHANNEL_H + +#include + +#endif // GRPCXX_CREATE_CHANNEL_H diff --git a/include/grpc++/create_channel_posix.h b/include/grpc++/create_channel_posix.h new file mode 100644 index 00000000..8c8983ba --- /dev/null +++ b/include/grpc++/create_channel_posix.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_CREATE_CHANNEL_POSIX_H +#define GRPCXX_CREATE_CHANNEL_POSIX_H + +#include + +#endif // GRPCXX_CREATE_CHANNEL_POSIX_H diff --git a/include/grpc++/ext/health_check_service_server_builder_option.h b/include/grpc++/ext/health_check_service_server_builder_option.h new file mode 100644 index 00000000..cb82fc03 --- /dev/null +++ b/include/grpc++/ext/health_check_service_server_builder_option.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_EXT_HEALTH_CHECK_SERVICE_SERVER_BUILDER_OPTION_H +#define GRPCXX_EXT_HEALTH_CHECK_SERVICE_SERVER_BUILDER_OPTION_H + +#include + +#endif // GRPCXX_EXT_HEALTH_CHECK_SERVICE_SERVER_BUILDER_OPTION_H diff --git a/include/grpc++/ext/proto_server_reflection_plugin.h b/include/grpc++/ext/proto_server_reflection_plugin.h new file mode 100644 index 00000000..02e21b92 --- /dev/null +++ b/include/grpc++/ext/proto_server_reflection_plugin.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_EXT_PROTO_SERVER_REFLECTION_PLUGIN_H +#define GRPCXX_EXT_PROTO_SERVER_REFLECTION_PLUGIN_H + +#include + +#endif // GRPCXX_EXT_PROTO_SERVER_REFLECTION_PLUGIN_H diff --git a/include/grpc++/generic/async_generic_service.h b/include/grpc++/generic/async_generic_service.h new file mode 100644 index 00000000..d3283fac --- /dev/null +++ b/include/grpc++/generic/async_generic_service.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_GENERIC_ASYNC_GENERIC_SERVICE_H +#define GRPCXX_GENERIC_ASYNC_GENERIC_SERVICE_H + +#include + +#endif // GRPCXX_GENERIC_ASYNC_GENERIC_SERVICE_H diff --git a/include/grpc++/generic/generic_stub.h b/include/grpc++/generic/generic_stub.h new file mode 100644 index 00000000..502953b5 --- /dev/null +++ b/include/grpc++/generic/generic_stub.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_GENERIC_GENERIC_STUB_H +#define GRPCXX_GENERIC_GENERIC_STUB_H + +#include + +#endif // GRPCXX_GENERIC_GENERIC_STUB_H diff --git a/include/grpc++/grpc++.h b/include/grpc++/grpc++.h new file mode 100644 index 00000000..9f1d7b1b --- /dev/null +++ b/include/grpc++/grpc++.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_GRPCXX_H +#define GRPCXX_GRPCXX_H + +#include + +#endif // GRPCXX_GRPCXX_H diff --git a/include/grpc++/health_check_service_interface.h b/include/grpc++/health_check_service_interface.h new file mode 100644 index 00000000..0cb0668e --- /dev/null +++ b/include/grpc++/health_check_service_interface.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_HEALTH_CHECK_SERVICE_INTERFACE_H +#define GRPCXX_HEALTH_CHECK_SERVICE_INTERFACE_H + +#include + +#endif // GRPCXX_HEALTH_CHECK_SERVICE_INTERFACE_H diff --git a/include/grpc++/impl/call.h b/include/grpc++/impl/call.h new file mode 100644 index 00000000..b1da2b63 --- /dev/null +++ b/include/grpc++/impl/call.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_CALL_H +#define GRPCXX_IMPL_CALL_H + +#include + +#endif // GRPCXX_IMPL_CALL_H diff --git a/include/grpc++/impl/channel_argument_option.h b/include/grpc++/impl/channel_argument_option.h new file mode 100644 index 00000000..3468378d --- /dev/null +++ b/include/grpc++/impl/channel_argument_option.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_CHANNEL_ARGUMENT_OPTION_H +#define GRPCXX_IMPL_CHANNEL_ARGUMENT_OPTION_H + +#include + +#endif // GRPCXX_IMPL_CHANNEL_ARGUMENT_OPTION_H diff --git a/include/grpc++/impl/client_unary_call.h b/include/grpc++/impl/client_unary_call.h new file mode 100644 index 00000000..75e65607 --- /dev/null +++ b/include/grpc++/impl/client_unary_call.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_CLIENT_UNARY_CALL_H +#define GRPCXX_IMPL_CLIENT_UNARY_CALL_H + +#include + +#endif // GRPCXX_IMPL_CLIENT_UNARY_CALL_H diff --git a/include/grpc++/impl/codegen/async_stream.h b/include/grpc++/impl/codegen/async_stream.h new file mode 100644 index 00000000..a034470a --- /dev/null +++ b/include/grpc++/impl/codegen/async_stream.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_CODEGEN_ASYNC_STREAM_H +#define GRPCXX_IMPL_CODEGEN_ASYNC_STREAM_H + +#include + +#endif // GRPCXX_IMPL_CODEGEN_ASYNC_STREAM_H diff --git a/include/grpc++/impl/codegen/async_unary_call.h b/include/grpc++/impl/codegen/async_unary_call.h new file mode 100644 index 00000000..2b08920a --- /dev/null +++ b/include/grpc++/impl/codegen/async_unary_call.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_CODEGEN_ASYNC_UNARY_CALL_H +#define GRPCXX_IMPL_CODEGEN_ASYNC_UNARY_CALL_H + +#include + +#endif // GRPCXX_IMPL_CODEGEN_ASYNC_UNARY_CALL_H diff --git a/include/grpc++/impl/codegen/byte_buffer.h b/include/grpc++/impl/codegen/byte_buffer.h new file mode 100644 index 00000000..b754fa24 --- /dev/null +++ b/include/grpc++/impl/codegen/byte_buffer.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_CODEGEN_BYTE_BUFFER_H +#define GRPCXX_IMPL_CODEGEN_BYTE_BUFFER_H + +#include + +#endif // GRPCXX_IMPL_CODEGEN_BYTE_BUFFER_H diff --git a/include/grpc++/impl/codegen/call.h b/include/grpc++/impl/codegen/call.h new file mode 100644 index 00000000..dadab545 --- /dev/null +++ b/include/grpc++/impl/codegen/call.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_CODEGEN_CALL_H +#define GRPCXX_IMPL_CODEGEN_CALL_H + +#include + +#endif // GRPCXX_IMPL_CODEGEN_CALL_H diff --git a/include/grpc++/impl/codegen/call_hook.h b/include/grpc++/impl/codegen/call_hook.h new file mode 100644 index 00000000..cf5ed571 --- /dev/null +++ b/include/grpc++/impl/codegen/call_hook.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_CODEGEN_CALL_HOOK_H +#define GRPCXX_IMPL_CODEGEN_CALL_HOOK_H + +#include + +#endif // GRPCXX_IMPL_CODEGEN_CALL_HOOK_H diff --git a/include/grpc++/impl/codegen/channel_interface.h b/include/grpc++/impl/codegen/channel_interface.h new file mode 100644 index 00000000..c6e782e9 --- /dev/null +++ b/include/grpc++/impl/codegen/channel_interface.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_CODEGEN_CHANNEL_INTERFACE_H +#define GRPCXX_IMPL_CODEGEN_CHANNEL_INTERFACE_H + +#include + +#endif // GRPCXX_IMPL_CODEGEN_CHANNEL_INTERFACE_H diff --git a/include/grpc++/impl/codegen/client_context.h b/include/grpc++/impl/codegen/client_context.h new file mode 100644 index 00000000..107532cb --- /dev/null +++ b/include/grpc++/impl/codegen/client_context.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_CODEGEN_CLIENT_CONTEXT_H +#define GRPCXX_IMPL_CODEGEN_CLIENT_CONTEXT_H + +#include + +#endif // GRPCXX_IMPL_CODEGEN_CLIENT_CONTEXT_H diff --git a/include/grpc++/impl/codegen/client_unary_call.h b/include/grpc++/impl/codegen/client_unary_call.h new file mode 100644 index 00000000..f7dff1f1 --- /dev/null +++ b/include/grpc++/impl/codegen/client_unary_call.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_CODEGEN_CLIENT_UNARY_CALL_H +#define GRPCXX_IMPL_CODEGEN_CLIENT_UNARY_CALL_H + +#include + +#endif // GRPCXX_IMPL_CODEGEN_CLIENT_UNARY_CALL_H diff --git a/include/grpc++/impl/codegen/completion_queue.h b/include/grpc++/impl/codegen/completion_queue.h new file mode 100644 index 00000000..10754955 --- /dev/null +++ b/include/grpc++/impl/codegen/completion_queue.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_CODEGEN_COMPLETION_QUEUE_H +#define GRPCXX_IMPL_CODEGEN_COMPLETION_QUEUE_H + +#include + +#endif // GRPCXX_IMPL_CODEGEN_COMPLETION_QUEUE_H diff --git a/include/grpc++/impl/codegen/completion_queue_tag.h b/include/grpc++/impl/codegen/completion_queue_tag.h new file mode 100644 index 00000000..994fa2a9 --- /dev/null +++ b/include/grpc++/impl/codegen/completion_queue_tag.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_CODEGEN_COMPLETION_QUEUE_TAG_H +#define GRPCXX_IMPL_CODEGEN_COMPLETION_QUEUE_TAG_H + +#include + +#endif // GRPCXX_IMPL_CODEGEN_COMPLETION_QUEUE_TAG_H diff --git a/include/grpc++/impl/codegen/config.h b/include/grpc++/impl/codegen/config.h new file mode 100644 index 00000000..237bf38d --- /dev/null +++ b/include/grpc++/impl/codegen/config.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_CODEGEN_CONFIG_H +#define GRPCXX_IMPL_CODEGEN_CONFIG_H + +#include + +#endif // GRPCXX_IMPL_CODEGEN_CONFIG_H diff --git a/include/grpc++/impl/codegen/config_protobuf.h b/include/grpc++/impl/codegen/config_protobuf.h new file mode 100644 index 00000000..debd74aa --- /dev/null +++ b/include/grpc++/impl/codegen/config_protobuf.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_CODEGEN_CONFIG_PROTOBUF_H +#define GRPCXX_IMPL_CODEGEN_CONFIG_PROTOBUF_H + +#include + +#endif // GRPCXX_IMPL_CODEGEN_CONFIG_PROTOBUF_H diff --git a/include/grpc++/impl/codegen/core_codegen.h b/include/grpc++/impl/codegen/core_codegen.h new file mode 100644 index 00000000..ee600a9d --- /dev/null +++ b/include/grpc++/impl/codegen/core_codegen.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_CODEGEN_CORE_CODEGEN_H +#define GRPCXX_IMPL_CODEGEN_CORE_CODEGEN_H + +#include + +#endif // GRPCXX_IMPL_CODEGEN_CORE_CODEGEN_H diff --git a/include/grpc++/impl/codegen/core_codegen_interface.h b/include/grpc++/impl/codegen/core_codegen_interface.h new file mode 100644 index 00000000..03b3f675 --- /dev/null +++ b/include/grpc++/impl/codegen/core_codegen_interface.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_CODEGEN_CORE_CODEGEN_INTERFACE_H +#define GRPCXX_IMPL_CODEGEN_CORE_CODEGEN_INTERFACE_H + +#include + +#endif // GRPCXX_IMPL_CODEGEN_CORE_CODEGEN_INTERFACE_H diff --git a/include/grpc++/impl/codegen/create_auth_context.h b/include/grpc++/impl/codegen/create_auth_context.h new file mode 100644 index 00000000..ef89229f --- /dev/null +++ b/include/grpc++/impl/codegen/create_auth_context.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_CODEGEN_CREATE_AUTH_CONTEXT_H +#define GRPCXX_IMPL_CODEGEN_CREATE_AUTH_CONTEXT_H + +#include + +#endif // GRPCXX_IMPL_CODEGEN_CREATE_AUTH_CONTEXT_H diff --git a/include/grpc++/impl/codegen/grpc_library.h b/include/grpc++/impl/codegen/grpc_library.h new file mode 100644 index 00000000..33c3e254 --- /dev/null +++ b/include/grpc++/impl/codegen/grpc_library.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_CODEGEN_GRPC_LIBRARY_H +#define GRPCXX_IMPL_CODEGEN_GRPC_LIBRARY_H + +#include + +#endif // GRPCXX_IMPL_CODEGEN_GRPC_LIBRARY_H diff --git a/include/grpc++/impl/codegen/metadata_map.h b/include/grpc++/impl/codegen/metadata_map.h new file mode 100644 index 00000000..41c5ad37 --- /dev/null +++ b/include/grpc++/impl/codegen/metadata_map.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_CODEGEN_METADATA_MAP_H +#define GRPCXX_IMPL_CODEGEN_METADATA_MAP_H + +#include + +#endif // GRPCXX_IMPL_CODEGEN_METADATA_MAP_H diff --git a/include/grpc++/impl/codegen/method_handler_impl.h b/include/grpc++/impl/codegen/method_handler_impl.h new file mode 100644 index 00000000..0bdb6206 --- /dev/null +++ b/include/grpc++/impl/codegen/method_handler_impl.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_CODEGEN_METHOD_HANDLER_IMPL_H +#define GRPCXX_IMPL_CODEGEN_METHOD_HANDLER_IMPL_H + +#include + +#endif // GRPCXX_IMPL_CODEGEN_METHOD_HANDLER_IMPL_H diff --git a/include/grpc++/impl/codegen/proto_utils.h b/include/grpc++/impl/codegen/proto_utils.h new file mode 100644 index 00000000..1f47884a --- /dev/null +++ b/include/grpc++/impl/codegen/proto_utils.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_CODEGEN_PROTO_UTILS_H +#define GRPCXX_IMPL_CODEGEN_PROTO_UTILS_H + +#include + +#endif // GRPCXX_IMPL_CODEGEN_PROTO_UTILS_H diff --git a/include/grpc++/impl/codegen/rpc_method.h b/include/grpc++/impl/codegen/rpc_method.h new file mode 100644 index 00000000..2906c74d --- /dev/null +++ b/include/grpc++/impl/codegen/rpc_method.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_CODEGEN_RPC_METHOD_H +#define GRPCXX_IMPL_CODEGEN_RPC_METHOD_H + +#include + +#endif // GRPCXX_IMPL_CODEGEN_RPC_METHOD_H diff --git a/include/grpc++/impl/codegen/rpc_service_method.h b/include/grpc++/impl/codegen/rpc_service_method.h new file mode 100644 index 00000000..999c0d5e --- /dev/null +++ b/include/grpc++/impl/codegen/rpc_service_method.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_CODEGEN_RPC_SERVICE_METHOD_H +#define GRPCXX_IMPL_CODEGEN_RPC_SERVICE_METHOD_H + +#include + +#endif // GRPCXX_IMPL_CODEGEN_RPC_SERVICE_METHOD_H diff --git a/include/grpc++/impl/codegen/security/auth_context.h b/include/grpc++/impl/codegen/security/auth_context.h new file mode 100644 index 00000000..b4663739 --- /dev/null +++ b/include/grpc++/impl/codegen/security/auth_context.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_CODEGEN_SECURITY_AUTH_CONTEXT_H +#define GRPCXX_IMPL_CODEGEN_SECURITY_AUTH_CONTEXT_H + +#include + +#endif // GRPCXX_IMPL_CODEGEN_SECURITY_AUTH_CONTEXT_H diff --git a/include/grpc++/impl/codegen/serialization_traits.h b/include/grpc++/impl/codegen/serialization_traits.h new file mode 100644 index 00000000..480575d1 --- /dev/null +++ b/include/grpc++/impl/codegen/serialization_traits.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_CODEGEN_SERIALIZATION_TRAITS_H +#define GRPCXX_IMPL_CODEGEN_SERIALIZATION_TRAITS_H + +#include + +#endif // GRPCXX_IMPL_CODEGEN_SERIALIZATION_TRAITS_H diff --git a/include/grpc++/impl/codegen/server_context.h b/include/grpc++/impl/codegen/server_context.h new file mode 100644 index 00000000..1c3342d5 --- /dev/null +++ b/include/grpc++/impl/codegen/server_context.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_CODEGEN_SERVER_CONTEXT_H +#define GRPCXX_IMPL_CODEGEN_SERVER_CONTEXT_H + +#include + +#endif // GRPCXX_IMPL_CODEGEN_SERVER_CONTEXT_H diff --git a/include/grpc++/impl/codegen/server_interface.h b/include/grpc++/impl/codegen/server_interface.h new file mode 100644 index 00000000..ceea44c5 --- /dev/null +++ b/include/grpc++/impl/codegen/server_interface.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_CODEGEN_SERVER_INTERFACE_H +#define GRPCXX_IMPL_CODEGEN_SERVER_INTERFACE_H + +#include + +#endif // GRPCXX_IMPL_CODEGEN_SERVER_INTERFACE_H diff --git a/include/grpc++/impl/codegen/service_type.h b/include/grpc++/impl/codegen/service_type.h new file mode 100644 index 00000000..be02b75b --- /dev/null +++ b/include/grpc++/impl/codegen/service_type.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_CODEGEN_SERVICE_TYPE_H +#define GRPCXX_IMPL_CODEGEN_SERVICE_TYPE_H + +#include + +#endif // GRPCXX_IMPL_CODEGEN_SERVICE_TYPE_H diff --git a/include/grpc++/impl/codegen/slice.h b/include/grpc++/impl/codegen/slice.h new file mode 100644 index 00000000..6714badc --- /dev/null +++ b/include/grpc++/impl/codegen/slice.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_CODEGEN_SLICE_H +#define GRPCXX_IMPL_CODEGEN_SLICE_H + +#include + +#endif // GRPCXX_IMPL_CODEGEN_SLICE_H diff --git a/include/grpc++/impl/codegen/status.h b/include/grpc++/impl/codegen/status.h new file mode 100644 index 00000000..6cf9459f --- /dev/null +++ b/include/grpc++/impl/codegen/status.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_CODEGEN_STATUS_H +#define GRPCXX_IMPL_CODEGEN_STATUS_H + +#include + +#endif // GRPCXX_IMPL_CODEGEN_STATUS_H diff --git a/include/grpc++/impl/codegen/status_code_enum.h b/include/grpc++/impl/codegen/status_code_enum.h new file mode 100644 index 00000000..7503eaee --- /dev/null +++ b/include/grpc++/impl/codegen/status_code_enum.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_CODEGEN_STATUS_CODE_ENUM_H +#define GRPCXX_IMPL_CODEGEN_STATUS_CODE_ENUM_H + +#include + +#endif // GRPCXX_IMPL_CODEGEN_STATUS_CODE_ENUM_H diff --git a/include/grpc++/impl/codegen/string_ref.h b/include/grpc++/impl/codegen/string_ref.h new file mode 100644 index 00000000..66e250ef --- /dev/null +++ b/include/grpc++/impl/codegen/string_ref.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_CODEGEN_STRING_REF_H +#define GRPCXX_IMPL_CODEGEN_STRING_REF_H + +#include + +#endif // GRPCXX_IMPL_CODEGEN_STRING_REF_H diff --git a/include/grpc++/impl/codegen/stub_options.h b/include/grpc++/impl/codegen/stub_options.h new file mode 100644 index 00000000..07cb4417 --- /dev/null +++ b/include/grpc++/impl/codegen/stub_options.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_CODEGEN_STUB_OPTIONS_H +#define GRPCXX_IMPL_CODEGEN_STUB_OPTIONS_H + +#include + +#endif // GRPCXX_IMPL_CODEGEN_STUB_OPTIONS_H diff --git a/include/grpc++/impl/codegen/sync_stream.h b/include/grpc++/impl/codegen/sync_stream.h new file mode 100644 index 00000000..1e6ba27b --- /dev/null +++ b/include/grpc++/impl/codegen/sync_stream.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_CODEGEN_SYNC_STREAM_H +#define GRPCXX_IMPL_CODEGEN_SYNC_STREAM_H + +#include + +#endif // GRPCXX_IMPL_CODEGEN_SYNC_STREAM_H diff --git a/include/grpc++/impl/codegen/time.h b/include/grpc++/impl/codegen/time.h new file mode 100644 index 00000000..f9b70f83 --- /dev/null +++ b/include/grpc++/impl/codegen/time.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_CODEGEN_TIME_H +#define GRPCXX_IMPL_CODEGEN_TIME_H + +#include + +#endif // GRPCXX_IMPL_CODEGEN_TIME_H diff --git a/include/grpc++/impl/grpc_library.h b/include/grpc++/impl/grpc_library.h new file mode 100644 index 00000000..f34a281a --- /dev/null +++ b/include/grpc++/impl/grpc_library.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_GRPC_LIBRARY_H +#define GRPCXX_IMPL_GRPC_LIBRARY_H + +#include + +#endif // GRPCXX_IMPL_GRPC_LIBRARY_H diff --git a/include/grpc++/impl/method_handler_impl.h b/include/grpc++/impl/method_handler_impl.h new file mode 100644 index 00000000..3840f487 --- /dev/null +++ b/include/grpc++/impl/method_handler_impl.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_METHOD_HANDLER_IMPL_H +#define GRPCXX_IMPL_METHOD_HANDLER_IMPL_H + +#include + +#endif // GRPCXX_IMPL_METHOD_HANDLER_IMPL_H diff --git a/include/grpc++/impl/rpc_method.h b/include/grpc++/impl/rpc_method.h new file mode 100644 index 00000000..7cba7c40 --- /dev/null +++ b/include/grpc++/impl/rpc_method.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_RPC_METHOD_H +#define GRPCXX_IMPL_RPC_METHOD_H + +#include + +#endif // GRPCXX_IMPL_RPC_METHOD_H diff --git a/include/grpc++/impl/rpc_service_method.h b/include/grpc++/impl/rpc_service_method.h new file mode 100644 index 00000000..2c75087b --- /dev/null +++ b/include/grpc++/impl/rpc_service_method.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_RPC_SERVICE_METHOD_H +#define GRPCXX_IMPL_RPC_SERVICE_METHOD_H + +#include + +#endif // GRPCXX_IMPL_RPC_SERVICE_METHOD_H diff --git a/include/grpc++/impl/serialization_traits.h b/include/grpc++/impl/serialization_traits.h new file mode 100644 index 00000000..33b3a0bb --- /dev/null +++ b/include/grpc++/impl/serialization_traits.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_SERIALIZATION_TRAITS_H +#define GRPCXX_IMPL_SERIALIZATION_TRAITS_H + +#include + +#endif // GRPCXX_IMPL_SERIALIZATION_TRAITS_H diff --git a/include/grpc++/impl/server_builder_option.h b/include/grpc++/impl/server_builder_option.h new file mode 100644 index 00000000..833f8db7 --- /dev/null +++ b/include/grpc++/impl/server_builder_option.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_SERVER_BUILDER_OPTION_H +#define GRPCXX_IMPL_SERVER_BUILDER_OPTION_H + +#include + +#endif // GRPCXX_IMPL_SERVER_BUILDER_OPTION_H diff --git a/include/grpc++/impl/server_builder_plugin.h b/include/grpc++/impl/server_builder_plugin.h new file mode 100644 index 00000000..844d32c5 --- /dev/null +++ b/include/grpc++/impl/server_builder_plugin.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_SERVER_BUILDER_PLUGIN_H +#define GRPCXX_IMPL_SERVER_BUILDER_PLUGIN_H + +#include + +#endif // GRPCXX_IMPL_SERVER_BUILDER_PLUGIN_H diff --git a/include/grpc++/impl/server_initializer.h b/include/grpc++/impl/server_initializer.h new file mode 100644 index 00000000..6a1669cc --- /dev/null +++ b/include/grpc++/impl/server_initializer.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_SERVER_INITIALIZER_H +#define GRPCXX_IMPL_SERVER_INITIALIZER_H + +#include + +#endif // GRPCXX_IMPL_SERVER_INITIALIZER_H diff --git a/include/grpc++/impl/service_type.h b/include/grpc++/impl/service_type.h new file mode 100644 index 00000000..86422160 --- /dev/null +++ b/include/grpc++/impl/service_type.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_IMPL_SERVICE_TYPE_H +#define GRPCXX_IMPL_SERVICE_TYPE_H + +#include + +#endif // GRPCXX_IMPL_SERVICE_TYPE_H diff --git a/include/grpc++/resource_quota.h b/include/grpc++/resource_quota.h new file mode 100644 index 00000000..aad1b565 --- /dev/null +++ b/include/grpc++/resource_quota.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_RESOURCE_QUOTA_H +#define GRPCXX_RESOURCE_QUOTA_H + +#include + +#endif // GRPCXX_RESOURCE_QUOTA_H diff --git a/include/grpc++/security/auth_context.h b/include/grpc++/security/auth_context.h new file mode 100644 index 00000000..9fe59d44 --- /dev/null +++ b/include/grpc++/security/auth_context.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_SECURITY_AUTH_CONTEXT_H +#define GRPCXX_SECURITY_AUTH_CONTEXT_H + +#include + +#endif // GRPCXX_SECURITY_AUTH_CONTEXT_H diff --git a/include/grpc++/security/auth_metadata_processor.h b/include/grpc++/security/auth_metadata_processor.h new file mode 100644 index 00000000..d0453139 --- /dev/null +++ b/include/grpc++/security/auth_metadata_processor.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_SECURITY_AUTH_METADATA_PROCESSOR_H +#define GRPCXX_SECURITY_AUTH_METADATA_PROCESSOR_H + +#include + +#endif // GRPCXX_SECURITY_AUTH_METADATA_PROCESSOR_H diff --git a/include/grpc++/security/credentials.h b/include/grpc++/security/credentials.h new file mode 100644 index 00000000..94044182 --- /dev/null +++ b/include/grpc++/security/credentials.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_SECURITY_CREDENTIALS_H +#define GRPCXX_SECURITY_CREDENTIALS_H + +#include + +#endif // GRPCXX_SECURITY_CREDENTIALS_H diff --git a/include/grpc++/security/server_credentials.h b/include/grpc++/security/server_credentials.h new file mode 100644 index 00000000..c6d1c4f0 --- /dev/null +++ b/include/grpc++/security/server_credentials.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_SECURITY_SERVER_CREDENTIALS_H +#define GRPCXX_SECURITY_SERVER_CREDENTIALS_H + +#include + +#endif // GRPCXX_SECURITY_SERVER_CREDENTIALS_H diff --git a/include/grpc++/server.h b/include/grpc++/server.h new file mode 100644 index 00000000..086c24cc --- /dev/null +++ b/include/grpc++/server.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_SERVER_H +#define GRPCXX_SERVER_H + +#include + +#endif // GRPCXX_SERVER_H diff --git a/include/grpc++/server_builder.h b/include/grpc++/server_builder.h new file mode 100644 index 00000000..2c6dab44 --- /dev/null +++ b/include/grpc++/server_builder.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_SERVER_BUILDER_H +#define GRPCXX_SERVER_BUILDER_H + +#include + +#endif // GRPCXX_SERVER_BUILDER_H diff --git a/include/grpc++/server_context.h b/include/grpc++/server_context.h new file mode 100644 index 00000000..672ccdca --- /dev/null +++ b/include/grpc++/server_context.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_SERVER_CONTEXT_H +#define GRPCXX_SERVER_CONTEXT_H + +#include + +#endif // GRPCXX_SERVER_CONTEXT_H diff --git a/include/grpc++/server_posix.h b/include/grpc++/server_posix.h new file mode 100644 index 00000000..d2866d96 --- /dev/null +++ b/include/grpc++/server_posix.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_SERVER_POSIX_H +#define GRPCXX_SERVER_POSIX_H + +#include + +#endif // GRPCXX_SERVER_POSIX_H diff --git a/include/grpc++/support/async_stream.h b/include/grpc++/support/async_stream.h new file mode 100644 index 00000000..9bb2b725 --- /dev/null +++ b/include/grpc++/support/async_stream.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_SUPPORT_ASYNC_STREAM_H +#define GRPCXX_SUPPORT_ASYNC_STREAM_H + +#include + +#endif // GRPCXX_SUPPORT_ASYNC_STREAM_H diff --git a/include/grpc++/support/async_unary_call.h b/include/grpc++/support/async_unary_call.h new file mode 100644 index 00000000..56fbf314 --- /dev/null +++ b/include/grpc++/support/async_unary_call.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_SUPPORT_ASYNC_UNARY_CALL_H +#define GRPCXX_SUPPORT_ASYNC_UNARY_CALL_H + +#include + +#endif // GRPCXX_SUPPORT_ASYNC_UNARY_CALL_H diff --git a/include/grpc++/support/byte_buffer.h b/include/grpc++/support/byte_buffer.h new file mode 100644 index 00000000..ec607ee0 --- /dev/null +++ b/include/grpc++/support/byte_buffer.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_SUPPORT_BYTE_BUFFER_H +#define GRPCXX_SUPPORT_BYTE_BUFFER_H + +#include + +#endif // GRPCXX_SUPPORT_BYTE_BUFFER_H diff --git a/include/grpc++/support/channel_arguments.h b/include/grpc++/support/channel_arguments.h new file mode 100644 index 00000000..6d5300cc --- /dev/null +++ b/include/grpc++/support/channel_arguments.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_SUPPORT_CHANNEL_ARGUMENTS_H +#define GRPCXX_SUPPORT_CHANNEL_ARGUMENTS_H + +#include + +#endif // GRPCXX_SUPPORT_CHANNEL_ARGUMENTS_H diff --git a/include/grpc++/support/config.h b/include/grpc++/support/config.h new file mode 100644 index 00000000..f8eee507 --- /dev/null +++ b/include/grpc++/support/config.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_SUPPORT_CONFIG_H +#define GRPCXX_SUPPORT_CONFIG_H + +#include + +#endif // GRPCXX_SUPPORT_CONFIG_H diff --git a/include/grpc++/support/error_details.h b/include/grpc++/support/error_details.h new file mode 100644 index 00000000..7ace308e --- /dev/null +++ b/include/grpc++/support/error_details.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_SUPPORT_ERROR_DETAILS_H +#define GRPCXX_SUPPORT_ERROR_DETAILS_H + +#include + +#endif // GRPCXX_SUPPORT_ERROR_DETAILS_H diff --git a/include/grpc++/support/slice.h b/include/grpc++/support/slice.h new file mode 100644 index 00000000..b02b1a97 --- /dev/null +++ b/include/grpc++/support/slice.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_SUPPORT_SLICE_H +#define GRPCXX_SUPPORT_SLICE_H + +#include + +#endif // GRPCXX_SUPPORT_SLICE_H diff --git a/include/grpc++/support/status.h b/include/grpc++/support/status.h new file mode 100644 index 00000000..e58a18bd --- /dev/null +++ b/include/grpc++/support/status.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_SUPPORT_STATUS_H +#define GRPCXX_SUPPORT_STATUS_H + +#include + +#endif // GRPCXX_SUPPORT_STATUS_H diff --git a/include/grpc++/support/status_code_enum.h b/include/grpc++/support/status_code_enum.h new file mode 100644 index 00000000..c278add0 --- /dev/null +++ b/include/grpc++/support/status_code_enum.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_SUPPORT_STATUS_CODE_ENUM_H +#define GRPCXX_SUPPORT_STATUS_CODE_ENUM_H + +#include + +#endif // GRPCXX_SUPPORT_STATUS_CODE_ENUM_H diff --git a/include/grpc++/support/string_ref.h b/include/grpc++/support/string_ref.h new file mode 100644 index 00000000..49de6daf --- /dev/null +++ b/include/grpc++/support/string_ref.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_SUPPORT_STRING_REF_H +#define GRPCXX_SUPPORT_STRING_REF_H + +#include + +#endif // GRPCXX_SUPPORT_STRING_REF_H diff --git a/include/grpc++/support/stub_options.h b/include/grpc++/support/stub_options.h new file mode 100644 index 00000000..a712ce87 --- /dev/null +++ b/include/grpc++/support/stub_options.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_SUPPORT_STUB_OPTIONS_H +#define GRPCXX_SUPPORT_STUB_OPTIONS_H + +#include + +#endif // GRPCXX_SUPPORT_STUB_OPTIONS_H diff --git a/include/grpc++/support/sync_stream.h b/include/grpc++/support/sync_stream.h new file mode 100644 index 00000000..c118df9f --- /dev/null +++ b/include/grpc++/support/sync_stream.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_SUPPORT_SYNC_STREAM_H +#define GRPCXX_SUPPORT_SYNC_STREAM_H + +#include + +#endif // GRPCXX_SUPPORT_SYNC_STREAM_H diff --git a/include/grpc++/support/time.h b/include/grpc++/support/time.h new file mode 100644 index 00000000..d356b910 --- /dev/null +++ b/include/grpc++/support/time.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_SUPPORT_TIME_H +#define GRPCXX_SUPPORT_TIME_H + +#include + +#endif // GRPCXX_SUPPORT_TIME_H diff --git a/include/grpc++/test/mock_stream.h b/include/grpc++/test/mock_stream.h new file mode 100644 index 00000000..a29345b0 --- /dev/null +++ b/include/grpc++/test/mock_stream.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_TEST_MOCK_STREAM_H +#define GRPCXX_TEST_MOCK_STREAM_H + +#include + +#endif // GRPCXX_TEST_MOCK_STREAM_H diff --git a/include/grpc++/test/server_context_test_spouse.h b/include/grpc++/test/server_context_test_spouse.h new file mode 100644 index 00000000..48a4838c --- /dev/null +++ b/include/grpc++/test/server_context_test_spouse.h @@ -0,0 +1,28 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// DEPRECATED: The headers in include/grpc++ are deprecated. Please include the +// headers in include/grpcpp instead. This header exists only for backwards +// compatibility. + +#ifndef GRPCXX_TEST_SERVER_CONTEXT_TEST_SPOUSE_H +#define GRPCXX_TEST_SERVER_CONTEXT_TEST_SPOUSE_H + +#include + +#endif // GRPCXX_TEST_SERVER_CONTEXT_TEST_SPOUSE_H diff --git a/include/grpc/byte_buffer.h b/include/grpc/byte_buffer.h new file mode 100644 index 00000000..ee740f47 --- /dev/null +++ b/include/grpc/byte_buffer.h @@ -0,0 +1,27 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_BYTE_BUFFER_H +#define GRPC_BYTE_BUFFER_H + +#include + +#include +#include + +#endif /* GRPC_BYTE_BUFFER_H */ diff --git a/include/grpc/byte_buffer_reader.h b/include/grpc/byte_buffer_reader.h new file mode 100644 index 00000000..15e06cad --- /dev/null +++ b/include/grpc/byte_buffer_reader.h @@ -0,0 +1,26 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_BYTE_BUFFER_READER_H +#define GRPC_BYTE_BUFFER_READER_H + +#include + +#include + +#endif /* GRPC_BYTE_BUFFER_READER_H */ diff --git a/include/grpc/census.h b/include/grpc/census.h new file mode 100644 index 00000000..4894f1c0 --- /dev/null +++ b/include/grpc/census.h @@ -0,0 +1,40 @@ +/* + * + * Copyright 2015-2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_CENSUS_H +#define GRPC_CENSUS_H + +#include + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + A Census Context is a handle used by Census to represent the current tracing + and stats collection information. Contexts should be propagated across RPC's + (this is the responsibility of the local RPC system). */ +typedef struct census_context census_context; + +#ifdef __cplusplus +} +#endif + +#endif /* GRPC_CENSUS_H */ diff --git a/include/grpc/compression.h b/include/grpc/compression.h new file mode 100644 index 00000000..a4f6a8fa --- /dev/null +++ b/include/grpc/compression.h @@ -0,0 +1,75 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_COMPRESSION_H +#define GRPC_COMPRESSION_H + +#include + +#include + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** Return if an algorithm is message compression algorithm. */ +GRPCAPI int grpc_compression_algorithm_is_message( + grpc_compression_algorithm algorithm); + +/** Return if an algorithm is stream compression algorithm. */ +GRPCAPI int grpc_compression_algorithm_is_stream( + grpc_compression_algorithm algorithm); + +/** Parses the \a slice as a grpc_compression_algorithm instance and updating \a + * algorithm. Returns 1 upon success, 0 otherwise. */ +GRPCAPI int grpc_compression_algorithm_parse( + grpc_slice value, grpc_compression_algorithm* algorithm); + +/** Updates \a name with the encoding name corresponding to a valid \a + * algorithm. Note that \a name is statically allocated and must *not* be freed. + * Returns 1 upon success, 0 otherwise. */ +GRPCAPI int grpc_compression_algorithm_name( + grpc_compression_algorithm algorithm, const char** name); + +/** Returns the compression algorithm corresponding to \a level for the + * compression algorithms encoded in the \a accepted_encodings bitset.*/ +GRPCAPI grpc_compression_algorithm grpc_compression_algorithm_for_level( + grpc_compression_level level, uint32_t accepted_encodings); + +GRPCAPI void grpc_compression_options_init(grpc_compression_options* opts); + +/** Mark \a algorithm as enabled in \a opts. */ +GRPCAPI void grpc_compression_options_enable_algorithm( + grpc_compression_options* opts, grpc_compression_algorithm algorithm); + +/** Mark \a algorithm as disabled in \a opts. */ +GRPCAPI void grpc_compression_options_disable_algorithm( + grpc_compression_options* opts, grpc_compression_algorithm algorithm); + +/** Returns true if \a algorithm is marked as enabled in \a opts. */ +GRPCAPI int grpc_compression_options_is_algorithm_enabled( + const grpc_compression_options* opts, grpc_compression_algorithm algorithm); + +#ifdef __cplusplus +} +#endif + +#endif /* GRPC_COMPRESSION_H */ diff --git a/include/grpc/fork.h b/include/grpc/fork.h new file mode 100644 index 00000000..26f9df98 --- /dev/null +++ b/include/grpc/fork.h @@ -0,0 +1,26 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_FORK_H +#define GRPC_FORK_H + +#include + +#include + +#endif /* GRPC_FORK_H */ diff --git a/include/grpc/grpc.h b/include/grpc/grpc.h new file mode 100644 index 00000000..80c7f796 --- /dev/null +++ b/include/grpc/grpc.h @@ -0,0 +1,540 @@ +/* + * + * Copyright 2015-2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_GRPC_H +#define GRPC_GRPC_H + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/*! \mainpage GRPC Core + * + * The GRPC Core library is a low-level library designed to be wrapped by higher + * level libraries. The top-level API is provided in grpc.h. Security related + * functionality lives in grpc_security.h. + */ + +GRPCAPI void grpc_metadata_array_init(grpc_metadata_array* array); +GRPCAPI void grpc_metadata_array_destroy(grpc_metadata_array* array); + +GRPCAPI void grpc_call_details_init(grpc_call_details* details); +GRPCAPI void grpc_call_details_destroy(grpc_call_details* details); + +/** Registers a plugin to be initialized and destroyed with the library. + + The \a init and \a destroy functions will be invoked as part of + \a grpc_init() and \a grpc_shutdown(), respectively. + Note that these functions can be invoked an arbitrary number of times + (and hence so will \a init and \a destroy). + It is safe to pass NULL to either argument. Plugins are destroyed in + the reverse order they were initialized. */ +GRPCAPI void grpc_register_plugin(void (*init)(void), void (*destroy)(void)); + +/** Initialize the grpc library. + + After it's called, a matching invocation to grpc_shutdown() is expected. + + It is not safe to call any other grpc functions before calling this. + (To avoid overhead, little checking is done, and some things may work. We + do not warrant that they will continue to do so in future revisions of this + library). */ +GRPCAPI void grpc_init(void); + +/** Shut down the grpc library. + + Before it's called, there should haven been a matching invocation to + grpc_init(). + + The last call to grpc_shutdown will initiate cleaning up of grpc library + internals, which can happen in another thread. Once the clean-up is done, + no memory is used by grpc, nor are any instructions executing within the + grpc library. Prior to calling, all application owned grpc objects must + have been destroyed. */ +GRPCAPI void grpc_shutdown(void); + +/** EXPERIMENTAL. Returns 1 if the grpc library has been initialized. + TODO(ericgribkoff) Decide if this should be promoted to non-experimental as + part of stabilizing the fork support API, as tracked in + https://github.com/grpc/grpc/issues/15334 */ +GRPCAPI int grpc_is_initialized(void); + +/** EXPERIMENTAL. Blocking shut down grpc library. + This is only for wrapped language to use now. */ +GRPCAPI void grpc_shutdown_blocking(void); + +/** Return a string representing the current version of grpc */ +GRPCAPI const char* grpc_version_string(void); + +/** Return a string specifying what the 'g' in gRPC stands for */ +GRPCAPI const char* grpc_g_stands_for(void); + +/** Returns the completion queue factory based on the attributes. MAY return a + NULL if no factory can be found */ +GRPCAPI const grpc_completion_queue_factory* +grpc_completion_queue_factory_lookup( + const grpc_completion_queue_attributes* attributes); + +/** Helper function to create a completion queue with grpc_cq_completion_type + of GRPC_CQ_NEXT and grpc_cq_polling_type of GRPC_CQ_DEFAULT_POLLING */ +GRPCAPI grpc_completion_queue* grpc_completion_queue_create_for_next( + void* reserved); + +/** Helper function to create a completion queue with grpc_cq_completion_type + of GRPC_CQ_PLUCK and grpc_cq_polling_type of GRPC_CQ_DEFAULT_POLLING */ +GRPCAPI grpc_completion_queue* grpc_completion_queue_create_for_pluck( + void* reserved); + +/** Helper function to create a completion queue with grpc_cq_completion_type + of GRPC_CQ_CALLBACK and grpc_cq_polling_type of GRPC_CQ_DEFAULT_POLLING. + This function is experimental. */ +GRPCAPI grpc_completion_queue* grpc_completion_queue_create_for_callback( + grpc_experimental_completion_queue_functor* shutdown_callback, + void* reserved); + +/** Create a completion queue */ +GRPCAPI grpc_completion_queue* grpc_completion_queue_create( + const grpc_completion_queue_factory* factory, + const grpc_completion_queue_attributes* attributes, void* reserved); + +/** Blocks until an event is available, the completion queue is being shut down, + or deadline is reached. + + Returns a grpc_event with type GRPC_QUEUE_TIMEOUT on timeout, + otherwise a grpc_event describing the event that occurred. + + Callers must not call grpc_completion_queue_next and + grpc_completion_queue_pluck simultaneously on the same completion queue. */ +GRPCAPI grpc_event grpc_completion_queue_next(grpc_completion_queue* cq, + gpr_timespec deadline, + void* reserved); + +/** Blocks until an event with tag 'tag' is available, the completion queue is + being shutdown or deadline is reached. + + Returns a grpc_event with type GRPC_QUEUE_TIMEOUT on timeout, + otherwise a grpc_event describing the event that occurred. + + Callers must not call grpc_completion_queue_next and + grpc_completion_queue_pluck simultaneously on the same completion queue. + + Completion queues support a maximum of GRPC_MAX_COMPLETION_QUEUE_PLUCKERS + concurrently executing plucks at any time. */ +GRPCAPI grpc_event grpc_completion_queue_pluck(grpc_completion_queue* cq, + void* tag, gpr_timespec deadline, + void* reserved); + +/** Maximum number of outstanding grpc_completion_queue_pluck executions per + completion queue */ +#define GRPC_MAX_COMPLETION_QUEUE_PLUCKERS 6 + +/** Begin destruction of a completion queue. Once all possible events are + drained then grpc_completion_queue_next will start to produce + GRPC_QUEUE_SHUTDOWN events only. At that point it's safe to call + grpc_completion_queue_destroy. + + After calling this function applications should ensure that no + NEW work is added to be published on this completion queue. */ +GRPCAPI void grpc_completion_queue_shutdown(grpc_completion_queue* cq); + +/** Destroy a completion queue. The caller must ensure that the queue is + drained and no threads are executing grpc_completion_queue_next */ +GRPCAPI void grpc_completion_queue_destroy(grpc_completion_queue* cq); + +/*********** EXPERIMENTAL API ************/ +/** Initializes a thread local cache for \a cq. + * grpc_flush_cq_tls_cache() MUST be called on the same thread, + * with the same cq. + */ +GRPCAPI void grpc_completion_queue_thread_local_cache_init( + grpc_completion_queue* cq); + +/*********** EXPERIMENTAL API ************/ +/** Flushes the thread local cache for \a cq. + * Returns 1 if there was contents in the cache. If there was an event + * in \a cq tls cache, its tag is placed in tag, and ok is set to the + * event success. + */ +GRPCAPI int grpc_completion_queue_thread_local_cache_flush( + grpc_completion_queue* cq, void** tag, int* ok); + +/** Check the connectivity state of a channel. */ +GRPCAPI grpc_connectivity_state grpc_channel_check_connectivity_state( + grpc_channel* channel, int try_to_connect); + +/** Number of active "external connectivity state watchers" attached to a + * channel. + * Useful for testing. **/ +GRPCAPI int grpc_channel_num_external_connectivity_watchers( + grpc_channel* channel); + +/** Watch for a change in connectivity state. + Once the channel connectivity state is different from last_observed_state, + tag will be enqueued on cq with success=1. + If deadline expires BEFORE the state is changed, tag will be enqueued on cq + with success=0. */ +GRPCAPI void grpc_channel_watch_connectivity_state( + grpc_channel* channel, grpc_connectivity_state last_observed_state, + gpr_timespec deadline, grpc_completion_queue* cq, void* tag); + +/** Check whether a grpc channel supports connectivity watcher */ +GRPCAPI int grpc_channel_support_connectivity_watcher(grpc_channel* channel); + +/** Create a call given a grpc_channel, in order to call 'method'. All + completions are sent to 'completion_queue'. 'method' and 'host' need only + live through the invocation of this function. + If parent_call is non-NULL, it must be a server-side call. It will be used + to propagate properties from the server call to this new client call, + depending on the value of \a propagation_mask (see propagation_bits.h for + possible values). */ +GRPCAPI grpc_call* grpc_channel_create_call( + grpc_channel* channel, grpc_call* parent_call, uint32_t propagation_mask, + grpc_completion_queue* completion_queue, grpc_slice method, + const grpc_slice* host, gpr_timespec deadline, void* reserved); + +/** Ping the channels peer (load balanced channels will select one sub-channel + to ping); if the channel is not connected, posts a failed. */ +GRPCAPI void grpc_channel_ping(grpc_channel* channel, grpc_completion_queue* cq, + void* tag, void* reserved); + +/** Pre-register a method/host pair on a channel. + method and host are not owned and must remain alive while the channel is + alive. */ +GRPCAPI void* grpc_channel_register_call(grpc_channel* channel, + const char* method, const char* host, + void* reserved); + +/** Create a call given a handle returned from grpc_channel_register_call. + \sa grpc_channel_create_call. */ +GRPCAPI grpc_call* grpc_channel_create_registered_call( + grpc_channel* channel, grpc_call* parent_call, uint32_t propagation_mask, + grpc_completion_queue* completion_queue, void* registered_call_handle, + gpr_timespec deadline, void* reserved); + +/** Allocate memory in the grpc_call arena: this memory is automatically + discarded at call completion */ +GRPCAPI void* grpc_call_arena_alloc(grpc_call* call, size_t size); + +/** Start a batch of operations defined in the array ops; when complete, post a + completion of type 'tag' to the completion queue bound to the call. + The order of ops specified in the batch has no significance. + Only one operation of each type can be active at once in any given + batch. + If a call to grpc_call_start_batch returns GRPC_CALL_OK you must call + grpc_completion_queue_next or grpc_completion_queue_pluck on the completion + queue associated with 'call' for work to be performed. If a call to + grpc_call_start_batch returns any value other than GRPC_CALL_OK it is + guaranteed that no state associated with 'call' is changed and it is not + appropriate to call grpc_completion_queue_next or + grpc_completion_queue_pluck consequent to the failed grpc_call_start_batch + call. + If a call to grpc_call_start_batch with an empty batch returns + GRPC_CALL_OK, the tag is put in the completion queue immediately. + THREAD SAFETY: access to grpc_call_start_batch in multi-threaded environment + needs to be synchronized. As an optimization, you may synchronize batches + containing just send operations independently from batches containing just + receive operations. Access to grpc_call_start_batch with an empty batch is + thread-compatible. */ +GRPCAPI grpc_call_error grpc_call_start_batch(grpc_call* call, + const grpc_op* ops, size_t nops, + void* tag, void* reserved); + +/** Returns a newly allocated string representing the endpoint to which this + call is communicating with. The string is in the uri format accepted by + grpc_channel_create. + The returned string should be disposed of with gpr_free(). + + WARNING: this value is never authenticated or subject to any security + related code. It must not be used for any authentication related + functionality. Instead, use grpc_auth_context. */ +GRPCAPI char* grpc_call_get_peer(grpc_call* call); + +struct census_context; + +/** Set census context for a call; Must be called before first call to + grpc_call_start_batch(). */ +GRPCAPI void grpc_census_call_set_context(grpc_call* call, + struct census_context* context); + +/** Retrieve the calls current census context. */ +GRPCAPI struct census_context* grpc_census_call_get_context(grpc_call* call); + +/** Return a newly allocated string representing the target a channel was + created for. */ +GRPCAPI char* grpc_channel_get_target(grpc_channel* channel); + +/** Request info about the channel. + \a channel_info indicates what information is being requested and + how that information will be returned. + \a channel_info is owned by the caller. */ +GRPCAPI void grpc_channel_get_info(grpc_channel* channel, + const grpc_channel_info* channel_info); + +/** EXPERIMENTAL. Resets the channel's connect backoff. + TODO(roth): When we see whether this proves useful, either promote + to non-experimental or remove it. */ +GRPCAPI void grpc_channel_reset_connect_backoff(grpc_channel* channel); + +/** Create a client channel to 'target'. Additional channel level configuration + MAY be provided by grpc_channel_args, though the expectation is that most + clients will want to simply pass NULL. The user data in 'args' need only + live through the invocation of this function. However, if any args of the + 'pointer' type are passed, then the referenced vtable must be maintained + by the caller until grpc_channel_destroy terminates. See grpc_channel_args + definition for more on this. */ +GRPCAPI grpc_channel* grpc_insecure_channel_create( + const char* target, const grpc_channel_args* args, void* reserved); + +/** Create a lame client: this client fails every operation attempted on it. */ +GRPCAPI grpc_channel* grpc_lame_client_channel_create( + const char* target, grpc_status_code error_code, const char* error_message); + +/** Close and destroy a grpc channel */ +GRPCAPI void grpc_channel_destroy(grpc_channel* channel); + +/** Error handling for grpc_call + Most grpc_call functions return a grpc_error. If the error is not GRPC_OK + then the operation failed due to some unsatisfied precondition. + If a grpc_call fails, it's guaranteed that no change to the call state + has been made. */ + +/** Cancel an RPC. + Can be called multiple times, from any thread. + THREAD-SAFETY grpc_call_cancel and grpc_call_cancel_with_status + are thread-safe, and can be called at any point before grpc_call_unref + is called.*/ +GRPCAPI grpc_call_error grpc_call_cancel(grpc_call* call, void* reserved); + +/** Cancel an RPC. + Can be called multiple times, from any thread. + If a status has not been received for the call, set it to the status code + and description passed in. + Importantly, this function does not send status nor description to the + remote endpoint. + Note that \a description doesn't need be a static string. + It doesn't need to be alive after the call to + grpc_call_cancel_with_status completes. + */ +GRPCAPI grpc_call_error grpc_call_cancel_with_status(grpc_call* call, + grpc_status_code status, + const char* description, + void* reserved); + +/** Ref a call. + THREAD SAFETY: grpc_call_ref is thread-compatible */ +GRPCAPI void grpc_call_ref(grpc_call* call); + +/** Unref a call. + THREAD SAFETY: grpc_call_unref is thread-compatible */ +GRPCAPI void grpc_call_unref(grpc_call* call); + +/** Request notification of a new call. + Once a call is received, a notification tagged with \a tag_new is added to + \a cq_for_notification. \a call, \a details and \a request_metadata are + updated with the appropriate call information. \a cq_bound_to_call is bound + to \a call, and batch operation notifications for that call will be posted + to \a cq_bound_to_call. + Note that \a cq_for_notification must have been registered to the server via + \a grpc_server_register_completion_queue. */ +GRPCAPI grpc_call_error grpc_server_request_call( + grpc_server* server, grpc_call** call, grpc_call_details* details, + grpc_metadata_array* request_metadata, + grpc_completion_queue* cq_bound_to_call, + grpc_completion_queue* cq_for_notification, void* tag_new); + +/** How to handle payloads for a registered method */ +typedef enum { + /** Don't try to read the payload */ + GRPC_SRM_PAYLOAD_NONE, + /** Read the initial payload as a byte buffer */ + GRPC_SRM_PAYLOAD_READ_INITIAL_BYTE_BUFFER +} grpc_server_register_method_payload_handling; + +/** Registers a method in the server. + Methods to this (host, method) pair will not be reported by + grpc_server_request_call, but instead be reported by + grpc_server_request_registered_call when passed the appropriate + registered_method (as returned by this function). + Must be called before grpc_server_start. + Returns NULL on failure. */ +GRPCAPI void* grpc_server_register_method( + grpc_server* server, const char* method, const char* host, + grpc_server_register_method_payload_handling payload_handling, + uint32_t flags); + +/** Request notification of a new pre-registered call. 'cq_for_notification' + must have been registered to the server via + grpc_server_register_completion_queue. */ +GRPCAPI grpc_call_error grpc_server_request_registered_call( + grpc_server* server, void* registered_method, grpc_call** call, + gpr_timespec* deadline, grpc_metadata_array* request_metadata, + grpc_byte_buffer** optional_payload, + grpc_completion_queue* cq_bound_to_call, + grpc_completion_queue* cq_for_notification, void* tag_new); + +/** Create a server. Additional configuration for each incoming channel can + be specified with args. If no additional configuration is needed, args can + be NULL. The user data in 'args' need only live through the invocation of + this function. However, if any args of the 'pointer' type are passed, then + the referenced vtable must be maintained by the caller until + grpc_server_destroy terminates. See grpc_channel_args definition for more + on this. */ +GRPCAPI grpc_server* grpc_server_create(const grpc_channel_args* args, + void* reserved); + +/** Register a completion queue with the server. Must be done for any + notification completion queue that is passed to grpc_server_request_*_call + and to grpc_server_shutdown_and_notify. Must be performed prior to + grpc_server_start. */ +GRPCAPI void grpc_server_register_completion_queue(grpc_server* server, + grpc_completion_queue* cq, + void* reserved); + +/** Add a HTTP2 over plaintext over tcp listener. + Returns bound port number on success, 0 on failure. + REQUIRES: server not started */ +GRPCAPI int grpc_server_add_insecure_http2_port(grpc_server* server, + const char* addr); + +/** Start a server - tells all listeners to start listening */ +GRPCAPI void grpc_server_start(grpc_server* server); + +/** Begin shutting down a server. + After completion, no new calls or connections will be admitted. + Existing calls will be allowed to complete. + Send a GRPC_OP_COMPLETE event when there are no more calls being serviced. + Shutdown is idempotent, and all tags will be notified at once if multiple + grpc_server_shutdown_and_notify calls are made. 'cq' must have been + registered to this server via grpc_server_register_completion_queue. */ +GRPCAPI void grpc_server_shutdown_and_notify(grpc_server* server, + grpc_completion_queue* cq, + void* tag); + +/** Cancel all in-progress calls. + Only usable after shutdown. */ +GRPCAPI void grpc_server_cancel_all_calls(grpc_server* server); + +/** Destroy a server. + Shutdown must have completed beforehand (i.e. all tags generated by + grpc_server_shutdown_and_notify must have been received, and at least + one call to grpc_server_shutdown_and_notify must have been made). */ +GRPCAPI void grpc_server_destroy(grpc_server* server); + +/** Enable or disable a tracer. + + Tracers (usually controlled by the environment variable GRPC_TRACE) + allow printf-style debugging on GRPC internals, and are useful for + tracking down problems in the field. + + Use of this function is not strictly thread-safe, but the + thread-safety issues raised by it should not be of concern. */ +GRPCAPI int grpc_tracer_set_enabled(const char* name, int enabled); + +/** Check whether a metadata key is legal (will be accepted by core) */ +GRPCAPI int grpc_header_key_is_legal(grpc_slice slice); + +/** Check whether a non-binary metadata value is legal (will be accepted by + core) */ +GRPCAPI int grpc_header_nonbin_value_is_legal(grpc_slice slice); + +/** Check whether a metadata key corresponds to a binary value */ +GRPCAPI int grpc_is_binary_header(grpc_slice slice); + +/** Convert grpc_call_error values to a string */ +GRPCAPI const char* grpc_call_error_to_string(grpc_call_error error); + +/** Create a buffer pool */ +GRPCAPI grpc_resource_quota* grpc_resource_quota_create(const char* trace_name); + +/** Add a reference to a buffer pool */ +GRPCAPI void grpc_resource_quota_ref(grpc_resource_quota* resource_quota); + +/** Drop a reference to a buffer pool */ +GRPCAPI void grpc_resource_quota_unref(grpc_resource_quota* resource_quota); + +/** Update the size of a buffer pool */ +GRPCAPI void grpc_resource_quota_resize(grpc_resource_quota* resource_quota, + size_t new_size); + +/** Update the size of the maximum number of threads allowed */ +GRPCAPI void grpc_resource_quota_set_max_threads( + grpc_resource_quota* resource_quota, int new_max_threads); + +/** Fetch a vtable for a grpc_channel_arg that points to a grpc_resource_quota + */ +GRPCAPI const grpc_arg_pointer_vtable* grpc_resource_quota_arg_vtable(void); + +/************* CHANNELZ API *************/ +/** Channelz is under active development. The following APIs will see some + churn as the feature is implemented. This comment will be removed once + channelz is officially supported, and these APIs become stable. For now + you may track the progress by following this github issue: + https://github.com/grpc/grpc/issues/15340 + + the following APIs return allocated JSON strings that match the response + objects from the channelz proto, found here: + https://github.com/grpc/grpc/blob/master/src/proto/grpc/channelz/channelz.proto. + + For easy conversion to protobuf, The JSON is formatted according to: + https://developers.google.com/protocol-buffers/docs/proto3#json. */ + +/* Gets all root channels (i.e. channels the application has directly + created). This does not include subchannels nor non-top level channels. + The returned string is allocated and must be freed by the application. */ +GRPCAPI char* grpc_channelz_get_top_channels(intptr_t start_channel_id); + +/* Gets all servers that exist in the process. */ +GRPCAPI char* grpc_channelz_get_servers(intptr_t start_server_id); + +/* Returns a single Server, or else a NOT_FOUND code. */ +GRPCAPI char* grpc_channelz_get_server(intptr_t server_id); + +/* Gets all server sockets that exist in the server. */ +GRPCAPI char* grpc_channelz_get_server_sockets(intptr_t server_id, + intptr_t start_socket_id, + intptr_t max_results); + +/* Returns a single Channel, or else a NOT_FOUND code. The returned string + is allocated and must be freed by the application. */ +GRPCAPI char* grpc_channelz_get_channel(intptr_t channel_id); + +/* Returns a single Subchannel, or else a NOT_FOUND code. The returned string + is allocated and must be freed by the application. */ +GRPCAPI char* grpc_channelz_get_subchannel(intptr_t subchannel_id); + +/* Returns a single Socket, or else a NOT_FOUND code. The returned string + is allocated and must be freed by the application. */ +GRPCAPI char* grpc_channelz_get_socket(intptr_t socket_id); + +#ifdef __cplusplus +} +#endif + +#endif /* GRPC_GRPC_H */ diff --git a/include/grpc/grpc_cronet.h b/include/grpc/grpc_cronet.h new file mode 100644 index 00000000..289cfcda --- /dev/null +++ b/include/grpc/grpc_cronet.h @@ -0,0 +1,38 @@ +/* + * + * Copyright 2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_GRPC_CRONET_H +#define GRPC_GRPC_CRONET_H + +#include + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +GRPCAPI grpc_channel* grpc_cronet_secure_channel_create( + void* engine, const char* target, const grpc_channel_args* args, + void* reserved); + +#ifdef __cplusplus +} +#endif + +#endif /* GRPC_GRPC_CRONET_H */ diff --git a/include/grpc/grpc_posix.h b/include/grpc/grpc_posix.h new file mode 100644 index 00000000..fbce5e13 --- /dev/null +++ b/include/grpc/grpc_posix.h @@ -0,0 +1,59 @@ +/* + * + * Copyright 2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_GRPC_POSIX_H +#define GRPC_GRPC_POSIX_H + +#include + +#include + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/*! \mainpage GRPC Core POSIX + * + * The GRPC Core POSIX library provides some POSIX-specific low-level + * functionality on top of GRPC Core. + */ + +/** Create a client channel to 'target' using file descriptor 'fd'. The 'target' + argument will be used to indicate the name for this channel. See the comment + for grpc_insecure_channel_create for description of 'args' argument. */ +GRPCAPI grpc_channel* grpc_insecure_channel_create_from_fd( + const char* target, int fd, const grpc_channel_args* args); + +/** Add the connected communication channel based on file descriptor 'fd' to the + 'server'. The 'fd' must be an open file descriptor corresponding to a + connected socket. Events from the file descriptor may come on any of the + server completion queues (i.e completion queues registered via the + grpc_server_register_completion_queue API). + + The 'reserved' pointer MUST be NULL. + */ +GRPCAPI void grpc_server_add_insecure_channel_from_fd(grpc_server* server, + void* reserved, int fd); + +#ifdef __cplusplus +} +#endif + +#endif /* GRPC_GRPC_POSIX_H */ diff --git a/include/grpc/grpc_security.h b/include/grpc/grpc_security.h new file mode 100644 index 00000000..99635ea8 --- /dev/null +++ b/include/grpc/grpc_security.h @@ -0,0 +1,1019 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_GRPC_SECURITY_H +#define GRPC_GRPC_SECURITY_H + +#include + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** --- Authentication Context. --- */ + +typedef struct grpc_auth_context grpc_auth_context; + +typedef struct grpc_auth_property_iterator { + const grpc_auth_context* ctx; + size_t index; + const char* name; +} grpc_auth_property_iterator; + +/** value, if not NULL, is guaranteed to be NULL terminated. */ +typedef struct grpc_auth_property { + char* name; + char* value; + size_t value_length; +} grpc_auth_property; + +/** Returns NULL when the iterator is at the end. */ +GRPCAPI const grpc_auth_property* grpc_auth_property_iterator_next( + grpc_auth_property_iterator* it); + +/** Iterates over the auth context. */ +GRPCAPI grpc_auth_property_iterator +grpc_auth_context_property_iterator(const grpc_auth_context* ctx); + +/** Gets the peer identity. Returns an empty iterator (first _next will return + NULL) if the peer is not authenticated. */ +GRPCAPI grpc_auth_property_iterator +grpc_auth_context_peer_identity(const grpc_auth_context* ctx); + +/** Finds a property in the context. May return an empty iterator (first _next + will return NULL) if no property with this name was found in the context. */ +GRPCAPI grpc_auth_property_iterator grpc_auth_context_find_properties_by_name( + const grpc_auth_context* ctx, const char* name); + +/** Gets the name of the property that indicates the peer identity. Will return + NULL if the peer is not authenticated. */ +GRPCAPI const char* grpc_auth_context_peer_identity_property_name( + const grpc_auth_context* ctx); + +/** Returns 1 if the peer is authenticated, 0 otherwise. */ +GRPCAPI int grpc_auth_context_peer_is_authenticated( + const grpc_auth_context* ctx); + +/** Gets the auth context from the call. Caller needs to call + grpc_auth_context_release on the returned context. */ +GRPCAPI grpc_auth_context* grpc_call_auth_context(grpc_call* call); + +/** Releases the auth context returned from grpc_call_auth_context. */ +GRPCAPI void grpc_auth_context_release(grpc_auth_context* context); + +/** -- + The following auth context methods should only be called by a server metadata + processor to set properties extracted from auth metadata. + -- */ + +/** Add a property. */ +GRPCAPI void grpc_auth_context_add_property(grpc_auth_context* ctx, + const char* name, const char* value, + size_t value_length); + +/** Add a C string property. */ +GRPCAPI void grpc_auth_context_add_cstring_property(grpc_auth_context* ctx, + const char* name, + const char* value); + +/** Sets the property name. Returns 1 if successful or 0 in case of failure + (which means that no property with this name exists). */ +GRPCAPI int grpc_auth_context_set_peer_identity_property_name( + grpc_auth_context* ctx, const char* name); + +/** --- SSL Session Cache. --- + + A SSL session cache object represents a way to cache client sessions + between connections. Only ticket-based resumption is supported. */ + +typedef struct grpc_ssl_session_cache grpc_ssl_session_cache; + +/** Create LRU cache for client-side SSL sessions with the given capacity. + If capacity is < 1, a default capacity is used instead. */ +GRPCAPI grpc_ssl_session_cache* grpc_ssl_session_cache_create_lru( + size_t capacity); + +/** Destroy SSL session cache. */ +GRPCAPI void grpc_ssl_session_cache_destroy(grpc_ssl_session_cache* cache); + +/** Create a channel arg with the given cache object. */ +GRPCAPI grpc_arg +grpc_ssl_session_cache_create_channel_arg(grpc_ssl_session_cache* cache); + +/** --- grpc_channel_credentials object. --- + + A channel credentials object represents a way to authenticate a client on a + channel. */ + +typedef struct grpc_channel_credentials grpc_channel_credentials; + +/** Releases a channel credentials object. + The creator of the credentials object is responsible for its release. */ +GRPCAPI void grpc_channel_credentials_release(grpc_channel_credentials* creds); + +/** Creates default credentials to connect to a google gRPC service. + WARNING: Do NOT use this credentials to connect to a non-google service as + this could result in an oauth2 token leak. The security level of the + resulting connection is GRPC_PRIVACY_AND_INTEGRITY. */ +GRPCAPI grpc_channel_credentials* grpc_google_default_credentials_create(void); + +/** Callback for getting the SSL roots override from the application. + In case of success, *pem_roots_certs must be set to a NULL terminated string + containing the list of PEM encoded root certificates. The ownership is passed + to the core and freed (laster by the core) with gpr_free. + If this function fails and GRPC_DEFAULT_SSL_ROOTS_FILE_PATH environment is + set to a valid path, it will override the roots specified this func */ +typedef grpc_ssl_roots_override_result (*grpc_ssl_roots_override_callback)( + char** pem_root_certs); + +/** Setup a callback to override the default TLS/SSL roots. + This function is not thread-safe and must be called at initialization time + before any ssl credentials are created to have the desired side effect. + If GRPC_DEFAULT_SSL_ROOTS_FILE_PATH environment is set to a valid path, the + callback will not be called. */ +GRPCAPI void grpc_set_ssl_roots_override_callback( + grpc_ssl_roots_override_callback cb); + +/** Object that holds a private key / certificate chain pair in PEM format. */ +typedef struct { + /** private_key is the NULL-terminated string containing the PEM encoding of + the client's private key. */ + const char* private_key; + + /** cert_chain is the NULL-terminated string containing the PEM encoding of + the client's certificate chain. */ + const char* cert_chain; +} grpc_ssl_pem_key_cert_pair; + +/** Deprecated in favor of grpc_ssl_verify_peer_options. It will be removed + after all of its call sites are migrated to grpc_ssl_verify_peer_options. + Object that holds additional peer-verification options on a secure + channel. */ +typedef struct { + /** If non-NULL this callback will be invoked with the expected + target_name, the peer's certificate (in PEM format), and whatever + userdata pointer is set below. If a non-zero value is returned by this + callback then it is treated as a verification failure. Invocation of + the callback is blocking, so any implementation should be light-weight. + */ + int (*verify_peer_callback)(const char* target_name, const char* peer_pem, + void* userdata); + /** Arbitrary userdata that will be passed as the last argument to + verify_peer_callback. */ + void* verify_peer_callback_userdata; + /** A destruct callback that will be invoked when the channel is being + cleaned up. The userdata argument will be passed to it. The intent is + to perform any cleanup associated with that userdata. */ + void (*verify_peer_destruct)(void* userdata); +} verify_peer_options; + +/** Object that holds additional peer-verification options on a secure + channel. */ +typedef struct { + /** If non-NULL this callback will be invoked with the expected + target_name, the peer's certificate (in PEM format), and whatever + userdata pointer is set below. If a non-zero value is returned by this + callback then it is treated as a verification failure. Invocation of + the callback is blocking, so any implementation should be light-weight. + */ + int (*verify_peer_callback)(const char* target_name, const char* peer_pem, + void* userdata); + /** Arbitrary userdata that will be passed as the last argument to + verify_peer_callback. */ + void* verify_peer_callback_userdata; + /** A destruct callback that will be invoked when the channel is being + cleaned up. The userdata argument will be passed to it. The intent is + to perform any cleanup associated with that userdata. */ + void (*verify_peer_destruct)(void* userdata); +} grpc_ssl_verify_peer_options; + +/** Deprecated in favor of grpc_ssl_server_credentials_create_ex. It will be + removed after all of its call sites are migrated to + grpc_ssl_server_credentials_create_ex. Creates an SSL credentials object. + The security level of the resulting connection is GRPC_PRIVACY_AND_INTEGRITY. + - pem_root_certs is the NULL-terminated string containing the PEM encoding + of the server root certificates. If this parameter is NULL, the + implementation will first try to dereference the file pointed by the + GRPC_DEFAULT_SSL_ROOTS_FILE_PATH environment variable, and if that fails, + try to get the roots set by grpc_override_ssl_default_roots. Eventually, + if all these fail, it will try to get the roots from a well-known place on + disk (in the grpc install directory). + + gRPC has implemented root cache if the underlying OpenSSL library supports + it. The gRPC root certificates cache is only applicable on the default + root certificates, which is used when this parameter is nullptr. If user + provides their own pem_root_certs, when creating an SSL credential object, + gRPC would not be able to cache it, and each subchannel will generate a + copy of the root store. So it is recommended to avoid providing large room + pem with pem_root_certs parameter to avoid excessive memory consumption, + particularly on mobile platforms such as iOS. + - pem_key_cert_pair is a pointer on the object containing client's private + key and certificate chain. This parameter can be NULL if the client does + not have such a key/cert pair. + - verify_options is an optional verify_peer_options object which holds + additional options controlling how peer certificates are verified. For + example, you can supply a callback which receives the peer's certificate + with which you can do additional verification. Can be NULL, in which + case verification will retain default behavior. Any settings in + verify_options are copied during this call, so the verify_options + object can be released afterwards. */ +GRPCAPI grpc_channel_credentials* grpc_ssl_credentials_create( + const char* pem_root_certs, grpc_ssl_pem_key_cert_pair* pem_key_cert_pair, + const verify_peer_options* verify_options, void* reserved); + +/* Creates an SSL credentials object. + The security level of the resulting connection is GRPC_PRIVACY_AND_INTEGRITY. + - pem_root_certs is the NULL-terminated string containing the PEM encoding + of the server root certificates. If this parameter is NULL, the + implementation will first try to dereference the file pointed by the + GRPC_DEFAULT_SSL_ROOTS_FILE_PATH environment variable, and if that fails, + try to get the roots set by grpc_override_ssl_default_roots. Eventually, + if all these fail, it will try to get the roots from a well-known place on + disk (in the grpc install directory). + + gRPC has implemented root cache if the underlying OpenSSL library supports + it. The gRPC root certificates cache is only applicable on the default + root certificates, which is used when this parameter is nullptr. If user + provides their own pem_root_certs, when creating an SSL credential object, + gRPC would not be able to cache it, and each subchannel will generate a + copy of the root store. So it is recommended to avoid providing large room + pem with pem_root_certs parameter to avoid excessive memory consumption, + particularly on mobile platforms such as iOS. + - pem_key_cert_pair is a pointer on the object containing client's private + key and certificate chain. This parameter can be NULL if the client does + not have such a key/cert pair. + - verify_options is an optional verify_peer_options object which holds + additional options controlling how peer certificates are verified. For + example, you can supply a callback which receives the peer's certificate + with which you can do additional verification. Can be NULL, in which + case verification will retain default behavior. Any settings in + verify_options are copied during this call, so the verify_options + object can be released afterwards. */ +GRPCAPI grpc_channel_credentials* grpc_ssl_credentials_create_ex( + const char* pem_root_certs, grpc_ssl_pem_key_cert_pair* pem_key_cert_pair, + const grpc_ssl_verify_peer_options* verify_options, void* reserved); + +/** --- grpc_call_credentials object. + + A call credentials object represents a way to authenticate on a particular + call. These credentials can be composed with a channel credentials object + so that they are sent with every call on this channel. */ + +typedef struct grpc_call_credentials grpc_call_credentials; + +/** Releases a call credentials object. + The creator of the credentials object is responsible for its release. */ +GRPCAPI void grpc_call_credentials_release(grpc_call_credentials* creds); + +/** Creates a composite channel credentials object. The security level of + * resulting connection is determined by channel_creds. */ +GRPCAPI grpc_channel_credentials* grpc_composite_channel_credentials_create( + grpc_channel_credentials* channel_creds, grpc_call_credentials* call_creds, + void* reserved); + +/** Creates a composite call credentials object. */ +GRPCAPI grpc_call_credentials* grpc_composite_call_credentials_create( + grpc_call_credentials* creds1, grpc_call_credentials* creds2, + void* reserved); + +/** Creates a compute engine credentials object for connecting to Google. + WARNING: Do NOT use this credentials to connect to a non-google service as + this could result in an oauth2 token leak. */ +GRPCAPI grpc_call_credentials* grpc_google_compute_engine_credentials_create( + void* reserved); + +GRPCAPI gpr_timespec grpc_max_auth_token_lifetime(void); + +/** Creates a JWT credentials object. May return NULL if the input is invalid. + - json_key is the JSON key string containing the client's private key. + - token_lifetime is the lifetime of each Json Web Token (JWT) created with + this credentials. It should not exceed grpc_max_auth_token_lifetime or + will be cropped to this value. */ +GRPCAPI grpc_call_credentials* +grpc_service_account_jwt_access_credentials_create(const char* json_key, + gpr_timespec token_lifetime, + void* reserved); + +/** Creates an Oauth2 Refresh Token credentials object for connecting to Google. + May return NULL if the input is invalid. + WARNING: Do NOT use this credentials to connect to a non-google service as + this could result in an oauth2 token leak. + - json_refresh_token is the JSON string containing the refresh token itself + along with a client_id and client_secret. */ +GRPCAPI grpc_call_credentials* grpc_google_refresh_token_credentials_create( + const char* json_refresh_token, void* reserved); + +/** Creates an Oauth2 Access Token credentials with an access token that was + acquired by an out of band mechanism. */ +GRPCAPI grpc_call_credentials* grpc_access_token_credentials_create( + const char* access_token, void* reserved); + +/** Creates an IAM credentials object for connecting to Google. */ +GRPCAPI grpc_call_credentials* grpc_google_iam_credentials_create( + const char* authorization_token, const char* authority_selector, + void* reserved); + +/** Options for creating STS Oauth Token Exchange credentials following the IETF + draft https://tools.ietf.org/html/draft-ietf-oauth-token-exchange-16. + Optional fields may be set to NULL or empty string. It is the responsibility + of the caller to ensure that the subject and actor tokens are refreshed on + disk at the specified paths. This API is used for experimental purposes for + now and may change in the future. */ +typedef struct { + const char* token_exchange_service_uri; /* Required. */ + const char* resource; /* Optional. */ + const char* audience; /* Optional. */ + const char* scope; /* Optional. */ + const char* requested_token_type; /* Optional. */ + const char* subject_token_path; /* Required. */ + const char* subject_token_type; /* Required. */ + const char* actor_token_path; /* Optional. */ + const char* actor_token_type; /* Optional. */ +} grpc_sts_credentials_options; + +/** Creates an STS credentials following the STS Token Exchanged specifed in the + IETF draft https://tools.ietf.org/html/draft-ietf-oauth-token-exchange-16. + This API is used for experimental purposes for now and may change in the + future. */ +GRPCAPI grpc_call_credentials* grpc_sts_credentials_create( + const grpc_sts_credentials_options* options, void* reserved); + +/** Callback function to be called by the metadata credentials plugin + implementation when the metadata is ready. + - user_data is the opaque pointer that was passed in the get_metadata method + of the grpc_metadata_credentials_plugin (see below). + - creds_md is an array of credentials metadata produced by the plugin. It + may be set to NULL in case of an error. + - num_creds_md is the number of items in the creds_md array. + - status must be GRPC_STATUS_OK in case of success or another specific error + code otherwise. + - error_details contains details about the error if any. In case of success + it should be NULL and will be otherwise ignored. */ +typedef void (*grpc_credentials_plugin_metadata_cb)( + void* user_data, const grpc_metadata* creds_md, size_t num_creds_md, + grpc_status_code status, const char* error_details); + +/** Context that can be used by metadata credentials plugin in order to create + auth related metadata. */ +typedef struct { + /** The fully qualifed service url. */ + const char* service_url; + + /** The method name of the RPC being called (not fully qualified). + The fully qualified method name can be built from the service_url: + full_qualified_method_name = ctx->service_url + '/' + ctx->method_name. */ + const char* method_name; + + /** The auth_context of the channel which gives the server's identity. */ + const grpc_auth_context* channel_auth_context; + + /** Reserved for future use. */ + void* reserved; +} grpc_auth_metadata_context; + +/** Performs a deep copy from \a from to \a to. **/ +GRPCAPI void grpc_auth_metadata_context_copy(grpc_auth_metadata_context* from, + grpc_auth_metadata_context* to); + +/** Releases internal resources held by \a context. **/ +GRPCAPI void grpc_auth_metadata_context_reset( + grpc_auth_metadata_context* context); + +/** Maximum number of metadata entries returnable by a credentials plugin via + a synchronous return. */ +#define GRPC_METADATA_CREDENTIALS_PLUGIN_SYNC_MAX 4 + +/** grpc_metadata_credentials plugin is an API user provided structure used to + create grpc_credentials objects that can be set on a channel (composed) or + a call. See grpc_credentials_metadata_create_from_plugin below. + The grpc client stack will call the get_metadata method of the plugin for + every call in scope for the credentials created from it. */ +typedef struct { + /** The implementation of this method has to be non-blocking, but can + be performed synchronously or asynchronously. + + If processing occurs synchronously, returns non-zero and populates + creds_md, num_creds_md, status, and error_details. In this case, + the caller takes ownership of the entries in creds_md and of + error_details. Note that if the plugin needs to return more than + GRPC_METADATA_CREDENTIALS_PLUGIN_SYNC_MAX entries in creds_md, it must + return asynchronously. + + If processing occurs asynchronously, returns zero and invokes \a cb + when processing is completed. \a user_data will be passed as the + first parameter of the callback. NOTE: \a cb MUST be invoked in a + different thread, not from the thread in which \a get_metadata() is + invoked. + + \a context is the information that can be used by the plugin to create + auth metadata. */ + int (*get_metadata)( + void* state, grpc_auth_metadata_context context, + grpc_credentials_plugin_metadata_cb cb, void* user_data, + grpc_metadata creds_md[GRPC_METADATA_CREDENTIALS_PLUGIN_SYNC_MAX], + size_t* num_creds_md, grpc_status_code* status, + const char** error_details); + + /** Implements debug string of the given plugin. This method returns an + * allocated string that the caller needs to free using gpr_free() */ + char* (*debug_string)(void* state); + + /** Destroys the plugin state. */ + void (*destroy)(void* state); + + /** State that will be set as the first parameter of the methods above. */ + void* state; + + /** Type of credentials that this plugin is implementing. */ + const char* type; +} grpc_metadata_credentials_plugin; + +/** Creates a credentials object from a plugin with a specified minimum security + * level. */ +GRPCAPI grpc_call_credentials* grpc_metadata_credentials_create_from_plugin( + grpc_metadata_credentials_plugin plugin, + grpc_security_level min_security_level, void* reserved); + +/** --- Secure channel creation. --- */ + +/** Creates a secure channel using the passed-in credentials. Additional + channel level configuration MAY be provided by grpc_channel_args, though + the expectation is that most clients will want to simply pass NULL. The + user data in 'args' need only live through the invocation of this function. + However, if any args of the 'pointer' type are passed, then the referenced + vtable must be maintained by the caller until grpc_channel_destroy + terminates. See grpc_channel_args definition for more on this. */ +GRPCAPI grpc_channel* grpc_secure_channel_create( + grpc_channel_credentials* creds, const char* target, + const grpc_channel_args* args, void* reserved); + +/** --- grpc_server_credentials object. --- + + A server credentials object represents a way to authenticate a server. */ + +typedef struct grpc_server_credentials grpc_server_credentials; + +/** Releases a server_credentials object. + The creator of the server_credentials object is responsible for its release. + */ +GRPCAPI void grpc_server_credentials_release(grpc_server_credentials* creds); + +/** Server certificate config object holds the server's public certificates and + associated private keys, as well as any CA certificates needed for client + certificate validation (if applicable). Create using + grpc_ssl_server_certificate_config_create(). */ +typedef struct grpc_ssl_server_certificate_config + grpc_ssl_server_certificate_config; + +/** Creates a grpc_ssl_server_certificate_config object. + - pem_roots_cert is the NULL-terminated string containing the PEM encoding of + the client root certificates. This parameter may be NULL if the server does + not want the client to be authenticated with SSL. + - pem_key_cert_pairs is an array private key / certificate chains of the + server. This parameter cannot be NULL. + - num_key_cert_pairs indicates the number of items in the private_key_files + and cert_chain_files parameters. It must be at least 1. + - It is the caller's responsibility to free this object via + grpc_ssl_server_certificate_config_destroy(). */ +GRPCAPI grpc_ssl_server_certificate_config* +grpc_ssl_server_certificate_config_create( + const char* pem_root_certs, + const grpc_ssl_pem_key_cert_pair* pem_key_cert_pairs, + size_t num_key_cert_pairs); + +/** Destroys a grpc_ssl_server_certificate_config object. */ +GRPCAPI void grpc_ssl_server_certificate_config_destroy( + grpc_ssl_server_certificate_config* config); + +/** Callback to retrieve updated SSL server certificates, private keys, and + trusted CAs (for client authentication). + - user_data parameter, if not NULL, contains opaque data to be used by the + callback. + - Use grpc_ssl_server_certificate_config_create to create the config. + - The caller assumes ownership of the config. */ +typedef grpc_ssl_certificate_config_reload_status ( + *grpc_ssl_server_certificate_config_callback)( + void* user_data, grpc_ssl_server_certificate_config** config); + +/** Deprecated in favor of grpc_ssl_server_credentials_create_ex. + Creates an SSL server_credentials object. + - pem_roots_cert is the NULL-terminated string containing the PEM encoding of + the client root certificates. This parameter may be NULL if the server does + not want the client to be authenticated with SSL. + - pem_key_cert_pairs is an array private key / certificate chains of the + server. This parameter cannot be NULL. + - num_key_cert_pairs indicates the number of items in the private_key_files + and cert_chain_files parameters. It should be at least 1. + - force_client_auth, if set to non-zero will force the client to authenticate + with an SSL cert. Note that this option is ignored if pem_root_certs is + NULL. */ +GRPCAPI grpc_server_credentials* grpc_ssl_server_credentials_create( + const char* pem_root_certs, grpc_ssl_pem_key_cert_pair* pem_key_cert_pairs, + size_t num_key_cert_pairs, int force_client_auth, void* reserved); + +/** Deprecated in favor of grpc_ssl_server_credentials_create_with_options. + Same as grpc_ssl_server_credentials_create method except uses + grpc_ssl_client_certificate_request_type enum to support more ways to + authenticate client certificates.*/ +GRPCAPI grpc_server_credentials* grpc_ssl_server_credentials_create_ex( + const char* pem_root_certs, grpc_ssl_pem_key_cert_pair* pem_key_cert_pairs, + size_t num_key_cert_pairs, + grpc_ssl_client_certificate_request_type client_certificate_request, + void* reserved); + +typedef struct grpc_ssl_server_credentials_options + grpc_ssl_server_credentials_options; + +/** Creates an options object using a certificate config. Use this method when + the certificates and keys of the SSL server will not change during the + server's lifetime. + - Takes ownership of the certificate_config parameter. */ +GRPCAPI grpc_ssl_server_credentials_options* +grpc_ssl_server_credentials_create_options_using_config( + grpc_ssl_client_certificate_request_type client_certificate_request, + grpc_ssl_server_certificate_config* certificate_config); + +/** Creates an options object using a certificate config fetcher. Use this + method to reload the certificates and keys of the SSL server without + interrupting the operation of the server. Initial certificate config will be + fetched during server initialization. + - user_data parameter, if not NULL, contains opaque data which will be passed + to the fetcher (see definition of + grpc_ssl_server_certificate_config_callback). */ +GRPCAPI grpc_ssl_server_credentials_options* +grpc_ssl_server_credentials_create_options_using_config_fetcher( + grpc_ssl_client_certificate_request_type client_certificate_request, + grpc_ssl_server_certificate_config_callback cb, void* user_data); + +/** Destroys a grpc_ssl_server_credentials_options object. */ +GRPCAPI void grpc_ssl_server_credentials_options_destroy( + grpc_ssl_server_credentials_options* options); + +/** Creates an SSL server_credentials object using the provided options struct. + - Takes ownership of the options parameter. */ +GRPCAPI grpc_server_credentials* +grpc_ssl_server_credentials_create_with_options( + grpc_ssl_server_credentials_options* options); + +/** --- Server-side secure ports. --- */ + +/** Add a HTTP2 over an encrypted link over tcp listener. + Returns bound port number on success, 0 on failure. + REQUIRES: server not started */ +GRPCAPI int grpc_server_add_secure_http2_port(grpc_server* server, + const char* addr, + grpc_server_credentials* creds); + +/** --- Call specific credentials. --- */ + +/** Sets a credentials to a call. Can only be called on the client side before + grpc_call_start_batch. */ +GRPCAPI grpc_call_error grpc_call_set_credentials(grpc_call* call, + grpc_call_credentials* creds); + +/** --- Auth Metadata Processing --- */ + +/** Callback function that is called when the metadata processing is done. + - Consumed metadata will be removed from the set of metadata available on the + call. consumed_md may be NULL if no metadata has been consumed. + - Response metadata will be set on the response. response_md may be NULL. + - status is GRPC_STATUS_OK for success or a specific status for an error. + Common error status for auth metadata processing is either + GRPC_STATUS_UNAUTHENTICATED in case of an authentication failure or + GRPC_STATUS PERMISSION_DENIED in case of an authorization failure. + - error_details gives details about the error. May be NULL. */ +typedef void (*grpc_process_auth_metadata_done_cb)( + void* user_data, const grpc_metadata* consumed_md, size_t num_consumed_md, + const grpc_metadata* response_md, size_t num_response_md, + grpc_status_code status, const char* error_details); + +/** Pluggable server-side metadata processor object. */ +typedef struct { + /** The context object is read/write: it contains the properties of the + channel peer and it is the job of the process function to augment it with + properties derived from the passed-in metadata. + The lifetime of these objects is guaranteed until cb is invoked. */ + void (*process)(void* state, grpc_auth_context* context, + const grpc_metadata* md, size_t num_md, + grpc_process_auth_metadata_done_cb cb, void* user_data); + void (*destroy)(void* state); + void* state; +} grpc_auth_metadata_processor; + +GRPCAPI void grpc_server_credentials_set_auth_metadata_processor( + grpc_server_credentials* creds, grpc_auth_metadata_processor processor); + +/** --- ALTS channel/server credentials --- **/ + +/** + * Main interface for ALTS credentials options. The options will contain + * information that will be passed from grpc to TSI layer such as RPC protocol + * versions. ALTS client (channel) and server credentials will have their own + * implementation of this interface. The APIs listed in this header are + * thread-compatible. It is used for experimental purpose for now and subject + * to change. + */ +typedef struct grpc_alts_credentials_options grpc_alts_credentials_options; + +/** + * This method creates a grpc ALTS credentials client options instance. + * It is used for experimental purpose for now and subject to change. + */ +GRPCAPI grpc_alts_credentials_options* +grpc_alts_credentials_client_options_create(void); + +/** + * This method creates a grpc ALTS credentials server options instance. + * It is used for experimental purpose for now and subject to change. + */ +GRPCAPI grpc_alts_credentials_options* +grpc_alts_credentials_server_options_create(void); + +/** + * This method adds a target service account to grpc client's ALTS credentials + * options instance. It is used for experimental purpose for now and subject + * to change. + * + * - options: grpc ALTS credentials options instance. + * - service_account: service account of target endpoint. + */ +GRPCAPI void grpc_alts_credentials_client_options_add_target_service_account( + grpc_alts_credentials_options* options, const char* service_account); + +/** + * This method destroys a grpc_alts_credentials_options instance by + * de-allocating all of its occupied memory. It is used for experimental purpose + * for now and subject to change. + * + * - options: a grpc_alts_credentials_options instance that needs to be + * destroyed. + */ +GRPCAPI void grpc_alts_credentials_options_destroy( + grpc_alts_credentials_options* options); + +/** + * This method creates an ALTS channel credential object. The security + * level of the resulting connection is GRPC_PRIVACY_AND_INTEGRITY. + * It is used for experimental purpose for now and subject to change. + * + * - options: grpc ALTS credentials options instance for client. + * + * It returns the created ALTS channel credential object. + */ +GRPCAPI grpc_channel_credentials* grpc_alts_credentials_create( + const grpc_alts_credentials_options* options); + +/** + * This method creates an ALTS server credential object. It is used for + * experimental purpose for now and subject to change. + * + * - options: grpc ALTS credentials options instance for server. + * + * It returns the created ALTS server credential object. + */ +GRPCAPI grpc_server_credentials* grpc_alts_server_credentials_create( + const grpc_alts_credentials_options* options); + +/** --- Local channel/server credentials --- **/ + +/** + * This method creates a local channel credential object. The security level + * of the resulting connection is GRPC_PRIVACY_AND_INTEGRITY for UDS and + * GRPC_SECURITY_NONE for LOCAL_TCP. It is used for experimental purpose + * for now and subject to change. + * + * - type: local connection type + * + * It returns the created local channel credential object. + */ +GRPCAPI grpc_channel_credentials* grpc_local_credentials_create( + grpc_local_connect_type type); + +/** + * This method creates a local server credential object. It is used for + * experimental purpose for now and subject to change. + * + * - type: local connection type + * + * It returns the created local server credential object. + */ +GRPCAPI grpc_server_credentials* grpc_local_server_credentials_create( + grpc_local_connect_type type); + +/** --- TLS channel/server credentials --- + * It is used for experimental purpose for now and subject to change. */ + +/** Struct for indicating errors. It is used for + * experimental purpose for now and subject to change. */ +typedef struct grpc_tls_error_details grpc_tls_error_details; + +/** Config for TLS key materials. It is used for + * experimental purpose for now and subject to change. */ +typedef struct grpc_tls_key_materials_config grpc_tls_key_materials_config; + +/** Config for TLS credential reload. It is used for + * experimental purpose for now and subject to change. */ +typedef struct grpc_tls_credential_reload_config + grpc_tls_credential_reload_config; + +/** Config for TLS server authorization check. It is used for + * experimental purpose for now and subject to change. */ +typedef struct grpc_tls_server_authorization_check_config + grpc_tls_server_authorization_check_config; + +/** TLS credentials options. It is used for + * experimental purpose for now and subject to change. */ +typedef struct grpc_tls_credentials_options grpc_tls_credentials_options; + +/** Create an empty TLS credentials options. It is used for + * experimental purpose for now and subject to change. */ +GRPCAPI grpc_tls_credentials_options* grpc_tls_credentials_options_create(void); + +/** Set grpc_ssl_client_certificate_request_type field in credentials options + with the provided type. options should not be NULL. + It returns 1 on success and 0 on failure. It is used for + experimental purpose for now and subject to change. */ +GRPCAPI int grpc_tls_credentials_options_set_cert_request_type( + grpc_tls_credentials_options* options, + grpc_ssl_client_certificate_request_type type); + +/** Set grpc_tls_server_verification_option field in credentials options + with the provided server_verification_option. options should not be NULL. + This should be called only on the client side. + If grpc_tls_server_verification_option is not + GRPC_TLS_SERVER_VERIFICATION, use of a customer server + authorization check (grpc_tls_server_authorization_check_config) + will be mandatory. + It returns 1 on success and 0 on failure. It is used for + experimental purpose for now and subject to change. */ +GRPCAPI int grpc_tls_credentials_options_set_server_verification_option( + grpc_tls_credentials_options* options, + grpc_tls_server_verification_option server_verification_option); + +/** Set grpc_tls_key_materials_config field in credentials options + with the provided config struct whose ownership is transferred. + Both parameters should not be NULL. + It returns 1 on success and 0 on failure. It is used for + experimental purpose for now and subject to change. */ +GRPCAPI int grpc_tls_credentials_options_set_key_materials_config( + grpc_tls_credentials_options* options, + grpc_tls_key_materials_config* config); + +/** Set grpc_tls_credential_reload_config field in credentials options + with the provided config struct whose ownership is transferred. + Both parameters should not be NULL. + It returns 1 on success and 0 on failure. It is used for + experimental purpose for now and subject to change. */ +GRPCAPI int grpc_tls_credentials_options_set_credential_reload_config( + grpc_tls_credentials_options* options, + grpc_tls_credential_reload_config* config); + +/** Set grpc_tls_server_authorization_check_config field in credentials options + with the provided config struct whose ownership is transferred. + Both parameters should not be NULL. + It returns 1 on success and 0 on failure. It is used for + experimental purpose for now and subject to change. */ +GRPCAPI int grpc_tls_credentials_options_set_server_authorization_check_config( + grpc_tls_credentials_options* options, + grpc_tls_server_authorization_check_config* config); + +/** --- TLS key materials config. --- + It is used for experimental purpose for now and subject to change. */ + +/** Create an empty grpc_tls_key_materials_config instance. + * It is used for experimental purpose for now and subject to change. */ +GRPCAPI grpc_tls_key_materials_config* grpc_tls_key_materials_config_create( + void); + +/** Set grpc_tls_key_materials_config instance with provided a TLS certificate. + It's valid for the caller to provide nullptr pem_root_certs, in which case + the gRPC-provided root cert will be used. pem_key_cert_pairs should not be + NULL. + The ownerships of |pem_root_certs| and |pem_key_cert_pairs| remain with the + caller. + It returns 1 on success and 0 on failure. It is used for experimental + purpose for now and subject to change. + */ +GRPCAPI int grpc_tls_key_materials_config_set_key_materials( + grpc_tls_key_materials_config* config, const char* pem_root_certs, + const grpc_ssl_pem_key_cert_pair** pem_key_cert_pairs, + size_t num_key_cert_pairs); + +/** Set grpc_tls_key_materials_config instance with a provided version number, + which is used to keep track of the version of key materials. + It returns 1 on success and 0 on failure. It is used for + experimental purpose for now and subject to change. + */ +GRPCAPI int grpc_tls_key_materials_config_set_version( + grpc_tls_key_materials_config* config, int version); + +/** Get the version number of a grpc_tls_key_materials_config instance. + It returns the version number on success and -1 on failure. + It is used for experimental purpose for now and subject to change. + */ +GRPCAPI int grpc_tls_key_materials_config_get_version( + grpc_tls_key_materials_config* config); + +/** --- TLS credential reload config. --- + It is used for experimental purpose for now and subject to change.*/ + +typedef struct grpc_tls_credential_reload_arg grpc_tls_credential_reload_arg; + +/** A callback function provided by gRPC to handle the result of credential + reload. It is used when schedule API is implemented asynchronously and + serves to bring the control back to grpc C core. It is used for + experimental purpose for now and subject to change. */ +typedef void (*grpc_tls_on_credential_reload_done_cb)( + grpc_tls_credential_reload_arg* arg); + +/** A struct containing all information necessary to schedule/cancel a + credential reload request. + - cb and cb_user_data represent a gRPC-provided + callback and an argument passed to it. + - key_materials_config is an in/output parameter containing currently + used/newly reloaded credentials. If credential reload does not result in + a new credential, key_materials_config should not be modified. The same + key_materials_config object can be updated if new key materials is + available. + - status and error_details are used to hold information about + errors occurred when a credential reload request is scheduled/cancelled. + - config is a pointer to the unique grpc_tls_credential_reload_config + instance that this argument corresponds to. + - context is a pointer to a wrapped language implementation of this + grpc_tls_credential_reload_arg instance. + - destroy_context is a pointer to a caller-provided method that cleans + up any data associated with the context pointer. + It is used for experimental purposes for now and subject to change. +*/ +struct grpc_tls_credential_reload_arg { + grpc_tls_on_credential_reload_done_cb cb; + void* cb_user_data; + grpc_tls_key_materials_config* key_materials_config; + grpc_ssl_certificate_config_reload_status status; + grpc_tls_error_details* error_details; + grpc_tls_credential_reload_config* config; + void* context; + void (*destroy_context)(void* ctx); +}; + +/** Create a grpc_tls_credential_reload_config instance. + - config_user_data is config-specific, read-only user data + that works for all channels created with a credential using the config. + - schedule is a pointer to an application-provided callback used to invoke + credential reload API. The implementation of this method has to be + non-blocking, but can be performed synchronously or asynchronously. + 1) If processing occurs synchronously, it populates + arg->key_materials_config, arg->status, and arg->error_details + and returns zero. + 2) If processing occurs asynchronously, it returns a non-zero value. + The application then invokes arg->cb when processing is completed. Note + that arg->cb cannot be invoked before schedule API returns. + - cancel is a pointer to an application-provided callback used to cancel + a credential reload request scheduled via an asynchronous schedule API. + arg is used to pinpoint an exact reloading request to be cancelled. + The operation may not have any effect if the request has already been + processed. + - destruct is a pointer to an application-provided callback used to clean up + any data associated with the config. + It is used for experimental purpose for now and subject to change. +*/ +GRPCAPI grpc_tls_credential_reload_config* +grpc_tls_credential_reload_config_create( + const void* config_user_data, + int (*schedule)(void* config_user_data, + grpc_tls_credential_reload_arg* arg), + void (*cancel)(void* config_user_data, grpc_tls_credential_reload_arg* arg), + void (*destruct)(void* config_user_data)); + +/** --- TLS server authorization check config. --- + * It is used for experimental purpose for now and subject to change. */ + +typedef struct grpc_tls_server_authorization_check_arg + grpc_tls_server_authorization_check_arg; + +/** callback function provided by gRPC used to handle the result of server + authorization check. It is used when schedule API is implemented + asynchronously, and serves to bring the control back to gRPC C core. It is + used for experimental purpose for now and subject to change. */ +typedef void (*grpc_tls_on_server_authorization_check_done_cb)( + grpc_tls_server_authorization_check_arg* arg); + +/** A struct containing all information necessary to schedule/cancel a server + authorization check request. + - cb and cb_user_data represent a gRPC-provided callback and an argument + passed to it. + - success will store the result of server authorization check. That is, + if success returns a non-zero value, it means the authorization check + passes and if returning zero, it means the check fails. + - target_name is the name of an endpoint the channel is connecting to. + - peer_cert represents a complete certificate chain including both + signing and leaf certificates. + - status and error_details contain information + about errors occurred when a server authorization check request is + scheduled/cancelled. + - config is a pointer to the unique + grpc_tls_server_authorization_check_config instance that this argument + corresponds to. + - context is a pointer to a wrapped language implementation of this + grpc_tls_server_authorization_check_arg instance. + - destroy_context is a pointer to a caller-provided method that cleans + up any data associated with the context pointer. + It is used for experimental purpose for now and subject to change. +*/ +struct grpc_tls_server_authorization_check_arg { + grpc_tls_on_server_authorization_check_done_cb cb; + void* cb_user_data; + int success; + const char* target_name; + const char* peer_cert; + const char* peer_cert_full_chain; + grpc_status_code status; + grpc_tls_error_details* error_details; + grpc_tls_server_authorization_check_config* config; + void* context; + void (*destroy_context)(void* ctx); +}; + +/** Create a grpc_tls_server_authorization_check_config instance. + - config_user_data is config-specific, read-only user data + that works for all channels created with a credential using the config. + - schedule is a pointer to an application-provided callback used to invoke + server authorization check API. The implementation of this method has to + be non-blocking, but can be performed synchronously or asynchronously. + 1)If processing occurs synchronously, it populates arg->result, + arg->status, and arg->error_details and returns zero. + 2) If processing occurs asynchronously, it returns a non-zero value. The + application then invokes arg->cb when processing is completed. Note that + arg->cb cannot be invoked before schedule API returns. + - cancel is a pointer to an application-provided callback used to cancel a + server authorization check request scheduled via an asynchronous schedule + API. arg is used to pinpoint an exact check request to be cancelled. The + operation may not have any effect if the request has already been + processed. + - destruct is a pointer to an application-provided callback used to clean up + any data associated with the config. + It is used for experimental purpose for now and subject to change. +*/ +GRPCAPI grpc_tls_server_authorization_check_config* +grpc_tls_server_authorization_check_config_create( + const void* config_user_data, + int (*schedule)(void* config_user_data, + grpc_tls_server_authorization_check_arg* arg), + void (*cancel)(void* config_user_data, + grpc_tls_server_authorization_check_arg* arg), + void (*destruct)(void* config_user_data)); + +/** + * This method creates a TLS channel credential object. + * It takes ownership of the options parameter. The security level + * of the resulting connection is GRPC_PRIVACY_AND_INTEGRITY. + * + * - options: grpc TLS credentials options instance. + * + * It returns the created credential object. + * + * It is used for experimental purpose for now and subject + * to change. + */ + +grpc_channel_credentials* grpc_tls_credentials_create( + grpc_tls_credentials_options* options); + +/** + * This method creates a TLS server credential object. + * It takes ownership of the options parameter. + * + * - options: grpc TLS credentials options instance. + * + * It returns the created credential object. + * + * It is used for experimental purpose for now and subject + * to change. + */ +grpc_server_credentials* grpc_tls_server_credentials_create( + grpc_tls_credentials_options* options); + +#ifdef __cplusplus +} +#endif + +#endif /* GRPC_GRPC_SECURITY_H */ diff --git a/include/grpc/grpc_security_constants.h b/include/grpc/grpc_security_constants.h new file mode 100644 index 00000000..e5082940 --- /dev/null +++ b/include/grpc/grpc_security_constants.h @@ -0,0 +1,146 @@ +/* + * + * Copyright 2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_GRPC_SECURITY_CONSTANTS_H +#define GRPC_GRPC_SECURITY_CONSTANTS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define GRPC_TRANSPORT_SECURITY_TYPE_PROPERTY_NAME "transport_security_type" +#define GRPC_SSL_TRANSPORT_SECURITY_TYPE "ssl" + +#define GRPC_X509_CN_PROPERTY_NAME "x509_common_name" +#define GRPC_X509_SAN_PROPERTY_NAME "x509_subject_alternative_name" +#define GRPC_X509_PEM_CERT_PROPERTY_NAME "x509_pem_cert" +#define GRPC_X509_PEM_CERT_CHAIN_PROPERTY_NAME "x509_pem_cert_chain" +#define GRPC_SSL_SESSION_REUSED_PROPERTY "ssl_session_reused" +#define GRPC_TRANSPORT_SECURITY_LEVEL_PROPERTY_NAME "security_level" +#define GRPC_PEER_SPIFFE_ID_PROPERTY_NAME "peer_spiffe_id" + +/** Environment variable that points to the default SSL roots file. This file + must be a PEM encoded file with all the roots such as the one that can be + downloaded from https://pki.google.com/roots.pem. */ +#define GRPC_DEFAULT_SSL_ROOTS_FILE_PATH_ENV_VAR \ + "GRPC_DEFAULT_SSL_ROOTS_FILE_PATH" + +/** Environment variable that points to the google default application + credentials json key or refresh token. Used in the + grpc_google_default_credentials_create function. */ +#define GRPC_GOOGLE_CREDENTIALS_ENV_VAR "GOOGLE_APPLICATION_CREDENTIALS" + +/** Results for the SSL roots override callback. */ +typedef enum { + GRPC_SSL_ROOTS_OVERRIDE_OK, + GRPC_SSL_ROOTS_OVERRIDE_FAIL_PERMANENTLY, /** Do not try fallback options. */ + GRPC_SSL_ROOTS_OVERRIDE_FAIL +} grpc_ssl_roots_override_result; + +/** Callback results for dynamically loading a SSL certificate config. */ +typedef enum { + GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED, + GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_NEW, + GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_FAIL +} grpc_ssl_certificate_config_reload_status; + +typedef enum { + /** Server does not request client certificate. + The certificate presented by the client is not checked by the server at + all. (A client may present a self signed or signed certificate or not + present a certificate at all and any of those option would be accepted) */ + GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE, + /** Server requests client certificate but does not enforce that the client + presents a certificate. + + If the client presents a certificate, the client authentication is left to + the application (the necessary metadata will be available to the + application via authentication context properties, see grpc_auth_context). + + The client's key certificate pair must be valid for the SSL connection to + be established. */ + GRPC_SSL_REQUEST_CLIENT_CERTIFICATE_BUT_DONT_VERIFY, + /** Server requests client certificate but does not enforce that the client + presents a certificate. + + If the client presents a certificate, the client authentication is done by + the gRPC framework. (For a successful connection the client needs to either + present a certificate that can be verified against the root certificate + configured by the server or not present a certificate at all) + + The client's key certificate pair must be valid for the SSL connection to + be established. */ + GRPC_SSL_REQUEST_CLIENT_CERTIFICATE_AND_VERIFY, + /** Server requests client certificate and enforces that the client presents a + certificate. + + If the client presents a certificate, the client authentication is left to + the application (the necessary metadata will be available to the + application via authentication context properties, see grpc_auth_context). + + The client's key certificate pair must be valid for the SSL connection to + be established. */ + GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_BUT_DONT_VERIFY, + /** Server requests client certificate and enforces that the client presents a + certificate. + + The certificate presented by the client is verified by the gRPC framework. + (For a successful connection the client needs to present a certificate that + can be verified against the root certificate configured by the server) + + The client's key certificate pair must be valid for the SSL connection to + be established. */ + GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY +} grpc_ssl_client_certificate_request_type; + +/* Security levels of grpc transport security. It represents an inherent + * property of a backend connection and is determined by a channel credential + * used to create the connection. */ +typedef enum { + GRPC_SECURITY_MIN, + GRPC_SECURITY_NONE = GRPC_SECURITY_MIN, + GRPC_INTEGRITY_ONLY, + GRPC_PRIVACY_AND_INTEGRITY, + GRPC_SECURITY_MAX = GRPC_PRIVACY_AND_INTEGRITY, +} grpc_security_level; + +typedef enum { + /** Default option: performs server certificate verification and hostname + verification. */ + GRPC_TLS_SERVER_VERIFICATION, + /** Performs server certificate verification, but skips hostname verification + Client is responsible for verifying server's identity via + server authorization check callback. */ + GRPC_TLS_SKIP_HOSTNAME_VERIFICATION, + /** Skips both server certificate and hostname verification. + Client is responsible for verifying server's identity and + server's certificate via server authorization check callback. */ + GRPC_TLS_SKIP_ALL_SERVER_VERIFICATION +} grpc_tls_server_verification_option; + +/** + * Type of local connections for which local channel/server credentials will be + * applied. It supports UDS and local TCP connections. + */ +typedef enum { UDS = 0, LOCAL_TCP } grpc_local_connect_type; + +#ifdef __cplusplus +} +#endif + +#endif /* GRPC_GRPC_SECURITY_CONSTANTS_H */ diff --git a/include/grpc/impl/codegen/atm.h b/include/grpc/impl/codegen/atm.h new file mode 100644 index 00000000..00d83f06 --- /dev/null +++ b/include/grpc/impl/codegen/atm.h @@ -0,0 +1,95 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_IMPL_CODEGEN_ATM_H +#define GRPC_IMPL_CODEGEN_ATM_H + +/** This interface provides atomic operations and barriers. + It is internal to gpr support code and should not be used outside it. + + If an operation with acquire semantics precedes another memory access by the + same thread, the operation will precede that other access as seen by other + threads. + + If an operation with release semantics follows another memory access by the + same thread, the operation will follow that other access as seen by other + threads. + + Routines with "acq" or "full" in the name have acquire semantics. Routines + with "rel" or "full" in the name have release semantics. Routines with + "no_barrier" in the name have neither acquire not release semantics. + + The routines may be implemented as macros. + + // Atomic operations act on an intergral_type gpr_atm that is guaranteed to + // be the same size as a pointer. + typedef intptr_t gpr_atm; + + // A memory barrier, providing both acquire and release semantics, but not + // otherwise acting on memory. + void gpr_atm_full_barrier(void); + + // Atomically return *p, with acquire semantics. + gpr_atm gpr_atm_acq_load(gpr_atm *p); + gpr_atm gpr_atm_no_barrier_load(gpr_atm *p); + + // Atomically set *p = value, with release semantics. + void gpr_atm_rel_store(gpr_atm *p, gpr_atm value); + + // Atomically add delta to *p, and return the old value of *p, with + // the barriers specified. + gpr_atm gpr_atm_no_barrier_fetch_add(gpr_atm *p, gpr_atm delta); + gpr_atm gpr_atm_full_fetch_add(gpr_atm *p, gpr_atm delta); + + // Atomically, if *p==o, set *p=n and return non-zero otherwise return 0, + // with the barriers specified if the operation succeeds. + int gpr_atm_no_barrier_cas(gpr_atm *p, gpr_atm o, gpr_atm n); + int gpr_atm_acq_cas(gpr_atm *p, gpr_atm o, gpr_atm n); + int gpr_atm_rel_cas(gpr_atm *p, gpr_atm o, gpr_atm n); + int gpr_atm_full_cas(gpr_atm *p, gpr_atm o, gpr_atm n); + + // Atomically, set *p=n and return the old value of *p + gpr_atm gpr_atm_full_xchg(gpr_atm *p, gpr_atm n); +*/ + +#include + +#if defined(GPR_GCC_ATOMIC) +#include +#elif defined(GPR_GCC_SYNC) +#include +#elif defined(GPR_WINDOWS_ATOMIC) +#include +#else +#error could not determine platform for atm +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** Adds \a delta to \a *value, clamping the result to the range specified + by \a min and \a max. Returns the new value. */ +gpr_atm gpr_atm_no_barrier_clamped_add(gpr_atm* value, gpr_atm delta, + gpr_atm min, gpr_atm max); + +#ifdef __cplusplus +} +#endif + +#endif /* GRPC_IMPL_CODEGEN_ATM_H */ diff --git a/include/grpc/impl/codegen/atm_gcc_atomic.h b/include/grpc/impl/codegen/atm_gcc_atomic.h new file mode 100644 index 00000000..58797085 --- /dev/null +++ b/include/grpc/impl/codegen/atm_gcc_atomic.h @@ -0,0 +1,91 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_IMPL_CODEGEN_ATM_GCC_ATOMIC_H +#define GRPC_IMPL_CODEGEN_ATM_GCC_ATOMIC_H + +/* atm_platform.h for gcc and gcc-like compilers with the + __atomic_* interface. */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef intptr_t gpr_atm; +#define GPR_ATM_MAX INTPTR_MAX +#define GPR_ATM_MIN INTPTR_MIN + +#ifdef GPR_LOW_LEVEL_COUNTERS +extern gpr_atm gpr_counter_atm_cas; +extern gpr_atm gpr_counter_atm_add; +#define GPR_ATM_INC_COUNTER(counter) \ + __atomic_fetch_add(&counter, 1, __ATOMIC_RELAXED) +#define GPR_ATM_INC_CAS_THEN(blah) \ + (GPR_ATM_INC_COUNTER(gpr_counter_atm_cas), blah) +#define GPR_ATM_INC_ADD_THEN(blah) \ + (GPR_ATM_INC_COUNTER(gpr_counter_atm_add), blah) +#else +#define GPR_ATM_INC_CAS_THEN(blah) blah +#define GPR_ATM_INC_ADD_THEN(blah) blah +#endif + +#define gpr_atm_full_barrier() (__atomic_thread_fence(__ATOMIC_SEQ_CST)) + +#define gpr_atm_acq_load(p) (__atomic_load_n((p), __ATOMIC_ACQUIRE)) +#define gpr_atm_no_barrier_load(p) (__atomic_load_n((p), __ATOMIC_RELAXED)) +#define gpr_atm_rel_store(p, value) \ + (__atomic_store_n((p), (intptr_t)(value), __ATOMIC_RELEASE)) +#define gpr_atm_no_barrier_store(p, value) \ + (__atomic_store_n((p), (intptr_t)(value), __ATOMIC_RELAXED)) + +#define gpr_atm_no_barrier_fetch_add(p, delta) \ + GPR_ATM_INC_ADD_THEN( \ + __atomic_fetch_add((p), (intptr_t)(delta), __ATOMIC_RELAXED)) +#define gpr_atm_full_fetch_add(p, delta) \ + GPR_ATM_INC_ADD_THEN( \ + __atomic_fetch_add((p), (intptr_t)(delta), __ATOMIC_ACQ_REL)) + +static __inline int gpr_atm_no_barrier_cas(gpr_atm* p, gpr_atm o, gpr_atm n) { + return GPR_ATM_INC_CAS_THEN(__atomic_compare_exchange_n( + p, &o, n, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED)); +} + +static __inline int gpr_atm_acq_cas(gpr_atm* p, gpr_atm o, gpr_atm n) { + return GPR_ATM_INC_CAS_THEN(__atomic_compare_exchange_n( + p, &o, n, 0, __ATOMIC_ACQUIRE, __ATOMIC_RELAXED)); +} + +static __inline int gpr_atm_rel_cas(gpr_atm* p, gpr_atm o, gpr_atm n) { + return GPR_ATM_INC_CAS_THEN(__atomic_compare_exchange_n( + p, &o, n, 0, __ATOMIC_RELEASE, __ATOMIC_RELAXED)); +} + +static __inline int gpr_atm_full_cas(gpr_atm* p, gpr_atm o, gpr_atm n) { + return GPR_ATM_INC_CAS_THEN(__atomic_compare_exchange_n( + p, &o, n, 0, __ATOMIC_ACQ_REL, __ATOMIC_RELAXED)); +} + +#define gpr_atm_full_xchg(p, n) \ + GPR_ATM_INC_CAS_THEN(__atomic_exchange_n((p), (n), __ATOMIC_ACQ_REL)) + +#ifdef __cplusplus +} +#endif + +#endif /* GRPC_IMPL_CODEGEN_ATM_GCC_ATOMIC_H */ diff --git a/include/grpc/impl/codegen/atm_gcc_sync.h b/include/grpc/impl/codegen/atm_gcc_sync.h new file mode 100644 index 00000000..728c3d54 --- /dev/null +++ b/include/grpc/impl/codegen/atm_gcc_sync.h @@ -0,0 +1,85 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_IMPL_CODEGEN_ATM_GCC_SYNC_H +#define GRPC_IMPL_CODEGEN_ATM_GCC_SYNC_H + +/* variant of atm_platform.h for gcc and gcc-like compiers with __sync_* + interface */ +#include + +typedef intptr_t gpr_atm; +#define GPR_ATM_MAX INTPTR_MAX +#define GPR_ATM_MIN INTPTR_MIN +#define GPR_ATM_INC_CAS_THEN(blah) blah +#define GPR_ATM_INC_ADD_THEN(blah) blah + +#define GPR_ATM_COMPILE_BARRIER_() __asm__ __volatile__("" : : : "memory") + +#if defined(__i386) || defined(__x86_64__) +/* All loads are acquire loads and all stores are release stores. */ +#define GPR_ATM_LS_BARRIER_() GPR_ATM_COMPILE_BARRIER_() +#else +#define GPR_ATM_LS_BARRIER_() gpr_atm_full_barrier() +#endif + +#define gpr_atm_full_barrier() (__sync_synchronize()) + +static __inline gpr_atm gpr_atm_acq_load(const gpr_atm* p) { + gpr_atm value = *p; + GPR_ATM_LS_BARRIER_(); + return value; +} + +static __inline gpr_atm gpr_atm_no_barrier_load(const gpr_atm* p) { + gpr_atm value = *p; + GPR_ATM_COMPILE_BARRIER_(); + return value; +} + +static __inline void gpr_atm_rel_store(gpr_atm* p, gpr_atm value) { + GPR_ATM_LS_BARRIER_(); + *p = value; +} + +static __inline void gpr_atm_no_barrier_store(gpr_atm* p, gpr_atm value) { + GPR_ATM_COMPILE_BARRIER_(); + *p = value; +} + +#undef GPR_ATM_LS_BARRIER_ +#undef GPR_ATM_COMPILE_BARRIER_ + +#define gpr_atm_no_barrier_fetch_add(p, delta) \ + gpr_atm_full_fetch_add((p), (delta)) +#define gpr_atm_full_fetch_add(p, delta) (__sync_fetch_and_add((p), (delta))) + +#define gpr_atm_no_barrier_cas(p, o, n) gpr_atm_acq_cas((p), (o), (n)) +#define gpr_atm_acq_cas(p, o, n) (__sync_bool_compare_and_swap((p), (o), (n))) +#define gpr_atm_rel_cas(p, o, n) gpr_atm_acq_cas((p), (o), (n)) +#define gpr_atm_full_cas(p, o, n) gpr_atm_acq_cas((p), (o), (n)) + +static __inline gpr_atm gpr_atm_full_xchg(gpr_atm* p, gpr_atm n) { + gpr_atm cur; + do { + cur = gpr_atm_acq_load(p); + } while (!gpr_atm_rel_cas(p, cur, n)); + return cur; +} + +#endif /* GRPC_IMPL_CODEGEN_ATM_GCC_SYNC_H */ diff --git a/include/grpc/impl/codegen/atm_windows.h b/include/grpc/impl/codegen/atm_windows.h new file mode 100644 index 00000000..c016b900 --- /dev/null +++ b/include/grpc/impl/codegen/atm_windows.h @@ -0,0 +1,128 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_IMPL_CODEGEN_ATM_WINDOWS_H +#define GRPC_IMPL_CODEGEN_ATM_WINDOWS_H + +/** Win32 variant of atm_platform.h */ +#include + +typedef intptr_t gpr_atm; +#define GPR_ATM_MAX INTPTR_MAX +#define GPR_ATM_MIN INTPTR_MIN +#define GPR_ATM_INC_CAS_THEN(blah) blah +#define GPR_ATM_INC_ADD_THEN(blah) blah + +#define gpr_atm_full_barrier MemoryBarrier + +static __inline gpr_atm gpr_atm_acq_load(const gpr_atm* p) { + gpr_atm result = *p; + gpr_atm_full_barrier(); + return result; +} + +static __inline gpr_atm gpr_atm_no_barrier_load(const gpr_atm* p) { + /* TODO(dklempner): Can we implement something better here? */ + return gpr_atm_acq_load(p); +} + +static __inline void gpr_atm_rel_store(gpr_atm* p, gpr_atm value) { + gpr_atm_full_barrier(); + *p = value; +} + +static __inline void gpr_atm_no_barrier_store(gpr_atm* p, gpr_atm value) { + /* TODO(ctiller): Can we implement something better here? */ + gpr_atm_rel_store(p, value); +} + +static __inline int gpr_atm_no_barrier_cas(gpr_atm* p, gpr_atm o, gpr_atm n) { +/** InterlockedCompareExchangePointerNoFence() not available on vista or + windows7 */ +#ifdef GPR_ARCH_64 + return o == (gpr_atm)InterlockedCompareExchangeAcquire64( + (volatile LONGLONG*)p, (LONGLONG)n, (LONGLONG)o); +#else + return o == (gpr_atm)InterlockedCompareExchangeAcquire((volatile LONG*)p, + (LONG)n, (LONG)o); +#endif +} + +static __inline int gpr_atm_acq_cas(gpr_atm* p, gpr_atm o, gpr_atm n) { +#ifdef GPR_ARCH_64 + return o == (gpr_atm)InterlockedCompareExchangeAcquire64( + (volatile LONGLONG*)p, (LONGLONG)n, (LONGLONG)o); +#else + return o == (gpr_atm)InterlockedCompareExchangeAcquire((volatile LONG*)p, + (LONG)n, (LONG)o); +#endif +} + +static __inline int gpr_atm_rel_cas(gpr_atm* p, gpr_atm o, gpr_atm n) { +#ifdef GPR_ARCH_64 + return o == (gpr_atm)InterlockedCompareExchangeRelease64( + (volatile LONGLONG*)p, (LONGLONG)n, (LONGLONG)o); +#else + return o == (gpr_atm)InterlockedCompareExchangeRelease((volatile LONG*)p, + (LONG)n, (LONG)o); +#endif +} + +static __inline int gpr_atm_full_cas(gpr_atm* p, gpr_atm o, gpr_atm n) { +#ifdef GPR_ARCH_64 + return o == (gpr_atm)InterlockedCompareExchange64((volatile LONGLONG*)p, + (LONGLONG)n, (LONGLONG)o); +#else + return o == (gpr_atm)InterlockedCompareExchange((volatile LONG*)p, (LONG)n, + (LONG)o); +#endif +} + +static __inline gpr_atm gpr_atm_no_barrier_fetch_add(gpr_atm* p, + gpr_atm delta) { + /** Use the CAS operation to get pointer-sized fetch and add */ + gpr_atm old; + do { + old = *p; + } while (!gpr_atm_no_barrier_cas(p, old, old + delta)); + return old; +} + +static __inline gpr_atm gpr_atm_full_fetch_add(gpr_atm* p, gpr_atm delta) { + /** Use a CAS operation to get pointer-sized fetch and add */ + gpr_atm old; +#ifdef GPR_ARCH_64 + do { + old = *p; + } while (old != (gpr_atm)InterlockedCompareExchange64((volatile LONGLONG*)p, + (LONGLONG)old + delta, + (LONGLONG)old)); +#else + do { + old = *p; + } while (old != (gpr_atm)InterlockedCompareExchange( + (volatile LONG*)p, (LONG)old + delta, (LONG)old)); +#endif + return old; +} + +static __inline gpr_atm gpr_atm_full_xchg(gpr_atm* p, gpr_atm n) { + return (gpr_atm)InterlockedExchangePointer((PVOID*)p, (PVOID)n); +} + +#endif /* GRPC_IMPL_CODEGEN_ATM_WINDOWS_H */ diff --git a/include/grpc/impl/codegen/byte_buffer.h b/include/grpc/impl/codegen/byte_buffer.h new file mode 100644 index 00000000..12479068 --- /dev/null +++ b/include/grpc/impl/codegen/byte_buffer.h @@ -0,0 +1,101 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_IMPL_CODEGEN_BYTE_BUFFER_H +#define GRPC_IMPL_CODEGEN_BYTE_BUFFER_H + +#include + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** Returns a RAW byte buffer instance over the given slices (up to \a nslices). + * + * Increases the reference count for all \a slices processed. The user is + * responsible for invoking grpc_byte_buffer_destroy on the returned instance.*/ +GRPCAPI grpc_byte_buffer* grpc_raw_byte_buffer_create(grpc_slice* slices, + size_t nslices); + +/** Returns a *compressed* RAW byte buffer instance over the given slices (up to + * \a nslices). The \a compression argument defines the compression algorithm + * used to generate the data in \a slices. + * + * Increases the reference count for all \a slices processed. The user is + * responsible for invoking grpc_byte_buffer_destroy on the returned instance.*/ +GRPCAPI grpc_byte_buffer* grpc_raw_compressed_byte_buffer_create( + grpc_slice* slices, size_t nslices, grpc_compression_algorithm compression); + +/** Copies input byte buffer \a bb. + * + * Increases the reference count of all the source slices. The user is + * responsible for calling grpc_byte_buffer_destroy over the returned copy. */ +GRPCAPI grpc_byte_buffer* grpc_byte_buffer_copy(grpc_byte_buffer* bb); + +/** Returns the size of the given byte buffer, in bytes. */ +GRPCAPI size_t grpc_byte_buffer_length(grpc_byte_buffer* bb); + +/** Destroys \a byte_buffer deallocating all its memory. */ +GRPCAPI void grpc_byte_buffer_destroy(grpc_byte_buffer* byte_buffer); + +/** Reader for byte buffers. Iterates over slices in the byte buffer */ +struct grpc_byte_buffer_reader; +typedef struct grpc_byte_buffer_reader grpc_byte_buffer_reader; + +/** Initialize \a reader to read over \a buffer. + * Returns 1 upon success, 0 otherwise. */ +GRPCAPI int grpc_byte_buffer_reader_init(grpc_byte_buffer_reader* reader, + grpc_byte_buffer* buffer); + +/** Cleanup and destroy \a reader */ +GRPCAPI void grpc_byte_buffer_reader_destroy(grpc_byte_buffer_reader* reader); + +/** Updates \a slice with the next piece of data from from \a reader and returns + * 1. Returns 0 at the end of the stream. Caller is responsible for calling + * grpc_slice_unref on the result. */ +GRPCAPI int grpc_byte_buffer_reader_next(grpc_byte_buffer_reader* reader, + grpc_slice* slice); + +/** EXPERIMENTAL API - This function may be removed and changed, in the future. + * + * Updates \a slice with the next piece of data from from \a reader and returns + * 1. Returns 0 at the end of the stream. Caller is responsible for making sure + * the slice pointer remains valid when accessed. + * + * NOTE: Do not use this function unless the caller can guarantee that the + * underlying grpc_byte_buffer outlasts the use of the slice. This is only + * safe when the underlying grpc_byte_buffer remains immutable while slice + * is being accessed. */ +GRPCAPI int grpc_byte_buffer_reader_peek(grpc_byte_buffer_reader* reader, + grpc_slice** slice); + +/** Merge all data from \a reader into single slice */ +GRPCAPI grpc_slice +grpc_byte_buffer_reader_readall(grpc_byte_buffer_reader* reader); + +/** Returns a RAW byte buffer instance from the output of \a reader. */ +GRPCAPI grpc_byte_buffer* grpc_raw_byte_buffer_from_reader( + grpc_byte_buffer_reader* reader); + +#ifdef __cplusplus +} +#endif + +#endif /* GRPC_IMPL_CODEGEN_BYTE_BUFFER_H */ diff --git a/include/grpc/impl/codegen/byte_buffer_reader.h b/include/grpc/impl/codegen/byte_buffer_reader.h new file mode 100644 index 00000000..e06e1955 --- /dev/null +++ b/include/grpc/impl/codegen/byte_buffer_reader.h @@ -0,0 +1,42 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_IMPL_CODEGEN_BYTE_BUFFER_READER_H +#define GRPC_IMPL_CODEGEN_BYTE_BUFFER_READER_H + +#ifdef __cplusplus +extern "C" { +#endif + +struct grpc_byte_buffer; + +struct grpc_byte_buffer_reader { + struct grpc_byte_buffer* buffer_in; + struct grpc_byte_buffer* buffer_out; + /** Different current objects correspond to different types of byte buffers */ + union grpc_byte_buffer_reader_current { + /** Index into a slice buffer's array of slices */ + unsigned index; + } current; +}; + +#ifdef __cplusplus +} +#endif + +#endif /* GRPC_IMPL_CODEGEN_BYTE_BUFFER_READER_H */ diff --git a/include/grpc/impl/codegen/compression_types.h b/include/grpc/impl/codegen/compression_types.h new file mode 100644 index 00000000..f778b005 --- /dev/null +++ b/include/grpc/impl/codegen/compression_types.h @@ -0,0 +1,108 @@ +/* + * + * Copyright 2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_IMPL_CODEGEN_COMPRESSION_TYPES_H +#define GRPC_IMPL_CODEGEN_COMPRESSION_TYPES_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** To be used as initial metadata key for the request of a concrete compression + * algorithm */ +#define GRPC_COMPRESSION_REQUEST_ALGORITHM_MD_KEY \ + "grpc-internal-encoding-request" + +/** To be used in channel arguments. + * + * \addtogroup grpc_arg_keys + * \{ */ +/** Default compression algorithm for the channel. + * Its value is an int from the \a grpc_compression_algorithm enum. */ +#define GRPC_COMPRESSION_CHANNEL_DEFAULT_ALGORITHM \ + "grpc.default_compression_algorithm" +/** Default compression level for the channel. + * Its value is an int from the \a grpc_compression_level enum. */ +#define GRPC_COMPRESSION_CHANNEL_DEFAULT_LEVEL "grpc.default_compression_level" +/** Compression algorithms supported by the channel. + * Its value is a bitset (an int). Bits correspond to algorithms in \a + * grpc_compression_algorithm. For example, its LSB corresponds to + * GRPC_COMPRESS_NONE, the next bit to GRPC_COMPRESS_DEFLATE, etc. + * Unset bits disable support for the algorithm. By default all algorithms are + * supported. It's not possible to disable GRPC_COMPRESS_NONE (the attempt will + * be ignored). */ +#define GRPC_COMPRESSION_CHANNEL_ENABLED_ALGORITHMS_BITSET \ + "grpc.compression_enabled_algorithms_bitset" +/** \} */ + +/** The various compression algorithms supported by gRPC (not sorted by + * compression level) */ +typedef enum { + GRPC_COMPRESS_NONE = 0, + GRPC_COMPRESS_DEFLATE, + GRPC_COMPRESS_GZIP, + /* EXPERIMENTAL: Stream compression is currently experimental. */ + GRPC_COMPRESS_STREAM_GZIP, + /* TODO(ctiller): snappy */ + GRPC_COMPRESS_ALGORITHMS_COUNT +} grpc_compression_algorithm; + +/** Compression levels allow a party with knowledge of its peer's accepted + * encodings to request compression in an abstract way. The level-algorithm + * mapping is performed internally and depends on the peer's supported + * compression algorithms. */ +typedef enum { + GRPC_COMPRESS_LEVEL_NONE = 0, + GRPC_COMPRESS_LEVEL_LOW, + GRPC_COMPRESS_LEVEL_MED, + GRPC_COMPRESS_LEVEL_HIGH, + GRPC_COMPRESS_LEVEL_COUNT +} grpc_compression_level; + +typedef struct grpc_compression_options { + /** All algs are enabled by default. This option corresponds to the channel + * argument key behind \a GRPC_COMPRESSION_CHANNEL_ENABLED_ALGORITHMS_BITSET + */ + uint32_t enabled_algorithms_bitset; + + /** The default compression level. It'll be used in the absence of call + * specific settings. This option corresponds to the channel + * argument key behind \a GRPC_COMPRESSION_CHANNEL_DEFAULT_LEVEL. If present, + * takes precedence over \a default_algorithm. + * TODO(dgq): currently only available for server channels. */ + struct grpc_compression_options_default_level { + int is_set; + grpc_compression_level level; + } default_level; + + /** The default message compression algorithm. It'll be used in the absence of + * call specific settings. This option corresponds to the channel argument key + * behind \a GRPC_COMPRESSION_CHANNEL_DEFAULT_ALGORITHM. */ + struct grpc_compression_options_default_algorithm { + int is_set; + grpc_compression_algorithm algorithm; + } default_algorithm; +} grpc_compression_options; + +#ifdef __cplusplus +} +#endif + +#endif /* GRPC_IMPL_CODEGEN_COMPRESSION_TYPES_H */ diff --git a/include/grpc/impl/codegen/connectivity_state.h b/include/grpc/impl/codegen/connectivity_state.h new file mode 100644 index 00000000..b70dbef3 --- /dev/null +++ b/include/grpc/impl/codegen/connectivity_state.h @@ -0,0 +1,44 @@ +/* + * + * Copyright 2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_IMPL_CODEGEN_CONNECTIVITY_STATE_H +#define GRPC_IMPL_CODEGEN_CONNECTIVITY_STATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** Connectivity state of a channel. */ +typedef enum { + /** channel is idle */ + GRPC_CHANNEL_IDLE, + /** channel is connecting */ + GRPC_CHANNEL_CONNECTING, + /** channel is ready for work */ + GRPC_CHANNEL_READY, + /** channel has seen a failure but expects to recover */ + GRPC_CHANNEL_TRANSIENT_FAILURE, + /** channel has seen a failure that it cannot recover from */ + GRPC_CHANNEL_SHUTDOWN +} grpc_connectivity_state; + +#ifdef __cplusplus +} +#endif + +#endif /* GRPC_IMPL_CODEGEN_CONNECTIVITY_STATE_H */ diff --git a/include/grpc/impl/codegen/fork.h b/include/grpc/impl/codegen/fork.h new file mode 100644 index 00000000..555df349 --- /dev/null +++ b/include/grpc/impl/codegen/fork.h @@ -0,0 +1,48 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_IMPL_CODEGEN_FORK_H +#define GRPC_IMPL_CODEGEN_FORK_H + +/** + * gRPC applications should call this before calling fork(). There should be no + * active gRPC function calls between calling grpc_prefork() and + * grpc_postfork_parent()/grpc_postfork_child(). + * + * + * Typical use: + * grpc_prefork(); + * int pid = fork(); + * if (pid) { + * grpc_postfork_parent(); + * // Parent process.. + * } else { + * grpc_postfork_child(); + * // Child process... + * } + */ + +void grpc_prefork(void); + +void grpc_postfork_parent(void); + +void grpc_postfork_child(void); + +void grpc_fork_handlers_auto_register(void); + +#endif /* GRPC_IMPL_CODEGEN_FORK_H */ diff --git a/include/grpc/impl/codegen/gpr_slice.h b/include/grpc/impl/codegen/gpr_slice.h new file mode 100644 index 00000000..89fa72d5 --- /dev/null +++ b/include/grpc/impl/codegen/gpr_slice.h @@ -0,0 +1,69 @@ +/* + * + * Copyright 2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#ifndef GRPC_IMPL_CODEGEN_GPR_SLICE_H +#define GRPC_IMPL_CODEGEN_GPR_SLICE_H + +/** WARNING: Please do not use this header. This was added as a temporary + * measure to not break some of the external projects that depend on + * gpr_slice_* functions. We are actively working on moving all the + * gpr_slice_* references to grpc_slice_* and this file will be removed + */ + +/* TODO (sreek) - Allowed by default but will be very soon turned off */ +#define GRPC_ALLOW_GPR_SLICE_FUNCTIONS 1 + +#ifdef GRPC_ALLOW_GPR_SLICE_FUNCTIONS + +#define gpr_slice_refcount grpc_slice_refcount +#define gpr_slice grpc_slice +#define gpr_slice_buffer grpc_slice_buffer + +#define gpr_slice_ref grpc_slice_ref +#define gpr_slice_unref grpc_slice_unref +#define gpr_slice_new grpc_slice_new +#define gpr_slice_new_with_user_data grpc_slice_new_with_user_data +#define gpr_slice_new_with_len grpc_slice_new_with_len +#define gpr_slice_malloc grpc_slice_malloc +#define gpr_slice_from_copied_string grpc_slice_from_copied_string +#define gpr_slice_from_copied_buffer grpc_slice_from_copied_buffer +#define gpr_slice_from_static_string grpc_slice_from_static_string +#define gpr_slice_sub grpc_slice_sub +#define gpr_slice_sub_no_ref grpc_slice_sub_no_ref +#define gpr_slice_split_tail grpc_slice_split_tail +#define gpr_slice_split_head grpc_slice_split_head +#define gpr_slice_cmp grpc_slice_cmp +#define gpr_slice_str_cmp grpc_slice_str_cmp + +#define gpr_slice_buffer grpc_slice_buffer +#define gpr_slice_buffer_init grpc_slice_buffer_init +#define gpr_slice_buffer_destroy grpc_slice_buffer_destroy +#define gpr_slice_buffer_add grpc_slice_buffer_add +#define gpr_slice_buffer_add_indexed grpc_slice_buffer_add_indexed +#define gpr_slice_buffer_addn grpc_slice_buffer_addn +#define gpr_slice_buffer_tiny_add grpc_slice_buffer_tiny_add +#define gpr_slice_buffer_pop grpc_slice_buffer_pop +#define gpr_slice_buffer_reset_and_unref grpc_slice_buffer_reset_and_unref +#define gpr_slice_buffer_swap grpc_slice_buffer_swap +#define gpr_slice_buffer_move_into grpc_slice_buffer_move_into +#define gpr_slice_buffer_trim_end grpc_slice_buffer_trim_end +#define gpr_slice_buffer_move_first grpc_slice_buffer_move_first +#define gpr_slice_buffer_take_first grpc_slice_buffer_take_first + +#endif /* GRPC_ALLOW_GPR_SLICE_FUNCTIONS */ + +#endif /* GRPC_IMPL_CODEGEN_GPR_SLICE_H */ diff --git a/include/grpc/impl/codegen/gpr_types.h b/include/grpc/impl/codegen/gpr_types.h new file mode 100644 index 00000000..6daf3398 --- /dev/null +++ b/include/grpc/impl/codegen/gpr_types.h @@ -0,0 +1,59 @@ +/* + * + * Copyright 2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_IMPL_CODEGEN_GPR_TYPES_H +#define GRPC_IMPL_CODEGEN_GPR_TYPES_H + +#include + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** The clocks we support. */ +typedef enum { + /** Monotonic clock. Epoch undefined. Always moves forwards. */ + GPR_CLOCK_MONOTONIC = 0, + /** Realtime clock. May jump forwards or backwards. Settable by + the system administrator. Has its epoch at 0:00:00 UTC 1 Jan 1970. */ + GPR_CLOCK_REALTIME, + /** CPU cycle time obtained by rdtsc instruction on x86 platforms. Epoch + undefined. Degrades to GPR_CLOCK_REALTIME on other platforms. */ + GPR_CLOCK_PRECISE, + /** Unmeasurable clock type: no base, created by taking the difference + between two times */ + GPR_TIMESPAN +} gpr_clock_type; + +/** Analogous to struct timespec. On some machines, absolute times may be in + * local time. */ +typedef struct gpr_timespec { + int64_t tv_sec; + int32_t tv_nsec; + /** Against which clock was this time measured? (or GPR_TIMESPAN if + this is a relative time measure) */ + gpr_clock_type clock_type; +} gpr_timespec; + +#ifdef __cplusplus +} +#endif + +#endif /* GRPC_IMPL_CODEGEN_GPR_TYPES_H */ diff --git a/include/grpc/impl/codegen/grpc_types.h b/include/grpc/impl/codegen/grpc_types.h new file mode 100644 index 00000000..0ab42132 --- /dev/null +++ b/include/grpc/impl/codegen/grpc_types.h @@ -0,0 +1,785 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_IMPL_CODEGEN_GRPC_TYPES_H +#define GRPC_IMPL_CODEGEN_GRPC_TYPES_H + +#include + +#include +#include +#include +#include + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + GRPC_BB_RAW + /** Future types may include GRPC_BB_PROTOBUF, etc. */ +} grpc_byte_buffer_type; + +typedef struct grpc_byte_buffer { + void* reserved; + grpc_byte_buffer_type type; + union grpc_byte_buffer_data { + struct /* internal */ { + void* reserved[8]; + } reserved; + struct grpc_compressed_buffer { + grpc_compression_algorithm compression; + grpc_slice_buffer slice_buffer; + } raw; + } data; +} grpc_byte_buffer; + +/** Completion Queues enable notification of the completion of + * asynchronous actions. */ +typedef struct grpc_completion_queue grpc_completion_queue; + +/** An alarm associated with a completion queue. */ +typedef struct grpc_alarm grpc_alarm; + +/** The Channel interface allows creation of Call objects. */ +typedef struct grpc_channel grpc_channel; + +/** A server listens to some port and responds to request calls */ +typedef struct grpc_server grpc_server; + +/** A Call represents an RPC. When created, it is in a configuration state + allowing properties to be set until it is invoked. After invoke, the Call + can have messages written to it and read from it. */ +typedef struct grpc_call grpc_call; + +/** The Socket Mutator interface allows changes on socket options */ +typedef struct grpc_socket_mutator grpc_socket_mutator; + +/** The Socket Factory interface creates and binds sockets */ +typedef struct grpc_socket_factory grpc_socket_factory; + +/** Type specifier for grpc_arg */ +typedef enum { + GRPC_ARG_STRING, + GRPC_ARG_INTEGER, + GRPC_ARG_POINTER +} grpc_arg_type; + +typedef struct grpc_arg_pointer_vtable { + void* (*copy)(void* p); + void (*destroy)(void* p); + int (*cmp)(void* p, void* q); +} grpc_arg_pointer_vtable; + +/** A single argument... each argument has a key and a value + + A note on naming keys: + Keys are namespaced into groups, usually grouped by library, and are + keys for module XYZ are named XYZ.key1, XYZ.key2, etc. Module names must + be restricted to the regex [A-Za-z][_A-Za-z0-9]{,15}. + Key names must be restricted to the regex [A-Za-z][_A-Za-z0-9]{,47}. + + GRPC core library keys are prefixed by grpc. + + Library authors are strongly encouraged to \#define symbolic constants for + their keys so that it's possible to change them in the future. */ +typedef struct { + grpc_arg_type type; + char* key; + union grpc_arg_value { + char* string; + int integer; + struct grpc_arg_pointer { + void* p; + const grpc_arg_pointer_vtable* vtable; + } pointer; + } value; +} grpc_arg; + +/** An array of arguments that can be passed around. + + Used to set optional channel-level configuration. + These configuration options are modelled as key-value pairs as defined + by grpc_arg; keys are strings to allow easy backwards-compatible extension + by arbitrary parties. All evaluation is performed at channel creation + time (i.e. the keys and values in this structure need only live through the + creation invocation). + + However, if one of the args has grpc_arg_type==GRPC_ARG_POINTER, then the + grpc_arg_pointer_vtable must live until the channel args are done being + used by core (i.e. when the object for use with which they were passed + is destroyed). + + See the description of the \ref grpc_arg_keys "available args" for more + details. */ +typedef struct { + size_t num_args; + grpc_arg* args; +} grpc_channel_args; + +/** \defgroup grpc_arg_keys + * Channel argument keys. + * \{ + */ +/** If non-zero, enable census for tracing and stats collection. */ +#define GRPC_ARG_ENABLE_CENSUS "grpc.census" +/** If non-zero, enable load reporting. */ +#define GRPC_ARG_ENABLE_LOAD_REPORTING "grpc.loadreporting" +/** Request that optional features default to off (regardless of what they + usually default to) - to enable tight control over what gets enabled */ +#define GRPC_ARG_MINIMAL_STACK "grpc.minimal_stack" +/** Maximum number of concurrent incoming streams to allow on a http2 + connection. Int valued. */ +#define GRPC_ARG_MAX_CONCURRENT_STREAMS "grpc.max_concurrent_streams" +/** Maximum message length that the channel can receive. Int valued, bytes. + -1 means unlimited. */ +#define GRPC_ARG_MAX_RECEIVE_MESSAGE_LENGTH "grpc.max_receive_message_length" +/** \deprecated For backward compatibility. + * Use GRPC_ARG_MAX_RECEIVE_MESSAGE_LENGTH instead. */ +#define GRPC_ARG_MAX_MESSAGE_LENGTH GRPC_ARG_MAX_RECEIVE_MESSAGE_LENGTH +/** Maximum message length that the channel can send. Int valued, bytes. + -1 means unlimited. */ +#define GRPC_ARG_MAX_SEND_MESSAGE_LENGTH "grpc.max_send_message_length" +/** Maximum time that a channel may have no outstanding rpcs, after which the + * server will close the connection. Int valued, milliseconds. INT_MAX means + * unlimited. */ +#define GRPC_ARG_MAX_CONNECTION_IDLE_MS "grpc.max_connection_idle_ms" +/** Maximum time that a channel may exist. Int valued, milliseconds. + * INT_MAX means unlimited. */ +#define GRPC_ARG_MAX_CONNECTION_AGE_MS "grpc.max_connection_age_ms" +/** Grace period after the channel reaches its max age. Int valued, + milliseconds. INT_MAX means unlimited. */ +#define GRPC_ARG_MAX_CONNECTION_AGE_GRACE_MS "grpc.max_connection_age_grace_ms" +/** Timeout after the last RPC finishes on the client channel at which the + * channel goes back into IDLE state. Int valued, milliseconds. INT_MAX means + * unlimited. The default value is 30 minutes and the min value is 1 second. */ +#define GRPC_ARG_CLIENT_IDLE_TIMEOUT_MS "grpc.client_idle_timeout_ms" +/** Enable/disable support for per-message compression. Defaults to 1, unless + GRPC_ARG_MINIMAL_STACK is enabled, in which case it defaults to 0. */ +#define GRPC_ARG_ENABLE_PER_MESSAGE_COMPRESSION "grpc.per_message_compression" +/** Experimental Arg. Enable/disable support for per-message decompression. + Defaults to 1. If disabled, decompression will not be performed and the + application will see the compressed message in the byte buffer. */ +#define GRPC_ARG_ENABLE_PER_MESSAGE_DECOMPRESSION \ + "grpc.per_message_decompression" +/** Enable/disable support for deadline checking. Defaults to 1, unless + GRPC_ARG_MINIMAL_STACK is enabled, in which case it defaults to 0 */ +#define GRPC_ARG_ENABLE_DEADLINE_CHECKS "grpc.enable_deadline_checking" +/** Initial stream ID for http2 transports. Int valued. */ +#define GRPC_ARG_HTTP2_INITIAL_SEQUENCE_NUMBER \ + "grpc.http2.initial_sequence_number" +/** Amount to read ahead on individual streams. Defaults to 64kb, larger + values can help throughput on high-latency connections. + NOTE: at some point we'd like to auto-tune this, and this parameter + will become a no-op. Int valued, bytes. */ +#define GRPC_ARG_HTTP2_STREAM_LOOKAHEAD_BYTES "grpc.http2.lookahead_bytes" +/** How much memory to use for hpack decoding. Int valued, bytes. */ +#define GRPC_ARG_HTTP2_HPACK_TABLE_SIZE_DECODER \ + "grpc.http2.hpack_table_size.decoder" +/** How much memory to use for hpack encoding. Int valued, bytes. */ +#define GRPC_ARG_HTTP2_HPACK_TABLE_SIZE_ENCODER \ + "grpc.http2.hpack_table_size.encoder" +/** How big a frame are we willing to receive via HTTP2. + Min 16384, max 16777215. Larger values give lower CPU usage for large + messages, but more head of line blocking for small messages. */ +#define GRPC_ARG_HTTP2_MAX_FRAME_SIZE "grpc.http2.max_frame_size" +/** Should BDP probing be performed? */ +#define GRPC_ARG_HTTP2_BDP_PROBE "grpc.http2.bdp_probe" +/** Minimum time between sending successive ping frames without receiving any + data/header/window_update frame, Int valued, milliseconds. */ +#define GRPC_ARG_HTTP2_MIN_SENT_PING_INTERVAL_WITHOUT_DATA_MS \ + "grpc.http2.min_time_between_pings_ms" +/** Minimum allowed time between a server receiving successive ping frames + without sending any data/header/window_update frame. Int valued, milliseconds + */ +#define GRPC_ARG_HTTP2_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS \ + "grpc.http2.min_ping_interval_without_data_ms" +/** Channel arg to override the http2 :scheme header */ +#define GRPC_ARG_HTTP2_SCHEME "grpc.http2_scheme" +/** How many pings can we send before needing to send a + data/header/window_update frame? (0 indicates that an infinite number of + pings can be sent without sending a data frame or header frame) */ +#define GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA \ + "grpc.http2.max_pings_without_data" +/** How many misbehaving pings the server can bear before sending goaway and + closing the transport? (0 indicates that the server can bear an infinite + number of misbehaving pings) */ +#define GRPC_ARG_HTTP2_MAX_PING_STRIKES "grpc.http2.max_ping_strikes" +/** How much data are we willing to queue up per stream if + GRPC_WRITE_BUFFER_HINT is set? This is an upper bound */ +#define GRPC_ARG_HTTP2_WRITE_BUFFER_SIZE "grpc.http2.write_buffer_size" +/** Should we allow receipt of true-binary data on http2 connections? + Defaults to on (1) */ +#define GRPC_ARG_HTTP2_ENABLE_TRUE_BINARY "grpc.http2.true_binary" +/** After a duration of this time the client/server pings its peer to see if the + transport is still alive. Int valued, milliseconds. */ +#define GRPC_ARG_KEEPALIVE_TIME_MS "grpc.keepalive_time_ms" +/** After waiting for a duration of this time, if the keepalive ping sender does + not receive the ping ack, it will close the transport. Int valued, + milliseconds. */ +#define GRPC_ARG_KEEPALIVE_TIMEOUT_MS "grpc.keepalive_timeout_ms" +/** Is it permissible to send keepalive pings without any outstanding streams. + Int valued, 0(false)/1(true). */ +#define GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS \ + "grpc.keepalive_permit_without_calls" +/** Default authority to pass if none specified on call construction. A string. + * */ +#define GRPC_ARG_DEFAULT_AUTHORITY "grpc.default_authority" +/** Primary user agent: goes at the start of the user-agent metadata + sent on each request. A string. */ +#define GRPC_ARG_PRIMARY_USER_AGENT_STRING "grpc.primary_user_agent" +/** Secondary user agent: goes at the end of the user-agent metadata + sent on each request. A string. */ +#define GRPC_ARG_SECONDARY_USER_AGENT_STRING "grpc.secondary_user_agent" +/** The minimum time between subsequent connection attempts, in ms */ +#define GRPC_ARG_MIN_RECONNECT_BACKOFF_MS "grpc.min_reconnect_backoff_ms" +/** The maximum time between subsequent connection attempts, in ms */ +#define GRPC_ARG_MAX_RECONNECT_BACKOFF_MS "grpc.max_reconnect_backoff_ms" +/** The time between the first and second connection attempts, in ms */ +#define GRPC_ARG_INITIAL_RECONNECT_BACKOFF_MS \ + "grpc.initial_reconnect_backoff_ms" +/** Minimum amount of time between DNS resolutions, in ms */ +#define GRPC_ARG_DNS_MIN_TIME_BETWEEN_RESOLUTIONS_MS \ + "grpc.dns_min_time_between_resolutions_ms" +/** The timeout used on servers for finishing handshaking on an incoming + connection. Defaults to 120 seconds. */ +#define GRPC_ARG_SERVER_HANDSHAKE_TIMEOUT_MS "grpc.server_handshake_timeout_ms" +/** This *should* be used for testing only. + The caller of the secure_channel_create functions may override the target + name used for SSL host name checking using this channel argument which is of + type \a GRPC_ARG_STRING. If this argument is not specified, the name used + for SSL host name checking will be the target parameter (assuming that the + secure channel is an SSL channel). If this parameter is specified and the + underlying is not an SSL channel, it will just be ignored. */ +#define GRPC_SSL_TARGET_NAME_OVERRIDE_ARG "grpc.ssl_target_name_override" +/** If non-zero, a pointer to a session cache (a pointer of type + grpc_ssl_session_cache*). (use grpc_ssl_session_cache_arg_vtable() to fetch + an appropriate pointer arg vtable) */ +#define GRPC_SSL_SESSION_CACHE_ARG "grpc.ssl_session_cache" +/** If non-zero, it will determine the maximum frame size used by TSI's frame + * protector. + * + * NOTE: Be aware that using a large "max_frame_size" is memory inefficient + * for non-zerocopy protectors. Also, increasing this value above 1MiB + * can break old binaries that don't support larger than 1MiB frame + * size. */ +#define GRPC_ARG_TSI_MAX_FRAME_SIZE "grpc.tsi.max_frame_size" +/** Maximum metadata size, in bytes. Note this limit applies to the max sum of + all metadata key-value entries in a batch of headers. */ +#define GRPC_ARG_MAX_METADATA_SIZE "grpc.max_metadata_size" +/** If non-zero, allow the use of SO_REUSEPORT if it's available (default 1) */ +#define GRPC_ARG_ALLOW_REUSEPORT "grpc.so_reuseport" +/** If non-zero, a pointer to a buffer pool (a pointer of type + * grpc_resource_quota*). (use grpc_resource_quota_arg_vtable() to fetch an + * appropriate pointer arg vtable) */ +#define GRPC_ARG_RESOURCE_QUOTA "grpc.resource_quota" +/** If non-zero, expand wildcard addresses to a list of local addresses. */ +#define GRPC_ARG_EXPAND_WILDCARD_ADDRS "grpc.expand_wildcard_addrs" +/** Service config data in JSON form. + This value will be ignored if the name resolver returns a service config. */ +#define GRPC_ARG_SERVICE_CONFIG "grpc.service_config" +/** Disable looking up the service config via the name resolver. */ +#define GRPC_ARG_SERVICE_CONFIG_DISABLE_RESOLUTION \ + "grpc.service_config_disable_resolution" +/** LB policy name. */ +#define GRPC_ARG_LB_POLICY_NAME "grpc.lb_policy_name" +/** The grpc_socket_mutator instance that set the socket options. A pointer. */ +#define GRPC_ARG_SOCKET_MUTATOR "grpc.socket_mutator" +/** The grpc_socket_factory instance to create and bind sockets. A pointer. */ +#define GRPC_ARG_SOCKET_FACTORY "grpc.socket_factory" +/** The maximum amount of memory used by trace events per channel trace node. + * Once the maximum is reached, subsequent events will evict the oldest events + * from the buffer. The unit for this knob is bytes. Setting it to zero causes + * channel tracing to be disabled. */ +#define GRPC_ARG_MAX_CHANNEL_TRACE_EVENT_MEMORY_PER_NODE \ + "grpc.max_channel_trace_event_memory_per_node" +/** If non-zero, gRPC library will track stats and information at at per channel + * level. Disabling channelz naturally disables channel tracing. The default + * is for channelz to be enabled. */ +#define GRPC_ARG_ENABLE_CHANNELZ "grpc.enable_channelz" +/** If non-zero, Cronet transport will coalesce packets to fewer frames + * when possible. */ +#define GRPC_ARG_USE_CRONET_PACKET_COALESCING \ + "grpc.use_cronet_packet_coalescing" +/** Channel arg (integer) setting how large a slice to try and read from the + wire each time recvmsg (or equivalent) is called **/ +#define GRPC_ARG_TCP_READ_CHUNK_SIZE "grpc.experimental.tcp_read_chunk_size" +/** Note this is not a "channel arg" key. This is the default slice size to use + * when trying to read from the wire if the GRPC_ARG_TCP_READ_CHUNK_SIZE + * channel arg is unspecified. */ +#define GRPC_TCP_DEFAULT_READ_SLICE_SIZE 8192 +#define GRPC_ARG_TCP_MIN_READ_CHUNK_SIZE \ + "grpc.experimental.tcp_min_read_chunk_size" +#define GRPC_ARG_TCP_MAX_READ_CHUNK_SIZE \ + "grpc.experimental.tcp_max_read_chunk_size" +/* TCP TX Zerocopy enable state: zero is disabled, non-zero is enabled. By + default, it is disabled. */ +#define GRPC_ARG_TCP_TX_ZEROCOPY_ENABLED \ + "grpc.experimental.tcp_tx_zerocopy_enabled" +/* TCP TX Zerocopy send threshold: only zerocopy if >= this many bytes sent. By + default, this is set to 16KB. */ +#define GRPC_ARG_TCP_TX_ZEROCOPY_SEND_BYTES_THRESHOLD \ + "grpc.experimental.tcp_tx_zerocopy_send_bytes_threshold" +/* TCP TX Zerocopy max simultaneous sends: limit for maximum number of pending + calls to tcp_write() using zerocopy. A tcp_write() is considered pending + until the kernel performs the zerocopy-done callback for all sendmsg() calls + issued by the tcp_write(). By default, this is set to 4. */ +#define GRPC_ARG_TCP_TX_ZEROCOPY_MAX_SIMULT_SENDS \ + "grpc.experimental.tcp_tx_zerocopy_max_simultaneous_sends" +/* Timeout in milliseconds to use for calls to the grpclb load balancer. + If 0 or unset, the balancer calls will have no deadline. */ +#define GRPC_ARG_GRPCLB_CALL_TIMEOUT_MS "grpc.grpclb_call_timeout_ms" +/* Timeout in milliseconds to wait for the serverlist from the grpclb load + balancer before using fallback backend addresses from the resolver. + If 0, enter fallback mode immediately. Default value is 10000. */ +#define GRPC_ARG_GRPCLB_FALLBACK_TIMEOUT_MS "grpc.grpclb_fallback_timeout_ms" +/* Timeout in milliseconds to wait for the child of a specific priority to + complete its initial connection attempt before the priority LB policy fails + over to the next priority. Default value is 10 seconds. */ +#define GRPC_ARG_PRIORITY_FAILOVER_TIMEOUT_MS \ + "grpc.priority_failover_timeout_ms" +/* Timeout in milliseconds to wait for a resource to be returned from + * the xds server before assuming that it does not exist. + * The default is 15 seconds. */ +#define GRPC_ARG_XDS_RESOURCE_DOES_NOT_EXIST_TIMEOUT_MS \ + "grpc.xds_resource_does_not_exist_timeout_ms" +/** If non-zero, grpc server's cronet compression workaround will be enabled */ +#define GRPC_ARG_WORKAROUND_CRONET_COMPRESSION \ + "grpc.workaround.cronet_compression" +/** String defining the optimization target for a channel. + Can be: "latency" - attempt to minimize latency at the cost of throughput + "blend" - try to balance latency and throughput + "throughput" - attempt to maximize throughput at the expense of + latency + Defaults to "blend". In the current implementation "blend" is equivalent to + "latency". */ +#define GRPC_ARG_OPTIMIZATION_TARGET "grpc.optimization_target" +/** If set to zero, disables retry behavior. Otherwise, transparent retries + are enabled for all RPCs, and configurable retries are enabled when they + are configured via the service config. For details, see: + https://github.com/grpc/proposal/blob/master/A6-client-retries.md + */ +#define GRPC_ARG_ENABLE_RETRIES "grpc.enable_retries" +/** Per-RPC retry buffer size, in bytes. Default is 256 KiB. */ +#define GRPC_ARG_PER_RPC_RETRY_BUFFER_SIZE "grpc.per_rpc_retry_buffer_size" +/** Channel arg that carries the bridged objective c object for custom metrics + * logging filter. */ +#define GRPC_ARG_MOBILE_LOG_CONTEXT "grpc.mobile_log_context" +/** If non-zero, client authority filter is disabled for the channel */ +#define GRPC_ARG_DISABLE_CLIENT_AUTHORITY_FILTER \ + "grpc.disable_client_authority_filter" +/** If set to zero, disables use of http proxies. Enabled by default. */ +#define GRPC_ARG_ENABLE_HTTP_PROXY "grpc.enable_http_proxy" +/** Channel arg to set http proxy per channel. If set, the channel arg + * value will be prefered over the envrionment variable settings. */ +#define GRPC_ARG_HTTP_PROXY "grpc.http_proxy" +/** If set to non zero, surfaces the user agent string to the server. User + agent is surfaced by default. */ +#define GRPC_ARG_SURFACE_USER_AGENT "grpc.surface_user_agent" +/** If set, inhibits health checking (which may be enabled via the + * service config.) */ +#define GRPC_ARG_INHIBIT_HEALTH_CHECKING "grpc.inhibit_health_checking" +/** If set, the channel's resolver is allowed to query for SRV records. + * For example, this is useful as a way to enable the "grpclb" + * load balancing policy. Note that this only works with the "ares" + * DNS resolver, and isn't supported by the "native" DNS resolver. */ +#define GRPC_ARG_DNS_ENABLE_SRV_QUERIES "grpc.dns_enable_srv_queries" +/** If set, determines an upper bound on the number of milliseconds that the + * c-ares based DNS resolver will wait on queries before cancelling them. + * The default value is 120,000. Setting this to "0" will disable the + * overall timeout entirely. Note that this doesn't include internal c-ares + * timeouts/backoff/retry logic, and so the actual DNS resolution may time out + * sooner than the value specified here. */ +#define GRPC_ARG_DNS_ARES_QUERY_TIMEOUT_MS "grpc.dns_ares_query_timeout" +/** If set, uses a local subchannel pool within the channel. Otherwise, uses the + * global subchannel pool. */ +#define GRPC_ARG_USE_LOCAL_SUBCHANNEL_POOL "grpc.use_local_subchannel_pool" +/** gRPC Objective-C channel pooling domain string. */ +#define GRPC_ARG_CHANNEL_POOL_DOMAIN "grpc.channel_pooling_domain" +/** gRPC Objective-C channel pooling id. */ +#define GRPC_ARG_CHANNEL_ID "grpc.channel_id" +/** \} */ + +/** Result of a grpc call. If the caller satisfies the prerequisites of a + particular operation, the grpc_call_error returned will be GRPC_CALL_OK. + Receiving any other value listed here is an indication of a bug in the + caller. */ +typedef enum grpc_call_error { + /** everything went ok */ + GRPC_CALL_OK = 0, + /** something failed, we don't know what */ + GRPC_CALL_ERROR, + /** this method is not available on the server */ + GRPC_CALL_ERROR_NOT_ON_SERVER, + /** this method is not available on the client */ + GRPC_CALL_ERROR_NOT_ON_CLIENT, + /** this method must be called before server_accept */ + GRPC_CALL_ERROR_ALREADY_ACCEPTED, + /** this method must be called before invoke */ + GRPC_CALL_ERROR_ALREADY_INVOKED, + /** this method must be called after invoke */ + GRPC_CALL_ERROR_NOT_INVOKED, + /** this call is already finished + (writes_done or write_status has already been called) */ + GRPC_CALL_ERROR_ALREADY_FINISHED, + /** there is already an outstanding read/write operation on the call */ + GRPC_CALL_ERROR_TOO_MANY_OPERATIONS, + /** the flags value was illegal for this call */ + GRPC_CALL_ERROR_INVALID_FLAGS, + /** invalid metadata was passed to this call */ + GRPC_CALL_ERROR_INVALID_METADATA, + /** invalid message was passed to this call */ + GRPC_CALL_ERROR_INVALID_MESSAGE, + /** completion queue for notification has not been registered + * with the server */ + GRPC_CALL_ERROR_NOT_SERVER_COMPLETION_QUEUE, + /** this batch of operations leads to more operations than allowed */ + GRPC_CALL_ERROR_BATCH_TOO_BIG, + /** payload type requested is not the type registered */ + GRPC_CALL_ERROR_PAYLOAD_TYPE_MISMATCH, + /** completion queue has been shutdown */ + GRPC_CALL_ERROR_COMPLETION_QUEUE_SHUTDOWN +} grpc_call_error; + +/** Default send/receive message size limits in bytes. -1 for unlimited. */ +/** TODO(roth) Make this match the default receive limit after next release */ +#define GRPC_DEFAULT_MAX_SEND_MESSAGE_LENGTH -1 +#define GRPC_DEFAULT_MAX_RECV_MESSAGE_LENGTH (4 * 1024 * 1024) + +/** Write Flags: */ +/** Hint that the write may be buffered and need not go out on the wire + immediately. GRPC is free to buffer the message until the next non-buffered + write, or until writes_done, but it need not buffer completely or at all. */ +#define GRPC_WRITE_BUFFER_HINT (0x00000001u) +/** Force compression to be disabled for a particular write + (start_write/add_metadata). Illegal on invoke/accept. */ +#define GRPC_WRITE_NO_COMPRESS (0x00000002u) +/** Force this message to be written to the socket before completing it */ +#define GRPC_WRITE_THROUGH (0x00000004u) +/** Mask of all valid flags. */ +#define GRPC_WRITE_USED_MASK \ + (GRPC_WRITE_BUFFER_HINT | GRPC_WRITE_NO_COMPRESS | GRPC_WRITE_THROUGH) + +/** Initial metadata flags */ +/** Signal that the call is idempotent */ +#define GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST (0x00000010u) +/** Signal that the call should not return UNAVAILABLE before it has started */ +#define GRPC_INITIAL_METADATA_WAIT_FOR_READY (0x00000020u) +/** Signal that the call is cacheable. GRPC is free to use GET verb */ +#define GRPC_INITIAL_METADATA_CACHEABLE_REQUEST (0x00000040u) +/** Signal that GRPC_INITIAL_METADATA_WAIT_FOR_READY was explicitly set + by the calling application. */ +#define GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET (0x00000080u) +/** Signal that the initial metadata should be corked */ +#define GRPC_INITIAL_METADATA_CORKED (0x00000100u) + +/** Mask of all valid flags */ +#define GRPC_INITIAL_METADATA_USED_MASK \ + (GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST | \ + GRPC_INITIAL_METADATA_WAIT_FOR_READY | \ + GRPC_INITIAL_METADATA_CACHEABLE_REQUEST | \ + GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET | \ + GRPC_INITIAL_METADATA_CORKED | GRPC_WRITE_THROUGH) + +/** A single metadata element */ +typedef struct grpc_metadata { + /** the key, value values are expected to line up with grpc_mdelem: if + changing them, update metadata.h at the same time. */ + grpc_slice key; + grpc_slice value; + + uint32_t flags; + + /** The following fields are reserved for grpc internal use. + There is no need to initialize them, and they will be set to garbage + during calls to grpc. */ + struct /* internal */ { + void* obfuscated[4]; + } internal_data; +} grpc_metadata; + +/** The type of completion (for grpc_event) */ +typedef enum grpc_completion_type { + /** Shutting down */ + GRPC_QUEUE_SHUTDOWN, + /** No event before timeout */ + GRPC_QUEUE_TIMEOUT, + /** Operation completion */ + GRPC_OP_COMPLETE +} grpc_completion_type; + +/** The result of an operation. + + Returned by a completion queue when the operation started with tag. */ +typedef struct grpc_event { + /** The type of the completion. */ + grpc_completion_type type; + /** If the grpc_completion_type is GRPC_OP_COMPLETE, this field indicates + whether the operation was successful or not; 0 in case of failure and + non-zero in case of success. + If grpc_completion_type is GRPC_QUEUE_SHUTDOWN or GRPC_QUEUE_TIMEOUT, this + field is guaranteed to be 0 */ + int success; + /** The tag passed to grpc_call_start_batch etc to start this operation. + *Only* GRPC_OP_COMPLETE has a tag. For all other grpc_completion_type + values, tag is uninitialized. */ + void* tag; +} grpc_event; + +typedef struct { + size_t count; + size_t capacity; + grpc_metadata* metadata; +} grpc_metadata_array; + +typedef struct { + grpc_slice method; + grpc_slice host; + gpr_timespec deadline; + uint32_t flags; + void* reserved; +} grpc_call_details; + +typedef enum { + /** Send initial metadata: one and only one instance MUST be sent for each + call, unless the call was cancelled - in which case this can be skipped. + This op completes after all bytes of metadata have been accepted by + outgoing flow control. */ + GRPC_OP_SEND_INITIAL_METADATA = 0, + /** Send a message: 0 or more of these operations can occur for each call. + This op completes after all bytes for the message have been accepted by + outgoing flow control. */ + GRPC_OP_SEND_MESSAGE, + /** Send a close from the client: one and only one instance MUST be sent from + the client, unless the call was cancelled - in which case this can be + skipped. This op completes after all bytes for the call + (including the close) have passed outgoing flow control. */ + GRPC_OP_SEND_CLOSE_FROM_CLIENT, + /** Send status from the server: one and only one instance MUST be sent from + the server unless the call was cancelled - in which case this can be + skipped. This op completes after all bytes for the call + (including the status) have passed outgoing flow control. */ + GRPC_OP_SEND_STATUS_FROM_SERVER, + /** Receive initial metadata: one and only one MUST be made on the client, + must not be made on the server. + This op completes after all initial metadata has been read from the + peer. */ + GRPC_OP_RECV_INITIAL_METADATA, + /** Receive a message: 0 or more of these operations can occur for each call. + This op completes after all bytes of the received message have been + read, or after a half-close has been received on this call. */ + GRPC_OP_RECV_MESSAGE, + /** Receive status on the client: one and only one must be made on the client. + This operation always succeeds, meaning ops paired with this operation + will also appear to succeed, even though they may not have. In that case + the status will indicate some failure. + This op completes after all activity on the call has completed. */ + GRPC_OP_RECV_STATUS_ON_CLIENT, + /** Receive close on the server: one and only one must be made on the + server. This op completes after the close has been received by the + server. This operation always succeeds, meaning ops paired with + this operation will also appear to succeed, even though they may not + have. */ + GRPC_OP_RECV_CLOSE_ON_SERVER +} grpc_op_type; + +struct grpc_byte_buffer; + +/** Operation data: one field for each op type (except SEND_CLOSE_FROM_CLIENT + which has no arguments) */ +typedef struct grpc_op { + /** Operation type, as defined by grpc_op_type */ + grpc_op_type op; + /** Write flags bitset for grpc_begin_messages */ + uint32_t flags; + /** Reserved for future usage */ + void* reserved; + union grpc_op_data { + /** Reserved for future usage */ + struct /* internal */ { + void* reserved[8]; + } reserved; + struct grpc_op_send_initial_metadata { + size_t count; + grpc_metadata* metadata; + /** If \a is_set, \a compression_level will be used for the call. + * Otherwise, \a compression_level won't be considered */ + struct grpc_op_send_initial_metadata_maybe_compression_level { + uint8_t is_set; + grpc_compression_level level; + } maybe_compression_level; + } send_initial_metadata; + struct grpc_op_send_message { + /** This op takes ownership of the slices in send_message. After + * a call completes, the contents of send_message are not guaranteed + * and likely empty. The original owner should still call + * grpc_byte_buffer_destroy() on this object however. + */ + struct grpc_byte_buffer* send_message; + } send_message; + struct grpc_op_send_status_from_server { + size_t trailing_metadata_count; + grpc_metadata* trailing_metadata; + grpc_status_code status; + /** optional: set to NULL if no details need sending, non-NULL if they do + * pointer will not be retained past the start_batch call + */ + grpc_slice* status_details; + } send_status_from_server; + /** ownership of the array is with the caller, but ownership of the elements + stays with the call object (ie key, value members are owned by the call + object, recv_initial_metadata->array is owned by the caller). + After the operation completes, call grpc_metadata_array_destroy on this + value, or reuse it in a future op. */ + struct grpc_op_recv_initial_metadata { + grpc_metadata_array* recv_initial_metadata; + } recv_initial_metadata; + /** ownership of the byte buffer is moved to the caller; the caller must + call grpc_byte_buffer_destroy on this value, or reuse it in a future op. + The returned byte buffer will be NULL if trailing metadata was + received instead of a message. + */ + struct grpc_op_recv_message { + struct grpc_byte_buffer** recv_message; + } recv_message; + struct grpc_op_recv_status_on_client { + /** ownership of the array is with the caller, but ownership of the + elements stays with the call object (ie key, value members are owned + by the call object, trailing_metadata->array is owned by the caller). + After the operation completes, call grpc_metadata_array_destroy on + this value, or reuse it in a future op. */ + grpc_metadata_array* trailing_metadata; + grpc_status_code* status; + grpc_slice* status_details; + /** If this is not nullptr, it will be populated with the full fidelity + * error string for debugging purposes. The application is responsible + * for freeing the data by using gpr_free(). */ + const char** error_string; + } recv_status_on_client; + struct grpc_op_recv_close_on_server { + /** out argument, set to 1 if the call failed in any way (seen as a + cancellation on the server), or 0 if the call succeeded */ + int* cancelled; + } recv_close_on_server; + } data; +} grpc_op; + +/** Information requested from the channel. */ +typedef struct { + /** If non-NULL, will be set to point to a string indicating the LB + * policy name. Caller takes ownership. */ + char** lb_policy_name; + /** If non-NULL, will be set to point to a string containing the + * service config used by the channel in JSON form. */ + char** service_config_json; +} grpc_channel_info; + +typedef struct grpc_resource_quota grpc_resource_quota; + +/** Completion queues internally MAY maintain a set of file descriptors in a + structure called 'pollset'. This enum specifies if a completion queue has an + associated pollset and any restrictions on the type of file descriptors that + can be present in the pollset. + + I/O progress can only be made when grpc_completion_queue_next() or + grpc_completion_queue_pluck() are called on the completion queue (unless the + grpc_cq_polling_type is GRPC_CQ_NON_POLLING) and hence it is very important + to actively call these APIs */ +typedef enum { + /** The completion queue will have an associated pollset and there is no + restriction on the type of file descriptors the pollset may contain */ + GRPC_CQ_DEFAULT_POLLING, + + /** Similar to GRPC_CQ_DEFAULT_POLLING except that the completion queues will + not contain any 'listening file descriptors' (i.e file descriptors used to + listen to incoming channels) */ + GRPC_CQ_NON_LISTENING, + + /** The completion queue will not have an associated pollset. Note that + grpc_completion_queue_next() or grpc_completion_queue_pluck() MUST still + be called to pop events from the completion queue; it is not required to + call them actively to make I/O progress */ + GRPC_CQ_NON_POLLING +} grpc_cq_polling_type; + +/** Specifies the type of APIs to use to pop events from the completion queue */ +typedef enum { + /** Events are popped out by calling grpc_completion_queue_next() API ONLY */ + GRPC_CQ_NEXT, + + /** Events are popped out by calling grpc_completion_queue_pluck() API ONLY*/ + GRPC_CQ_PLUCK, + + /** EXPERIMENTAL: Events trigger a callback specified as the tag */ + GRPC_CQ_CALLBACK +} grpc_cq_completion_type; + +/** EXPERIMENTAL: Specifies an interface class to be used as a tag + for callback-based completion queues. This can be used directly, + as the first element of a struct in C, or as a base class in C++. + Its "run" value should be assigned to some non-member function, such as + a static method. */ +typedef struct grpc_experimental_completion_queue_functor { + /** The run member specifies a function that will be called when this + tag is extracted from the completion queue. Its arguments will be a + pointer to this functor and a boolean that indicates whether the + operation succeeded (non-zero) or failed (zero) */ + void (*functor_run)(struct grpc_experimental_completion_queue_functor*, int); + + /** The inlineable member specifies whether this functor can be run inline. + This should only be used for trivial internally-defined functors. */ + int inlineable; + + /** The following fields are not API. They are meant for internal use. */ + int internal_success; + struct grpc_experimental_completion_queue_functor* internal_next; +} grpc_experimental_completion_queue_functor; + +/* The upgrade to version 2 is currently experimental. */ + +#define GRPC_CQ_CURRENT_VERSION 2 +#define GRPC_CQ_VERSION_MINIMUM_FOR_CALLBACKABLE 2 +typedef struct grpc_completion_queue_attributes { + /** The version number of this structure. More fields might be added to this + structure in future. */ + int version; /** Set to GRPC_CQ_CURRENT_VERSION */ + + grpc_cq_completion_type cq_completion_type; + + grpc_cq_polling_type cq_polling_type; + + /* END OF VERSION 1 CQ ATTRIBUTES */ + + /* EXPERIMENTAL: START OF VERSION 2 CQ ATTRIBUTES */ + /** When creating a callbackable CQ, pass in a functor to get invoked when + * shutdown is complete */ + grpc_experimental_completion_queue_functor* cq_shutdown_cb; + + /* END OF VERSION 2 CQ ATTRIBUTES */ +} grpc_completion_queue_attributes; + +/** The completion queue factory structure is opaque to the callers of grpc */ +typedef struct grpc_completion_queue_factory grpc_completion_queue_factory; + +#ifdef __cplusplus +} +#endif + +#endif /* GRPC_IMPL_CODEGEN_GRPC_TYPES_H */ diff --git a/include/grpc/impl/codegen/log.h b/include/grpc/impl/codegen/log.h new file mode 100644 index 00000000..ad7f0241 --- /dev/null +++ b/include/grpc/impl/codegen/log.h @@ -0,0 +1,112 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_IMPL_CODEGEN_LOG_H +#define GRPC_IMPL_CODEGEN_LOG_H + +#include + +#include +#include /* for abort() */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** GPR log API. + + Usage (within grpc): + + int argument1 = 3; + char* argument2 = "hello"; + gpr_log(GPR_DEBUG, "format string %d", argument1); + gpr_log(GPR_INFO, "hello world"); + gpr_log(GPR_ERROR, "%d %s!!", argument1, argument2); */ + +/** The severity of a log message - use the #defines below when calling into + gpr_log to additionally supply file and line data */ +typedef enum gpr_log_severity { + GPR_LOG_SEVERITY_DEBUG, + GPR_LOG_SEVERITY_INFO, + GPR_LOG_SEVERITY_ERROR +} gpr_log_severity; + +#define GPR_LOG_VERBOSITY_UNSET -1 + +/** Returns a string representation of the log severity */ +GPRAPI const char* gpr_log_severity_string(gpr_log_severity severity); + +/** Macros to build log contexts at various severity levels */ +#define GPR_DEBUG __FILE__, __LINE__, GPR_LOG_SEVERITY_DEBUG +#define GPR_INFO __FILE__, __LINE__, GPR_LOG_SEVERITY_INFO +#define GPR_ERROR __FILE__, __LINE__, GPR_LOG_SEVERITY_ERROR + +/** Log a message. It's advised to use GPR_xxx above to generate the context + * for each message */ +GPRAPI void gpr_log(const char* file, int line, gpr_log_severity severity, + const char* format, ...) GPR_PRINT_FORMAT_CHECK(4, 5); + +GPRAPI int gpr_should_log(gpr_log_severity severity); + +GPRAPI void gpr_log_message(const char* file, int line, + gpr_log_severity severity, const char* message); + +/** Set global log verbosity */ +GPRAPI void gpr_set_log_verbosity(gpr_log_severity min_severity_to_print); + +GPRAPI void gpr_log_verbosity_init(void); + +/** Log overrides: applications can use this API to intercept logging calls + and use their own implementations */ + +struct gpr_log_func_args { + const char* file; + int line; + gpr_log_severity severity; + const char* message; +}; + +typedef struct gpr_log_func_args gpr_log_func_args; + +typedef void (*gpr_log_func)(gpr_log_func_args* args); +GPRAPI void gpr_set_log_function(gpr_log_func func); + +/** abort() the process if x is zero, having written a line to the log. + + Intended for internal invariants. If the error can be recovered from, + without the possibility of corruption, or might best be reflected via + an exception in a higher-level language, consider returning error code. */ +#define GPR_ASSERT(x) \ + do { \ + if (GPR_UNLIKELY(!(x))) { \ + gpr_log(GPR_ERROR, "assertion failed: %s", #x); \ + abort(); \ + } \ + } while (0) + +#ifndef NDEBUG +#define GPR_DEBUG_ASSERT(x) GPR_ASSERT(x) +#else +#define GPR_DEBUG_ASSERT(x) +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* GRPC_IMPL_CODEGEN_LOG_H */ diff --git a/include/grpc/impl/codegen/port_platform.h b/include/grpc/impl/codegen/port_platform.h new file mode 100644 index 00000000..4f213ff5 --- /dev/null +++ b/include/grpc/impl/codegen/port_platform.h @@ -0,0 +1,720 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_IMPL_CODEGEN_PORT_PLATFORM_H +#define GRPC_IMPL_CODEGEN_PORT_PLATFORM_H + +/* + * Define GPR_BACKWARDS_COMPATIBILITY_MODE to try harder to be ABI + * compatible with older platforms (currently only on Linux) + * Causes: + * - some libc calls to be gotten via dlsym + * - some syscalls to be made directly + */ + +/* + * Defines GRPC_USE_ABSL to use Abseil Common Libraries (C++) + */ +#ifndef GRPC_USE_ABSL +#define GRPC_USE_ABSL 1 +#endif + +/* + * Defines GPR_ABSEIL_SYNC to use synchronization features from Abseil + */ +#ifndef GPR_ABSEIL_SYNC +/* #define GPR_ABSEIL_SYNC 1 */ +#endif + +/* Get windows.h included everywhere (we need it) */ +#if defined(_WIN64) || defined(WIN64) || defined(_WIN32) || defined(WIN32) +#ifndef WIN32_LEAN_AND_MEAN +#define GRPC_WIN32_LEAN_AND_MEAN_WAS_NOT_DEFINED +#define WIN32_LEAN_AND_MEAN +#endif /* WIN32_LEAN_AND_MEAN */ + +#ifndef NOMINMAX +#define GRPC_NOMINMX_WAS_NOT_DEFINED +#define NOMINMAX +#endif /* NOMINMAX */ + +#include + +#ifndef _WIN32_WINNT +#error \ + "Please compile grpc with _WIN32_WINNT of at least 0x600 (aka Windows Vista)" +#else /* !defined(_WIN32_WINNT) */ +#if (_WIN32_WINNT < 0x0600) +#error \ + "Please compile grpc with _WIN32_WINNT of at least 0x600 (aka Windows Vista)" +#endif /* _WIN32_WINNT < 0x0600 */ +#endif /* defined(_WIN32_WINNT) */ + +#ifdef GRPC_WIN32_LEAN_AND_MEAN_WAS_NOT_DEFINED +#undef GRPC_WIN32_LEAN_AND_MEAN_WAS_NOT_DEFINED +#undef WIN32_LEAN_AND_MEAN +#endif /* GRPC_WIN32_LEAN_AND_MEAN_WAS_NOT_DEFINED */ + +#ifdef GRPC_NOMINMAX_WAS_NOT_DEFINED +#undef GRPC_NOMINMAX_WAS_NOT_DEFINED +#undef NOMINMAX +#endif /* GRPC_WIN32_LEAN_AND_MEAN_WAS_NOT_DEFINED */ +#endif /* defined(_WIN64) || defined(WIN64) || defined(_WIN32) || \ + defined(WIN32) */ + +/* Override this file with one for your platform if you need to redefine + things. */ + +#if !defined(GPR_NO_AUTODETECT_PLATFORM) +#if defined(_WIN64) || defined(WIN64) || defined(_WIN32) || defined(WIN32) +#if defined(_WIN64) || defined(WIN64) +#define GPR_ARCH_64 1 +#else +#define GPR_ARCH_32 1 +#endif +#define GPR_PLATFORM_STRING "windows" +#define GPR_WINDOWS 1 +#define GPR_WINDOWS_SUBPROCESS 1 +#define GPR_WINDOWS_ENV +#ifdef __MSYS__ +#define GPR_GETPID_IN_UNISTD_H 1 +#define GPR_MSYS_TMPFILE +#define GPR_POSIX_LOG +#define GPR_POSIX_STRING +#define GPR_POSIX_TIME +#else +#define GPR_GETPID_IN_PROCESS_H 1 +#define GPR_WINDOWS_TMPFILE +#define GPR_WINDOWS_LOG +#define GPR_WINDOWS_CRASH_HANDLER 1 +#define GPR_WINDOWS_STRING +#define GPR_WINDOWS_TIME +#endif +#ifdef __GNUC__ +#define GPR_GCC_ATOMIC 1 +#define GPR_GCC_TLS 1 +#else +#define GPR_WINDOWS_ATOMIC 1 +#define GPR_MSVC_TLS 1 +#endif +#elif defined(GPR_MANYLINUX1) +// TODO(atash): manylinux1 is just another __linux__ but with ancient +// libraries; it should be integrated with the `__linux__` definitions below. +#define GPR_PLATFORM_STRING "manylinux" +#define GPR_POSIX_CRASH_HANDLER 1 +#define GPR_CPU_POSIX 1 +#define GPR_GCC_ATOMIC 1 +#define GPR_GCC_TLS 1 +#define GPR_LINUX 1 +#define GPR_LINUX_LOG 1 +#define GPR_SUPPORT_CHANNELS_FROM_FD 1 +#define GPR_LINUX_ENV 1 +#define GPR_POSIX_TMPFILE 1 +#define GPR_POSIX_STRING 1 +#define GPR_POSIX_SUBPROCESS 1 +#define GPR_POSIX_SYNC 1 +#define GPR_POSIX_TIME 1 +#define GPR_HAS_PTHREAD_H 1 +#define GPR_GETPID_IN_UNISTD_H 1 +#ifdef _LP64 +#define GPR_ARCH_64 1 +#else /* _LP64 */ +#define GPR_ARCH_32 1 +#endif /* _LP64 */ +#include +#elif defined(ANDROID) || defined(__ANDROID__) +#define GPR_PLATFORM_STRING "android" +#define GPR_ANDROID 1 +// TODO(apolcyn): re-evaluate support for c-ares +// on android after upgrading our c-ares dependency. +// See https://github.com/grpc/grpc/issues/18038. +#define GRPC_ARES 0 +#ifdef _LP64 +#define GPR_ARCH_64 1 +#else /* _LP64 */ +#define GPR_ARCH_32 1 +#endif /* _LP64 */ +#define GPR_CPU_POSIX 1 +#define GPR_GCC_SYNC 1 +#define GPR_GCC_TLS 1 +#define GPR_POSIX_ENV 1 +#define GPR_POSIX_TMPFILE 1 +#define GPR_ANDROID_LOG 1 +#define GPR_POSIX_STRING 1 +#define GPR_POSIX_SUBPROCESS 1 +#define GPR_POSIX_SYNC 1 +#define GPR_POSIX_TIME 1 +#define GPR_HAS_PTHREAD_H 1 +#define GPR_GETPID_IN_UNISTD_H 1 +#define GPR_SUPPORT_CHANNELS_FROM_FD 1 +#elif defined(__linux__) +#define GPR_PLATFORM_STRING "linux" +#ifndef _BSD_SOURCE +#define _BSD_SOURCE +#endif +#ifndef _DEFAULT_SOURCE +#define _DEFAULT_SOURCE +#endif +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif +#include +#define GPR_CPU_LINUX 1 +#define GPR_GCC_ATOMIC 1 +#define GPR_GCC_TLS 1 +#define GPR_LINUX 1 +#define GPR_LINUX_LOG +#define GPR_SUPPORT_CHANNELS_FROM_FD 1 +#define GPR_LINUX_ENV 1 +#define GPR_POSIX_TMPFILE 1 +#define GPR_POSIX_STRING 1 +#define GPR_POSIX_SUBPROCESS 1 +#define GPR_POSIX_SYNC 1 +#define GPR_POSIX_TIME 1 +#define GPR_HAS_PTHREAD_H 1 +#define GPR_GETPID_IN_UNISTD_H 1 +#ifdef _LP64 +#define GPR_ARCH_64 1 +#else /* _LP64 */ +#define GPR_ARCH_32 1 +#endif /* _LP64 */ +#ifdef __GLIBC__ +#define GPR_POSIX_CRASH_HANDLER 1 +#define GPR_LINUX_PTHREAD_NAME 1 +#include +#else /* musl libc */ +#define GPR_MUSL_LIBC_COMPAT 1 +#endif +#elif defined(__ASYLO__) +#define GPR_ARCH_64 1 +#define GPR_CPU_POSIX 1 +#define GPR_GCC_TLS 1 +#define GPR_PLATFORM_STRING "asylo" +#define GPR_GCC_SYNC 1 +#define GPR_POSIX_SYNC 1 +#define GPR_POSIX_STRING 1 +#define GPR_POSIX_LOG 1 +#define GPR_POSIX_TIME 1 +#define GPR_POSIX_ENV 1 +#define GPR_ASYLO 1 +#define GRPC_POSIX_SOCKET 1 +#define GRPC_POSIX_SOCKETADDR +#define GRPC_POSIX_SOCKETUTILS 1 +#define GRPC_TIMER_USE_GENERIC 1 +#define GRPC_POSIX_NO_SPECIAL_WAKEUP_FD 1 +#define GRPC_POSIX_WAKEUP_FD 1 +#define GRPC_ARES 0 +#define GPR_NO_AUTODETECT_PLATFORM 1 +#elif defined(__APPLE__) +#include +#include +#ifndef _BSD_SOURCE +#define _BSD_SOURCE +#endif +#if TARGET_OS_IPHONE +#define GPR_PLATFORM_STRING "ios" +#define GPR_CPU_IPHONE 1 +#define GPR_PTHREAD_TLS 1 +#define GRPC_CFSTREAM 1 +/* the c-ares resolver isn't safe to enable on iOS */ +#define GRPC_ARES 0 +#else /* TARGET_OS_IPHONE */ +#define GPR_PLATFORM_STRING "osx" +#ifdef __MAC_OS_X_VERSION_MIN_REQUIRED +#if __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_7 +#define GPR_CPU_IPHONE 1 +#define GPR_PTHREAD_TLS 1 +#else /* __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_7 */ +#define GPR_CPU_POSIX 1 +/* TODO(vjpai): there is a reported issue in bazel build for Mac where __thread + in a header is currently not working (bazelbuild/bazel#4341). Remove + the following conditional and use GPR_GCC_TLS when that is fixed */ +#ifndef GRPC_BAZEL_BUILD +#define GPR_GCC_TLS 1 +#else /* GRPC_BAZEL_BUILD */ +#define GPR_PTHREAD_TLS 1 +#endif /* GRPC_BAZEL_BUILD */ +#define GPR_APPLE_PTHREAD_NAME 1 +#endif +#else /* __MAC_OS_X_VERSION_MIN_REQUIRED */ +#define GPR_CPU_POSIX 1 +/* TODO(vjpai): Remove the following conditional and use only GPR_GCC_TLS + when bazelbuild/bazel#4341 is fixed */ +#ifndef GRPC_BAZEL_BUILD +#define GPR_GCC_TLS 1 +#else /* GRPC_BAZEL_BUILD */ +#define GPR_PTHREAD_TLS 1 +#endif /* GRPC_BAZEL_BUILD */ +#endif +#define GPR_POSIX_CRASH_HANDLER 1 +#endif +#define GPR_APPLE 1 +#define GPR_GCC_ATOMIC 1 +#define GPR_POSIX_LOG 1 +#define GPR_POSIX_ENV 1 +#define GPR_POSIX_TMPFILE 1 +#define GPR_POSIX_STRING 1 +#define GPR_POSIX_SUBPROCESS 1 +#define GPR_POSIX_SYNC 1 +#define GPR_POSIX_TIME 1 +#define GPR_HAS_PTHREAD_H 1 +#define GPR_GETPID_IN_UNISTD_H 1 +#ifndef GRPC_CFSTREAM +#define GPR_SUPPORT_CHANNELS_FROM_FD 1 +#endif +#ifdef _LP64 +#define GPR_ARCH_64 1 +#else /* _LP64 */ +#define GPR_ARCH_32 1 +#endif /* _LP64 */ +#elif defined(__FreeBSD__) +#define GPR_PLATFORM_STRING "freebsd" +#ifndef _BSD_SOURCE +#define _BSD_SOURCE +#endif +#define GPR_FREEBSD 1 +#define GPR_CPU_POSIX 1 +#define GPR_GCC_ATOMIC 1 +#define GPR_GCC_TLS 1 +#define GPR_POSIX_LOG 1 +#define GPR_POSIX_ENV 1 +#define GPR_POSIX_TMPFILE 1 +#define GPR_POSIX_STRING 1 +#define GPR_POSIX_SUBPROCESS 1 +#define GPR_POSIX_SYNC 1 +#define GPR_POSIX_TIME 1 +#define GPR_HAS_PTHREAD_H 1 +#define GPR_GETPID_IN_UNISTD_H 1 +#define GPR_SUPPORT_CHANNELS_FROM_FD 1 +#ifdef _LP64 +#define GPR_ARCH_64 1 +#else /* _LP64 */ +#define GPR_ARCH_32 1 +#endif /* _LP64 */ +#elif defined(__OpenBSD__) +#define GPR_PLATFORM_STRING "openbsd" +#ifndef _BSD_SOURCE +#define _BSD_SOURCE +#endif +#define GPR_OPENBSD 1 +#define GPR_CPU_POSIX 1 +#define GPR_GCC_ATOMIC 1 +#define GPR_GCC_TLS 1 +#define GPR_POSIX_LOG 1 +#define GPR_POSIX_ENV 1 +#define GPR_POSIX_TMPFILE 1 +#define GPR_POSIX_STRING 1 +#define GPR_POSIX_SUBPROCESS 1 +#define GPR_POSIX_SYNC 1 +#define GPR_POSIX_TIME 1 +#define GPR_HAS_PTHREAD_H 1 +#define GPR_GETPID_IN_UNISTD_H 1 +#define GPR_SUPPORT_CHANNELS_FROM_FD 1 +#ifdef _LP64 +#define GPR_ARCH_64 1 +#else /* _LP64 */ +#define GPR_ARCH_32 1 +#endif /* _LP64 */ +#elif defined(__sun) && defined(__SVR4) +#define GPR_PLATFORM_STRING "solaris" +#define GPR_SOLARIS 1 +#define GPR_CPU_POSIX 1 +#define GPR_GCC_ATOMIC 1 +#define GPR_GCC_TLS 1 +#define GPR_POSIX_LOG 1 +#define GPR_POSIX_ENV 1 +#define GPR_POSIX_TMPFILE 1 +#define GPR_POSIX_STRING 1 +#define GPR_POSIX_SUBPROCESS 1 +#define GPR_POSIX_SYNC 1 +#define GPR_POSIX_TIME 1 +#define GPR_HAS_PTHREAD_H 1 +#define GPR_GETPID_IN_UNISTD_H 1 +#ifdef _LP64 +#define GPR_ARCH_64 1 +#else /* _LP64 */ +#define GPR_ARCH_32 1 +#endif /* _LP64 */ +#elif defined(_AIX) +#define GPR_PLATFORM_STRING "aix" +#ifndef _ALL_SOURCE +#define _ALL_SOURCE +#endif +#define GPR_AIX 1 +#define GPR_CPU_POSIX 1 +#define GPR_GCC_ATOMIC 1 +#define GPR_GCC_TLS 1 +#define GPR_POSIX_LOG 1 +#define GPR_POSIX_ENV 1 +#define GPR_POSIX_TMPFILE 1 +#define GPR_POSIX_STRING 1 +#define GPR_POSIX_SUBPROCESS 1 +#define GPR_POSIX_SYNC 1 +#define GPR_POSIX_TIME 1 +#define GPR_HAS_PTHREAD_H 1 +#define GPR_GETPID_IN_UNISTD_H 1 +#ifdef _LP64 +#define GPR_ARCH_64 1 +#else /* _LP64 */ +#define GPR_ARCH_32 1 +#endif /* _LP64 */ +#elif defined(__native_client__) +#define GPR_PLATFORM_STRING "nacl" +#ifndef _BSD_SOURCE +#define _BSD_SOURCE +#endif +#ifndef _DEFAULT_SOURCE +#define _DEFAULT_SOURCE +#endif +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif +#define GPR_NACL 1 +#define GPR_CPU_POSIX 1 +#define GPR_GCC_ATOMIC 1 +#define GPR_GCC_TLS 1 +#define GPR_POSIX_LOG 1 +#define GPR_POSIX_ENV 1 +#define GPR_POSIX_TMPFILE 1 +#define GPR_POSIX_STRING 1 +#define GPR_POSIX_SUBPROCESS 1 +#define GPR_POSIX_SYNC 1 +#define GPR_POSIX_TIME 1 +#define GPR_HAS_PTHREAD_H 1 +#define GPR_GETPID_IN_UNISTD_H 1 +#ifdef _LP64 +#define GPR_ARCH_64 1 +#else /* _LP64 */ +#define GPR_ARCH_32 1 +#endif /* _LP64 */ +#elif defined(__Fuchsia__) +#define GPR_FUCHSIA 1 +#define GPR_ARCH_64 1 +#define GPR_PLATFORM_STRING "fuchsia" +#include +// Specifying musl libc affects wrap_memcpy.c. It causes memmove() to be +// invoked. +#define GPR_MUSL_LIBC_COMPAT 1 +#define GPR_CPU_POSIX 1 +#define GPR_GCC_ATOMIC 1 +#define GPR_PTHREAD_TLS 1 +#define GPR_POSIX_LOG 1 +#define GPR_POSIX_SYNC 1 +#define GPR_POSIX_ENV 1 +#define GPR_POSIX_TMPFILE 1 +#define GPR_POSIX_SUBPROCESS 1 +#define GPR_POSIX_SYNC 1 +#define GPR_POSIX_STRING 1 +#define GPR_POSIX_TIME 1 +#define GPR_HAS_PTHREAD_H 1 +#define GPR_GETPID_IN_UNISTD_H 1 +#else +#error "Could not auto-detect platform" +#endif +#endif /* GPR_NO_AUTODETECT_PLATFORM */ + +#if defined(GPR_BACKWARDS_COMPATIBILITY_MODE) +/* + * For backward compatibility mode, reset _FORTIFY_SOURCE to prevent + * a library from having non-standard symbols such as __asprintf_chk. + * This helps non-glibc systems such as alpine using musl to find symbols. + */ +#if defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE > 0 +#undef _FORTIFY_SOURCE +#define _FORTIFY_SOURCE 0 +#endif +#endif + +/* + * There are platforms for which TLS should not be used even though the + * compiler makes it seem like it's supported (Android NDK < r12b for example). + * This is primarily because of linker problems and toolchain misconfiguration: + * TLS isn't supported until NDK r12b per + * https://developer.android.com/ndk/downloads/revision_history.html + * TLS also does not work with Android NDK if GCC is being used as the compiler + * instead of Clang. + * Since NDK r16, `__NDK_MAJOR__` and `__NDK_MINOR__` are defined in + * . For NDK < r16, users should define these macros, + * e.g. `-D__NDK_MAJOR__=11 -D__NKD_MINOR__=0` for NDK r11. */ +#if defined(__ANDROID__) && defined(GPR_GCC_TLS) +#if __has_include() +#include +#endif /* __has_include() */ +#if (defined(__clang__) && defined(__NDK_MAJOR__) && defined(__NDK_MINOR__) && \ + ((__NDK_MAJOR__ < 12) || \ + ((__NDK_MAJOR__ == 12) && (__NDK_MINOR__ < 1)))) || \ + (defined(__GNUC__) && !defined(__clang__)) +#undef GPR_GCC_TLS +#define GPR_PTHREAD_TLS 1 +#endif +#endif /*defined(__ANDROID__) && defined(GPR_GCC_TLS) */ + +#if defined(__has_include) +#if __has_include() +#define GRPC_HAS_CXX11_ATOMIC +#endif /* __has_include() */ +#endif /* defined(__has_include) */ + +#ifndef GPR_PLATFORM_STRING +#warning "GPR_PLATFORM_STRING not auto-detected" +#define GPR_PLATFORM_STRING "unknown" +#endif + +#ifdef GPR_GCOV +#undef GPR_FORBID_UNREACHABLE_CODE +#define GPR_FORBID_UNREACHABLE_CODE 1 +#endif + +#ifdef _MSC_VER +#if _MSC_VER < 1700 +typedef __int8 int8_t; +typedef __int16 int16_t; +typedef __int32 int32_t; +typedef __int64 int64_t; +typedef unsigned __int8 uint8_t; +typedef unsigned __int16 uint16_t; +typedef unsigned __int32 uint32_t; +typedef unsigned __int64 uint64_t; +#else +#include +#endif /* _MSC_VER < 1700 */ +#else +#include +#endif /* _MSC_VER */ + +/* Type of cycle clock implementation */ +#ifdef GPR_LINUX +/* Disable cycle clock by default. + TODO(soheil): enable when we support fallback for unstable cycle clocks. +#if defined(__i386__) +#define GPR_CYCLE_COUNTER_RDTSC_32 1 +#elif defined(__x86_64__) || defined(__amd64__) +#define GPR_CYCLE_COUNTER_RDTSC_64 1 +#else +#define GPR_CYCLE_COUNTER_FALLBACK 1 +#endif +*/ +#define GPR_CYCLE_COUNTER_FALLBACK 1 +#else +#define GPR_CYCLE_COUNTER_FALLBACK 1 +#endif /* GPR_LINUX */ + +/* Cache line alignment */ +#ifndef GPR_CACHELINE_SIZE_LOG +#if defined(__i386__) || defined(__x86_64__) +#define GPR_CACHELINE_SIZE_LOG 6 +#endif +#ifndef GPR_CACHELINE_SIZE_LOG +/* A reasonable default guess. Note that overestimates tend to waste more + space, while underestimates tend to waste more time. */ +#define GPR_CACHELINE_SIZE_LOG 6 +#endif /* GPR_CACHELINE_SIZE_LOG */ +#endif /* GPR_CACHELINE_SIZE_LOG */ + +#define GPR_CACHELINE_SIZE (1 << GPR_CACHELINE_SIZE_LOG) + +/* scrub GCC_ATOMIC if it's not available on this compiler */ +#if defined(GPR_GCC_ATOMIC) && !defined(__ATOMIC_RELAXED) +#undef GPR_GCC_ATOMIC +#define GPR_GCC_SYNC 1 +#endif + +/* Validate platform combinations */ +#if defined(GPR_GCC_ATOMIC) + defined(GPR_GCC_SYNC) + \ + defined(GPR_WINDOWS_ATOMIC) != \ + 1 +#error Must define exactly one of GPR_GCC_ATOMIC, GPR_GCC_SYNC, GPR_WINDOWS_ATOMIC +#endif + +#if defined(GPR_ARCH_32) + defined(GPR_ARCH_64) != 1 +#error Must define exactly one of GPR_ARCH_32, GPR_ARCH_64 +#endif + +#if defined(GPR_CPU_LINUX) + defined(GPR_CPU_POSIX) + defined(GPR_WINDOWS) + \ + defined(GPR_CPU_IPHONE) + defined(GPR_CPU_CUSTOM) != \ + 1 +#error Must define exactly one of GPR_CPU_LINUX, GPR_CPU_POSIX, GPR_WINDOWS, GPR_CPU_IPHONE, GPR_CPU_CUSTOM +#endif + +#if defined(GPR_MSVC_TLS) + defined(GPR_GCC_TLS) + defined(GPR_PTHREAD_TLS) + \ + defined(GPR_CUSTOM_TLS) != \ + 1 +#error Must define exactly one of GPR_MSVC_TLS, GPR_GCC_TLS, GPR_PTHREAD_TLS, GPR_CUSTOM_TLS +#endif + +/* maximum alignment needed for any type on this platform, rounded up to a + power of two */ +#define GPR_MAX_ALIGNMENT 16 + +#ifndef GRPC_ARES +#define GRPC_ARES 1 +#endif + +#ifndef GRPC_IF_NAMETOINDEX +#define GRPC_IF_NAMETOINDEX 1 +#endif + +#ifndef GRPC_MUST_USE_RESULT +#if defined(__GNUC__) && !defined(__MINGW32__) +#define GRPC_MUST_USE_RESULT __attribute__((warn_unused_result)) +#define GPR_ALIGN_STRUCT(n) __attribute__((aligned(n))) +#else +#define GRPC_MUST_USE_RESULT +#define GPR_ALIGN_STRUCT(n) +#endif +#endif + +#ifndef GRPC_UNUSED +#if defined(__GNUC__) && !defined(__MINGW32__) +#define GRPC_UNUSED __attribute__((unused)) +#else +#define GRPC_UNUSED +#endif +#endif + +#ifndef GPR_PRINT_FORMAT_CHECK +#ifdef __GNUC__ +#define GPR_PRINT_FORMAT_CHECK(FORMAT_STR, ARGS) \ + __attribute__((format(printf, FORMAT_STR, ARGS))) +#else +#define GPR_PRINT_FORMAT_CHECK(FORMAT_STR, ARGS) +#endif +#endif /* GPR_PRINT_FORMAT_CHECK */ + +#if GPR_FORBID_UNREACHABLE_CODE +#define GPR_UNREACHABLE_CODE(STATEMENT) +#else +#define GPR_UNREACHABLE_CODE(STATEMENT) \ + do { \ + gpr_log(GPR_ERROR, "Should never reach here."); \ + abort(); \ + STATEMENT; \ + } while (0) +#endif /* GPR_FORBID_UNREACHABLE_CODE */ + +#ifndef GPRAPI +#define GPRAPI +#endif + +#ifndef GRPCAPI +#define GRPCAPI GPRAPI +#endif + +#ifndef CENSUSAPI +#define CENSUSAPI GRPCAPI +#endif + +#ifndef GPR_HAS_ATTRIBUTE +#ifdef __has_attribute +#define GPR_HAS_ATTRIBUTE(a) __has_attribute(a) +#else +#define GPR_HAS_ATTRIBUTE(a) 0 +#endif +#endif /* GPR_HAS_ATTRIBUTE */ + +#ifndef GPR_HAS_FEATURE +#ifdef __has_feature +#define GPR_HAS_FEATURE(a) __has_feature(a) +#else +#define GPR_HAS_FEATURE(a) 0 +#endif +#endif /* GPR_HAS_FEATURE */ + +#ifndef GPR_ATTRIBUTE_NOINLINE +#if GPR_HAS_ATTRIBUTE(noinline) || (defined(__GNUC__) && !defined(__clang__)) +#define GPR_ATTRIBUTE_NOINLINE __attribute__((noinline)) +#define GPR_HAS_ATTRIBUTE_NOINLINE 1 +#else +#define GPR_ATTRIBUTE_NOINLINE +#endif +#endif /* GPR_ATTRIBUTE_NOINLINE */ + +#ifndef GPR_ATTRIBUTE_WEAK +/* Attribute weak is broken on LLVM/windows: + * https://bugs.llvm.org/show_bug.cgi?id=37598 */ +#if (GPR_HAS_ATTRIBUTE(weak) || (defined(__GNUC__) && !defined(__clang__))) && \ + !(defined(__llvm__) && defined(_WIN32)) +#define GPR_ATTRIBUTE_WEAK __attribute__((weak)) +#define GPR_HAS_ATTRIBUTE_WEAK 1 +#else +#define GPR_ATTRIBUTE_WEAK +#endif +#endif /* GPR_ATTRIBUTE_WEAK */ + +#ifndef GPR_ATTRIBUTE_NO_TSAN /* (1) */ +#if GPR_HAS_FEATURE(thread_sanitizer) +#define GPR_ATTRIBUTE_NO_TSAN __attribute__((no_sanitize("thread"))) +#endif /* GPR_HAS_FEATURE */ +#ifndef GPR_ATTRIBUTE_NO_TSAN /* (2) */ +#define GPR_ATTRIBUTE_NO_TSAN +#endif /* GPR_ATTRIBUTE_NO_TSAN (2) */ +#endif /* GPR_ATTRIBUTE_NO_TSAN (1) */ + +/* GRPC_TSAN_ENABLED will be defined, when compiled with thread sanitizer. */ +#ifndef GRPC_TSAN_SUPPRESSED +#if defined(__SANITIZE_THREAD__) +#define GRPC_TSAN_ENABLED +#elif GPR_HAS_FEATURE(thread_sanitizer) +#define GRPC_TSAN_ENABLED +#endif +#endif + +/* GRPC_ASAN_ENABLED will be defined, when compiled with address sanitizer. */ +#ifndef GRPC_ASAN_SUPPRESSED +#if defined(__SANITIZE_ADDRESS__) +#define GRPC_ASAN_ENABLED +#elif GPR_HAS_FEATURE(address_sanitizer) +#define GRPC_ASAN_ENABLED +#endif +#endif + +/* GRPC_ALLOW_EXCEPTIONS should be 0 or 1 if exceptions are allowed or not */ +#ifndef GRPC_ALLOW_EXCEPTIONS +#ifdef GPR_WINDOWS +#if defined(_MSC_VER) && defined(_CPPUNWIND) +#define GRPC_ALLOW_EXCEPTIONS 1 +#elif defined(__EXCEPTIONS) +#define GRPC_ALLOW_EXCEPTIONS 1 +#else +#define GRPC_ALLOW_EXCEPTIONS 0 +#endif +#else /* GPR_WINDOWS */ +#ifdef __EXCEPTIONS +#define GRPC_ALLOW_EXCEPTIONS 1 +#else /* __EXCEPTIONS */ +#define GRPC_ALLOW_EXCEPTIONS 0 +#endif /* __EXCEPTIONS */ +#endif /* __GPR_WINDOWS */ +#endif /* GRPC_ALLOW_EXCEPTIONS */ + +/* Use GPR_LIKELY only in cases where you are sure that a certain outcome is the + * most likely. Ideally, also collect performance numbers to justify the claim. + */ +#ifdef __GNUC__ +#define GPR_LIKELY(x) __builtin_expect((x), 1) +#define GPR_UNLIKELY(x) __builtin_expect((x), 0) +#else /* __GNUC__ */ +#define GPR_LIKELY(x) (x) +#define GPR_UNLIKELY(x) (x) +#endif /* __GNUC__ */ + +#ifndef __STDC_FORMAT_MACROS +#define __STDC_FORMAT_MACROS +#endif + +#endif /* GRPC_IMPL_CODEGEN_PORT_PLATFORM_H */ diff --git a/include/grpc/impl/codegen/propagation_bits.h b/include/grpc/impl/codegen/propagation_bits.h new file mode 100644 index 00000000..824bdbd8 --- /dev/null +++ b/include/grpc/impl/codegen/propagation_bits.h @@ -0,0 +1,52 @@ +/* + * + * Copyright 2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_IMPL_CODEGEN_PROPAGATION_BITS_H +#define GRPC_IMPL_CODEGEN_PROPAGATION_BITS_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** Propagation bits: this can be bitwise or-ed to form propagation_mask for + * grpc_call */ +/** Propagate deadline */ +#define GRPC_PROPAGATE_DEADLINE ((uint32_t)1) +/** Propagate census context */ +#define GRPC_PROPAGATE_CENSUS_STATS_CONTEXT ((uint32_t)2) +#define GRPC_PROPAGATE_CENSUS_TRACING_CONTEXT ((uint32_t)4) +/** Propagate cancellation */ +#define GRPC_PROPAGATE_CANCELLATION ((uint32_t)8) + +/** Default propagation mask: clients of the core API are encouraged to encode + deltas from this in their implementations... ie write: + GRPC_PROPAGATE_DEFAULTS & ~GRPC_PROPAGATE_DEADLINE to disable deadline + propagation. Doing so gives flexibility in the future to define new + propagation types that are default inherited or not. */ +#define GRPC_PROPAGATE_DEFAULTS \ + ((uint32_t)(( \ + 0xffff | GRPC_PROPAGATE_DEADLINE | GRPC_PROPAGATE_CENSUS_STATS_CONTEXT | \ + GRPC_PROPAGATE_CENSUS_TRACING_CONTEXT | GRPC_PROPAGATE_CANCELLATION))) + +#ifdef __cplusplus +} +#endif + +#endif /* GRPC_IMPL_CODEGEN_PROPAGATION_BITS_H */ diff --git a/include/grpc/impl/codegen/slice.h b/include/grpc/impl/codegen/slice.h new file mode 100644 index 00000000..3567b1e8 --- /dev/null +++ b/include/grpc/impl/codegen/slice.h @@ -0,0 +1,127 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_IMPL_CODEGEN_SLICE_H +#define GRPC_IMPL_CODEGEN_SLICE_H + +#include + +#include + +#include + +typedef struct grpc_slice grpc_slice; + +/** Slice API + + A slice represents a contiguous reference counted array of bytes. + It is cheap to take references to a slice, and it is cheap to create a + slice pointing to a subset of another slice. + + The data-structure for slices is exposed here to allow non-gpr code to + build slices from whatever data they have available. + + When defining interfaces that handle slices, care should be taken to define + reference ownership semantics (who should call unref?) and mutability + constraints (is the callee allowed to modify the slice?) */ + +/* Inlined half of grpc_slice is allowed to expand the size of the overall type + by this many bytes */ +#define GRPC_SLICE_INLINE_EXTRA_SIZE sizeof(void*) + +#define GRPC_SLICE_INLINED_SIZE \ + (sizeof(size_t) + sizeof(uint8_t*) - 1 + GRPC_SLICE_INLINE_EXTRA_SIZE) + +struct grpc_slice_refcount; +/** A grpc_slice s, if initialized, represents the byte range + s.bytes[0..s.length-1]. + + It can have an associated ref count which has a destruction routine to be run + when the ref count reaches zero (see grpc_slice_new() and grp_slice_unref()). + Multiple grpc_slice values may share a ref count. + + If the slice does not have a refcount, it represents an inlined small piece + of data that is copied by value. */ +struct grpc_slice { + struct grpc_slice_refcount* refcount; + union grpc_slice_data { + struct grpc_slice_refcounted { + size_t length; + uint8_t* bytes; + } refcounted; + struct grpc_slice_inlined { + uint8_t length; + uint8_t bytes[GRPC_SLICE_INLINED_SIZE]; + } inlined; + } data; +}; + +#define GRPC_SLICE_BUFFER_INLINE_ELEMENTS 8 + +/** Represents an expandable array of slices, to be interpreted as a + single item. */ +typedef struct grpc_slice_buffer { + /** This is for internal use only. External users (i.e any code outside grpc + * core) MUST NOT use this field */ + grpc_slice* base_slices; + + /** slices in the array (Points to the first valid grpc_slice in the array) */ + grpc_slice* slices; + /** the number of slices in the array */ + size_t count; + /** the number of slices allocated in the array. External users (i.e any code + * outside grpc core) MUST NOT use this field */ + size_t capacity; + /** the combined length of all slices in the array */ + size_t length; + /** inlined elements to avoid allocations */ + grpc_slice inlined[GRPC_SLICE_BUFFER_INLINE_ELEMENTS]; +} grpc_slice_buffer; + +#define GRPC_SLICE_START_PTR(slice) \ + ((slice).refcount ? (slice).data.refcounted.bytes \ + : (slice).data.inlined.bytes) +#define GRPC_SLICE_LENGTH(slice) \ + ((slice).refcount ? (slice).data.refcounted.length \ + : (slice).data.inlined.length) +#define GRPC_SLICE_SET_LENGTH(slice, newlen) \ + ((slice).refcount ? ((slice).data.refcounted.length = (size_t)(newlen)) \ + : ((slice).data.inlined.length = (uint8_t)(newlen))) +#define GRPC_SLICE_END_PTR(slice) \ + GRPC_SLICE_START_PTR(slice) + GRPC_SLICE_LENGTH(slice) +#define GRPC_SLICE_IS_EMPTY(slice) (GRPC_SLICE_LENGTH(slice) == 0) + +#ifdef GRPC_ALLOW_GPR_SLICE_FUNCTIONS + +/* Duplicate GPR_* definitions */ +#define GPR_SLICE_START_PTR(slice) \ + ((slice).refcount ? (slice).data.refcounted.bytes \ + : (slice).data.inlined.bytes) +#define GPR_SLICE_LENGTH(slice) \ + ((slice).refcount ? (slice).data.refcounted.length \ + : (slice).data.inlined.length) +#define GPR_SLICE_SET_LENGTH(slice, newlen) \ + ((slice).refcount ? ((slice).data.refcounted.length = (size_t)(newlen)) \ + : ((slice).data.inlined.length = (uint8_t)(newlen))) +#define GPR_SLICE_END_PTR(slice) \ + GRPC_SLICE_START_PTR(slice) + GRPC_SLICE_LENGTH(slice) +#define GPR_SLICE_IS_EMPTY(slice) (GRPC_SLICE_LENGTH(slice) == 0) + +#endif /* GRPC_ALLOW_GPR_SLICE_FUNCTIONS */ + +#endif /* GRPC_IMPL_CODEGEN_SLICE_H */ diff --git a/include/grpc/impl/codegen/status.h b/include/grpc/impl/codegen/status.h new file mode 100644 index 00000000..dec3b8f3 --- /dev/null +++ b/include/grpc/impl/codegen/status.h @@ -0,0 +1,154 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_IMPL_CODEGEN_STATUS_H +#define GRPC_IMPL_CODEGEN_STATUS_H + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + /** Not an error; returned on success */ + GRPC_STATUS_OK = 0, + + /** The operation was cancelled (typically by the caller). */ + GRPC_STATUS_CANCELLED = 1, + + /** Unknown error. An example of where this error may be returned is + if a Status value received from another address space belongs to + an error-space that is not known in this address space. Also + errors raised by APIs that do not return enough error information + may be converted to this error. */ + GRPC_STATUS_UNKNOWN = 2, + + /** Client specified an invalid argument. Note that this differs + from FAILED_PRECONDITION. INVALID_ARGUMENT indicates arguments + that are problematic regardless of the state of the system + (e.g., a malformed file name). */ + GRPC_STATUS_INVALID_ARGUMENT = 3, + + /** Deadline expired before operation could complete. For operations + that change the state of the system, this error may be returned + even if the operation has completed successfully. For example, a + successful response from a server could have been delayed long + enough for the deadline to expire. */ + GRPC_STATUS_DEADLINE_EXCEEDED = 4, + + /** Some requested entity (e.g., file or directory) was not found. */ + GRPC_STATUS_NOT_FOUND = 5, + + /** Some entity that we attempted to create (e.g., file or directory) + already exists. */ + GRPC_STATUS_ALREADY_EXISTS = 6, + + /** The caller does not have permission to execute the specified + operation. PERMISSION_DENIED must not be used for rejections + caused by exhausting some resource (use RESOURCE_EXHAUSTED + instead for those errors). PERMISSION_DENIED must not be + used if the caller can not be identified (use UNAUTHENTICATED + instead for those errors). */ + GRPC_STATUS_PERMISSION_DENIED = 7, + + /** The request does not have valid authentication credentials for the + operation. */ + GRPC_STATUS_UNAUTHENTICATED = 16, + + /** Some resource has been exhausted, perhaps a per-user quota, or + perhaps the entire file system is out of space. */ + GRPC_STATUS_RESOURCE_EXHAUSTED = 8, + + /** Operation was rejected because the system is not in a state + required for the operation's execution. For example, directory + to be deleted may be non-empty, an rmdir operation is applied to + a non-directory, etc. + + A litmus test that may help a service implementor in deciding + between FAILED_PRECONDITION, ABORTED, and UNAVAILABLE: + (a) Use UNAVAILABLE if the client can retry just the failing call. + (b) Use ABORTED if the client should retry at a higher-level + (e.g., restarting a read-modify-write sequence). + (c) Use FAILED_PRECONDITION if the client should not retry until + the system state has been explicitly fixed. E.g., if an "rmdir" + fails because the directory is non-empty, FAILED_PRECONDITION + should be returned since the client should not retry unless + they have first fixed up the directory by deleting files from it. + (d) Use FAILED_PRECONDITION if the client performs conditional + REST Get/Update/Delete on a resource and the resource on the + server does not match the condition. E.g., conflicting + read-modify-write on the same resource. */ + GRPC_STATUS_FAILED_PRECONDITION = 9, + + /** The operation was aborted, typically due to a concurrency issue + like sequencer check failures, transaction aborts, etc. + + See litmus test above for deciding between FAILED_PRECONDITION, + ABORTED, and UNAVAILABLE. */ + GRPC_STATUS_ABORTED = 10, + + /** Operation was attempted past the valid range. E.g., seeking or + reading past end of file. + + Unlike INVALID_ARGUMENT, this error indicates a problem that may + be fixed if the system state changes. For example, a 32-bit file + system will generate INVALID_ARGUMENT if asked to read at an + offset that is not in the range [0,2^32-1], but it will generate + OUT_OF_RANGE if asked to read from an offset past the current + file size. + + There is a fair bit of overlap between FAILED_PRECONDITION and + OUT_OF_RANGE. We recommend using OUT_OF_RANGE (the more specific + error) when it applies so that callers who are iterating through + a space can easily look for an OUT_OF_RANGE error to detect when + they are done. */ + GRPC_STATUS_OUT_OF_RANGE = 11, + + /** Operation is not implemented or not supported/enabled in this service. */ + GRPC_STATUS_UNIMPLEMENTED = 12, + + /** Internal errors. Means some invariants expected by underlying + system has been broken. If you see one of these errors, + something is very broken. */ + GRPC_STATUS_INTERNAL = 13, + + /** The service is currently unavailable. This is a most likely a + transient condition and may be corrected by retrying with + a backoff. Note that it is not always safe to retry non-idempotent + operations. + + WARNING: Although data MIGHT not have been transmitted when this + status occurs, there is NOT A GUARANTEE that the server has not seen + anything. So in general it is unsafe to retry on this status code + if the call is non-idempotent. + + See litmus test above for deciding between FAILED_PRECONDITION, + ABORTED, and UNAVAILABLE. */ + GRPC_STATUS_UNAVAILABLE = 14, + + /** Unrecoverable data loss or corruption. */ + GRPC_STATUS_DATA_LOSS = 15, + + /** Force users to include a default branch: */ + GRPC_STATUS__DO_NOT_USE = -1 +} grpc_status_code; + +#ifdef __cplusplus +} +#endif + +#endif /* GRPC_IMPL_CODEGEN_STATUS_H */ diff --git a/include/grpc/impl/codegen/sync.h b/include/grpc/impl/codegen/sync.h new file mode 100644 index 00000000..49e31947 --- /dev/null +++ b/include/grpc/impl/codegen/sync.h @@ -0,0 +1,65 @@ +/* + * + * Copyright 2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_IMPL_CODEGEN_SYNC_H +#define GRPC_IMPL_CODEGEN_SYNC_H +/** Synchronization primitives for GPR. + + The type gpr_mu provides a non-reentrant mutex (lock). + + The type gpr_cv provides a condition variable. + + The type gpr_once provides for one-time initialization. + + The type gpr_event provides one-time-setting, reading, and + waiting of a void*, with memory barriers. + + The type gpr_refcount provides an object reference counter, + with memory barriers suitable to control + object lifetimes. + + The type gpr_stats_counter provides an atomic statistics counter. It + provides no memory barriers. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Platform-specific type declarations of gpr_mu and gpr_cv. */ +#include + +#include + +#if defined(GPR_CUSTOM_SYNC) +#include +#elif defined(GPR_ABSEIL_SYNC) +#include +#elif defined(GPR_POSIX_SYNC) +#include +#elif defined(GPR_WINDOWS) +#include +#else +#error Unable to determine platform for sync +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* GRPC_IMPL_CODEGEN_SYNC_H */ diff --git a/include/grpc/impl/codegen/sync_abseil.h b/include/grpc/impl/codegen/sync_abseil.h new file mode 100644 index 00000000..38dfab32 --- /dev/null +++ b/include/grpc/impl/codegen/sync_abseil.h @@ -0,0 +1,36 @@ +/* + * + * Copyright 2020 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_IMPL_CODEGEN_SYNC_ABSEIL_H +#define GRPC_IMPL_CODEGEN_SYNC_ABSEIL_H + +#include + +#include + +#ifdef GPR_ABSEIL_SYNC + +typedef intptr_t gpr_mu; +typedef intptr_t gpr_cv; +typedef int32_t gpr_once; + +#define GPR_ONCE_INIT 0 + +#endif + +#endif /* GRPC_IMPL_CODEGEN_SYNC_ABSEIL_H */ diff --git a/include/grpc/impl/codegen/sync_custom.h b/include/grpc/impl/codegen/sync_custom.h new file mode 100644 index 00000000..69b1bf6c --- /dev/null +++ b/include/grpc/impl/codegen/sync_custom.h @@ -0,0 +1,38 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_IMPL_CODEGEN_SYNC_CUSTOM_H +#define GRPC_IMPL_CODEGEN_SYNC_CUSTOM_H + +#include + +#include + +/* Users defining GPR_CUSTOM_SYNC need to define the following macros. */ + +#ifdef GPR_CUSTOM_SYNC + +typedef GPR_CUSTOM_MU_TYPE gpr_mu; +typedef GPR_CUSTOM_CV_TYPE gpr_cv; +typedef GPR_CUSTOM_ONCE_TYPE gpr_once; + +#define GPR_ONCE_INIT GPR_CUSTOM_ONCE_INIT + +#endif + +#endif /* GRPC_IMPL_CODEGEN_SYNC_CUSTOM_H */ diff --git a/include/grpc/impl/codegen/sync_generic.h b/include/grpc/impl/codegen/sync_generic.h new file mode 100644 index 00000000..eabdc513 --- /dev/null +++ b/include/grpc/impl/codegen/sync_generic.h @@ -0,0 +1,48 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_IMPL_CODEGEN_SYNC_GENERIC_H +#define GRPC_IMPL_CODEGEN_SYNC_GENERIC_H +/* Generic type definitions for gpr_sync. */ + +#include + +#include + +/* gpr_event */ +typedef struct { + gpr_atm state; +} gpr_event; + +#define GPR_EVENT_INIT \ + { 0 } + +/* gpr_refcount */ +typedef struct { + gpr_atm count; +} gpr_refcount; + +/* gpr_stats_counter */ +typedef struct { + gpr_atm value; +} gpr_stats_counter; + +#define GPR_STATS_INIT \ + { 0 } + +#endif /* GRPC_IMPL_CODEGEN_SYNC_GENERIC_H */ diff --git a/include/grpc/impl/codegen/sync_posix.h b/include/grpc/impl/codegen/sync_posix.h new file mode 100644 index 00000000..2aec3a3f --- /dev/null +++ b/include/grpc/impl/codegen/sync_posix.h @@ -0,0 +1,52 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_IMPL_CODEGEN_SYNC_POSIX_H +#define GRPC_IMPL_CODEGEN_SYNC_POSIX_H + +#include + +#include + +#include + +#ifdef GRPC_ASAN_ENABLED +/* The member |leak_checker| is used to check whether there is a memory leak + * caused by upper layer logic that's missing the |gpr_xx_destroy| call + * to the object before freeing it. + * This issue was reported at https://github.com/grpc/grpc/issues/17563 + * and discussed at https://github.com/grpc/grpc/pull/17586 + */ +typedef struct { + pthread_mutex_t mutex; + int* leak_checker; +} gpr_mu; + +typedef struct { + pthread_cond_t cond_var; + int* leak_checker; +} gpr_cv; +#else +typedef pthread_mutex_t gpr_mu; +typedef pthread_cond_t gpr_cv; +#endif +typedef pthread_once_t gpr_once; + +#define GPR_ONCE_INIT PTHREAD_ONCE_INIT + +#endif /* GRPC_IMPL_CODEGEN_SYNC_POSIX_H */ diff --git a/include/grpc/impl/codegen/sync_windows.h b/include/grpc/impl/codegen/sync_windows.h new file mode 100644 index 00000000..ba5d5aed --- /dev/null +++ b/include/grpc/impl/codegen/sync_windows.h @@ -0,0 +1,36 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_IMPL_CODEGEN_SYNC_WINDOWS_H +#define GRPC_IMPL_CODEGEN_SYNC_WINDOWS_H + +#include + +#include + +typedef struct { + CRITICAL_SECTION cs; /* Not an SRWLock until Vista is unsupported */ + int locked; +} gpr_mu; + +typedef CONDITION_VARIABLE gpr_cv; + +typedef INIT_ONCE gpr_once; +#define GPR_ONCE_INIT INIT_ONCE_STATIC_INIT + +#endif /* GRPC_IMPL_CODEGEN_SYNC_WINDOWS_H */ diff --git a/include/grpc/load_reporting.h b/include/grpc/load_reporting.h new file mode 100644 index 00000000..55f50ea8 --- /dev/null +++ b/include/grpc/load_reporting.h @@ -0,0 +1,48 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_LOAD_REPORTING_H +#define GRPC_LOAD_REPORTING_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** Metadata key for the gRPC LB load balancer token. + * + * The value corresponding to this key is an opaque token that is given to the + * frontend as part of each pick; the frontend sends this token to the backend + * in each request it sends when using that pick. The token is used by the + * backend to verify the request and to allow the backend to report load to the + * gRPC LB system. */ +#define GRPC_LB_TOKEN_MD_KEY "lb-token" + +/** Metadata key for gRPC LB cost reporting. + * + * The value corresponding to this key is an opaque binary blob reported by the + * backend as part of its trailing metadata containing cost information for the + * call. */ +#define GRPC_LB_COST_MD_KEY "lb-cost-bin" + +#ifdef __cplusplus +} +#endif + +#endif /* GRPC_LOAD_REPORTING_H */ diff --git a/include/grpc/module.modulemap b/include/grpc/module.modulemap new file mode 100644 index 00000000..06c1e977 --- /dev/null +++ b/include/grpc/module.modulemap @@ -0,0 +1,64 @@ + +framework module grpc { + umbrella header "grpc.h" + + header "impl/codegen/atm.h" + header "impl/codegen/byte_buffer.h" + header "impl/codegen/byte_buffer_reader.h" + header "impl/codegen/compression_types.h" + header "impl/codegen/connectivity_state.h" + header "impl/codegen/fork.h" + header "impl/codegen/gpr_slice.h" + header "impl/codegen/gpr_types.h" + header "impl/codegen/grpc_types.h" + header "impl/codegen/log.h" + header "impl/codegen/port_platform.h" + header "impl/codegen/propagation_bits.h" + header "impl/codegen/slice.h" + header "impl/codegen/status.h" + header "impl/codegen/sync.h" + header "impl/codegen/sync_abseil.h" + header "impl/codegen/sync_generic.h" + header "support/alloc.h" + header "support/atm.h" + header "support/cpu.h" + header "support/log.h" + header "support/log_windows.h" + header "support/port_platform.h" + header "support/string_util.h" + header "support/sync.h" + header "support/sync_abseil.h" + header "support/sync_generic.h" + header "support/thd_id.h" + header "support/time.h" + header "byte_buffer.h" + header "byte_buffer_reader.h" + header "census.h" + header "compression.h" + header "fork.h" + header "grpc.h" + header "grpc_posix.h" + header "grpc_security.h" + header "grpc_security_constants.h" + header "load_reporting.h" + header "slice.h" + header "slice_buffer.h" + header "status.h" + header "support/workaround_list.h" + + textual header "impl/codegen/atm_gcc_atomic.h" + textual header "impl/codegen/atm_gcc_sync.h" + textual header "impl/codegen/atm_windows.h" + textual header "impl/codegen/sync_custom.h" + textual header "impl/codegen/sync_posix.h" + textual header "impl/codegen/sync_windows.h" + textual header "support/atm_gcc_atomic.h" + textual header "support/atm_gcc_sync.h" + textual header "support/atm_windows.h" + textual header "support/sync_custom.h" + textual header "support/sync_posix.h" + textual header "support/sync_windows.h" + + export * + module * { export * } +} diff --git a/include/grpc/slice.h b/include/grpc/slice.h new file mode 100644 index 00000000..51fc62b4 --- /dev/null +++ b/include/grpc/slice.h @@ -0,0 +1,172 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_SLICE_H +#define GRPC_SLICE_H + +#include + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** Increment the refcount of s. Requires slice is initialized. + Returns s. */ +GPRAPI grpc_slice grpc_slice_ref(grpc_slice s); + +/** Decrement the ref count of s. If the ref count of s reaches zero, all + slices sharing the ref count are destroyed, and considered no longer + initialized. If s is ultimately derived from a call to grpc_slice_new(start, + len, dest) where dest!=NULL , then (*dest)(start) is called, else if s is + ultimately derived from a call to grpc_slice_new_with_len(start, len, dest) + where dest!=NULL , then (*dest)(start, len). Requires s initialized. */ +GPRAPI void grpc_slice_unref(grpc_slice s); + +/** Copy slice - create a new slice that contains the same data as s */ +GPRAPI grpc_slice grpc_slice_copy(grpc_slice s); + +/** Create a slice pointing at some data. Calls malloc to allocate a refcount + for the object, and arranges that destroy will be called with the pointer + passed in at destruction. */ +GPRAPI grpc_slice grpc_slice_new(void* p, size_t len, void (*destroy)(void*)); + +/** Equivalent to grpc_slice_new, but with a separate pointer that is + passed to the destroy function. This function can be useful when + the data is part of a larger structure that must be destroyed when + the data is no longer needed. */ +GPRAPI grpc_slice grpc_slice_new_with_user_data(void* p, size_t len, + void (*destroy)(void*), + void* user_data); + +/** Equivalent to grpc_slice_new, but with a two argument destroy function that + also takes the slice length. */ +GPRAPI grpc_slice grpc_slice_new_with_len(void* p, size_t len, + void (*destroy)(void*, size_t)); + +/** Equivalent to grpc_slice_new(malloc(len), len, free), but saves one malloc() + call. + Aborts if malloc() fails. */ +GPRAPI grpc_slice grpc_slice_malloc(size_t length); +GPRAPI grpc_slice grpc_slice_malloc_large(size_t length); + +#define GRPC_SLICE_MALLOC(len) grpc_slice_malloc(len) + +/** Intern a slice: + + The return value for two invocations of this function with the same sequence + of bytes is a slice which points to the same memory. */ +GPRAPI grpc_slice grpc_slice_intern(grpc_slice slice); + +/** Create a slice by copying a string. + Does not preserve null terminators. + Equivalent to: + size_t len = strlen(source); + grpc_slice slice = grpc_slice_malloc(len); + memcpy(slice->data, source, len); */ +GPRAPI grpc_slice grpc_slice_from_copied_string(const char* source); + +/** Create a slice by copying a buffer. + Equivalent to: + grpc_slice slice = grpc_slice_malloc(len); + memcpy(slice->data, source, len); */ +GPRAPI grpc_slice grpc_slice_from_copied_buffer(const char* source, size_t len); + +/** Create a slice pointing to constant memory */ +GPRAPI grpc_slice grpc_slice_from_static_string(const char* source); + +/** Create a slice pointing to constant memory */ +GPRAPI grpc_slice grpc_slice_from_static_buffer(const void* source, size_t len); + +/** Return a result slice derived from s, which shares a ref count with \a s, + where result.data==s.data+begin, and result.length==end-begin. The ref count + of \a s is increased by one. Do not assign result back to \a s. + Requires s initialized, begin <= end, begin <= s.length, and + end <= source->length. */ +GPRAPI grpc_slice grpc_slice_sub(grpc_slice s, size_t begin, size_t end); + +/** The same as grpc_slice_sub, but without altering the ref count */ +GPRAPI grpc_slice grpc_slice_sub_no_ref(grpc_slice s, size_t begin, size_t end); + +/** Splits s into two: modifies s to be s[0:split], and returns a new slice, + sharing a refcount with s, that contains s[split:s.length]. + Requires s initialized, split <= s.length */ +GPRAPI grpc_slice grpc_slice_split_tail(grpc_slice* s, size_t split); + +typedef enum { + GRPC_SLICE_REF_TAIL = 1, + GRPC_SLICE_REF_HEAD = 2, + GRPC_SLICE_REF_BOTH = 1 + 2 +} grpc_slice_ref_whom; + +/** The same as grpc_slice_split_tail, but with an option to skip altering + * refcounts (grpc_slice_split_tail_maybe_ref(..., true) is equivalent to + * grpc_slice_split_tail(...)) */ +GPRAPI grpc_slice grpc_slice_split_tail_maybe_ref(grpc_slice* s, size_t split, + grpc_slice_ref_whom ref_whom); + +/** Splits s into two: modifies s to be s[split:s.length], and returns a new + slice, sharing a refcount with s, that contains s[0:split]. + Requires s initialized, split <= s.length */ +GPRAPI grpc_slice grpc_slice_split_head(grpc_slice* s, size_t split); + +GPRAPI grpc_slice grpc_empty_slice(void); + +GPRAPI uint32_t grpc_slice_default_hash_impl(grpc_slice s); +GPRAPI int grpc_slice_default_eq_impl(grpc_slice a, grpc_slice b); + +GPRAPI int grpc_slice_eq(grpc_slice a, grpc_slice b); + +/** Returns <0 if a < b, ==0 if a == b, >0 if a > b + The order is arbitrary, and is not guaranteed to be stable across different + versions of the API. */ +GPRAPI int grpc_slice_cmp(grpc_slice a, grpc_slice b); +GPRAPI int grpc_slice_str_cmp(grpc_slice a, const char* b); + +/** return non-zero if the first blen bytes of a are equal to b */ +GPRAPI int grpc_slice_buf_start_eq(grpc_slice a, const void* b, size_t blen); + +/** return the index of the last instance of \a c in \a s, or -1 if not found */ +GPRAPI int grpc_slice_rchr(grpc_slice s, char c); +GPRAPI int grpc_slice_chr(grpc_slice s, char c); + +/** return the index of the first occurrence of \a needle in \a haystack, or -1 + if it's not found */ +GPRAPI int grpc_slice_slice(grpc_slice haystack, grpc_slice needle); + +GPRAPI uint32_t grpc_slice_hash(grpc_slice s); + +/** Do two slices point at the same memory, with the same length + If a or b is inlined, actually compares data */ +GPRAPI int grpc_slice_is_equivalent(grpc_slice a, grpc_slice b); + +/** Return a slice pointing to newly allocated memory that has the same contents + * as \a s */ +GPRAPI grpc_slice grpc_slice_dup(grpc_slice a); + +/** Return a copy of slice as a C string. Offers no protection against embedded + NULL's. Returned string must be freed with gpr_free. */ +GPRAPI char* grpc_slice_to_c_string(grpc_slice s); + +#ifdef __cplusplus +} +#endif + +#endif /* GRPC_SLICE_H */ diff --git a/include/grpc/slice_buffer.h b/include/grpc/slice_buffer.h new file mode 100644 index 00000000..3260019c --- /dev/null +++ b/include/grpc/slice_buffer.h @@ -0,0 +1,84 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_SLICE_BUFFER_H +#define GRPC_SLICE_BUFFER_H + +#include + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** initialize a slice buffer */ +GPRAPI void grpc_slice_buffer_init(grpc_slice_buffer* sb); +/** destroy a slice buffer - unrefs any held elements */ +GPRAPI void grpc_slice_buffer_destroy(grpc_slice_buffer* sb); +/** Add an element to a slice buffer - takes ownership of the slice. + This function is allowed to concatenate the passed in slice to the end of + some other slice if desired by the slice buffer. */ +GPRAPI void grpc_slice_buffer_add(grpc_slice_buffer* sb, grpc_slice slice); +/** add an element to a slice buffer - takes ownership of the slice and returns + the index of the slice. + Guarantees that the slice will not be concatenated at the end of another + slice (i.e. the data for this slice will begin at the first byte of the + slice at the returned index in sb->slices) + The implementation MAY decide to concatenate data at the end of a small + slice added in this fashion. */ +GPRAPI size_t grpc_slice_buffer_add_indexed(grpc_slice_buffer* sb, + grpc_slice slice); +GPRAPI void grpc_slice_buffer_addn(grpc_slice_buffer* sb, grpc_slice* slices, + size_t n); +/** add a very small (less than 8 bytes) amount of data to the end of a slice + buffer: returns a pointer into which to add the data */ +GPRAPI uint8_t* grpc_slice_buffer_tiny_add(grpc_slice_buffer* sb, size_t len); +/** pop the last buffer, but don't unref it */ +GPRAPI void grpc_slice_buffer_pop(grpc_slice_buffer* sb); +/** clear a slice buffer, unref all elements */ +GPRAPI void grpc_slice_buffer_reset_and_unref(grpc_slice_buffer* sb); +/** swap the contents of two slice buffers */ +GPRAPI void grpc_slice_buffer_swap(grpc_slice_buffer* a, grpc_slice_buffer* b); +/** move all of the elements of src into dst */ +GPRAPI void grpc_slice_buffer_move_into(grpc_slice_buffer* src, + grpc_slice_buffer* dst); +/** remove n bytes from the end of a slice buffer */ +GPRAPI void grpc_slice_buffer_trim_end(grpc_slice_buffer* src, size_t n, + grpc_slice_buffer* garbage); +/** move the first n bytes of src into dst */ +GPRAPI void grpc_slice_buffer_move_first(grpc_slice_buffer* src, size_t n, + grpc_slice_buffer* dst); +/** move the first n bytes of src into dst without adding references */ +GPRAPI void grpc_slice_buffer_move_first_no_ref(grpc_slice_buffer* src, + size_t n, + grpc_slice_buffer* dst); +/** move the first n bytes of src into dst (copying them) */ +GPRAPI void grpc_slice_buffer_move_first_into_buffer(grpc_slice_buffer* src, + size_t n, void* dst); +/** take the first slice in the slice buffer */ +GPRAPI grpc_slice grpc_slice_buffer_take_first(grpc_slice_buffer* src); +/** undo the above with (a possibly different) \a slice */ +GPRAPI void grpc_slice_buffer_undo_take_first(grpc_slice_buffer* src, + grpc_slice slice); + +#ifdef __cplusplus +} +#endif + +#endif /* GRPC_SLICE_BUFFER_H */ diff --git a/include/grpc/status.h b/include/grpc/status.h new file mode 100644 index 00000000..ecb9668b --- /dev/null +++ b/include/grpc/status.h @@ -0,0 +1,26 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_STATUS_H +#define GRPC_STATUS_H + +#include + +#include + +#endif /* GRPC_STATUS_H */ diff --git a/include/grpc/support/alloc.h b/include/grpc/support/alloc.h new file mode 100644 index 00000000..d440e4be --- /dev/null +++ b/include/grpc/support/alloc.h @@ -0,0 +1,52 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_SUPPORT_ALLOC_H +#define GRPC_SUPPORT_ALLOC_H + +#include + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** malloc. + * If size==0, always returns NULL. Otherwise this function never returns NULL. + * The pointer returned is suitably aligned for any kind of variable it could + * contain. + */ +GPRAPI void* gpr_malloc(size_t size); +/** like malloc, but zero all bytes before returning them */ +GPRAPI void* gpr_zalloc(size_t size); +/** free */ +GPRAPI void gpr_free(void* ptr); +/** realloc, never returns NULL */ +GPRAPI void* gpr_realloc(void* p, size_t size); +/** aligned malloc, never returns NULL, will align to alignment, which + * must be a power of 2. */ +GPRAPI void* gpr_malloc_aligned(size_t size, size_t alignment); +/** free memory allocated by gpr_malloc_aligned */ +GPRAPI void gpr_free_aligned(void* ptr); + +#ifdef __cplusplus +} +#endif + +#endif /* GRPC_SUPPORT_ALLOC_H */ diff --git a/include/grpc/support/atm.h b/include/grpc/support/atm.h new file mode 100644 index 00000000..073b0a6f --- /dev/null +++ b/include/grpc/support/atm.h @@ -0,0 +1,26 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_SUPPORT_ATM_H +#define GRPC_SUPPORT_ATM_H + +#include + +#include + +#endif /* GRPC_SUPPORT_ATM_H */ diff --git a/include/grpc/support/atm_gcc_atomic.h b/include/grpc/support/atm_gcc_atomic.h new file mode 100644 index 00000000..ae603db4 --- /dev/null +++ b/include/grpc/support/atm_gcc_atomic.h @@ -0,0 +1,26 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_SUPPORT_ATM_GCC_ATOMIC_H +#define GRPC_SUPPORT_ATM_GCC_ATOMIC_H + +#include + +#include + +#endif /* GRPC_SUPPORT_ATM_GCC_ATOMIC_H */ diff --git a/include/grpc/support/atm_gcc_sync.h b/include/grpc/support/atm_gcc_sync.h new file mode 100644 index 00000000..6f51fdb1 --- /dev/null +++ b/include/grpc/support/atm_gcc_sync.h @@ -0,0 +1,26 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_SUPPORT_ATM_GCC_SYNC_H +#define GRPC_SUPPORT_ATM_GCC_SYNC_H + +#include + +#include + +#endif /* GRPC_SUPPORT_ATM_GCC_SYNC_H */ diff --git a/include/grpc/support/atm_windows.h b/include/grpc/support/atm_windows.h new file mode 100644 index 00000000..36955e4d --- /dev/null +++ b/include/grpc/support/atm_windows.h @@ -0,0 +1,26 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_SUPPORT_ATM_WINDOWS_H +#define GRPC_SUPPORT_ATM_WINDOWS_H + +#include + +#include + +#endif /* GRPC_SUPPORT_ATM_WINDOWS_H */ diff --git a/include/grpc/support/cpu.h b/include/grpc/support/cpu.h new file mode 100644 index 00000000..f0e898e8 --- /dev/null +++ b/include/grpc/support/cpu.h @@ -0,0 +1,44 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_SUPPORT_CPU_H +#define GRPC_SUPPORT_CPU_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** Interface providing CPU information for currently running system */ + +/** Return the number of CPU cores on the current system. Will return 0 if + the information is not available. */ +GPRAPI unsigned gpr_cpu_num_cores(void); + +/** Return the CPU on which the current thread is executing; N.B. This should + be considered advisory only - it is possible that the thread is switched + to a different CPU at any time. Returns a value in range + [0, gpr_cpu_num_cores() - 1] */ +GPRAPI unsigned gpr_cpu_current_cpu(void); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif /* GRPC_SUPPORT_CPU_H */ diff --git a/include/grpc/support/log.h b/include/grpc/support/log.h new file mode 100644 index 00000000..8d8742b9 --- /dev/null +++ b/include/grpc/support/log.h @@ -0,0 +1,26 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_SUPPORT_LOG_H +#define GRPC_SUPPORT_LOG_H + +#include + +#include + +#endif /* GRPC_SUPPORT_LOG_H */ diff --git a/include/grpc/support/log_windows.h b/include/grpc/support/log_windows.h new file mode 100644 index 00000000..e833f9d9 --- /dev/null +++ b/include/grpc/support/log_windows.h @@ -0,0 +1,38 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_SUPPORT_LOG_WINDOWS_H +#define GRPC_SUPPORT_LOG_WINDOWS_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** Returns a string allocated with gpr_malloc that contains a UTF-8 + * formatted error message, corresponding to the error messageid. + * Use in conjunction with GetLastError() et al. + */ +GPRAPI char* gpr_format_message(int messageid); + +#ifdef __cplusplus +} +#endif + +#endif /* GRPC_SUPPORT_LOG_WINDOWS_H */ diff --git a/include/grpc/support/port_platform.h b/include/grpc/support/port_platform.h new file mode 100644 index 00000000..26025dcd --- /dev/null +++ b/include/grpc/support/port_platform.h @@ -0,0 +1,24 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_SUPPORT_PORT_PLATFORM_H +#define GRPC_SUPPORT_PORT_PLATFORM_H + +#include + +#endif /* GRPC_SUPPORT_PORT_PLATFORM_H */ diff --git a/include/grpc/support/string_util.h b/include/grpc/support/string_util.h new file mode 100644 index 00000000..2679160c --- /dev/null +++ b/include/grpc/support/string_util.h @@ -0,0 +1,51 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_SUPPORT_STRING_UTIL_H +#define GRPC_SUPPORT_STRING_UTIL_H + +#include + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** String utility functions */ + +/** Returns a copy of src that can be passed to gpr_free(). + If allocation fails or if src is NULL, returns NULL. */ +GPRAPI char* gpr_strdup(const char* src); + +/** printf to a newly-allocated string. The set of supported formats may vary + between platforms. + + On success, returns the number of bytes printed (excluding the final '\0'), + and *strp points to a string which must later be destroyed with gpr_free(). + + On error, returns -1 and sets *strp to NULL. If the format string is bad, + the result is undefined. */ +GPRAPI int gpr_asprintf(char** strp, const char* format, ...) + GPR_PRINT_FORMAT_CHECK(2, 3); + +#ifdef __cplusplus +} +#endif + +#endif /* GRPC_SUPPORT_STRING_UTIL_H */ diff --git a/include/grpc/support/sync.h b/include/grpc/support/sync.h new file mode 100644 index 00000000..da820dec --- /dev/null +++ b/include/grpc/support/sync.h @@ -0,0 +1,282 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_SUPPORT_SYNC_H +#define GRPC_SUPPORT_SYNC_H + +#include + +#include /* for gpr_timespec */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** --- Mutex interface --- + + At most one thread may hold an exclusive lock on a mutex at any given time. + Actions taken by a thread that holds a mutex exclusively happen after + actions taken by all previous holders of the mutex. Variables of type + gpr_mu are uninitialized when first declared. */ + +/** Initialize *mu. Requires: *mu uninitialized. */ +GPRAPI void gpr_mu_init(gpr_mu* mu); + +/** Cause *mu no longer to be initialized, freeing any memory in use. Requires: + *mu initialized; no other concurrent operation on *mu. */ +GPRAPI void gpr_mu_destroy(gpr_mu* mu); + +/** Wait until no thread has a lock on *mu, cause the calling thread to own an + exclusive lock on *mu, then return. May block indefinitely or crash if the + calling thread has a lock on *mu. Requires: *mu initialized. */ +GPRAPI void gpr_mu_lock(gpr_mu* mu); + +/** Release an exclusive lock on *mu held by the calling thread. Requires: *mu + initialized; the calling thread holds an exclusive lock on *mu. */ +GPRAPI void gpr_mu_unlock(gpr_mu* mu); + +/** Without blocking, attempt to acquire an exclusive lock on *mu for the + calling thread, then return non-zero iff success. Fail, if any thread holds + the lock; succeeds with high probability if no thread holds the lock. + Requires: *mu initialized. */ +GPRAPI int gpr_mu_trylock(gpr_mu* mu); + +/** --- Condition variable interface --- + + A while-loop should be used with gpr_cv_wait() when waiting for conditions + to become true. See the example below. Variables of type gpr_cv are + uninitialized when first declared. */ + +/** Initialize *cv. Requires: *cv uninitialized. */ +GPRAPI void gpr_cv_init(gpr_cv* cv); + +/** Cause *cv no longer to be initialized, freeing any memory in use. Requires: + *cv initialized; no other concurrent operation on *cv.*/ +GPRAPI void gpr_cv_destroy(gpr_cv* cv); + +/** Atomically release *mu and wait on *cv. When the calling thread is woken + from *cv or the deadline abs_deadline is exceeded, execute gpr_mu_lock(mu) + and return whether the deadline was exceeded. Use + abs_deadline==gpr_inf_future for no deadline. abs_deadline can be either + an absolute deadline, or a GPR_TIMESPAN. May return even when not + woken explicitly. Requires: *mu and *cv initialized; the calling thread + holds an exclusive lock on *mu. */ +GPRAPI int gpr_cv_wait(gpr_cv* cv, gpr_mu* mu, gpr_timespec abs_deadline); + +/** If any threads are waiting on *cv, wake at least one. + Clients may treat this as an optimization of gpr_cv_broadcast() + for use in the case where waking more than one waiter is not useful. + Requires: *cv initialized. */ +GPRAPI void gpr_cv_signal(gpr_cv* cv); + +/** Wake all threads waiting on *cv. Requires: *cv initialized. */ +GPRAPI void gpr_cv_broadcast(gpr_cv* cv); + +/** --- One-time initialization --- + + gpr_once must be declared with static storage class, and initialized with + GPR_ONCE_INIT. e.g., + static gpr_once once_var = GPR_ONCE_INIT; */ + +/** Ensure that (*init_routine)() has been called exactly once (for the + specified gpr_once instance) and then return. + If multiple threads call gpr_once() on the same gpr_once instance, one of + them will call (*init_routine)(), and the others will block until that call + finishes.*/ +GPRAPI void gpr_once_init(gpr_once* once, void (*init_routine)(void)); + +/** --- One-time event notification --- + + These operations act on a gpr_event, which should be initialized with + gpr_ev_init(), or with GPR_EVENT_INIT if static, e.g., + static gpr_event event_var = GPR_EVENT_INIT; + It requires no destruction. */ + +/** Initialize *ev. */ +GPRAPI void gpr_event_init(gpr_event* ev); + +/** Set *ev so that gpr_event_get() and gpr_event_wait() will return value. + Requires: *ev initialized; value != NULL; no prior or concurrent calls to + gpr_event_set(ev, ...) since initialization. */ +GPRAPI void gpr_event_set(gpr_event* ev, void* value); + +/** Return the value set by gpr_event_set(ev, ...), or NULL if no such call has + completed. If the result is non-NULL, all operations that occurred prior to + the gpr_event_set(ev, ...) set will be visible after this call returns. + Requires: *ev initialized. This operation is faster than acquiring a mutex + on most platforms. */ +GPRAPI void* gpr_event_get(gpr_event* ev); + +/** Wait until *ev is set by gpr_event_set(ev, ...), or abs_deadline is + exceeded, then return gpr_event_get(ev). Requires: *ev initialized. Use + abs_deadline==gpr_inf_future for no deadline. When the event has been + signalled before the call, this operation is faster than acquiring a mutex + on most platforms. */ +GPRAPI void* gpr_event_wait(gpr_event* ev, gpr_timespec abs_deadline); + +/** --- Reference counting --- + + These calls act on the type gpr_refcount. It requires no destruction. */ + +/** Initialize *r to value n. */ +GPRAPI void gpr_ref_init(gpr_refcount* r, int n); + +/** Increment the reference count *r. Requires *r initialized. */ +GPRAPI void gpr_ref(gpr_refcount* r); + +/** Increment the reference count *r. Requires *r initialized. + Crashes if refcount is zero */ +GPRAPI void gpr_ref_non_zero(gpr_refcount* r); + +/** Increment the reference count *r by n. Requires *r initialized, n > 0. */ +GPRAPI void gpr_refn(gpr_refcount* r, int n); + +/** Decrement the reference count *r and return non-zero iff it has reached + zero. . Requires *r initialized. */ +GPRAPI int gpr_unref(gpr_refcount* r); + +/** Return non-zero iff the reference count of *r is one, and thus is owned + by exactly one object. */ +GPRAPI int gpr_ref_is_unique(gpr_refcount* r); + +/** --- Stats counters --- + + These calls act on the integral type gpr_stats_counter. It requires no + destruction. Static instances may be initialized with + gpr_stats_counter c = GPR_STATS_INIT; + Beware: These operations do not imply memory barriers. Do not use them to + synchronize other events. */ + +/** Initialize *c to the value n. */ +GPRAPI void gpr_stats_init(gpr_stats_counter* c, intptr_t n); + +/** *c += inc. Requires: *c initialized. */ +GPRAPI void gpr_stats_inc(gpr_stats_counter* c, intptr_t inc); + +/** Return *c. Requires: *c initialized. */ +GPRAPI intptr_t gpr_stats_read(const gpr_stats_counter* c); + +/** ==================Example use of interface=================== + A producer-consumer queue of up to N integers, + illustrating the use of the calls in this interface. */ +#if 0 + +#define N 4 + + typedef struct queue { + gpr_cv non_empty; /* Signalled when length becomes non-zero. */ + gpr_cv non_full; /* Signalled when length becomes non-N. */ + gpr_mu mu; /* Protects all fields below. + (That is, except during initialization or + destruction, the fields below should be accessed + only by a thread that holds mu.) */ + int head; /* Index of head of queue 0..N-1. */ + int length; /* Number of valid elements in queue 0..N. */ + int elem[N]; /* elem[head .. head+length-1] are queue elements. */ + } queue; + + /* Initialize *q. */ + void queue_init(queue *q) { + gpr_mu_init(&q->mu); + gpr_cv_init(&q->non_empty); + gpr_cv_init(&q->non_full); + q->head = 0; + q->length = 0; + } + + /* Free storage associated with *q. */ + void queue_destroy(queue *q) { + gpr_mu_destroy(&q->mu); + gpr_cv_destroy(&q->non_empty); + gpr_cv_destroy(&q->non_full); + } + + /* Wait until there is room in *q, then append x to *q. */ + void queue_append(queue *q, int x) { + gpr_mu_lock(&q->mu); + /* To wait for a predicate without a deadline, loop on the negation of the + predicate, and use gpr_cv_wait(..., gpr_inf_future) inside the loop + to release the lock, wait, and reacquire on each iteration. Code that + makes the condition true should use gpr_cv_broadcast() on the + corresponding condition variable. The predicate must be on state + protected by the lock. */ + while (q->length == N) { + gpr_cv_wait(&q->non_full, &q->mu, gpr_inf_future); + } + if (q->length == 0) { /* Wake threads blocked in queue_remove(). */ + /* It's normal to use gpr_cv_broadcast() or gpr_signal() while + holding the lock. */ + gpr_cv_broadcast(&q->non_empty); + } + q->elem[(q->head + q->length) % N] = x; + q->length++; + gpr_mu_unlock(&q->mu); + } + + /* If it can be done without blocking, append x to *q and return non-zero. + Otherwise return 0. */ + int queue_try_append(queue *q, int x) { + int result = 0; + if (gpr_mu_trylock(&q->mu)) { + if (q->length != N) { + if (q->length == 0) { /* Wake threads blocked in queue_remove(). */ + gpr_cv_broadcast(&q->non_empty); + } + q->elem[(q->head + q->length) % N] = x; + q->length++; + result = 1; + } + gpr_mu_unlock(&q->mu); + } + return result; + } + + /* Wait until the *q is non-empty or deadline abs_deadline passes. If the + queue is non-empty, remove its head entry, place it in *head, and return + non-zero. Otherwise return 0. */ + int queue_remove(queue *q, int *head, gpr_timespec abs_deadline) { + int result = 0; + gpr_mu_lock(&q->mu); + /* To wait for a predicate with a deadline, loop on the negation of the + predicate or until gpr_cv_wait() returns true. Code that makes + the condition true should use gpr_cv_broadcast() on the corresponding + condition variable. The predicate must be on state protected by the + lock. */ + while (q->length == 0 && + !gpr_cv_wait(&q->non_empty, &q->mu, abs_deadline)) { + } + if (q->length != 0) { /* Queue is non-empty. */ + result = 1; + if (q->length == N) { /* Wake threads blocked in queue_append(). */ + gpr_cv_broadcast(&q->non_full); + } + *head = q->elem[q->head]; + q->head = (q->head + 1) % N; + q->length--; + } /* else deadline exceeded */ + gpr_mu_unlock(&q->mu); + return result; + } +#endif /* 0 */ + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif /* GRPC_SUPPORT_SYNC_H */ diff --git a/include/grpc/support/sync_abseil.h b/include/grpc/support/sync_abseil.h new file mode 100644 index 00000000..3ee73489 --- /dev/null +++ b/include/grpc/support/sync_abseil.h @@ -0,0 +1,26 @@ +/* + * + * Copyright 2020 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_SUPPORT_SYNC_ABSEIL_H +#define GRPC_SUPPORT_SYNC_ABSEIL_H + +#include + +#include + +#endif /* GRPC_SUPPORT_SYNC_ABSEIL_H */ diff --git a/include/grpc/support/sync_custom.h b/include/grpc/support/sync_custom.h new file mode 100644 index 00000000..27cf0e05 --- /dev/null +++ b/include/grpc/support/sync_custom.h @@ -0,0 +1,26 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_SUPPORT_SYNC_CUSTOM_H +#define GRPC_SUPPORT_SYNC_CUSTOM_H + +#include + +#include + +#endif /* GRPC_SUPPORT_SYNC_CUSTOM_H */ diff --git a/include/grpc/support/sync_generic.h b/include/grpc/support/sync_generic.h new file mode 100644 index 00000000..93028c4a --- /dev/null +++ b/include/grpc/support/sync_generic.h @@ -0,0 +1,26 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_SUPPORT_SYNC_GENERIC_H +#define GRPC_SUPPORT_SYNC_GENERIC_H + +#include + +#include + +#endif /* GRPC_SUPPORT_SYNC_GENERIC_H */ diff --git a/include/grpc/support/sync_posix.h b/include/grpc/support/sync_posix.h new file mode 100644 index 00000000..3dce7ee4 --- /dev/null +++ b/include/grpc/support/sync_posix.h @@ -0,0 +1,26 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_SUPPORT_SYNC_POSIX_H +#define GRPC_SUPPORT_SYNC_POSIX_H + +#include + +#include + +#endif /* GRPC_SUPPORT_SYNC_POSIX_H */ diff --git a/include/grpc/support/sync_windows.h b/include/grpc/support/sync_windows.h new file mode 100644 index 00000000..a493c864 --- /dev/null +++ b/include/grpc/support/sync_windows.h @@ -0,0 +1,26 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_SUPPORT_SYNC_WINDOWS_H +#define GRPC_SUPPORT_SYNC_WINDOWS_H + +#include + +#include + +#endif /* GRPC_SUPPORT_SYNC_WINDOWS_H */ diff --git a/include/grpc/support/thd_id.h b/include/grpc/support/thd_id.h new file mode 100644 index 00000000..e9b2b7ec --- /dev/null +++ b/include/grpc/support/thd_id.h @@ -0,0 +1,44 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_SUPPORT_THD_ID_H +#define GRPC_SUPPORT_THD_ID_H +/** Thread ID interface for GPR. + + Used by some wrapped languages for logging purposes. + + Types + gpr_thd_id a unique opaque identifier for a thread. + */ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef uintptr_t gpr_thd_id; + +/** Returns the identifier of the current thread. */ +GPRAPI gpr_thd_id gpr_thd_currentid(void); + +#ifdef __cplusplus +} +#endif + +#endif /* GRPC_SUPPORT_THD_ID_H */ diff --git a/include/grpc/support/time.h b/include/grpc/support/time.h new file mode 100644 index 00000000..550ffc2c --- /dev/null +++ b/include/grpc/support/time.h @@ -0,0 +1,92 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_SUPPORT_TIME_H +#define GRPC_SUPPORT_TIME_H + +#include + +#include + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** Time constants. */ +GPRAPI gpr_timespec +gpr_time_0(gpr_clock_type type); /** The zero time interval. */ +GPRAPI gpr_timespec gpr_inf_future(gpr_clock_type type); /** The far future */ +GPRAPI gpr_timespec gpr_inf_past(gpr_clock_type type); /** The far past. */ + +#define GPR_MS_PER_SEC 1000 +#define GPR_US_PER_SEC 1000000 +#define GPR_NS_PER_SEC 1000000000 +#define GPR_NS_PER_MS 1000000 +#define GPR_NS_PER_US 1000 +#define GPR_US_PER_MS 1000 + +/** initialize time subsystem */ +GPRAPI void gpr_time_init(void); + +/** Return the current time measured from the given clocks epoch. */ +GPRAPI gpr_timespec gpr_now(gpr_clock_type clock); + +/** Convert a timespec from one clock to another */ +GPRAPI gpr_timespec gpr_convert_clock_type(gpr_timespec t, + gpr_clock_type target_clock); + +/** Return -ve, 0, or +ve according to whether a < b, a == b, or a > b + respectively. */ +GPRAPI int gpr_time_cmp(gpr_timespec a, gpr_timespec b); + +GPRAPI gpr_timespec gpr_time_max(gpr_timespec a, gpr_timespec b); +GPRAPI gpr_timespec gpr_time_min(gpr_timespec a, gpr_timespec b); + +/** Add and subtract times. Calculations saturate at infinities. */ +GPRAPI gpr_timespec gpr_time_add(gpr_timespec a, gpr_timespec b); +GPRAPI gpr_timespec gpr_time_sub(gpr_timespec a, gpr_timespec b); + +/** Return a timespec representing a given number of time units. INT64_MIN is + interpreted as gpr_inf_past, and INT64_MAX as gpr_inf_future. */ +GPRAPI gpr_timespec gpr_time_from_micros(int64_t x, gpr_clock_type clock_type); +GPRAPI gpr_timespec gpr_time_from_nanos(int64_t x, gpr_clock_type clock_type); +GPRAPI gpr_timespec gpr_time_from_millis(int64_t x, gpr_clock_type clock_type); +GPRAPI gpr_timespec gpr_time_from_seconds(int64_t x, gpr_clock_type clock_type); +GPRAPI gpr_timespec gpr_time_from_minutes(int64_t x, gpr_clock_type clock_type); +GPRAPI gpr_timespec gpr_time_from_hours(int64_t x, gpr_clock_type clock_type); + +GPRAPI int32_t gpr_time_to_millis(gpr_timespec timespec); + +/** Return 1 if two times are equal or within threshold of each other, + 0 otherwise */ +GPRAPI int gpr_time_similar(gpr_timespec a, gpr_timespec b, + gpr_timespec threshold); + +/** Sleep until at least 'until' - an absolute timeout */ +GPRAPI void gpr_sleep_until(gpr_timespec until); + +GPRAPI double gpr_timespec_to_micros(gpr_timespec t); + +#ifdef __cplusplus +} +#endif + +#endif /* GRPC_SUPPORT_TIME_H */ diff --git a/include/grpc/support/workaround_list.h b/include/grpc/support/workaround_list.h new file mode 100644 index 00000000..e28dfa14 --- /dev/null +++ b/include/grpc/support/workaround_list.h @@ -0,0 +1,31 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_SUPPORT_WORKAROUND_LIST_H +#define GRPC_SUPPORT_WORKAROUND_LIST_H + +/* The list of IDs of server workarounds currently maintained by gRPC. For + * explanation and detailed descriptions of workarounds, see + * /doc/workarounds.md + */ +typedef enum { + GRPC_WORKAROUND_ID_CRONET_COMPRESSION = 0, + GRPC_MAX_WORKAROUND_ID +} grpc_workaround_list; + +#endif /* GRPC_SUPPORT_WORKAROUND_LIST_H */ diff --git a/include/grpcpp/alarm.h b/include/grpcpp/alarm.h new file mode 100644 index 00000000..2343c114 --- /dev/null +++ b/include/grpcpp/alarm.h @@ -0,0 +1,29 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_ALARM_H +#define GRPCPP_ALARM_H + +#include + +namespace grpc { + +typedef ::grpc_impl::Alarm Alarm; +} + +#endif // GRPCPP_ALARM_H diff --git a/include/grpcpp/alarm_impl.h b/include/grpcpp/alarm_impl.h new file mode 100644 index 00000000..cd37882e --- /dev/null +++ b/include/grpcpp/alarm_impl.h @@ -0,0 +1,125 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +/// An Alarm posts the user-provided tag to its associated completion queue or +/// invokes the user-provided function on expiry or cancellation. +#ifndef GRPCPP_ALARM_IMPL_H +#define GRPCPP_ALARM_IMPL_H + +#include + +#include +#include +#include +#include +#include +#include + +namespace grpc_impl { + +class Alarm : private ::grpc::GrpcLibraryCodegen { + public: + /// Create an unset completion queue alarm + Alarm(); + + /// Destroy the given completion queue alarm, cancelling it in the process. + ~Alarm(); + + /// DEPRECATED: Create and set a completion queue alarm instance associated to + /// \a cq. + /// This form is deprecated because it is inherently racy. + /// \internal We rely on the presence of \a cq for grpc initialization. If \a + /// cq were ever to be removed, a reference to a static + /// internal::GrpcLibraryInitializer instance would need to be introduced + /// here. \endinternal. + template + Alarm(::grpc::CompletionQueue* cq, const T& deadline, void* tag) : Alarm() { + SetInternal(cq, ::grpc::TimePoint(deadline).raw_time(), tag); + } + + /// Trigger an alarm instance on completion queue \a cq at the specified time. + /// Once the alarm expires (at \a deadline) or it's cancelled (see \a Cancel), + /// an event with tag \a tag will be added to \a cq. If the alarm expired, the + /// event's success bit will be true, false otherwise (ie, upon cancellation). + template + void Set(::grpc::CompletionQueue* cq, const T& deadline, void* tag) { + SetInternal(cq, ::grpc::TimePoint(deadline).raw_time(), tag); + } + + /// Alarms aren't copyable. + Alarm(const Alarm&) = delete; + Alarm& operator=(const Alarm&) = delete; + + /// Alarms are movable. + Alarm(Alarm&& rhs) : alarm_(rhs.alarm_) { rhs.alarm_ = nullptr; } + Alarm& operator=(Alarm&& rhs) { + alarm_ = rhs.alarm_; + rhs.alarm_ = nullptr; + return *this; + } + + /// Cancel a completion queue alarm. Calling this function over an alarm that + /// has already fired has no effect. + void Cancel(); + +#ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL + /// Set an alarm to invoke callback \a f. The argument to the callback + /// states whether the alarm expired at \a deadline (true) or was cancelled + /// (false) + template + void Set(const T& deadline, std::function f) { + SetInternal(::grpc::TimePoint(deadline).raw_time(), std::move(f)); + } +#endif + + /// NOTE: class experimental_type is not part of the public API of this class + /// TODO(vjpai): Move these contents to the public API of Alarm when + /// they are no longer experimental + class experimental_type { + public: + explicit experimental_type(Alarm* alarm) : alarm_(alarm) {} + + /// Set an alarm to invoke callback \a f. The argument to the callback + /// states whether the alarm expired at \a deadline (true) or was cancelled + /// (false) + template + void Set(const T& deadline, std::function f) { + alarm_->SetInternal(::grpc::TimePoint(deadline).raw_time(), + std::move(f)); + } + + private: + Alarm* alarm_; + }; + + /// NOTE: The function experimental() is not stable public API. It is a view + /// to the experimental components of this class. It may be changed or removed + /// at any time. + experimental_type experimental() { return experimental_type(this); } + + private: + void SetInternal(::grpc::CompletionQueue* cq, gpr_timespec deadline, + void* tag); + void SetInternal(gpr_timespec deadline, std::function f); + + ::grpc::internal::CompletionQueueTag* alarm_; +}; + +} // namespace grpc_impl + +#endif // GRPCPP_ALARM_IMPL_H diff --git a/include/grpcpp/channel.h b/include/grpcpp/channel.h new file mode 100644 index 00000000..163c804f --- /dev/null +++ b/include/grpcpp/channel.h @@ -0,0 +1,37 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_CHANNEL_H +#define GRPCPP_CHANNEL_H + +#include + +namespace grpc { + +typedef ::grpc_impl::Channel Channel; + +namespace experimental { +/// Resets the channel's connection backoff. +/// TODO(roth): Once we see whether this proves useful, either create a gRFC +/// and change this to be a method of the Channel class, or remove it. +void ChannelResetConnectionBackoff(Channel* channel); +} // namespace experimental + +} // namespace grpc + +#endif // GRPCPP_CHANNEL_H diff --git a/include/grpcpp/channel_impl.h b/include/grpcpp/channel_impl.h new file mode 100644 index 00000000..6cc63ba0 --- /dev/null +++ b/include/grpcpp/channel_impl.h @@ -0,0 +1,130 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_CHANNEL_IMPL_H +#define GRPCPP_CHANNEL_IMPL_H + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +struct grpc_channel; + +namespace grpc { +namespace testing { +class ChannelTestPeer; +} // namespace testing + +std::shared_ptr<::grpc_impl::Channel> CreateChannelInternal( + const grpc::string& host, grpc_channel* c_channel, + std::vector< + std::unique_ptr> + interceptor_creators); +} // namespace grpc +namespace grpc_impl { + +namespace experimental { +/// Resets the channel's connection backoff. +/// TODO(roth): Once we see whether this proves useful, either create a gRFC +/// and change this to be a method of the Channel class, or remove it. +void ChannelResetConnectionBackoff(Channel* channel); +} // namespace experimental + +/// Channels represent a connection to an endpoint. Created by \a CreateChannel. +class Channel final : public ::grpc::ChannelInterface, + public ::grpc::internal::CallHook, + public std::enable_shared_from_this, + private ::grpc::GrpcLibraryCodegen { + public: + ~Channel(); + + /// Get the current channel state. If the channel is in IDLE and + /// \a try_to_connect is set to true, try to connect. + grpc_connectivity_state GetState(bool try_to_connect) override; + + /// Returns the LB policy name, or the empty string if not yet available. + grpc::string GetLoadBalancingPolicyName() const; + + /// Returns the service config in JSON form, or the empty string if + /// not available. + grpc::string GetServiceConfigJSON() const; + + private: + template + friend class ::grpc::internal::BlockingUnaryCallImpl; + friend class ::grpc::testing::ChannelTestPeer; + friend void experimental::ChannelResetConnectionBackoff(Channel* channel); + friend std::shared_ptr grpc::CreateChannelInternal( + const grpc::string& host, grpc_channel* c_channel, + std::vector> + interceptor_creators); + friend class ::grpc::internal::InterceptedChannel; + Channel(const grpc::string& host, grpc_channel* c_channel, + std::vector> + interceptor_creators); + + ::grpc::internal::Call CreateCall(const ::grpc::internal::RpcMethod& method, + ::grpc_impl::ClientContext* context, + ::grpc_impl::CompletionQueue* cq) override; + void PerformOpsOnCall(::grpc::internal::CallOpSetInterface* ops, + ::grpc::internal::Call* call) override; + void* RegisterMethod(const char* method) override; + + void NotifyOnStateChangeImpl(grpc_connectivity_state last_observed, + gpr_timespec deadline, + ::grpc_impl::CompletionQueue* cq, + void* tag) override; + bool WaitForStateChangeImpl(grpc_connectivity_state last_observed, + gpr_timespec deadline) override; + + ::grpc_impl::CompletionQueue* CallbackCQ() override; + + ::grpc::internal::Call CreateCallInternal( + const ::grpc::internal::RpcMethod& method, + ::grpc_impl::ClientContext* context, ::grpc_impl::CompletionQueue* cq, + size_t interceptor_pos) override; + + const grpc::string host_; + grpc_channel* const c_channel_; // owned + + // mu_ protects callback_cq_ (the per-channel callbackable completion queue) + grpc::internal::Mutex mu_; + + // callback_cq_ references the callbackable completion queue associated + // with this channel (if any). It is set on the first call to CallbackCQ(). + // It is _not owned_ by the channel; ownership belongs with its internal + // shutdown callback tag (invoked when the CQ is fully shutdown). + ::grpc_impl::CompletionQueue* callback_cq_ = nullptr; + + std::vector< + std::unique_ptr<::grpc::experimental::ClientInterceptorFactoryInterface>> + interceptor_creators_; +}; + +} // namespace grpc_impl + +#endif // GRPCPP_CHANNEL_IMPL_H diff --git a/include/grpcpp/client_context.h b/include/grpcpp/client_context.h new file mode 100644 index 00000000..1994fcc6 --- /dev/null +++ b/include/grpcpp/client_context.h @@ -0,0 +1,39 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +/// A ClientContext allows the person implementing a service client to: +/// +/// - Add custom metadata key-value pairs that will propagated to the server +/// side. +/// - Control call settings such as compression and authentication. +/// - Initial and trailing metadata coming from the server. +/// - Get performance metrics (ie, census). +/// +/// Context settings are only relevant to the call they are invoked with, that +/// is to say, they aren't sticky. Some of these settings, such as the +/// compression options, can be made persistent at channel construction time +/// (see \a grpc::CreateCustomChannel). +/// +/// \warning ClientContext instances should \em not be reused across rpcs. + +#ifndef GRPCPP_CLIENT_CONTEXT_H +#define GRPCPP_CLIENT_CONTEXT_H + +#include + +#endif // GRPCPP_CLIENT_CONTEXT_H diff --git a/include/grpcpp/completion_queue.h b/include/grpcpp/completion_queue.h new file mode 100644 index 00000000..123b277f --- /dev/null +++ b/include/grpcpp/completion_queue.h @@ -0,0 +1,24 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_COMPLETION_QUEUE_H +#define GRPCPP_COMPLETION_QUEUE_H + +#include + +#endif // GRPCPP_COMPLETION_QUEUE_H diff --git a/include/grpcpp/completion_queue_impl.h b/include/grpcpp/completion_queue_impl.h new file mode 100644 index 00000000..b6fb2b4f --- /dev/null +++ b/include/grpcpp/completion_queue_impl.h @@ -0,0 +1,24 @@ +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_COMPLETION_QUEUE_IMPL_H +#define GRPCPP_COMPLETION_QUEUE_IMPL_H + +#include + +#endif // GRPCPP_COMPLETION_QUEUE_IMPL_H diff --git a/include/grpcpp/create_channel.h b/include/grpcpp/create_channel.h new file mode 100644 index 00000000..9b257ace --- /dev/null +++ b/include/grpcpp/create_channel.h @@ -0,0 +1,57 @@ +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_CREATE_CHANNEL_H +#define GRPCPP_CREATE_CHANNEL_H + +#include +#include + +namespace grpc { + +static inline std::shared_ptr<::grpc::Channel> CreateChannel( + const grpc::string& target, + const std::shared_ptr& creds) { + return ::grpc_impl::CreateChannelImpl(target, creds); +} + +static inline std::shared_ptr<::grpc::Channel> CreateCustomChannel( + const grpc::string& target, + const std::shared_ptr& creds, + const ChannelArguments& args) { + return ::grpc_impl::CreateCustomChannelImpl(target, creds, args); +} + +namespace experimental { + +static inline std::shared_ptr<::grpc::Channel> +CreateCustomChannelWithInterceptors( + const grpc::string& target, + const std::shared_ptr& creds, + const ChannelArguments& args, + std::vector< + std::unique_ptr> + interceptor_creators) { + return ::grpc_impl::experimental::CreateCustomChannelWithInterceptors( + target, creds, args, std::move(interceptor_creators)); +} + +} // namespace experimental +} // namespace grpc + +#endif // GRPCPP_CREATE_CHANNEL_H diff --git a/include/grpcpp/create_channel_impl.h b/include/grpcpp/create_channel_impl.h new file mode 100644 index 00000000..02896e66 --- /dev/null +++ b/include/grpcpp/create_channel_impl.h @@ -0,0 +1,78 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_CREATE_CHANNEL_IMPL_H +#define GRPCPP_CREATE_CHANNEL_IMPL_H + +#include + +#include +#include +#include +#include +#include + +namespace grpc_impl { +/// Create a new \a Channel pointing to \a target. +/// +/// \param target The URI of the endpoint to connect to. +/// \param creds Credentials to use for the created channel. If it does not +/// hold an object or is invalid, a lame channel (one on which all operations +/// fail) is returned. +std::shared_ptr<::grpc::Channel> CreateChannelImpl( + const grpc::string& target, + const std::shared_ptr<::grpc::ChannelCredentials>& creds); + +/// Create a new \em custom \a Channel pointing to \a target. +/// +/// \warning For advanced use and testing ONLY. Override default channel +/// arguments only if necessary. +/// +/// \param target The URI of the endpoint to connect to. +/// \param creds Credentials to use for the created channel. If it does not +/// hold an object or is invalid, a lame channel (one on which all operations +/// fail) is returned. +/// \param args Options for channel creation. +std::shared_ptr<::grpc::Channel> CreateCustomChannelImpl( + const grpc::string& target, + const std::shared_ptr<::grpc::ChannelCredentials>& creds, + const ::grpc::ChannelArguments& args); + +namespace experimental { +/// Create a new \em custom \a Channel pointing to \a target with \a +/// interceptors being invoked per call. +/// +/// \warning For advanced use and testing ONLY. Override default channel +/// arguments only if necessary. +/// +/// \param target The URI of the endpoint to connect to. +/// \param creds Credentials to use for the created channel. If it does not +/// hold an object or is invalid, a lame channel (one on which all operations +/// fail) is returned. +/// \param args Options for channel creation. +std::shared_ptr<::grpc::Channel> CreateCustomChannelWithInterceptors( + const grpc::string& target, + const std::shared_ptr& creds, + const ::grpc::ChannelArguments& args, + std::vector< + std::unique_ptr> + interceptor_creators); +} // namespace experimental +} // namespace grpc_impl + +#endif // GRPCPP_CREATE_CHANNEL_IMPL_H diff --git a/include/grpcpp/create_channel_posix.h b/include/grpcpp/create_channel_posix.h new file mode 100644 index 00000000..b8a1f5e5 --- /dev/null +++ b/include/grpcpp/create_channel_posix.h @@ -0,0 +1,57 @@ +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_CREATE_CHANNEL_POSIX_H +#define GRPCPP_CREATE_CHANNEL_POSIX_H + +#include + +namespace grpc { + +#ifdef GPR_SUPPORT_CHANNELS_FROM_FD + +static inline std::shared_ptr CreateInsecureChannelFromFd( + const grpc::string& target, int fd) { + return ::grpc_impl::CreateInsecureChannelFromFd(target, fd); +} + +static inline std::shared_ptr CreateCustomInsecureChannelFromFd( + const grpc::string& target, int fd, const ChannelArguments& args) { + return ::grpc_impl::CreateCustomInsecureChannelFromFd(target, fd, args); +} + +namespace experimental { + +static inline std::shared_ptr +CreateCustomInsecureChannelWithInterceptorsFromFd( + const grpc::string& target, int fd, const ChannelArguments& args, + std::unique_ptr>> + interceptor_creators) { + return ::grpc_impl::experimental:: + CreateCustomInsecureChannelWithInterceptorsFromFd( + target, fd, args, std::move(interceptor_creators)); +} + +} // namespace experimental + +#endif // GPR_SUPPORT_CHANNELS_FROM_FD + +} // namespace grpc + +#endif // GRPCPP_CREATE_CHANNEL_POSIX_H diff --git a/include/grpcpp/create_channel_posix_impl.h b/include/grpcpp/create_channel_posix_impl.h new file mode 100644 index 00000000..5c111206 --- /dev/null +++ b/include/grpcpp/create_channel_posix_impl.h @@ -0,0 +1,70 @@ +/* + * + * Copyright 2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_CREATE_CHANNEL_POSIX_IMPL_H +#define GRPCPP_CREATE_CHANNEL_POSIX_IMPL_H + +#include + +#include +#include +#include + +namespace grpc_impl { + +#ifdef GPR_SUPPORT_CHANNELS_FROM_FD + +/// Create a new \a Channel communicating over the given file descriptor. +/// +/// \param target The name of the target. +/// \param fd The file descriptor representing a socket. +std::shared_ptr CreateInsecureChannelFromFd( + const grpc::string& target, int fd); + +/// Create a new \a Channel communicating over given file descriptor with custom +/// channel arguments. +/// +/// \param target The name of the target. +/// \param fd The file descriptor representing a socket. +/// \param args Options for channel creation. +std::shared_ptr CreateCustomInsecureChannelFromFd( + const grpc::string& target, int fd, const grpc::ChannelArguments& args); + +namespace experimental { + +/// Create a new \a Channel communicating over given file descriptor with custom +/// channel arguments. +/// +/// \param target The name of the target. +/// \param fd The file descriptor representing a socket. +/// \param args Options for channel creation. +/// \param interceptor_creators Vector of interceptor factory objects. +std::shared_ptr +CreateCustomInsecureChannelWithInterceptorsFromFd( + const grpc::string& target, int fd, const grpc::ChannelArguments& args, + std::unique_ptr>> + interceptor_creators); + +} // namespace experimental + +#endif // GPR_SUPPORT_CHANNELS_FROM_FD + +} // namespace grpc_impl + +#endif // GRPCPP_CREATE_CHANNEL_POSIX_IMPL_H diff --git a/include/grpcpp/ext/channelz_service_plugin.h b/include/grpcpp/ext/channelz_service_plugin.h new file mode 100644 index 00000000..95cb93e3 --- /dev/null +++ b/include/grpcpp/ext/channelz_service_plugin.h @@ -0,0 +1,36 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_EXT_CHANNELZ_SERVICE_PLUGIN_H +#define GRPCPP_EXT_CHANNELZ_SERVICE_PLUGIN_H + +#include + +namespace grpc { +namespace channelz { +namespace experimental { + +static inline void InitChannelzService() { + ::grpc_impl::channelz::experimental::InitChannelzService(); +} + +} // namespace experimental +} // namespace channelz +} // namespace grpc + +#endif // GRPCPP_EXT_CHANNELZ_SERVICE_PLUGIN_H diff --git a/include/grpcpp/ext/channelz_service_plugin_impl.h b/include/grpcpp/ext/channelz_service_plugin_impl.h new file mode 100644 index 00000000..3a5f3c4b --- /dev/null +++ b/include/grpcpp/ext/channelz_service_plugin_impl.h @@ -0,0 +1,41 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_EXT_CHANNELZ_SERVICE_PLUGIN_IMPL_H +#define GRPCPP_EXT_CHANNELZ_SERVICE_PLUGIN_IMPL_H + +#include + +#include +#include +#include + +namespace grpc_impl { +namespace channelz { +namespace experimental { + +/// Add channelz server plugin to \a ServerBuilder. This function should +/// be called at static initialization time. This service is experimental +/// for now. Track progress in https://github.com/grpc/grpc/issues/15988. +void InitChannelzService(); + +} // namespace experimental +} // namespace channelz +} // namespace grpc_impl + +#endif // GRPCPP_EXT_CHANNELZ_SERVICE_PLUGIN_IMPL_H diff --git a/include/grpcpp/ext/health_check_service_server_builder_option.h b/include/grpcpp/ext/health_check_service_server_builder_option.h new file mode 100644 index 00000000..dd43b05e --- /dev/null +++ b/include/grpcpp/ext/health_check_service_server_builder_option.h @@ -0,0 +1,47 @@ +/* + * + * Copyright 2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_EXT_HEALTH_CHECK_SERVICE_SERVER_BUILDER_OPTION_H +#define GRPCPP_EXT_HEALTH_CHECK_SERVICE_SERVER_BUILDER_OPTION_H + +#include + +#include +#include +#include + +namespace grpc { + +class HealthCheckServiceServerBuilderOption : public ServerBuilderOption { + public: + /// The ownership of \a hc will be taken and transferred to the grpc server. + /// To explicitly disable default service, pass in a nullptr. + explicit HealthCheckServiceServerBuilderOption( + std::unique_ptr hc); + ~HealthCheckServiceServerBuilderOption() override {} + void UpdateArguments(ChannelArguments* args) override; + void UpdatePlugins( + std::vector>* plugins) override; + + private: + std::unique_ptr hc_; +}; + +} // namespace grpc + +#endif // GRPCPP_EXT_HEALTH_CHECK_SERVICE_SERVER_BUILDER_OPTION_H diff --git a/include/grpcpp/ext/proto_server_reflection_plugin.h b/include/grpcpp/ext/proto_server_reflection_plugin.h new file mode 100644 index 00000000..f6f2202f --- /dev/null +++ b/include/grpcpp/ext/proto_server_reflection_plugin.h @@ -0,0 +1,37 @@ +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_EXT_PROTO_SERVER_REFLECTION_PLUGIN_H +#define GRPCPP_EXT_PROTO_SERVER_REFLECTION_PLUGIN_H + +#include + +namespace grpc { +namespace reflection { + +typedef ::grpc_impl::reflection::ProtoServerReflectionPlugin + ProtoServerReflectionPlugin; + +static inline void InitProtoReflectionServerBuilderPlugin() { + ::grpc_impl::reflection::InitProtoReflectionServerBuilderPlugin(); +} + +} // namespace reflection +} // namespace grpc + +#endif // GRPCPP_EXT_PROTO_SERVER_REFLECTION_PLUGIN_H diff --git a/include/grpcpp/ext/proto_server_reflection_plugin_impl.h b/include/grpcpp/ext/proto_server_reflection_plugin_impl.h new file mode 100644 index 00000000..a06fe14c --- /dev/null +++ b/include/grpcpp/ext/proto_server_reflection_plugin_impl.h @@ -0,0 +1,55 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_EXT_PROTO_SERVER_REFLECTION_PLUGIN_IMPL_H +#define GRPCPP_EXT_PROTO_SERVER_REFLECTION_PLUGIN_IMPL_H + +#include +#include + +namespace grpc { +class ProtoServerReflection; +} // namespace grpc + +namespace grpc_impl { +class ServerInitializer; + +namespace reflection { + +class ProtoServerReflectionPlugin : public ::grpc::ServerBuilderPlugin { + public: + ProtoServerReflectionPlugin(); + ::grpc::string name() override; + void InitServer(::grpc_impl::ServerInitializer* si) override; + void Finish(::grpc_impl::ServerInitializer* si) override; + void ChangeArguments(const ::grpc::string& name, void* value) override; + bool has_async_methods() const override; + bool has_sync_methods() const override; + + private: + std::shared_ptr reflection_service_; +}; + +/// Add proto reflection plugin to \a ServerBuilder. +/// This function should be called at the static initialization time. +void InitProtoReflectionServerBuilderPlugin(); + +} // namespace reflection +} // namespace grpc_impl + +#endif // GRPCPP_EXT_PROTO_SERVER_REFLECTION_PLUGIN_IMPL_H diff --git a/include/grpcpp/ext/server_load_reporting.h b/include/grpcpp/ext/server_load_reporting.h new file mode 100644 index 00000000..0c39a9e9 --- /dev/null +++ b/include/grpcpp/ext/server_load_reporting.h @@ -0,0 +1,43 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_EXT_SERVER_LOAD_REPORTING_H +#define GRPCPP_EXT_SERVER_LOAD_REPORTING_H + +#include + +namespace grpc { +namespace load_reporter { +namespace experimental { + +typedef ::grpc_impl::load_reporter::experimental:: + LoadReportingServiceServerBuilderOption + LoadReportingServiceServerBuilderOption; + +static inline void AddLoadReportingCost(grpc::ServerContext* ctx, + const grpc::string& cost_name, + double cost_value) { + ::grpc_impl::load_reporter::experimental::AddLoadReportingCost(ctx, cost_name, + cost_value); +} + +} // namespace experimental +} // namespace load_reporter +} // namespace grpc + +#endif // GRPCPP_EXT_SERVER_LOAD_REPORTING_H diff --git a/include/grpcpp/ext/server_load_reporting_impl.h b/include/grpcpp/ext/server_load_reporting_impl.h new file mode 100644 index 00000000..1b27e0af --- /dev/null +++ b/include/grpcpp/ext/server_load_reporting_impl.h @@ -0,0 +1,54 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_EXT_SERVER_LOAD_REPORTING_IMPL_H +#define GRPCPP_EXT_SERVER_LOAD_REPORTING_IMPL_H + +#include + +#include +#include +#include +#include + +namespace grpc_impl { +namespace load_reporter { +namespace experimental { + +// The ServerBuilderOption to enable server-side load reporting feature. To +// enable the feature, please make sure the binary builds with the +// grpcpp_server_load_reporting library and set this option in the +// ServerBuilder. +class LoadReportingServiceServerBuilderOption + : public grpc::ServerBuilderOption { + public: + void UpdateArguments(::grpc::ChannelArguments* args) override; + void UpdatePlugins(std::vector>* + plugins) override; +}; + +// Adds the load reporting cost with \a cost_name and \a cost_value in the +// trailing metadata of the server context. +void AddLoadReportingCost(grpc::ServerContext* ctx, + const grpc::string& cost_name, double cost_value); + +} // namespace experimental +} // namespace load_reporter +} // namespace grpc_impl + +#endif // GRPCPP_EXT_SERVER_LOAD_REPORTING_IMPL_H diff --git a/include/grpcpp/generic/async_generic_service.h b/include/grpcpp/generic/async_generic_service.h new file mode 100644 index 00000000..2c67edc5 --- /dev/null +++ b/include/grpcpp/generic/async_generic_service.h @@ -0,0 +1,24 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_GENERIC_ASYNC_GENERIC_SERVICE_H +#define GRPCPP_GENERIC_ASYNC_GENERIC_SERVICE_H + +#include + +#endif // GRPCPP_GENERIC_ASYNC_GENERIC_SERVICE_H diff --git a/include/grpcpp/generic/generic_stub.h b/include/grpcpp/generic/generic_stub.h new file mode 100644 index 00000000..f4c4664f --- /dev/null +++ b/include/grpcpp/generic/generic_stub.h @@ -0,0 +1,30 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_GENERIC_GENERIC_STUB_H +#define GRPCPP_GENERIC_GENERIC_STUB_H + +#include + +namespace grpc { + +typedef ::grpc_impl::GenericStub GenericStub; + +} // namespace grpc + +#endif // GRPCPP_GENERIC_GENERIC_STUB_H diff --git a/include/grpcpp/generic/generic_stub_impl.h b/include/grpcpp/generic/generic_stub_impl.h new file mode 100644 index 00000000..906a5d25 --- /dev/null +++ b/include/grpcpp/generic/generic_stub_impl.h @@ -0,0 +1,216 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_GENERIC_GENERIC_STUB_IMPL_H +#define GRPCPP_GENERIC_GENERIC_STUB_IMPL_H + +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace grpc { + +typedef ::grpc_impl::ClientAsyncReaderWriter + GenericClientAsyncReaderWriter; +typedef ::grpc_impl::ClientAsyncResponseReader + GenericClientAsyncResponseReader; +} // namespace grpc +namespace grpc_impl { +class CompletionQueue; + +/// Generic stubs provide a type-unaware interface to call gRPC methods +/// by name. In practice, the Request and Response types should be basic +/// types like grpc::ByteBuffer or proto::MessageLite (the base protobuf). +template +class TemplatedGenericStub final { + public: + explicit TemplatedGenericStub(std::shared_ptr channel) + : channel_(channel) {} + + /// Setup a call to a named method \a method using \a context, but don't + /// start it. Let it be started explicitly with StartCall and a tag. + /// The return value only indicates whether or not registration of the call + /// succeeded (i.e. the call won't proceed if the return value is nullptr). + std::unique_ptr> + PrepareCall(ClientContext* context, const grpc::string& method, + CompletionQueue* cq) { + return CallInternal(channel_.get(), context, method, cq, false, nullptr); + } + + /// Setup a unary call to a named method \a method using \a context, and don't + /// start it. Let it be started explicitly with StartCall. + /// The return value only indicates whether or not registration of the call + /// succeeded (i.e. the call won't proceed if the return value is nullptr). + std::unique_ptr> PrepareUnaryCall( + ClientContext* context, const grpc::string& method, + const RequestType& request, CompletionQueue* cq) { + return std::unique_ptr>( + internal::ClientAsyncResponseReaderFactory::Create( + channel_.get(), cq, + grpc::internal::RpcMethod(method.c_str(), + grpc::internal::RpcMethod::NORMAL_RPC), + context, request, false)); + } + + /// DEPRECATED for multi-threaded use + /// Begin a call to a named method \a method using \a context. + /// A tag \a tag will be delivered to \a cq when the call has been started + /// (i.e, initial metadata has been sent). + /// The return value only indicates whether or not registration of the call + /// succeeded (i.e. the call won't proceed if the return value is nullptr). + std::unique_ptr> Call( + ClientContext* context, const grpc::string& method, CompletionQueue* cq, + void* tag) { + return CallInternal(channel_.get(), context, method, cq, true, tag); + } + +#ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL + /// Setup and start a unary call to a named method \a method using + /// \a context and specifying the \a request and \a response buffers. + void UnaryCall(ClientContext* context, const grpc::string& method, + const RequestType* request, ResponseType* response, + std::function on_completion) { + UnaryCallInternal(context, method, request, response, + std::move(on_completion)); + } + + /// Setup a unary call to a named method \a method using + /// \a context and specifying the \a request and \a response buffers. + /// Like any other reactor-based RPC, it will not be activated until + /// StartCall is invoked on its reactor. + void PrepareUnaryCall(ClientContext* context, const grpc::string& method, + const RequestType* request, ResponseType* response, + ClientUnaryReactor* reactor) { + PrepareUnaryCallInternal(context, method, request, response, reactor); + } + + /// Setup a call to a named method \a method using \a context and tied to + /// \a reactor . Like any other bidi streaming RPC, it will not be activated + /// until StartCall is invoked on its reactor. + void PrepareBidiStreamingCall( + ClientContext* context, const grpc::string& method, + ClientBidiReactor* reactor) { + PrepareBidiStreamingCallInternal(context, method, reactor); + } +#endif + + /// NOTE: class experimental_type is not part of the public API of this class + /// TODO(vjpai): Move these contents to the public API of GenericStub when + /// they are no longer experimental + class experimental_type { + public: + explicit experimental_type(TemplatedGenericStub* stub) : stub_(stub) {} + + /// Setup and start a unary call to a named method \a method using + /// \a context and specifying the \a request and \a response buffers. + void UnaryCall(ClientContext* context, const grpc::string& method, + const RequestType* request, ResponseType* response, + std::function on_completion) { + stub_->UnaryCallInternal(context, method, request, response, + std::move(on_completion)); + } + + /// Setup a unary call to a named method \a method using + /// \a context and specifying the \a request and \a response buffers. + /// Like any other reactor-based RPC, it will not be activated until + /// StartCall is invoked on its reactor. + void PrepareUnaryCall(ClientContext* context, const grpc::string& method, + const RequestType* request, ResponseType* response, + ClientUnaryReactor* reactor) { + stub_->PrepareUnaryCallInternal(context, method, request, response, + reactor); + } + + /// Setup a call to a named method \a method using \a context and tied to + /// \a reactor . Like any other bidi streaming RPC, it will not be activated + /// until StartCall is invoked on its reactor. + void PrepareBidiStreamingCall( + ClientContext* context, const grpc::string& method, + ClientBidiReactor* reactor) { + stub_->PrepareBidiStreamingCallInternal(context, method, reactor); + } + + private: + TemplatedGenericStub* stub_; + }; + + /// NOTE: The function experimental() is not stable public API. It is a view + /// to the experimental components of this class. It may be changed or removed + /// at any time. + experimental_type experimental() { return experimental_type(this); } + + private: + std::shared_ptr channel_; + + void UnaryCallInternal(ClientContext* context, const grpc::string& method, + const RequestType* request, ResponseType* response, + std::function on_completion) { + internal::CallbackUnaryCall( + channel_.get(), + grpc::internal::RpcMethod(method.c_str(), + grpc::internal::RpcMethod::NORMAL_RPC), + context, request, response, std::move(on_completion)); + } + + void PrepareUnaryCallInternal(ClientContext* context, + const grpc::string& method, + const RequestType* request, + ResponseType* response, + ClientUnaryReactor* reactor) { + internal::ClientCallbackUnaryFactory::Create( + channel_.get(), + grpc::internal::RpcMethod(method.c_str(), + grpc::internal::RpcMethod::NORMAL_RPC), + context, request, response, reactor); + } + + void PrepareBidiStreamingCallInternal( + ClientContext* context, const grpc::string& method, + ClientBidiReactor* reactor) { + internal::ClientCallbackReaderWriterFactory:: + Create(channel_.get(), + grpc::internal::RpcMethod( + method.c_str(), grpc::internal::RpcMethod::BIDI_STREAMING), + context, reactor); + } + + std::unique_ptr> + CallInternal(grpc::ChannelInterface* channel, ClientContext* context, + const grpc::string& method, CompletionQueue* cq, bool start, + void* tag) { + return std::unique_ptr>( + internal::ClientAsyncReaderWriterFactory:: + Create( + channel, cq, + grpc::internal::RpcMethod( + method.c_str(), grpc::internal::RpcMethod::BIDI_STREAMING), + context, start, tag)); + } +}; + +typedef TemplatedGenericStub GenericStub; + +} // namespace grpc_impl + +#endif // GRPCPP_GENERIC_GENERIC_STUB_IMPL_H diff --git a/include/grpcpp/grpcpp.h b/include/grpcpp/grpcpp.h new file mode 100644 index 00000000..aa8a2420 --- /dev/null +++ b/include/grpcpp/grpcpp.h @@ -0,0 +1,68 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +/// \mainpage gRPC C++ API +/// +/// The gRPC C++ API mainly consists of the following classes: +///
+/// - grpc::Channel, which represents the connection to an endpoint. See [the +/// gRPC Concepts page](https://grpc.io/docs/guides/concepts.html) for more +/// details. Channels are created by the factory function grpc::CreateChannel. +/// +/// - grpc::CompletionQueue, the producer-consumer queue used for all +/// asynchronous communication with the gRPC runtime. +/// +/// - grpc::ClientContext and grpc::ServerContext, where optional configuration +/// for an RPC can be set, such as setting custom metadata to be conveyed to the +/// peer, compression settings, authentication, etc. +/// +/// - grpc::Server, representing a gRPC server, created by grpc::ServerBuilder. +/// +/// Streaming calls are handled with the streaming classes in +/// \ref sync_stream.h and +/// \ref async_stream.h. +/// +/// Refer to the +/// [examples](https://github.com/grpc/grpc/blob/master/examples/cpp) +/// for code putting these pieces into play. + +#ifndef GRPCPP_GRPCPP_H +#define GRPCPP_GRPCPP_H + +// Pragma for http://include-what-you-use.org/ tool, tells that following +// headers are not private for grpcpp.h and are part of its interface. +// IWYU pragma: begin_exports +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +// IWYU pragma: end_exports + +namespace grpc { +/// Return gRPC library version. +grpc::string Version(); +} // namespace grpc + +#endif // GRPCPP_GRPCPP_H diff --git a/include/grpcpp/health_check_service_interface.h b/include/grpcpp/health_check_service_interface.h new file mode 100644 index 00000000..a51b0d18 --- /dev/null +++ b/include/grpcpp/health_check_service_interface.h @@ -0,0 +1,41 @@ +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_HEALTH_CHECK_SERVICE_INTERFACE_H +#define GRPCPP_HEALTH_CHECK_SERVICE_INTERFACE_H + +#include + +namespace grpc { + +const char kHealthCheckServiceInterfaceArg[] = + "grpc.health_check_service_interface"; + +typedef ::grpc_impl::HealthCheckServiceInterface HealthCheckServiceInterface; + +static inline void EnableDefaultHealthCheckService(bool enable) { + ::grpc_impl::EnableDefaultHealthCheckService(enable); +} + +static inline bool DefaultHealthCheckServiceEnabled() { + return ::grpc_impl::DefaultHealthCheckServiceEnabled(); +} + +} // namespace grpc + +#endif // GRPCPP_HEALTH_CHECK_SERVICE_INTERFACE_H diff --git a/include/grpcpp/health_check_service_interface_impl.h b/include/grpcpp/health_check_service_interface_impl.h new file mode 100644 index 00000000..025dadb4 --- /dev/null +++ b/include/grpcpp/health_check_service_interface_impl.h @@ -0,0 +1,55 @@ +/* + * + * Copyright 2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_HEALTH_CHECK_SERVICE_INTERFACE_IMPL_H +#define GRPCPP_HEALTH_CHECK_SERVICE_INTERFACE_IMPL_H + +#include + +namespace grpc_impl { + +/// The gRPC server uses this interface to expose the health checking service +/// without depending on protobuf. +class HealthCheckServiceInterface { + public: + virtual ~HealthCheckServiceInterface() {} + + /// Set or change the serving status of the given \a service_name. + virtual void SetServingStatus(const grpc::string& service_name, + bool serving) = 0; + /// Apply to all registered service names. + virtual void SetServingStatus(bool serving) = 0; + + /// Set all registered service names to not serving and prevent future + /// state changes. + virtual void Shutdown() {} +}; + +/// Enable/disable the default health checking service. This applies to all C++ +/// servers created afterwards. For each server, user can override the default +/// with a HealthCheckServiceServerBuilderOption. +/// NOT thread safe. +void EnableDefaultHealthCheckService(bool enable); + +/// Returns whether the default health checking service is enabled. +/// NOT thread safe. +bool DefaultHealthCheckServiceEnabled(); + +} // namespace grpc_impl + +#endif // GRPCPP_HEALTH_CHECK_SERVICE_INTERFACE_IMPL_H diff --git a/include/grpcpp/impl/README.md b/include/grpcpp/impl/README.md new file mode 100644 index 00000000..612150ca --- /dev/null +++ b/include/grpcpp/impl/README.md @@ -0,0 +1,4 @@ +**The APIs in this directory are not stable!** + +This directory contains header files that need to be installed but are not part +of the public API. Users should not use these headers directly. diff --git a/include/grpcpp/impl/call.h b/include/grpcpp/impl/call.h new file mode 100644 index 00000000..a6b13126 --- /dev/null +++ b/include/grpcpp/impl/call.h @@ -0,0 +1,24 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CALL_H +#define GRPCPP_IMPL_CALL_H + +#include + +#endif // GRPCPP_IMPL_CALL_H diff --git a/include/grpcpp/impl/channel_argument_option.h b/include/grpcpp/impl/channel_argument_option.h new file mode 100644 index 00000000..0c488247 --- /dev/null +++ b/include/grpcpp/impl/channel_argument_option.h @@ -0,0 +1,37 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CHANNEL_ARGUMENT_OPTION_H +#define GRPCPP_IMPL_CHANNEL_ARGUMENT_OPTION_H + +#include +#include + +#include +#include + +namespace grpc { + +std::unique_ptr MakeChannelArgumentOption( + const grpc::string& name, const grpc::string& value); +std::unique_ptr MakeChannelArgumentOption( + const grpc::string& name, int value); + +} // namespace grpc + +#endif // GRPCPP_IMPL_CHANNEL_ARGUMENT_OPTION_H diff --git a/include/grpcpp/impl/client_unary_call.h b/include/grpcpp/impl/client_unary_call.h new file mode 100644 index 00000000..378482c5 --- /dev/null +++ b/include/grpcpp/impl/client_unary_call.h @@ -0,0 +1,24 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CLIENT_UNARY_CALL_H +#define GRPCPP_IMPL_CLIENT_UNARY_CALL_H + +#include + +#endif // GRPCPP_IMPL_CLIENT_UNARY_CALL_H diff --git a/include/grpcpp/impl/codegen/async_generic_service.h b/include/grpcpp/impl/codegen/async_generic_service.h new file mode 100644 index 00000000..05f10c67 --- /dev/null +++ b/include/grpcpp/impl/codegen/async_generic_service.h @@ -0,0 +1,163 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_ASYNC_GENERIC_SERVICE_H +#define GRPCPP_IMPL_CODEGEN_ASYNC_GENERIC_SERVICE_H + +#include + +#include +#include +#include +#include + +struct grpc_server; + +namespace grpc { + +typedef ::grpc_impl::ServerAsyncReaderWriter + GenericServerAsyncReaderWriter; +typedef ::grpc_impl::ServerAsyncResponseWriter + GenericServerAsyncResponseWriter; +typedef ::grpc_impl::ServerAsyncReader + GenericServerAsyncReader; +typedef ::grpc_impl::ServerAsyncWriter GenericServerAsyncWriter; + +class GenericServerContext final : public ::grpc_impl::ServerContext { + public: + const grpc::string& method() const { return method_; } + const grpc::string& host() const { return host_; } + + private: + friend class grpc_impl::Server; + friend class grpc::ServerInterface; + + void Clear() { + method_.clear(); + host_.clear(); + ::grpc_impl::ServerContext::Clear(); + } + + grpc::string method_; + grpc::string host_; +}; + +// A generic service at the server side accepts all RPC methods and hosts. It is +// typically used in proxies. The generic service can be registered to a server +// which also has other services. +// Sample usage: +// ServerBuilder builder; +// auto cq = builder.AddCompletionQueue(); +// AsyncGenericService generic_service; +// builder.RegisterAsyncGenericService(&generic_service); +// auto server = builder.BuildAndStart(); +// +// // request a new call +// GenericServerContext context; +// GenericServerAsyncReaderWriter stream; +// generic_service.RequestCall(&context, &stream, cq.get(), cq.get(), tag); +// +// When tag is retrieved from cq->Next(), context.method() can be used to look +// at the method and the RPC can be handled accordingly. +class AsyncGenericService final { + public: + AsyncGenericService() : server_(nullptr) {} + + void RequestCall(GenericServerContext* ctx, + GenericServerAsyncReaderWriter* reader_writer, + ::grpc_impl::CompletionQueue* call_cq, + ::grpc_impl::ServerCompletionQueue* notification_cq, + void* tag); + + private: + friend class grpc_impl::Server; + grpc_impl::Server* server_; +}; + +#ifndef GRPC_CALLBACK_API_NONEXPERIMENTAL +namespace experimental { +#endif + +/// \a ServerGenericBidiReactor is the reactor class for bidi streaming RPCs +/// invoked on a CallbackGenericService. It is just a ServerBidi reactor with +/// ByteBuffer arguments. +using ServerGenericBidiReactor = + ::grpc_impl::ServerBidiReactor; + +class GenericCallbackServerContext final + : public ::grpc_impl::CallbackServerContext { + public: + const grpc::string& method() const { return method_; } + const grpc::string& host() const { return host_; } + + private: + friend class ::grpc_impl::Server; + friend class ::grpc::ServerInterface; + + void Clear() { + method_.clear(); + host_.clear(); + ::grpc_impl::CallbackServerContext::Clear(); + } + + grpc::string method_; + grpc::string host_; +}; + +/// \a CallbackGenericService is the base class for generic services implemented +/// using the callback API and registered through the ServerBuilder using +/// RegisterCallbackGenericService. +class CallbackGenericService { + public: + CallbackGenericService() {} + virtual ~CallbackGenericService() {} + + /// The "method handler" for the generic API. This function should be + /// overridden to provide a ServerGenericBidiReactor that implements the + /// application-level interface for this RPC. Unimplemented by default. + virtual ServerGenericBidiReactor* CreateReactor( + GenericCallbackServerContext* /*ctx*/) { + class Reactor : public ServerGenericBidiReactor { + public: + Reactor() { this->Finish(Status(StatusCode::UNIMPLEMENTED, "")); } + void OnDone() override { delete this; } + }; + return new Reactor; + } + + private: + friend class ::grpc_impl::Server; + + ::grpc_impl::internal::CallbackBidiHandler* + Handler() { + return new ::grpc_impl::internal::CallbackBidiHandler( + [this](::grpc_impl::CallbackServerContext* ctx) { + return CreateReactor(static_cast(ctx)); + }); + } + + grpc_impl::Server* server_{nullptr}; +}; + +#ifndef GRPC_CALLBACK_API_NONEXPERIMENTAL +} // namespace experimental +#endif +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_ASYNC_GENERIC_SERVICE_H diff --git a/include/grpcpp/impl/codegen/async_stream.h b/include/grpcpp/impl/codegen/async_stream.h new file mode 100644 index 00000000..d76a8982 --- /dev/null +++ b/include/grpcpp/impl/codegen/async_stream.h @@ -0,0 +1,95 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_ASYNC_STREAM_H +#define GRPCPP_IMPL_CODEGEN_ASYNC_STREAM_H + +#include + +namespace grpc { + +namespace internal { + +typedef ::grpc_impl::internal::ClientAsyncStreamingInterface + ClientAsyncStreamingInterface; + +template +using AsyncReaderInterface = ::grpc_impl::internal::AsyncReaderInterface; + +template +using AsyncWriterInterface = ::grpc_impl::internal::AsyncWriterInterface; + +} // namespace internal + +template +using ClientAsyncReaderInterface = ::grpc_impl::ClientAsyncReaderInterface; + +template +using ClientAsyncReader = ::grpc_impl::ClientAsyncReader; + +template +using ClientAsyncWriterInterface = ::grpc_impl::ClientAsyncWriterInterface; + +template +using ClientAsyncWriter = ::grpc_impl::ClientAsyncWriter; + +template +using ClientAsyncReaderWriterInterface = + ::grpc_impl::ClientAsyncReaderWriterInterface; + +template +using ClientAsyncReaderWriter = ::grpc_impl::ClientAsyncReaderWriter; + +template +using ServerAsyncReaderInterface = + ::grpc_impl::ServerAsyncReaderInterface; + +template +using ServerAsyncReader = ::grpc_impl::ServerAsyncReader; + +template +using ServerAsyncWriterInterface = ::grpc_impl::ServerAsyncWriterInterface; + +template +using ServerAsyncWriter = ::grpc_impl::ServerAsyncWriter; + +template +using ServerAsyncReaderWriterInterface = + ::grpc_impl::ServerAsyncReaderWriterInterface; + +template +using ServerAsyncReaderWriter = ::grpc_impl::ServerAsyncReaderWriter; + +namespace internal { +template +using ClientAsyncReaderFactory = + ::grpc_impl::internal::ClientAsyncReaderFactory; + +template +using ClientAsyncWriterFactory = + ::grpc_impl::internal::ClientAsyncWriterFactory; + +template +using ClientAsyncReaderWriterFactory = + ::grpc_impl::internal::ClientAsyncReaderWriterFactory; + +} // namespace internal + +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_ASYNC_STREAM_H diff --git a/include/grpcpp/impl/codegen/async_stream_impl.h b/include/grpcpp/impl/codegen/async_stream_impl.h new file mode 100644 index 00000000..f832f5e4 --- /dev/null +++ b/include/grpcpp/impl/codegen/async_stream_impl.h @@ -0,0 +1,1134 @@ +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef GRPCPP_IMPL_CODEGEN_ASYNC_STREAM_IMPL_H +#define GRPCPP_IMPL_CODEGEN_ASYNC_STREAM_IMPL_H + +#include +#include +#include +#include +#include +#include + +namespace grpc_impl { + +namespace internal { +/// Common interface for all client side asynchronous streaming. +class ClientAsyncStreamingInterface { + public: + virtual ~ClientAsyncStreamingInterface() {} + + /// Start the call that was set up by the constructor, but only if the + /// constructor was invoked through the "Prepare" API which doesn't actually + /// start the call + virtual void StartCall(void* tag) = 0; + + /// Request notification of the reading of the initial metadata. Completion + /// will be notified by \a tag on the associated completion queue. + /// This call is optional, but if it is used, it cannot be used concurrently + /// with or after the \a AsyncReaderInterface::Read method. + /// + /// \param[in] tag Tag identifying this request. + virtual void ReadInitialMetadata(void* tag) = 0; + + /// Indicate that the stream is to be finished and request notification for + /// when the call has been ended. + /// Should not be used concurrently with other operations. + /// + /// It is appropriate to call this method exactly once when both: + /// * the client side has no more message to send + /// (this can be declared implicitly by calling this method, or + /// explicitly through an earlier call to the WritesDone method + /// of the class in use, e.g. \a ClientAsyncWriterInterface::WritesDone or + /// \a ClientAsyncReaderWriterInterface::WritesDone). + /// * there are no more messages to be received from the server (this can + /// be known implicitly by the calling code, or explicitly from an + /// earlier call to \a AsyncReaderInterface::Read that yielded a failed + /// result, e.g. cq->Next(&read_tag, &ok) filled in 'ok' with 'false'). + /// + /// The tag will be returned when either: + /// - all incoming messages have been read and the server has returned + /// a status. + /// - the server has returned a non-OK status. + /// - the call failed for some reason and the library generated a + /// status. + /// + /// Note that implementations of this method attempt to receive initial + /// metadata from the server if initial metadata hasn't yet been received. + /// + /// \param[in] tag Tag identifying this request. + /// \param[out] status To be updated with the operation status. + virtual void Finish(::grpc::Status* status, void* tag) = 0; +}; + +/// An interface that yields a sequence of messages of type \a R. +template +class AsyncReaderInterface { + public: + virtual ~AsyncReaderInterface() {} + + /// Read a message of type \a R into \a msg. Completion will be notified by \a + /// tag on the associated completion queue. + /// This is thread-safe with respect to \a Write or \a WritesDone methods. It + /// should not be called concurrently with other streaming APIs + /// on the same stream. It is not meaningful to call it concurrently + /// with another \a AsyncReaderInterface::Read on the same stream since reads + /// on the same stream are delivered in order. + /// + /// \param[out] msg Where to eventually store the read message. + /// \param[in] tag The tag identifying the operation. + /// + /// Side effect: note that this method attempt to receive initial metadata for + /// a stream if it hasn't yet been received. + virtual void Read(R* msg, void* tag) = 0; +}; + +/// An interface that can be fed a sequence of messages of type \a W. +template +class AsyncWriterInterface { + public: + virtual ~AsyncWriterInterface() {} + + /// Request the writing of \a msg with identifying tag \a tag. + /// + /// Only one write may be outstanding at any given time. This means that + /// after calling Write, one must wait to receive \a tag from the completion + /// queue BEFORE calling Write again. + /// This is thread-safe with respect to \a AsyncReaderInterface::Read + /// + /// gRPC doesn't take ownership or a reference to \a msg, so it is safe to + /// to deallocate once Write returns. + /// + /// \param[in] msg The message to be written. + /// \param[in] tag The tag identifying the operation. + virtual void Write(const W& msg, void* tag) = 0; + + /// Request the writing of \a msg using WriteOptions \a options with + /// identifying tag \a tag. + /// + /// Only one write may be outstanding at any given time. This means that + /// after calling Write, one must wait to receive \a tag from the completion + /// queue BEFORE calling Write again. + /// WriteOptions \a options is used to set the write options of this message. + /// This is thread-safe with respect to \a AsyncReaderInterface::Read + /// + /// gRPC doesn't take ownership or a reference to \a msg, so it is safe to + /// to deallocate once Write returns. + /// + /// \param[in] msg The message to be written. + /// \param[in] options The WriteOptions to be used to write this message. + /// \param[in] tag The tag identifying the operation. + virtual void Write(const W& msg, ::grpc::WriteOptions options, void* tag) = 0; + + /// Request the writing of \a msg and coalesce it with the writing + /// of trailing metadata, using WriteOptions \a options with + /// identifying tag \a tag. + /// + /// For client, WriteLast is equivalent of performing Write and + /// WritesDone in a single step. + /// For server, WriteLast buffers the \a msg. The writing of \a msg is held + /// until Finish is called, where \a msg and trailing metadata are coalesced + /// and write is initiated. Note that WriteLast can only buffer \a msg up to + /// the flow control window size. If \a msg size is larger than the window + /// size, it will be sent on wire without buffering. + /// + /// gRPC doesn't take ownership or a reference to \a msg, so it is safe to + /// to deallocate once Write returns. + /// + /// \param[in] msg The message to be written. + /// \param[in] options The WriteOptions to be used to write this message. + /// \param[in] tag The tag identifying the operation. + void WriteLast(const W& msg, ::grpc::WriteOptions options, void* tag) { + Write(msg, options.set_last_message(), tag); + } +}; + +} // namespace internal + +template +class ClientAsyncReaderInterface + : public internal::ClientAsyncStreamingInterface, + public internal::AsyncReaderInterface {}; + +namespace internal { +template +class ClientAsyncReaderFactory { + public: + /// Create a stream object. + /// Write the first request out if \a start is set. + /// \a tag will be notified on \a cq when the call has been started and + /// \a request has been written out. If \a start is not set, \a tag must be + /// nullptr and the actual call must be initiated by StartCall + /// Note that \a context will be used to fill in custom initial metadata + /// used to send to the server when starting the call. + template + static ClientAsyncReader* Create(::grpc::ChannelInterface* channel, + ::grpc_impl::CompletionQueue* cq, + const ::grpc::internal::RpcMethod& method, + ::grpc_impl::ClientContext* context, + const W& request, bool start, void* tag) { + ::grpc::internal::Call call = channel->CreateCall(method, context, cq); + return new (::grpc::g_core_codegen_interface->grpc_call_arena_alloc( + call.call(), sizeof(ClientAsyncReader))) + ClientAsyncReader(call, context, request, start, tag); + } +}; +} // namespace internal + +/// Async client-side API for doing server-streaming RPCs, +/// where the incoming message stream coming from the server has +/// messages of type \a R. +template +class ClientAsyncReader final : public ClientAsyncReaderInterface { + public: + // always allocated against a call arena, no memory free required + static void operator delete(void* /*ptr*/, std::size_t size) { + GPR_CODEGEN_ASSERT(size == sizeof(ClientAsyncReader)); + } + + // This operator should never be called as the memory should be freed as part + // of the arena destruction. It only exists to provide a matching operator + // delete to the operator new so that some compilers will not complain (see + // https://github.com/grpc/grpc/issues/11301) Note at the time of adding this + // there are no tests catching the compiler warning. + static void operator delete(void*, void*) { GPR_CODEGEN_ASSERT(false); } + + void StartCall(void* tag) override { + GPR_CODEGEN_ASSERT(!started_); + started_ = true; + StartCallInternal(tag); + } + + /// See the \a ClientAsyncStreamingInterface.ReadInitialMetadata + /// method for semantics. + /// + /// Side effect: + /// - upon receiving initial metadata from the server, + /// the \a ClientContext associated with this call is updated, and the + /// calling code can access the received metadata through the + /// \a ClientContext. + void ReadInitialMetadata(void* tag) override { + GPR_CODEGEN_ASSERT(started_); + GPR_CODEGEN_ASSERT(!context_->initial_metadata_received_); + + meta_ops_.set_output_tag(tag); + meta_ops_.RecvInitialMetadata(context_); + call_.PerformOps(&meta_ops_); + } + + void Read(R* msg, void* tag) override { + GPR_CODEGEN_ASSERT(started_); + read_ops_.set_output_tag(tag); + if (!context_->initial_metadata_received_) { + read_ops_.RecvInitialMetadata(context_); + } + read_ops_.RecvMessage(msg); + call_.PerformOps(&read_ops_); + } + + /// See the \a ClientAsyncStreamingInterface.Finish method for semantics. + /// + /// Side effect: + /// - the \a ClientContext associated with this call is updated with + /// possible initial and trailing metadata received from the server. + void Finish(::grpc::Status* status, void* tag) override { + GPR_CODEGEN_ASSERT(started_); + finish_ops_.set_output_tag(tag); + if (!context_->initial_metadata_received_) { + finish_ops_.RecvInitialMetadata(context_); + } + finish_ops_.ClientRecvStatus(context_, status); + call_.PerformOps(&finish_ops_); + } + + private: + friend class internal::ClientAsyncReaderFactory; + template + ClientAsyncReader(::grpc::internal::Call call, + ::grpc_impl::ClientContext* context, const W& request, + bool start, void* tag) + : context_(context), call_(call), started_(start) { + // TODO(ctiller): don't assert + GPR_CODEGEN_ASSERT(init_ops_.SendMessage(request).ok()); + init_ops_.ClientSendClose(); + if (start) { + StartCallInternal(tag); + } else { + GPR_CODEGEN_ASSERT(tag == nullptr); + } + } + + void StartCallInternal(void* tag) { + init_ops_.SendInitialMetadata(&context_->send_initial_metadata_, + context_->initial_metadata_flags()); + init_ops_.set_output_tag(tag); + call_.PerformOps(&init_ops_); + } + + ::grpc_impl::ClientContext* context_; + ::grpc::internal::Call call_; + bool started_; + ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata, + ::grpc::internal::CallOpSendMessage, + ::grpc::internal::CallOpClientSendClose> + init_ops_; + ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata> + meta_ops_; + ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata, + ::grpc::internal::CallOpRecvMessage> + read_ops_; + ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata, + ::grpc::internal::CallOpClientRecvStatus> + finish_ops_; +}; + +/// Common interface for client side asynchronous writing. +template +class ClientAsyncWriterInterface + : public internal::ClientAsyncStreamingInterface, + public internal::AsyncWriterInterface { + public: + /// Signal the client is done with the writes (half-close the client stream). + /// Thread-safe with respect to \a AsyncReaderInterface::Read + /// + /// \param[in] tag The tag identifying the operation. + virtual void WritesDone(void* tag) = 0; +}; + +namespace internal { +template +class ClientAsyncWriterFactory { + public: + /// Create a stream object. + /// Start the RPC if \a start is set + /// \a tag will be notified on \a cq when the call has been started (i.e. + /// intitial metadata sent) and \a request has been written out. + /// If \a start is not set, \a tag must be nullptr and the actual call + /// must be initiated by StartCall + /// Note that \a context will be used to fill in custom initial metadata + /// used to send to the server when starting the call. + /// \a response will be filled in with the single expected response + /// message from the server upon a successful call to the \a Finish + /// method of this instance. + template + static ClientAsyncWriter* Create(::grpc::ChannelInterface* channel, + ::grpc_impl::CompletionQueue* cq, + const ::grpc::internal::RpcMethod& method, + ::grpc_impl::ClientContext* context, + R* response, bool start, void* tag) { + ::grpc::internal::Call call = channel->CreateCall(method, context, cq); + return new (::grpc::g_core_codegen_interface->grpc_call_arena_alloc( + call.call(), sizeof(ClientAsyncWriter))) + ClientAsyncWriter(call, context, response, start, tag); + } +}; +} // namespace internal + +/// Async API on the client side for doing client-streaming RPCs, +/// where the outgoing message stream going to the server contains +/// messages of type \a W. +template +class ClientAsyncWriter final : public ClientAsyncWriterInterface { + public: + // always allocated against a call arena, no memory free required + static void operator delete(void* /*ptr*/, std::size_t size) { + GPR_CODEGEN_ASSERT(size == sizeof(ClientAsyncWriter)); + } + + // This operator should never be called as the memory should be freed as part + // of the arena destruction. It only exists to provide a matching operator + // delete to the operator new so that some compilers will not complain (see + // https://github.com/grpc/grpc/issues/11301) Note at the time of adding this + // there are no tests catching the compiler warning. + static void operator delete(void*, void*) { GPR_CODEGEN_ASSERT(false); } + + void StartCall(void* tag) override { + GPR_CODEGEN_ASSERT(!started_); + started_ = true; + StartCallInternal(tag); + } + + /// See the \a ClientAsyncStreamingInterface.ReadInitialMetadata method for + /// semantics. + /// + /// Side effect: + /// - upon receiving initial metadata from the server, the \a ClientContext + /// associated with this call is updated, and the calling code can access + /// the received metadata through the \a ClientContext. + void ReadInitialMetadata(void* tag) override { + GPR_CODEGEN_ASSERT(started_); + GPR_CODEGEN_ASSERT(!context_->initial_metadata_received_); + + meta_ops_.set_output_tag(tag); + meta_ops_.RecvInitialMetadata(context_); + call_.PerformOps(&meta_ops_); + } + + void Write(const W& msg, void* tag) override { + GPR_CODEGEN_ASSERT(started_); + write_ops_.set_output_tag(tag); + // TODO(ctiller): don't assert + GPR_CODEGEN_ASSERT(write_ops_.SendMessage(msg).ok()); + call_.PerformOps(&write_ops_); + } + + void Write(const W& msg, ::grpc::WriteOptions options, void* tag) override { + GPR_CODEGEN_ASSERT(started_); + write_ops_.set_output_tag(tag); + if (options.is_last_message()) { + options.set_buffer_hint(); + write_ops_.ClientSendClose(); + } + // TODO(ctiller): don't assert + GPR_CODEGEN_ASSERT(write_ops_.SendMessage(msg, options).ok()); + call_.PerformOps(&write_ops_); + } + + void WritesDone(void* tag) override { + GPR_CODEGEN_ASSERT(started_); + write_ops_.set_output_tag(tag); + write_ops_.ClientSendClose(); + call_.PerformOps(&write_ops_); + } + + /// See the \a ClientAsyncStreamingInterface.Finish method for semantics. + /// + /// Side effect: + /// - the \a ClientContext associated with this call is updated with + /// possible initial and trailing metadata received from the server. + /// - attempts to fill in the \a response parameter passed to this class's + /// constructor with the server's response message. + void Finish(::grpc::Status* status, void* tag) override { + GPR_CODEGEN_ASSERT(started_); + finish_ops_.set_output_tag(tag); + if (!context_->initial_metadata_received_) { + finish_ops_.RecvInitialMetadata(context_); + } + finish_ops_.ClientRecvStatus(context_, status); + call_.PerformOps(&finish_ops_); + } + + private: + friend class internal::ClientAsyncWriterFactory; + template + ClientAsyncWriter(::grpc::internal::Call call, + ::grpc_impl::ClientContext* context, R* response, + bool start, void* tag) + : context_(context), call_(call), started_(start) { + finish_ops_.RecvMessage(response); + finish_ops_.AllowNoMessage(); + if (start) { + StartCallInternal(tag); + } else { + GPR_CODEGEN_ASSERT(tag == nullptr); + } + } + + void StartCallInternal(void* tag) { + write_ops_.SendInitialMetadata(&context_->send_initial_metadata_, + context_->initial_metadata_flags()); + // if corked bit is set in context, we just keep the initial metadata + // buffered up to coalesce with later message send. No op is performed. + if (!context_->initial_metadata_corked_) { + write_ops_.set_output_tag(tag); + call_.PerformOps(&write_ops_); + } + } + + ::grpc_impl::ClientContext* context_; + ::grpc::internal::Call call_; + bool started_; + ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata> + meta_ops_; + ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata, + ::grpc::internal::CallOpSendMessage, + ::grpc::internal::CallOpClientSendClose> + write_ops_; + ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata, + ::grpc::internal::CallOpGenericRecvMessage, + ::grpc::internal::CallOpClientRecvStatus> + finish_ops_; +}; + +/// Async client-side interface for bi-directional streaming, +/// where the client-to-server message stream has messages of type \a W, +/// and the server-to-client message stream has messages of type \a R. +template +class ClientAsyncReaderWriterInterface + : public internal::ClientAsyncStreamingInterface, + public internal::AsyncWriterInterface, + public internal::AsyncReaderInterface { + public: + /// Signal the client is done with the writes (half-close the client stream). + /// Thread-safe with respect to \a AsyncReaderInterface::Read + /// + /// \param[in] tag The tag identifying the operation. + virtual void WritesDone(void* tag) = 0; +}; + +namespace internal { +template +class ClientAsyncReaderWriterFactory { + public: + /// Create a stream object. + /// Start the RPC request if \a start is set. + /// \a tag will be notified on \a cq when the call has been started (i.e. + /// intitial metadata sent). If \a start is not set, \a tag must be + /// nullptr and the actual call must be initiated by StartCall + /// Note that \a context will be used to fill in custom initial metadata + /// used to send to the server when starting the call. + static ClientAsyncReaderWriter* Create( + ::grpc::ChannelInterface* channel, ::grpc_impl::CompletionQueue* cq, + const ::grpc::internal::RpcMethod& method, + ::grpc_impl::ClientContext* context, bool start, void* tag) { + ::grpc::internal::Call call = channel->CreateCall(method, context, cq); + + return new (::grpc::g_core_codegen_interface->grpc_call_arena_alloc( + call.call(), sizeof(ClientAsyncReaderWriter))) + ClientAsyncReaderWriter(call, context, start, tag); + } +}; +} // namespace internal + +/// Async client-side interface for bi-directional streaming, +/// where the outgoing message stream going to the server +/// has messages of type \a W, and the incoming message stream coming +/// from the server has messages of type \a R. +template +class ClientAsyncReaderWriter final + : public ClientAsyncReaderWriterInterface { + public: + // always allocated against a call arena, no memory free required + static void operator delete(void* /*ptr*/, std::size_t size) { + GPR_CODEGEN_ASSERT(size == sizeof(ClientAsyncReaderWriter)); + } + + // This operator should never be called as the memory should be freed as part + // of the arena destruction. It only exists to provide a matching operator + // delete to the operator new so that some compilers will not complain (see + // https://github.com/grpc/grpc/issues/11301) Note at the time of adding this + // there are no tests catching the compiler warning. + static void operator delete(void*, void*) { GPR_CODEGEN_ASSERT(false); } + + void StartCall(void* tag) override { + GPR_CODEGEN_ASSERT(!started_); + started_ = true; + StartCallInternal(tag); + } + + /// See the \a ClientAsyncStreamingInterface.ReadInitialMetadata method + /// for semantics of this method. + /// + /// Side effect: + /// - upon receiving initial metadata from the server, the \a ClientContext + /// is updated with it, and then the receiving initial metadata can + /// be accessed through this \a ClientContext. + void ReadInitialMetadata(void* tag) override { + GPR_CODEGEN_ASSERT(started_); + GPR_CODEGEN_ASSERT(!context_->initial_metadata_received_); + + meta_ops_.set_output_tag(tag); + meta_ops_.RecvInitialMetadata(context_); + call_.PerformOps(&meta_ops_); + } + + void Read(R* msg, void* tag) override { + GPR_CODEGEN_ASSERT(started_); + read_ops_.set_output_tag(tag); + if (!context_->initial_metadata_received_) { + read_ops_.RecvInitialMetadata(context_); + } + read_ops_.RecvMessage(msg); + call_.PerformOps(&read_ops_); + } + + void Write(const W& msg, void* tag) override { + GPR_CODEGEN_ASSERT(started_); + write_ops_.set_output_tag(tag); + // TODO(ctiller): don't assert + GPR_CODEGEN_ASSERT(write_ops_.SendMessage(msg).ok()); + call_.PerformOps(&write_ops_); + } + + void Write(const W& msg, ::grpc::WriteOptions options, void* tag) override { + GPR_CODEGEN_ASSERT(started_); + write_ops_.set_output_tag(tag); + if (options.is_last_message()) { + options.set_buffer_hint(); + write_ops_.ClientSendClose(); + } + // TODO(ctiller): don't assert + GPR_CODEGEN_ASSERT(write_ops_.SendMessage(msg, options).ok()); + call_.PerformOps(&write_ops_); + } + + void WritesDone(void* tag) override { + GPR_CODEGEN_ASSERT(started_); + write_ops_.set_output_tag(tag); + write_ops_.ClientSendClose(); + call_.PerformOps(&write_ops_); + } + + /// See the \a ClientAsyncStreamingInterface.Finish method for semantics. + /// Side effect + /// - the \a ClientContext associated with this call is updated with + /// possible initial and trailing metadata sent from the server. + void Finish(::grpc::Status* status, void* tag) override { + GPR_CODEGEN_ASSERT(started_); + finish_ops_.set_output_tag(tag); + if (!context_->initial_metadata_received_) { + finish_ops_.RecvInitialMetadata(context_); + } + finish_ops_.ClientRecvStatus(context_, status); + call_.PerformOps(&finish_ops_); + } + + private: + friend class internal::ClientAsyncReaderWriterFactory; + ClientAsyncReaderWriter(::grpc::internal::Call call, + ::grpc_impl::ClientContext* context, bool start, + void* tag) + : context_(context), call_(call), started_(start) { + if (start) { + StartCallInternal(tag); + } else { + GPR_CODEGEN_ASSERT(tag == nullptr); + } + } + + void StartCallInternal(void* tag) { + write_ops_.SendInitialMetadata(&context_->send_initial_metadata_, + context_->initial_metadata_flags()); + // if corked bit is set in context, we just keep the initial metadata + // buffered up to coalesce with later message send. No op is performed. + if (!context_->initial_metadata_corked_) { + write_ops_.set_output_tag(tag); + call_.PerformOps(&write_ops_); + } + } + + ::grpc_impl::ClientContext* context_; + ::grpc::internal::Call call_; + bool started_; + ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata> + meta_ops_; + ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata, + ::grpc::internal::CallOpRecvMessage> + read_ops_; + ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata, + ::grpc::internal::CallOpSendMessage, + ::grpc::internal::CallOpClientSendClose> + write_ops_; + ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata, + ::grpc::internal::CallOpClientRecvStatus> + finish_ops_; +}; + +template +class ServerAsyncReaderInterface + : public ::grpc::internal::ServerAsyncStreamingInterface, + public internal::AsyncReaderInterface { + public: + /// Indicate that the stream is to be finished with a certain status code + /// and also send out \a msg response to the client. + /// Request notification for when the server has sent the response and the + /// appropriate signals to the client to end the call. + /// Should not be used concurrently with other operations. + /// + /// It is appropriate to call this method when: + /// * all messages from the client have been received (either known + /// implictly, or explicitly because a previous + /// \a AsyncReaderInterface::Read operation with a non-ok result, + /// e.g., cq->Next(&read_tag, &ok) filled in 'ok' with 'false'). + /// + /// This operation will end when the server has finished sending out initial + /// metadata (if not sent already), response message, and status, or if + /// some failure occurred when trying to do so. + /// + /// gRPC doesn't take ownership or a reference to \a msg or \a status, so it + /// is safe to deallocate once Finish returns. + /// + /// \param[in] tag Tag identifying this request. + /// \param[in] status To be sent to the client as the result of this call. + /// \param[in] msg To be sent to the client as the response for this call. + virtual void Finish(const W& msg, const ::grpc::Status& status, + void* tag) = 0; + + /// Indicate that the stream is to be finished with a certain + /// non-OK status code. + /// Request notification for when the server has sent the appropriate + /// signals to the client to end the call. + /// Should not be used concurrently with other operations. + /// + /// This call is meant to end the call with some error, and can be called at + /// any point that the server would like to "fail" the call (though note + /// this shouldn't be called concurrently with any other "sending" call, like + /// \a AsyncWriterInterface::Write). + /// + /// This operation will end when the server has finished sending out initial + /// metadata (if not sent already), and status, or if some failure occurred + /// when trying to do so. + /// + /// gRPC doesn't take ownership or a reference to \a status, so it is safe to + /// to deallocate once FinishWithError returns. + /// + /// \param[in] tag Tag identifying this request. + /// \param[in] status To be sent to the client as the result of this call. + /// - Note: \a status must have a non-OK code. + virtual void FinishWithError(const ::grpc::Status& status, void* tag) = 0; +}; + +/// Async server-side API for doing client-streaming RPCs, +/// where the incoming message stream from the client has messages of type \a R, +/// and the single response message sent from the server is type \a W. +template +class ServerAsyncReader final : public ServerAsyncReaderInterface { + public: + explicit ServerAsyncReader(::grpc_impl::ServerContext* ctx) + : call_(nullptr, nullptr, nullptr), ctx_(ctx) {} + + /// See \a ServerAsyncStreamingInterface::SendInitialMetadata for semantics. + /// + /// Implicit input parameter: + /// - The initial metadata that will be sent to the client from this op will + /// be taken from the \a ServerContext associated with the call. + void SendInitialMetadata(void* tag) override { + GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); + + meta_ops_.set_output_tag(tag); + meta_ops_.SendInitialMetadata(&ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); + if (ctx_->compression_level_set()) { + meta_ops_.set_compression_level(ctx_->compression_level()); + } + ctx_->sent_initial_metadata_ = true; + call_.PerformOps(&meta_ops_); + } + + void Read(R* msg, void* tag) override { + read_ops_.set_output_tag(tag); + read_ops_.RecvMessage(msg); + call_.PerformOps(&read_ops_); + } + + /// See the \a ServerAsyncReaderInterface.Read method for semantics + /// + /// Side effect: + /// - also sends initial metadata if not alreay sent. + /// - uses the \a ServerContext associated with this call to send possible + /// initial and trailing metadata. + /// + /// Note: \a msg is not sent if \a status has a non-OK code. + /// + /// gRPC doesn't take ownership or a reference to \a msg and \a status, so it + /// is safe to deallocate once Finish returns. + void Finish(const W& msg, const ::grpc::Status& status, void* tag) override { + finish_ops_.set_output_tag(tag); + if (!ctx_->sent_initial_metadata_) { + finish_ops_.SendInitialMetadata(&ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); + if (ctx_->compression_level_set()) { + finish_ops_.set_compression_level(ctx_->compression_level()); + } + ctx_->sent_initial_metadata_ = true; + } + // The response is dropped if the status is not OK. + if (status.ok()) { + finish_ops_.ServerSendStatus(&ctx_->trailing_metadata_, + finish_ops_.SendMessage(msg)); + } else { + finish_ops_.ServerSendStatus(&ctx_->trailing_metadata_, status); + } + call_.PerformOps(&finish_ops_); + } + + /// See the \a ServerAsyncReaderInterface.Read method for semantics + /// + /// Side effect: + /// - also sends initial metadata if not alreay sent. + /// - uses the \a ServerContext associated with this call to send possible + /// initial and trailing metadata. + /// + /// gRPC doesn't take ownership or a reference to \a status, so it is safe to + /// to deallocate once FinishWithError returns. + void FinishWithError(const ::grpc::Status& status, void* tag) override { + GPR_CODEGEN_ASSERT(!status.ok()); + finish_ops_.set_output_tag(tag); + if (!ctx_->sent_initial_metadata_) { + finish_ops_.SendInitialMetadata(&ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); + if (ctx_->compression_level_set()) { + finish_ops_.set_compression_level(ctx_->compression_level()); + } + ctx_->sent_initial_metadata_ = true; + } + finish_ops_.ServerSendStatus(&ctx_->trailing_metadata_, status); + call_.PerformOps(&finish_ops_); + } + + private: + void BindCall(::grpc::internal::Call* call) override { call_ = *call; } + + ::grpc::internal::Call call_; + ::grpc_impl::ServerContext* ctx_; + ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata> + meta_ops_; + ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvMessage> read_ops_; + ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata, + ::grpc::internal::CallOpSendMessage, + ::grpc::internal::CallOpServerSendStatus> + finish_ops_; +}; + +template +class ServerAsyncWriterInterface + : public ::grpc::internal::ServerAsyncStreamingInterface, + public internal::AsyncWriterInterface { + public: + /// Indicate that the stream is to be finished with a certain status code. + /// Request notification for when the server has sent the appropriate + /// signals to the client to end the call. + /// Should not be used concurrently with other operations. + /// + /// It is appropriate to call this method when either: + /// * all messages from the client have been received (either known + /// implictly, or explicitly because a previous \a + /// AsyncReaderInterface::Read operation with a non-ok + /// result (e.g., cq->Next(&read_tag, &ok) filled in 'ok' with 'false'. + /// * it is desired to end the call early with some non-OK status code. + /// + /// This operation will end when the server has finished sending out initial + /// metadata (if not sent already), response message, and status, or if + /// some failure occurred when trying to do so. + /// + /// gRPC doesn't take ownership or a reference to \a status, so it is safe to + /// to deallocate once Finish returns. + /// + /// \param[in] tag Tag identifying this request. + /// \param[in] status To be sent to the client as the result of this call. + virtual void Finish(const ::grpc::Status& status, void* tag) = 0; + + /// Request the writing of \a msg and coalesce it with trailing metadata which + /// contains \a status, using WriteOptions options with + /// identifying tag \a tag. + /// + /// WriteAndFinish is equivalent of performing WriteLast and Finish + /// in a single step. + /// + /// gRPC doesn't take ownership or a reference to \a msg and \a status, so it + /// is safe to deallocate once WriteAndFinish returns. + /// + /// \param[in] msg The message to be written. + /// \param[in] options The WriteOptions to be used to write this message. + /// \param[in] status The Status that server returns to client. + /// \param[in] tag The tag identifying the operation. + virtual void WriteAndFinish(const W& msg, ::grpc::WriteOptions options, + const ::grpc::Status& status, void* tag) = 0; +}; + +/// Async server-side API for doing server streaming RPCs, +/// where the outgoing message stream from the server has messages of type \a W. +template +class ServerAsyncWriter final : public ServerAsyncWriterInterface { + public: + explicit ServerAsyncWriter(::grpc_impl::ServerContext* ctx) + : call_(nullptr, nullptr, nullptr), ctx_(ctx) {} + + /// See \a ServerAsyncStreamingInterface::SendInitialMetadata for semantics. + /// + /// Implicit input parameter: + /// - The initial metadata that will be sent to the client from this op will + /// be taken from the \a ServerContext associated with the call. + /// + /// \param[in] tag Tag identifying this request. + void SendInitialMetadata(void* tag) override { + GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); + + meta_ops_.set_output_tag(tag); + meta_ops_.SendInitialMetadata(&ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); + if (ctx_->compression_level_set()) { + meta_ops_.set_compression_level(ctx_->compression_level()); + } + ctx_->sent_initial_metadata_ = true; + call_.PerformOps(&meta_ops_); + } + + void Write(const W& msg, void* tag) override { + write_ops_.set_output_tag(tag); + EnsureInitialMetadataSent(&write_ops_); + // TODO(ctiller): don't assert + GPR_CODEGEN_ASSERT(write_ops_.SendMessage(msg).ok()); + call_.PerformOps(&write_ops_); + } + + void Write(const W& msg, ::grpc::WriteOptions options, void* tag) override { + write_ops_.set_output_tag(tag); + if (options.is_last_message()) { + options.set_buffer_hint(); + } + + EnsureInitialMetadataSent(&write_ops_); + // TODO(ctiller): don't assert + GPR_CODEGEN_ASSERT(write_ops_.SendMessage(msg, options).ok()); + call_.PerformOps(&write_ops_); + } + + /// See the \a ServerAsyncWriterInterface.WriteAndFinish method for semantics. + /// + /// Implicit input parameter: + /// - the \a ServerContext associated with this call is used + /// for sending trailing (and initial) metadata to the client. + /// + /// Note: \a status must have an OK code. + /// + /// gRPC doesn't take ownership or a reference to \a msg and \a status, so it + /// is safe to deallocate once WriteAndFinish returns. + void WriteAndFinish(const W& msg, ::grpc::WriteOptions options, + const ::grpc::Status& status, void* tag) override { + write_ops_.set_output_tag(tag); + EnsureInitialMetadataSent(&write_ops_); + options.set_buffer_hint(); + GPR_CODEGEN_ASSERT(write_ops_.SendMessage(msg, options).ok()); + write_ops_.ServerSendStatus(&ctx_->trailing_metadata_, status); + call_.PerformOps(&write_ops_); + } + + /// See the \a ServerAsyncWriterInterface.Finish method for semantics. + /// + /// Implicit input parameter: + /// - the \a ServerContext associated with this call is used for sending + /// trailing (and initial if not already sent) metadata to the client. + /// + /// Note: there are no restrictions are the code of + /// \a status,it may be non-OK + /// + /// gRPC doesn't take ownership or a reference to \a status, so it is safe to + /// to deallocate once Finish returns. + void Finish(const ::grpc::Status& status, void* tag) override { + finish_ops_.set_output_tag(tag); + EnsureInitialMetadataSent(&finish_ops_); + finish_ops_.ServerSendStatus(&ctx_->trailing_metadata_, status); + call_.PerformOps(&finish_ops_); + } + + private: + void BindCall(::grpc::internal::Call* call) override { call_ = *call; } + + template + void EnsureInitialMetadataSent(T* ops) { + if (!ctx_->sent_initial_metadata_) { + ops->SendInitialMetadata(&ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); + if (ctx_->compression_level_set()) { + ops->set_compression_level(ctx_->compression_level()); + } + ctx_->sent_initial_metadata_ = true; + } + } + + ::grpc::internal::Call call_; + ::grpc_impl::ServerContext* ctx_; + ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata> + meta_ops_; + ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata, + ::grpc::internal::CallOpSendMessage, + ::grpc::internal::CallOpServerSendStatus> + write_ops_; + ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata, + ::grpc::internal::CallOpServerSendStatus> + finish_ops_; +}; + +/// Server-side interface for asynchronous bi-directional streaming. +template +class ServerAsyncReaderWriterInterface + : public ::grpc::internal::ServerAsyncStreamingInterface, + public internal::AsyncWriterInterface, + public internal::AsyncReaderInterface { + public: + /// Indicate that the stream is to be finished with a certain status code. + /// Request notification for when the server has sent the appropriate + /// signals to the client to end the call. + /// Should not be used concurrently with other operations. + /// + /// It is appropriate to call this method when either: + /// * all messages from the client have been received (either known + /// implictly, or explicitly because a previous \a + /// AsyncReaderInterface::Read operation + /// with a non-ok result (e.g., cq->Next(&read_tag, &ok) filled in 'ok' + /// with 'false'. + /// * it is desired to end the call early with some non-OK status code. + /// + /// This operation will end when the server has finished sending out initial + /// metadata (if not sent already), response message, and status, or if some + /// failure occurred when trying to do so. + /// + /// gRPC doesn't take ownership or a reference to \a status, so it is safe to + /// to deallocate once Finish returns. + /// + /// \param[in] tag Tag identifying this request. + /// \param[in] status To be sent to the client as the result of this call. + virtual void Finish(const ::grpc::Status& status, void* tag) = 0; + + /// Request the writing of \a msg and coalesce it with trailing metadata which + /// contains \a status, using WriteOptions options with + /// identifying tag \a tag. + /// + /// WriteAndFinish is equivalent of performing WriteLast and Finish in a + /// single step. + /// + /// gRPC doesn't take ownership or a reference to \a msg and \a status, so it + /// is safe to deallocate once WriteAndFinish returns. + /// + /// \param[in] msg The message to be written. + /// \param[in] options The WriteOptions to be used to write this message. + /// \param[in] status The Status that server returns to client. + /// \param[in] tag The tag identifying the operation. + virtual void WriteAndFinish(const W& msg, ::grpc::WriteOptions options, + const ::grpc::Status& status, void* tag) = 0; +}; + +/// Async server-side API for doing bidirectional streaming RPCs, +/// where the incoming message stream coming from the client has messages of +/// type \a R, and the outgoing message stream coming from the server has +/// messages of type \a W. +template +class ServerAsyncReaderWriter final + : public ServerAsyncReaderWriterInterface { + public: + explicit ServerAsyncReaderWriter(::grpc_impl::ServerContext* ctx) + : call_(nullptr, nullptr, nullptr), ctx_(ctx) {} + + /// See \a ServerAsyncStreamingInterface::SendInitialMetadata for semantics. + /// + /// Implicit input parameter: + /// - The initial metadata that will be sent to the client from this op will + /// be taken from the \a ServerContext associated with the call. + /// + /// \param[in] tag Tag identifying this request. + void SendInitialMetadata(void* tag) override { + GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); + + meta_ops_.set_output_tag(tag); + meta_ops_.SendInitialMetadata(&ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); + if (ctx_->compression_level_set()) { + meta_ops_.set_compression_level(ctx_->compression_level()); + } + ctx_->sent_initial_metadata_ = true; + call_.PerformOps(&meta_ops_); + } + + void Read(R* msg, void* tag) override { + read_ops_.set_output_tag(tag); + read_ops_.RecvMessage(msg); + call_.PerformOps(&read_ops_); + } + + void Write(const W& msg, void* tag) override { + write_ops_.set_output_tag(tag); + EnsureInitialMetadataSent(&write_ops_); + // TODO(ctiller): don't assert + GPR_CODEGEN_ASSERT(write_ops_.SendMessage(msg).ok()); + call_.PerformOps(&write_ops_); + } + + void Write(const W& msg, ::grpc::WriteOptions options, void* tag) override { + write_ops_.set_output_tag(tag); + if (options.is_last_message()) { + options.set_buffer_hint(); + } + EnsureInitialMetadataSent(&write_ops_); + GPR_CODEGEN_ASSERT(write_ops_.SendMessage(msg, options).ok()); + call_.PerformOps(&write_ops_); + } + + /// See the \a ServerAsyncReaderWriterInterface.WriteAndFinish + /// method for semantics. + /// + /// Implicit input parameter: + /// - the \a ServerContext associated with this call is used + /// for sending trailing (and initial) metadata to the client. + /// + /// Note: \a status must have an OK code. + // + /// gRPC doesn't take ownership or a reference to \a msg and \a status, so it + /// is safe to deallocate once WriteAndFinish returns. + void WriteAndFinish(const W& msg, ::grpc::WriteOptions options, + const ::grpc::Status& status, void* tag) override { + write_ops_.set_output_tag(tag); + EnsureInitialMetadataSent(&write_ops_); + options.set_buffer_hint(); + GPR_CODEGEN_ASSERT(write_ops_.SendMessage(msg, options).ok()); + write_ops_.ServerSendStatus(&ctx_->trailing_metadata_, status); + call_.PerformOps(&write_ops_); + } + + /// See the \a ServerAsyncReaderWriterInterface.Finish method for semantics. + /// + /// Implicit input parameter: + /// - the \a ServerContext associated with this call is used for sending + /// trailing (and initial if not already sent) metadata to the client. + /// + /// Note: there are no restrictions are the code of \a status, + /// it may be non-OK + // + /// gRPC doesn't take ownership or a reference to \a status, so it is safe to + /// to deallocate once Finish returns. + void Finish(const ::grpc::Status& status, void* tag) override { + finish_ops_.set_output_tag(tag); + EnsureInitialMetadataSent(&finish_ops_); + + finish_ops_.ServerSendStatus(&ctx_->trailing_metadata_, status); + call_.PerformOps(&finish_ops_); + } + + private: + friend class ::grpc_impl::Server; + + void BindCall(::grpc::internal::Call* call) override { call_ = *call; } + + template + void EnsureInitialMetadataSent(T* ops) { + if (!ctx_->sent_initial_metadata_) { + ops->SendInitialMetadata(&ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); + if (ctx_->compression_level_set()) { + ops->set_compression_level(ctx_->compression_level()); + } + ctx_->sent_initial_metadata_ = true; + } + } + + ::grpc::internal::Call call_; + ::grpc_impl::ServerContext* ctx_; + ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata> + meta_ops_; + ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvMessage> read_ops_; + ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata, + ::grpc::internal::CallOpSendMessage, + ::grpc::internal::CallOpServerSendStatus> + write_ops_; + ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata, + ::grpc::internal::CallOpServerSendStatus> + finish_ops_; +}; + +} // namespace grpc_impl +#endif // GRPCPP_IMPL_CODEGEN_ASYNC_STREAM_IMPL_H diff --git a/include/grpcpp/impl/codegen/async_unary_call.h b/include/grpcpp/impl/codegen/async_unary_call.h new file mode 100644 index 00000000..cbbe7017 --- /dev/null +++ b/include/grpcpp/impl/codegen/async_unary_call.h @@ -0,0 +1,46 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_ASYNC_UNARY_CALL_H +#define GRPCPP_IMPL_CODEGEN_ASYNC_UNARY_CALL_H + +#include + +namespace grpc { + +template +using ClientAsyncResponseReaderInterface = + grpc_impl::ClientAsyncResponseReaderInterface; + +template +using ClientAsyncResponseReader = grpc_impl::ClientAsyncResponseReader; + +template +using ServerAsyncResponseWriter = ::grpc_impl::ServerAsyncResponseWriter; + +namespace internal { + +template +using ClientAsyncResponseReaderFactory = + ::grpc_impl::internal::ClientAsyncResponseReaderFactory; + +} // namespace internal + +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_ASYNC_UNARY_CALL_H diff --git a/include/grpcpp/impl/codegen/async_unary_call_impl.h b/include/grpcpp/impl/codegen/async_unary_call_impl.h new file mode 100644 index 00000000..e7a21012 --- /dev/null +++ b/include/grpcpp/impl/codegen/async_unary_call_impl.h @@ -0,0 +1,314 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_ASYNC_UNARY_CALL_IMPL_H +#define GRPCPP_IMPL_CODEGEN_ASYNC_UNARY_CALL_IMPL_H + +#include +#include +#include +#include +#include +#include + +namespace grpc_impl { + +/// An interface relevant for async client side unary RPCs (which send +/// one request message to a server and receive one response message). +template +class ClientAsyncResponseReaderInterface { + public: + virtual ~ClientAsyncResponseReaderInterface() {} + + /// Start the call that was set up by the constructor, but only if the + /// constructor was invoked through the "Prepare" API which doesn't actually + /// start the call + virtual void StartCall() = 0; + + /// Request notification of the reading of initial metadata. Completion + /// will be notified by \a tag on the associated completion queue. + /// This call is optional, but if it is used, it cannot be used concurrently + /// with or after the \a Finish method. + /// + /// \param[in] tag Tag identifying this request. + virtual void ReadInitialMetadata(void* tag) = 0; + + /// Request to receive the server's response \a msg and final \a status for + /// the call, and to notify \a tag on this call's completion queue when + /// finished. + /// + /// This function will return when either: + /// - when the server's response message and status have been received. + /// - when the server has returned a non-OK status (no message expected in + /// this case). + /// - when the call failed for some reason and the library generated a + /// non-OK status. + /// + /// \param[in] tag Tag identifying this request. + /// \param[out] status To be updated with the operation status. + /// \param[out] msg To be filled in with the server's response message. + virtual void Finish(R* msg, ::grpc::Status* status, void* tag) = 0; +}; + +namespace internal { +template +class ClientAsyncResponseReaderFactory { + public: + /// Start a call and write the request out if \a start is set. + /// \a tag will be notified on \a cq when the call has been started (i.e. + /// intitial metadata sent) and \a request has been written out. + /// If \a start is not set, the actual call must be initiated by StartCall + /// Note that \a context will be used to fill in custom initial metadata + /// used to send to the server when starting the call. + template + static ClientAsyncResponseReader* Create( + ::grpc::ChannelInterface* channel, ::grpc_impl::CompletionQueue* cq, + const ::grpc::internal::RpcMethod& method, + ::grpc_impl::ClientContext* context, const W& request, bool start) { + ::grpc::internal::Call call = channel->CreateCall(method, context, cq); + return new (::grpc::g_core_codegen_interface->grpc_call_arena_alloc( + call.call(), sizeof(ClientAsyncResponseReader))) + ClientAsyncResponseReader(call, context, request, start); + } +}; +} // namespace internal + +/// Async API for client-side unary RPCs, where the message response +/// received from the server is of type \a R. +template +class ClientAsyncResponseReader final + : public ClientAsyncResponseReaderInterface { + public: + // always allocated against a call arena, no memory free required + static void operator delete(void* /*ptr*/, std::size_t size) { + GPR_CODEGEN_ASSERT(size == sizeof(ClientAsyncResponseReader)); + } + + // This operator should never be called as the memory should be freed as part + // of the arena destruction. It only exists to provide a matching operator + // delete to the operator new so that some compilers will not complain (see + // https://github.com/grpc/grpc/issues/11301) Note at the time of adding this + // there are no tests catching the compiler warning. + static void operator delete(void*, void*) { GPR_CODEGEN_ASSERT(false); } + + void StartCall() override { + GPR_CODEGEN_ASSERT(!started_); + started_ = true; + StartCallInternal(); + } + + /// See \a ClientAsyncResponseReaderInterface::ReadInitialMetadata for + /// semantics. + /// + /// Side effect: + /// - the \a ClientContext associated with this call is updated with + /// possible initial and trailing metadata sent from the server. + void ReadInitialMetadata(void* tag) override { + GPR_CODEGEN_ASSERT(started_); + GPR_CODEGEN_ASSERT(!context_->initial_metadata_received_); + + single_buf.set_output_tag(tag); + single_buf.RecvInitialMetadata(context_); + call_.PerformOps(&single_buf); + initial_metadata_read_ = true; + } + + /// See \a ClientAysncResponseReaderInterface::Finish for semantics. + /// + /// Side effect: + /// - the \a ClientContext associated with this call is updated with + /// possible initial and trailing metadata sent from the server. + void Finish(R* msg, ::grpc::Status* status, void* tag) override { + GPR_CODEGEN_ASSERT(started_); + if (initial_metadata_read_) { + finish_buf.set_output_tag(tag); + finish_buf.RecvMessage(msg); + finish_buf.AllowNoMessage(); + finish_buf.ClientRecvStatus(context_, status); + call_.PerformOps(&finish_buf); + } else { + single_buf.set_output_tag(tag); + single_buf.RecvInitialMetadata(context_); + single_buf.RecvMessage(msg); + single_buf.AllowNoMessage(); + single_buf.ClientRecvStatus(context_, status); + call_.PerformOps(&single_buf); + } + } + + private: + friend class internal::ClientAsyncResponseReaderFactory; + ::grpc_impl::ClientContext* const context_; + ::grpc::internal::Call call_; + bool started_; + bool initial_metadata_read_ = false; + + template + ClientAsyncResponseReader(::grpc::internal::Call call, + ::grpc_impl::ClientContext* context, + const W& request, bool start) + : context_(context), call_(call), started_(start) { + // Bind the metadata at time of StartCallInternal but set up the rest here + // TODO(ctiller): don't assert + GPR_CODEGEN_ASSERT(single_buf.SendMessage(request).ok()); + single_buf.ClientSendClose(); + if (start) StartCallInternal(); + } + + void StartCallInternal() { + single_buf.SendInitialMetadata(&context_->send_initial_metadata_, + context_->initial_metadata_flags()); + } + + // disable operator new + static void* operator new(std::size_t size); + static void* operator new(std::size_t /*size*/, void* p) { return p; } + + ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata, + ::grpc::internal::CallOpSendMessage, + ::grpc::internal::CallOpClientSendClose, + ::grpc::internal::CallOpRecvInitialMetadata, + ::grpc::internal::CallOpRecvMessage, + ::grpc::internal::CallOpClientRecvStatus> + single_buf; + ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvMessage, + ::grpc::internal::CallOpClientRecvStatus> + finish_buf; +}; + +/// Async server-side API for handling unary calls, where the single +/// response message sent to the client is of type \a W. +template +class ServerAsyncResponseWriter final + : public ::grpc::internal::ServerAsyncStreamingInterface { + public: + explicit ServerAsyncResponseWriter(::grpc_impl::ServerContext* ctx) + : call_(nullptr, nullptr, nullptr), ctx_(ctx) {} + + /// See \a ServerAsyncStreamingInterface::SendInitialMetadata for semantics. + /// + /// Side effect: + /// The initial metadata that will be sent to the client from this op will + /// be taken from the \a ServerContext associated with the call. + /// + /// \param[in] tag Tag identifying this request. + void SendInitialMetadata(void* tag) override { + GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); + + meta_buf_.set_output_tag(tag); + meta_buf_.SendInitialMetadata(&ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); + if (ctx_->compression_level_set()) { + meta_buf_.set_compression_level(ctx_->compression_level()); + } + ctx_->sent_initial_metadata_ = true; + call_.PerformOps(&meta_buf_); + } + + /// Indicate that the stream is to be finished and request notification + /// when the server has sent the appropriate signals to the client to + /// end the call. Should not be used concurrently with other operations. + /// + /// \param[in] tag Tag identifying this request. + /// \param[in] status To be sent to the client as the result of the call. + /// \param[in] msg Message to be sent to the client. + /// + /// Side effect: + /// - also sends initial metadata if not already sent (using the + /// \a ServerContext associated with this call). + /// + /// Note: if \a status has a non-OK code, then \a msg will not be sent, + /// and the client will receive only the status with possible trailing + /// metadata. + void Finish(const W& msg, const ::grpc::Status& status, void* tag) { + finish_buf_.set_output_tag(tag); + finish_buf_.set_core_cq_tag(&finish_buf_); + if (!ctx_->sent_initial_metadata_) { + finish_buf_.SendInitialMetadata(&ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); + if (ctx_->compression_level_set()) { + finish_buf_.set_compression_level(ctx_->compression_level()); + } + ctx_->sent_initial_metadata_ = true; + } + // The response is dropped if the status is not OK. + if (status.ok()) { + finish_buf_.ServerSendStatus(&ctx_->trailing_metadata_, + finish_buf_.SendMessage(msg)); + } else { + finish_buf_.ServerSendStatus(&ctx_->trailing_metadata_, status); + } + call_.PerformOps(&finish_buf_); + } + + /// Indicate that the stream is to be finished with a non-OK status, + /// and request notification for when the server has finished sending the + /// appropriate signals to the client to end the call. + /// Should not be used concurrently with other operations. + /// + /// \param[in] tag Tag identifying this request. + /// \param[in] status To be sent to the client as the result of the call. + /// - Note: \a status must have a non-OK code. + /// + /// Side effect: + /// - also sends initial metadata if not already sent (using the + /// \a ServerContext associated with this call). + void FinishWithError(const ::grpc::Status& status, void* tag) { + GPR_CODEGEN_ASSERT(!status.ok()); + finish_buf_.set_output_tag(tag); + if (!ctx_->sent_initial_metadata_) { + finish_buf_.SendInitialMetadata(&ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); + if (ctx_->compression_level_set()) { + finish_buf_.set_compression_level(ctx_->compression_level()); + } + ctx_->sent_initial_metadata_ = true; + } + finish_buf_.ServerSendStatus(&ctx_->trailing_metadata_, status); + call_.PerformOps(&finish_buf_); + } + + private: + void BindCall(::grpc::internal::Call* call) override { call_ = *call; } + + ::grpc::internal::Call call_; + ::grpc_impl::ServerContext* ctx_; + ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata> + meta_buf_; + ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata, + ::grpc::internal::CallOpSendMessage, + ::grpc::internal::CallOpServerSendStatus> + finish_buf_; +}; + +} // namespace grpc_impl + +namespace std { +template +class default_delete<::grpc_impl::ClientAsyncResponseReader> { + public: + void operator()(void* /*p*/) {} +}; +template +class default_delete<::grpc_impl::ClientAsyncResponseReaderInterface> { + public: + void operator()(void* /*p*/) {} +}; +} // namespace std + +#endif // GRPCPP_IMPL_CODEGEN_ASYNC_UNARY_CALL_IMPL_H diff --git a/include/grpcpp/impl/codegen/byte_buffer.h b/include/grpcpp/impl/codegen/byte_buffer.h new file mode 100644 index 00000000..54886ae8 --- /dev/null +++ b/include/grpcpp/impl/codegen/byte_buffer.h @@ -0,0 +1,233 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_BYTE_BUFFER_H +#define GRPCPP_IMPL_CODEGEN_BYTE_BUFFER_H + +#include + +#include +#include +#include +#include +#include + +#include + +namespace grpc_impl { +namespace internal { + +template +class CallbackUnaryHandler; +template +class CallbackServerStreamingHandler; +template +class RpcMethodHandler; +template +class ServerStreamingHandler; +template <::grpc::StatusCode code> +class ErrorMethodHandler; + +} // namespace internal +} // namespace grpc_impl + +namespace grpc { + +class ServerInterface; +class ByteBuffer; +class ServerInterface; + +namespace internal { +class CallOpSendMessage; +template +class CallOpRecvMessage; +class CallOpGenericRecvMessage; +class ExternalConnectionAcceptorImpl; +template +class DeserializeFuncType; +class GrpcByteBufferPeer; + +} // namespace internal +/// A sequence of bytes. +class ByteBuffer final { + public: + /// Constuct an empty buffer. + ByteBuffer() : buffer_(nullptr) {} + + /// Construct buffer from \a slices, of which there are \a nslices. + ByteBuffer(const Slice* slices, size_t nslices) { + // The following assertions check that the representation of a grpc::Slice + // is identical to that of a grpc_slice: it has a grpc_slice field, and + // nothing else. + static_assert(std::is_same::value, + "Slice must have same representation as grpc_slice"); + static_assert(sizeof(Slice) == sizeof(grpc_slice), + "Slice must have same representation as grpc_slice"); + // The following assertions check that the representation of a ByteBuffer is + // identical to grpc_byte_buffer*: it has a grpc_byte_buffer* field, + // and nothing else. + static_assert(std::is_same::value, + "ByteBuffer must have same representation as " + "grpc_byte_buffer*"); + static_assert(sizeof(ByteBuffer) == sizeof(grpc_byte_buffer*), + "ByteBuffer must have same representation as " + "grpc_byte_buffer*"); + // The const_cast is legal if grpc_raw_byte_buffer_create() does no more + // than its advertised side effect of increasing the reference count of the + // slices it processes, and such an increase does not affect the semantics + // seen by the caller of this constructor. + buffer_ = g_core_codegen_interface->grpc_raw_byte_buffer_create( + reinterpret_cast(const_cast(slices)), nslices); + } + + /// Constuct a byte buffer by referencing elements of existing buffer + /// \a buf. Wrapper of core function grpc_byte_buffer_copy . This is not + /// a deep copy; it is just a referencing. As a result, its performance is + /// size-independent. + ByteBuffer(const ByteBuffer& buf) : buffer_(nullptr) { operator=(buf); } + + ~ByteBuffer() { + if (buffer_) { + g_core_codegen_interface->grpc_byte_buffer_destroy(buffer_); + } + } + + /// Wrapper of core function grpc_byte_buffer_copy . This is not + /// a deep copy; it is just a referencing. As a result, its performance is + /// size-independent. + ByteBuffer& operator=(const ByteBuffer& buf) { + if (this != &buf) { + Clear(); // first remove existing data + } + if (buf.buffer_) { + // then copy + buffer_ = g_core_codegen_interface->grpc_byte_buffer_copy(buf.buffer_); + } + return *this; + } + + /// Dump (read) the buffer contents into \a slices. + Status Dump(std::vector* slices) const; + + /// Remove all data. + void Clear() { + if (buffer_) { + g_core_codegen_interface->grpc_byte_buffer_destroy(buffer_); + buffer_ = nullptr; + } + } + + /// Make a duplicate copy of the internals of this byte + /// buffer so that we have our own owned version of it. + /// bbuf.Duplicate(); is equivalent to bbuf=bbuf; but is actually readable. + /// This is not a deep copy; it is a referencing and its performance + /// is size-independent. + void Duplicate() { + buffer_ = g_core_codegen_interface->grpc_byte_buffer_copy(buffer_); + } + + /// Forget underlying byte buffer without destroying + /// Use this only for un-owned byte buffers + void Release() { buffer_ = nullptr; } + + /// Buffer size in bytes. + size_t Length() const { + return buffer_ == nullptr + ? 0 + : g_core_codegen_interface->grpc_byte_buffer_length(buffer_); + } + + /// Swap the state of *this and *other. + void Swap(ByteBuffer* other) { + grpc_byte_buffer* tmp = other->buffer_; + other->buffer_ = buffer_; + buffer_ = tmp; + } + + /// Is this ByteBuffer valid? + bool Valid() const { return (buffer_ != nullptr); } + + private: + friend class SerializationTraits; + friend class ServerInterface; + friend class internal::CallOpSendMessage; + template + friend class internal::CallOpRecvMessage; + friend class internal::CallOpGenericRecvMessage; + template + friend class ::grpc_impl::internal::RpcMethodHandler; + template + friend class ::grpc_impl::internal::ServerStreamingHandler; + template + friend class ::grpc_impl::internal::CallbackUnaryHandler; + template + friend class ::grpc_impl::internal::CallbackServerStreamingHandler; + template + friend class ::grpc_impl::internal::ErrorMethodHandler; + template + friend class internal::DeserializeFuncType; + friend class ProtoBufferReader; + friend class ProtoBufferWriter; + friend class internal::GrpcByteBufferPeer; + friend class internal::ExternalConnectionAcceptorImpl; + + grpc_byte_buffer* buffer_; + + // takes ownership + void set_buffer(grpc_byte_buffer* buf) { + if (buffer_) { + Clear(); + } + buffer_ = buf; + } + + grpc_byte_buffer* c_buffer() { return buffer_; } + grpc_byte_buffer** c_buffer_ptr() { return &buffer_; } + + class ByteBufferPointer { + public: + ByteBufferPointer(const ByteBuffer* b) + : bbuf_(const_cast(b)) {} + operator ByteBuffer*() { return bbuf_; } + operator grpc_byte_buffer*() { return bbuf_->buffer_; } + operator grpc_byte_buffer**() { return &bbuf_->buffer_; } + + private: + ByteBuffer* bbuf_; + }; + ByteBufferPointer bbuf_ptr() const { return ByteBufferPointer(this); } +}; + +template <> +class SerializationTraits { + public: + static Status Deserialize(ByteBuffer* byte_buffer, ByteBuffer* dest) { + dest->set_buffer(byte_buffer->buffer_); + return Status::OK; + } + static Status Serialize(const ByteBuffer& source, ByteBuffer* buffer, + bool* own_buffer) { + *buffer = source; + *own_buffer = true; + return g_core_codegen_interface->ok(); + } +}; + +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_BYTE_BUFFER_H diff --git a/include/grpcpp/impl/codegen/call.h b/include/grpcpp/impl/codegen/call.h new file mode 100644 index 00000000..eefa4a7f --- /dev/null +++ b/include/grpcpp/impl/codegen/call.h @@ -0,0 +1,96 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#ifndef GRPCPP_IMPL_CODEGEN_CALL_H +#define GRPCPP_IMPL_CODEGEN_CALL_H + +#include +#include + +namespace grpc_impl { +class CompletionQueue; +} + +namespace grpc { +namespace experimental { +class ClientRpcInfo; +class ServerRpcInfo; +} // namespace experimental +namespace internal { +class CallHook; +class CallOpSetInterface; + +/// Straightforward wrapping of the C call object +class Call final { + public: + Call() + : call_hook_(nullptr), + cq_(nullptr), + call_(nullptr), + max_receive_message_size_(-1) {} + /** call is owned by the caller */ + Call(grpc_call* call, CallHook* call_hook, ::grpc_impl::CompletionQueue* cq) + : call_hook_(call_hook), + cq_(cq), + call_(call), + max_receive_message_size_(-1) {} + + Call(grpc_call* call, CallHook* call_hook, ::grpc_impl::CompletionQueue* cq, + experimental::ClientRpcInfo* rpc_info) + : call_hook_(call_hook), + cq_(cq), + call_(call), + max_receive_message_size_(-1), + client_rpc_info_(rpc_info) {} + + Call(grpc_call* call, CallHook* call_hook, ::grpc_impl::CompletionQueue* cq, + int max_receive_message_size, experimental::ServerRpcInfo* rpc_info) + : call_hook_(call_hook), + cq_(cq), + call_(call), + max_receive_message_size_(max_receive_message_size), + server_rpc_info_(rpc_info) {} + + void PerformOps(CallOpSetInterface* ops) { + call_hook_->PerformOpsOnCall(ops, this); + } + + grpc_call* call() const { return call_; } + ::grpc_impl::CompletionQueue* cq() const { return cq_; } + + int max_receive_message_size() const { return max_receive_message_size_; } + + experimental::ClientRpcInfo* client_rpc_info() const { + return client_rpc_info_; + } + + experimental::ServerRpcInfo* server_rpc_info() const { + return server_rpc_info_; + } + + private: + CallHook* call_hook_; + ::grpc_impl::CompletionQueue* cq_; + grpc_call* call_; + int max_receive_message_size_; + experimental::ClientRpcInfo* client_rpc_info_ = nullptr; + experimental::ServerRpcInfo* server_rpc_info_ = nullptr; +}; +} // namespace internal +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_CALL_H diff --git a/include/grpcpp/impl/codegen/call_hook.h b/include/grpcpp/impl/codegen/call_hook.h new file mode 100644 index 00000000..4f7d370c --- /dev/null +++ b/include/grpcpp/impl/codegen/call_hook.h @@ -0,0 +1,39 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_CALL_HOOK_H +#define GRPCPP_IMPL_CODEGEN_CALL_HOOK_H + +namespace grpc { + +namespace internal { +class CallOpSetInterface; +class Call; + +/// This is an interface that Channel and Server implement to allow them to hook +/// performing ops. +class CallHook { + public: + virtual ~CallHook() {} + virtual void PerformOpsOnCall(CallOpSetInterface* ops, Call* call) = 0; +}; +} // namespace internal + +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_CALL_HOOK_H diff --git a/include/grpcpp/impl/codegen/call_op_set.h b/include/grpcpp/impl/codegen/call_op_set.h new file mode 100644 index 00000000..ba91404e --- /dev/null +++ b/include/grpcpp/impl/codegen/call_op_set.h @@ -0,0 +1,1032 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_CALL_OP_SET_H +#define GRPCPP_IMPL_CODEGEN_CALL_OP_SET_H + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace grpc { + +extern CoreCodegenInterface* g_core_codegen_interface; + +namespace internal { +class Call; +class CallHook; + +// TODO(yangg) if the map is changed before we send, the pointers will be a +// mess. Make sure it does not happen. +inline grpc_metadata* FillMetadataArray( + const std::multimap& metadata, + size_t* metadata_count, const grpc::string& optional_error_details) { + *metadata_count = metadata.size() + (optional_error_details.empty() ? 0 : 1); + if (*metadata_count == 0) { + return nullptr; + } + grpc_metadata* metadata_array = + (grpc_metadata*)(g_core_codegen_interface->gpr_malloc( + (*metadata_count) * sizeof(grpc_metadata))); + size_t i = 0; + for (auto iter = metadata.cbegin(); iter != metadata.cend(); ++iter, ++i) { + metadata_array[i].key = SliceReferencingString(iter->first); + metadata_array[i].value = SliceReferencingString(iter->second); + } + if (!optional_error_details.empty()) { + metadata_array[i].key = + g_core_codegen_interface->grpc_slice_from_static_buffer( + kBinaryErrorDetailsKey, sizeof(kBinaryErrorDetailsKey) - 1); + metadata_array[i].value = SliceReferencingString(optional_error_details); + } + return metadata_array; +} +} // namespace internal + +/// Per-message write options. +class WriteOptions { + public: + WriteOptions() : flags_(0), last_message_(false) {} + WriteOptions(const WriteOptions& other) + : flags_(other.flags_), last_message_(other.last_message_) {} + + /// Default assignment operator + WriteOptions& operator=(const WriteOptions& other) = default; + + /// Clear all flags. + inline void Clear() { flags_ = 0; } + + /// Returns raw flags bitset. + inline uint32_t flags() const { return flags_; } + + /// Sets flag for the disabling of compression for the next message write. + /// + /// \sa GRPC_WRITE_NO_COMPRESS + inline WriteOptions& set_no_compression() { + SetBit(GRPC_WRITE_NO_COMPRESS); + return *this; + } + + /// Clears flag for the disabling of compression for the next message write. + /// + /// \sa GRPC_WRITE_NO_COMPRESS + inline WriteOptions& clear_no_compression() { + ClearBit(GRPC_WRITE_NO_COMPRESS); + return *this; + } + + /// Get value for the flag indicating whether compression for the next + /// message write is forcefully disabled. + /// + /// \sa GRPC_WRITE_NO_COMPRESS + inline bool get_no_compression() const { + return GetBit(GRPC_WRITE_NO_COMPRESS); + } + + /// Sets flag indicating that the write may be buffered and need not go out on + /// the wire immediately. + /// + /// \sa GRPC_WRITE_BUFFER_HINT + inline WriteOptions& set_buffer_hint() { + SetBit(GRPC_WRITE_BUFFER_HINT); + return *this; + } + + /// Clears flag indicating that the write may be buffered and need not go out + /// on the wire immediately. + /// + /// \sa GRPC_WRITE_BUFFER_HINT + inline WriteOptions& clear_buffer_hint() { + ClearBit(GRPC_WRITE_BUFFER_HINT); + return *this; + } + + /// Get value for the flag indicating that the write may be buffered and need + /// not go out on the wire immediately. + /// + /// \sa GRPC_WRITE_BUFFER_HINT + inline bool get_buffer_hint() const { return GetBit(GRPC_WRITE_BUFFER_HINT); } + + /// corked bit: aliases set_buffer_hint currently, with the intent that + /// set_buffer_hint will be removed in the future + inline WriteOptions& set_corked() { + SetBit(GRPC_WRITE_BUFFER_HINT); + return *this; + } + + inline WriteOptions& clear_corked() { + ClearBit(GRPC_WRITE_BUFFER_HINT); + return *this; + } + + inline bool is_corked() const { return GetBit(GRPC_WRITE_BUFFER_HINT); } + + /// last-message bit: indicates this is the last message in a stream + /// client-side: makes Write the equivalent of performing Write, WritesDone + /// in a single step + /// server-side: hold the Write until the service handler returns (sync api) + /// or until Finish is called (async api) + inline WriteOptions& set_last_message() { + last_message_ = true; + return *this; + } + + /// Clears flag indicating that this is the last message in a stream, + /// disabling coalescing. + inline WriteOptions& clear_last_message() { + last_message_ = false; + return *this; + } + + /// Guarantee that all bytes have been written to the socket before completing + /// this write (usually writes are completed when they pass flow control). + inline WriteOptions& set_write_through() { + SetBit(GRPC_WRITE_THROUGH); + return *this; + } + + inline bool is_write_through() const { return GetBit(GRPC_WRITE_THROUGH); } + + /// Get value for the flag indicating that this is the last message, and + /// should be coalesced with trailing metadata. + /// + /// \sa GRPC_WRITE_LAST_MESSAGE + bool is_last_message() const { return last_message_; } + + private: + void SetBit(const uint32_t mask) { flags_ |= mask; } + + void ClearBit(const uint32_t mask) { flags_ &= ~mask; } + + bool GetBit(const uint32_t mask) const { return (flags_ & mask) != 0; } + + uint32_t flags_; + bool last_message_; +}; + +namespace internal { + +/// Default argument for CallOpSet. I is unused by the class, but can be +/// used for generating multiple names for the same thing. +template +class CallNoOp { + protected: + void AddOp(grpc_op* /*ops*/, size_t* /*nops*/) {} + void FinishOp(bool* /*status*/) {} + void SetInterceptionHookPoint( + InterceptorBatchMethodsImpl* /*interceptor_methods*/) {} + void SetFinishInterceptionHookPoint( + InterceptorBatchMethodsImpl* /*interceptor_methods*/) {} + void SetHijackingState(InterceptorBatchMethodsImpl* /*interceptor_methods*/) { + } +}; + +class CallOpSendInitialMetadata { + public: + CallOpSendInitialMetadata() : send_(false) { + maybe_compression_level_.is_set = false; + } + + void SendInitialMetadata(std::multimap* metadata, + uint32_t flags) { + maybe_compression_level_.is_set = false; + send_ = true; + flags_ = flags; + metadata_map_ = metadata; + } + + void set_compression_level(grpc_compression_level level) { + maybe_compression_level_.is_set = true; + maybe_compression_level_.level = level; + } + + protected: + void AddOp(grpc_op* ops, size_t* nops) { + if (!send_ || hijacked_) return; + grpc_op* op = &ops[(*nops)++]; + op->op = GRPC_OP_SEND_INITIAL_METADATA; + op->flags = flags_; + op->reserved = NULL; + initial_metadata_ = + FillMetadataArray(*metadata_map_, &initial_metadata_count_, ""); + op->data.send_initial_metadata.count = initial_metadata_count_; + op->data.send_initial_metadata.metadata = initial_metadata_; + op->data.send_initial_metadata.maybe_compression_level.is_set = + maybe_compression_level_.is_set; + if (maybe_compression_level_.is_set) { + op->data.send_initial_metadata.maybe_compression_level.level = + maybe_compression_level_.level; + } + } + void FinishOp(bool* /*status*/) { + if (!send_ || hijacked_) return; + g_core_codegen_interface->gpr_free(initial_metadata_); + send_ = false; + } + + void SetInterceptionHookPoint( + InterceptorBatchMethodsImpl* interceptor_methods) { + if (!send_) return; + interceptor_methods->AddInterceptionHookPoint( + experimental::InterceptionHookPoints::PRE_SEND_INITIAL_METADATA); + interceptor_methods->SetSendInitialMetadata(metadata_map_); + } + + void SetFinishInterceptionHookPoint( + InterceptorBatchMethodsImpl* /*interceptor_methods*/) {} + + void SetHijackingState(InterceptorBatchMethodsImpl* /*interceptor_methods*/) { + hijacked_ = true; + } + + bool hijacked_ = false; + bool send_; + uint32_t flags_; + size_t initial_metadata_count_; + std::multimap* metadata_map_; + grpc_metadata* initial_metadata_; + struct { + bool is_set; + grpc_compression_level level; + } maybe_compression_level_; +}; + +class CallOpSendMessage { + public: + CallOpSendMessage() : send_buf_() {} + + /// Send \a message using \a options for the write. The \a options are cleared + /// after use. + template + Status SendMessage(const M& message, + WriteOptions options) GRPC_MUST_USE_RESULT; + + template + Status SendMessage(const M& message) GRPC_MUST_USE_RESULT; + + /// Send \a message using \a options for the write. The \a options are cleared + /// after use. This form of SendMessage allows gRPC to reference \a message + /// beyond the lifetime of SendMessage. + template + Status SendMessagePtr(const M* message, + WriteOptions options) GRPC_MUST_USE_RESULT; + + /// This form of SendMessage allows gRPC to reference \a message beyond the + /// lifetime of SendMessage. + template + Status SendMessagePtr(const M* message) GRPC_MUST_USE_RESULT; + + protected: + void AddOp(grpc_op* ops, size_t* nops) { + if (msg_ == nullptr && !send_buf_.Valid()) return; + if (hijacked_) { + serializer_ = nullptr; + return; + } + if (msg_ != nullptr) { + GPR_CODEGEN_ASSERT(serializer_(msg_).ok()); + } + serializer_ = nullptr; + grpc_op* op = &ops[(*nops)++]; + op->op = GRPC_OP_SEND_MESSAGE; + op->flags = write_options_.flags(); + op->reserved = NULL; + op->data.send_message.send_message = send_buf_.c_buffer(); + // Flags are per-message: clear them after use. + write_options_.Clear(); + } + void FinishOp(bool* status) { + if (msg_ == nullptr && !send_buf_.Valid()) return; + if (hijacked_ && failed_send_) { + // Hijacking interceptor failed this Op + *status = false; + } else if (!*status) { + // This Op was passed down to core and the Op failed + failed_send_ = true; + } + } + + void SetInterceptionHookPoint( + InterceptorBatchMethodsImpl* interceptor_methods) { + if (msg_ == nullptr && !send_buf_.Valid()) return; + interceptor_methods->AddInterceptionHookPoint( + experimental::InterceptionHookPoints::PRE_SEND_MESSAGE); + interceptor_methods->SetSendMessage(&send_buf_, &msg_, &failed_send_, + serializer_); + } + + void SetFinishInterceptionHookPoint( + InterceptorBatchMethodsImpl* interceptor_methods) { + if (msg_ != nullptr || send_buf_.Valid()) { + interceptor_methods->AddInterceptionHookPoint( + experimental::InterceptionHookPoints::POST_SEND_MESSAGE); + } + send_buf_.Clear(); + msg_ = nullptr; + // The contents of the SendMessage value that was previously set + // has had its references stolen by core's operations + interceptor_methods->SetSendMessage(nullptr, nullptr, &failed_send_, + nullptr); + } + + void SetHijackingState(InterceptorBatchMethodsImpl* /*interceptor_methods*/) { + hijacked_ = true; + } + + private: + const void* msg_ = nullptr; // The original non-serialized message + bool hijacked_ = false; + bool failed_send_ = false; + ByteBuffer send_buf_; + WriteOptions write_options_; + std::function serializer_; +}; + +template +Status CallOpSendMessage::SendMessage(const M& message, WriteOptions options) { + write_options_ = options; + serializer_ = [this](const void* message) { + bool own_buf; + send_buf_.Clear(); + // TODO(vjpai): Remove the void below when possible + // The void in the template parameter below should not be needed + // (since it should be implicit) but is needed due to an observed + // difference in behavior between clang and gcc for certain internal users + Status result = SerializationTraits::Serialize( + *static_cast(message), send_buf_.bbuf_ptr(), &own_buf); + if (!own_buf) { + send_buf_.Duplicate(); + } + return result; + }; + // Serialize immediately only if we do not have access to the message pointer + if (msg_ == nullptr) { + Status result = serializer_(&message); + serializer_ = nullptr; + return result; + } + return Status(); +} + +template +Status CallOpSendMessage::SendMessage(const M& message) { + return SendMessage(message, WriteOptions()); +} + +template +Status CallOpSendMessage::SendMessagePtr(const M* message, + WriteOptions options) { + msg_ = message; + return SendMessage(*message, options); +} + +template +Status CallOpSendMessage::SendMessagePtr(const M* message) { + msg_ = message; + return SendMessage(*message, WriteOptions()); +} + +template +class CallOpRecvMessage { + public: + void RecvMessage(R* message) { message_ = message; } + + // Do not change status if no message is received. + void AllowNoMessage() { allow_not_getting_message_ = true; } + + bool got_message = false; + + protected: + void AddOp(grpc_op* ops, size_t* nops) { + if (message_ == nullptr || hijacked_) return; + grpc_op* op = &ops[(*nops)++]; + op->op = GRPC_OP_RECV_MESSAGE; + op->flags = 0; + op->reserved = NULL; + op->data.recv_message.recv_message = recv_buf_.c_buffer_ptr(); + } + + void FinishOp(bool* status) { + if (message_ == nullptr) return; + if (recv_buf_.Valid()) { + if (*status) { + got_message = *status = + SerializationTraits::Deserialize(recv_buf_.bbuf_ptr(), message_) + .ok(); + recv_buf_.Release(); + } else { + got_message = false; + recv_buf_.Clear(); + } + } else if (hijacked_) { + if (hijacked_recv_message_failed_) { + FinishOpRecvMessageFailureHandler(status); + } else { + // The op was hijacked and it was successful. There is no further action + // to be performed since the message is already in its non-serialized + // form. + } + } else { + FinishOpRecvMessageFailureHandler(status); + } + } + + void SetInterceptionHookPoint( + InterceptorBatchMethodsImpl* interceptor_methods) { + if (message_ == nullptr) return; + interceptor_methods->SetRecvMessage(message_, + &hijacked_recv_message_failed_); + } + + void SetFinishInterceptionHookPoint( + InterceptorBatchMethodsImpl* interceptor_methods) { + if (message_ == nullptr) return; + interceptor_methods->AddInterceptionHookPoint( + experimental::InterceptionHookPoints::POST_RECV_MESSAGE); + if (!got_message) interceptor_methods->SetRecvMessage(nullptr, nullptr); + } + void SetHijackingState(InterceptorBatchMethodsImpl* interceptor_methods) { + hijacked_ = true; + if (message_ == nullptr) return; + interceptor_methods->AddInterceptionHookPoint( + experimental::InterceptionHookPoints::PRE_RECV_MESSAGE); + got_message = true; + } + + private: + // Sets got_message and \a status for a failed recv message op + void FinishOpRecvMessageFailureHandler(bool* status) { + got_message = false; + if (!allow_not_getting_message_) { + *status = false; + } + } + + R* message_ = nullptr; + ByteBuffer recv_buf_; + bool allow_not_getting_message_ = false; + bool hijacked_ = false; + bool hijacked_recv_message_failed_ = false; +}; + +class DeserializeFunc { + public: + virtual Status Deserialize(ByteBuffer* buf) = 0; + virtual ~DeserializeFunc() {} +}; + +template +class DeserializeFuncType final : public DeserializeFunc { + public: + DeserializeFuncType(R* message) : message_(message) {} + Status Deserialize(ByteBuffer* buf) override { + return SerializationTraits::Deserialize(buf->bbuf_ptr(), message_); + } + + ~DeserializeFuncType() override {} + + private: + R* message_; // Not a managed pointer because management is external to this +}; + +class CallOpGenericRecvMessage { + public: + template + void RecvMessage(R* message) { + // Use an explicit base class pointer to avoid resolution error in the + // following unique_ptr::reset for some old implementations. + DeserializeFunc* func = new DeserializeFuncType(message); + deserialize_.reset(func); + message_ = message; + } + + // Do not change status if no message is received. + void AllowNoMessage() { allow_not_getting_message_ = true; } + + bool got_message = false; + + protected: + void AddOp(grpc_op* ops, size_t* nops) { + if (!deserialize_ || hijacked_) return; + grpc_op* op = &ops[(*nops)++]; + op->op = GRPC_OP_RECV_MESSAGE; + op->flags = 0; + op->reserved = NULL; + op->data.recv_message.recv_message = recv_buf_.c_buffer_ptr(); + } + + void FinishOp(bool* status) { + if (!deserialize_ || hijacked_) return; + if (recv_buf_.Valid()) { + if (*status) { + got_message = true; + *status = deserialize_->Deserialize(&recv_buf_).ok(); + recv_buf_.Release(); + } else { + got_message = false; + recv_buf_.Clear(); + } + } else if (hijacked_) { + if (hijacked_recv_message_failed_) { + FinishOpRecvMessageFailureHandler(status); + } else { + // The op was hijacked and it was successful. There is no further action + // to be performed since the message is already in its non-serialized + // form. + } + } else { + got_message = false; + if (!allow_not_getting_message_) { + *status = false; + } + } + } + + void SetInterceptionHookPoint( + InterceptorBatchMethodsImpl* interceptor_methods) { + if (!deserialize_) return; + interceptor_methods->SetRecvMessage(message_, + &hijacked_recv_message_failed_); + } + + void SetFinishInterceptionHookPoint( + InterceptorBatchMethodsImpl* interceptor_methods) { + if (!deserialize_) return; + interceptor_methods->AddInterceptionHookPoint( + experimental::InterceptionHookPoints::POST_RECV_MESSAGE); + if (!got_message) interceptor_methods->SetRecvMessage(nullptr, nullptr); + deserialize_.reset(); + } + void SetHijackingState(InterceptorBatchMethodsImpl* interceptor_methods) { + hijacked_ = true; + if (!deserialize_) return; + interceptor_methods->AddInterceptionHookPoint( + experimental::InterceptionHookPoints::PRE_RECV_MESSAGE); + got_message = true; + } + + private: + // Sets got_message and \a status for a failed recv message op + void FinishOpRecvMessageFailureHandler(bool* status) { + got_message = false; + if (!allow_not_getting_message_) { + *status = false; + } + } + + void* message_ = nullptr; + std::unique_ptr deserialize_; + ByteBuffer recv_buf_; + bool allow_not_getting_message_ = false; + bool hijacked_ = false; + bool hijacked_recv_message_failed_ = false; +}; + +class CallOpClientSendClose { + public: + CallOpClientSendClose() : send_(false) {} + + void ClientSendClose() { send_ = true; } + + protected: + void AddOp(grpc_op* ops, size_t* nops) { + if (!send_ || hijacked_) return; + grpc_op* op = &ops[(*nops)++]; + op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT; + op->flags = 0; + op->reserved = NULL; + } + void FinishOp(bool* /*status*/) { send_ = false; } + + void SetInterceptionHookPoint( + InterceptorBatchMethodsImpl* interceptor_methods) { + if (!send_) return; + interceptor_methods->AddInterceptionHookPoint( + experimental::InterceptionHookPoints::PRE_SEND_CLOSE); + } + + void SetFinishInterceptionHookPoint( + InterceptorBatchMethodsImpl* /*interceptor_methods*/) {} + + void SetHijackingState(InterceptorBatchMethodsImpl* /*interceptor_methods*/) { + hijacked_ = true; + } + + private: + bool hijacked_ = false; + bool send_; +}; + +class CallOpServerSendStatus { + public: + CallOpServerSendStatus() : send_status_available_(false) {} + + void ServerSendStatus( + std::multimap* trailing_metadata, + const Status& status) { + send_error_details_ = status.error_details(); + metadata_map_ = trailing_metadata; + send_status_available_ = true; + send_status_code_ = static_cast(status.error_code()); + send_error_message_ = status.error_message(); + } + + protected: + void AddOp(grpc_op* ops, size_t* nops) { + if (!send_status_available_ || hijacked_) return; + trailing_metadata_ = FillMetadataArray( + *metadata_map_, &trailing_metadata_count_, send_error_details_); + grpc_op* op = &ops[(*nops)++]; + op->op = GRPC_OP_SEND_STATUS_FROM_SERVER; + op->data.send_status_from_server.trailing_metadata_count = + trailing_metadata_count_; + op->data.send_status_from_server.trailing_metadata = trailing_metadata_; + op->data.send_status_from_server.status = send_status_code_; + error_message_slice_ = SliceReferencingString(send_error_message_); + op->data.send_status_from_server.status_details = + send_error_message_.empty() ? nullptr : &error_message_slice_; + op->flags = 0; + op->reserved = NULL; + } + + void FinishOp(bool* /*status*/) { + if (!send_status_available_ || hijacked_) return; + g_core_codegen_interface->gpr_free(trailing_metadata_); + send_status_available_ = false; + } + + void SetInterceptionHookPoint( + InterceptorBatchMethodsImpl* interceptor_methods) { + if (!send_status_available_) return; + interceptor_methods->AddInterceptionHookPoint( + experimental::InterceptionHookPoints::PRE_SEND_STATUS); + interceptor_methods->SetSendTrailingMetadata(metadata_map_); + interceptor_methods->SetSendStatus(&send_status_code_, &send_error_details_, + &send_error_message_); + } + + void SetFinishInterceptionHookPoint( + InterceptorBatchMethodsImpl* /*interceptor_methods*/) {} + + void SetHijackingState(InterceptorBatchMethodsImpl* /*interceptor_methods*/) { + hijacked_ = true; + } + + private: + bool hijacked_ = false; + bool send_status_available_; + grpc_status_code send_status_code_; + grpc::string send_error_details_; + grpc::string send_error_message_; + size_t trailing_metadata_count_; + std::multimap* metadata_map_; + grpc_metadata* trailing_metadata_; + grpc_slice error_message_slice_; +}; + +class CallOpRecvInitialMetadata { + public: + CallOpRecvInitialMetadata() : metadata_map_(nullptr) {} + + void RecvInitialMetadata(::grpc_impl::ClientContext* context) { + context->initial_metadata_received_ = true; + metadata_map_ = &context->recv_initial_metadata_; + } + + protected: + void AddOp(grpc_op* ops, size_t* nops) { + if (metadata_map_ == nullptr || hijacked_) return; + grpc_op* op = &ops[(*nops)++]; + op->op = GRPC_OP_RECV_INITIAL_METADATA; + op->data.recv_initial_metadata.recv_initial_metadata = metadata_map_->arr(); + op->flags = 0; + op->reserved = NULL; + } + + void FinishOp(bool* /*status*/) { + if (metadata_map_ == nullptr || hijacked_) return; + } + + void SetInterceptionHookPoint( + InterceptorBatchMethodsImpl* interceptor_methods) { + interceptor_methods->SetRecvInitialMetadata(metadata_map_); + } + + void SetFinishInterceptionHookPoint( + InterceptorBatchMethodsImpl* interceptor_methods) { + if (metadata_map_ == nullptr) return; + interceptor_methods->AddInterceptionHookPoint( + experimental::InterceptionHookPoints::POST_RECV_INITIAL_METADATA); + metadata_map_ = nullptr; + } + + void SetHijackingState(InterceptorBatchMethodsImpl* interceptor_methods) { + hijacked_ = true; + if (metadata_map_ == nullptr) return; + interceptor_methods->AddInterceptionHookPoint( + experimental::InterceptionHookPoints::PRE_RECV_INITIAL_METADATA); + } + + private: + bool hijacked_ = false; + MetadataMap* metadata_map_; +}; + +class CallOpClientRecvStatus { + public: + CallOpClientRecvStatus() + : recv_status_(nullptr), debug_error_string_(nullptr) {} + + void ClientRecvStatus(::grpc_impl::ClientContext* context, Status* status) { + client_context_ = context; + metadata_map_ = &client_context_->trailing_metadata_; + recv_status_ = status; + error_message_ = g_core_codegen_interface->grpc_empty_slice(); + } + + protected: + void AddOp(grpc_op* ops, size_t* nops) { + if (recv_status_ == nullptr || hijacked_) return; + grpc_op* op = &ops[(*nops)++]; + op->op = GRPC_OP_RECV_STATUS_ON_CLIENT; + op->data.recv_status_on_client.trailing_metadata = metadata_map_->arr(); + op->data.recv_status_on_client.status = &status_code_; + op->data.recv_status_on_client.status_details = &error_message_; + op->data.recv_status_on_client.error_string = &debug_error_string_; + op->flags = 0; + op->reserved = NULL; + } + + void FinishOp(bool* /*status*/) { + if (recv_status_ == nullptr || hijacked_) return; + if (static_cast(status_code_) == StatusCode::OK) { + *recv_status_ = Status(); + GPR_CODEGEN_DEBUG_ASSERT(debug_error_string_ == nullptr); + } else { + *recv_status_ = + Status(static_cast(status_code_), + GRPC_SLICE_IS_EMPTY(error_message_) + ? grpc::string() + : grpc::string(GRPC_SLICE_START_PTR(error_message_), + GRPC_SLICE_END_PTR(error_message_)), + metadata_map_->GetBinaryErrorDetails()); + if (debug_error_string_ != nullptr) { + client_context_->set_debug_error_string(debug_error_string_); + g_core_codegen_interface->gpr_free((void*)debug_error_string_); + } + } + // TODO(soheil): Find callers that set debug string even for status OK, + // and fix them. + g_core_codegen_interface->grpc_slice_unref(error_message_); + } + + void SetInterceptionHookPoint( + InterceptorBatchMethodsImpl* interceptor_methods) { + interceptor_methods->SetRecvStatus(recv_status_); + interceptor_methods->SetRecvTrailingMetadata(metadata_map_); + } + + void SetFinishInterceptionHookPoint( + InterceptorBatchMethodsImpl* interceptor_methods) { + if (recv_status_ == nullptr) return; + interceptor_methods->AddInterceptionHookPoint( + experimental::InterceptionHookPoints::POST_RECV_STATUS); + recv_status_ = nullptr; + } + + void SetHijackingState(InterceptorBatchMethodsImpl* interceptor_methods) { + hijacked_ = true; + if (recv_status_ == nullptr) return; + interceptor_methods->AddInterceptionHookPoint( + experimental::InterceptionHookPoints::PRE_RECV_STATUS); + } + + private: + bool hijacked_ = false; + ::grpc_impl::ClientContext* client_context_; + MetadataMap* metadata_map_; + Status* recv_status_; + const char* debug_error_string_; + grpc_status_code status_code_; + grpc_slice error_message_; +}; + +template , class Op2 = CallNoOp<2>, + class Op3 = CallNoOp<3>, class Op4 = CallNoOp<4>, + class Op5 = CallNoOp<5>, class Op6 = CallNoOp<6>> +class CallOpSet; + +/// Primary implementation of CallOpSetInterface. +/// Since we cannot use variadic templates, we declare slots up to +/// the maximum count of ops we'll need in a set. We leverage the +/// empty base class optimization to slim this class (especially +/// when there are many unused slots used). To avoid duplicate base classes, +/// the template parameter for CallNoOp is varied by argument position. +template +class CallOpSet : public CallOpSetInterface, + public Op1, + public Op2, + public Op3, + public Op4, + public Op5, + public Op6 { + public: + CallOpSet() : core_cq_tag_(this), return_tag_(this) {} + // The copy constructor and assignment operator reset the value of + // core_cq_tag_, return_tag_, done_intercepting_ and interceptor_methods_ + // since those are only meaningful on a specific object, not across objects. + CallOpSet(const CallOpSet& other) + : core_cq_tag_(this), + return_tag_(this), + call_(other.call_), + done_intercepting_(false), + interceptor_methods_(InterceptorBatchMethodsImpl()) {} + + CallOpSet& operator=(const CallOpSet& other) { + core_cq_tag_ = this; + return_tag_ = this; + call_ = other.call_; + done_intercepting_ = false; + interceptor_methods_ = InterceptorBatchMethodsImpl(); + return *this; + } + + void FillOps(Call* call) override { + done_intercepting_ = false; + g_core_codegen_interface->grpc_call_ref(call->call()); + call_ = + *call; // It's fine to create a copy of call since it's just pointers + + if (RunInterceptors()) { + ContinueFillOpsAfterInterception(); + } else { + // After the interceptors are run, ContinueFillOpsAfterInterception will + // be run + } + } + + bool FinalizeResult(void** tag, bool* status) override { + if (done_intercepting_) { + // Complete the avalanching since we are done with this batch of ops + call_.cq()->CompleteAvalanching(); + // We have already finished intercepting and filling in the results. This + // round trip from the core needed to be made because interceptors were + // run + *tag = return_tag_; + *status = saved_status_; + g_core_codegen_interface->grpc_call_unref(call_.call()); + return true; + } + + this->Op1::FinishOp(status); + this->Op2::FinishOp(status); + this->Op3::FinishOp(status); + this->Op4::FinishOp(status); + this->Op5::FinishOp(status); + this->Op6::FinishOp(status); + saved_status_ = *status; + if (RunInterceptorsPostRecv()) { + *tag = return_tag_; + g_core_codegen_interface->grpc_call_unref(call_.call()); + return true; + } + // Interceptors are going to be run, so we can't return the tag just yet. + // After the interceptors are run, ContinueFinalizeResultAfterInterception + return false; + } + + void set_output_tag(void* return_tag) { return_tag_ = return_tag; } + + void* core_cq_tag() override { return core_cq_tag_; } + + /// set_core_cq_tag is used to provide a different core CQ tag than "this". + /// This is used for callback-based tags, where the core tag is the core + /// callback function. It does not change the use or behavior of any other + /// function (such as FinalizeResult) + void set_core_cq_tag(void* core_cq_tag) { core_cq_tag_ = core_cq_tag; } + + // This will be called while interceptors are run if the RPC is a hijacked + // RPC. This should set hijacking state for each of the ops. + void SetHijackingState() override { + this->Op1::SetHijackingState(&interceptor_methods_); + this->Op2::SetHijackingState(&interceptor_methods_); + this->Op3::SetHijackingState(&interceptor_methods_); + this->Op4::SetHijackingState(&interceptor_methods_); + this->Op5::SetHijackingState(&interceptor_methods_); + this->Op6::SetHijackingState(&interceptor_methods_); + } + + // Should be called after interceptors are done running + void ContinueFillOpsAfterInterception() override { + static const size_t MAX_OPS = 6; + grpc_op ops[MAX_OPS]; + size_t nops = 0; + this->Op1::AddOp(ops, &nops); + this->Op2::AddOp(ops, &nops); + this->Op3::AddOp(ops, &nops); + this->Op4::AddOp(ops, &nops); + this->Op5::AddOp(ops, &nops); + this->Op6::AddOp(ops, &nops); + + grpc_call_error err = g_core_codegen_interface->grpc_call_start_batch( + call_.call(), ops, nops, core_cq_tag(), nullptr); + + if (err != GRPC_CALL_OK) { + // A failure here indicates an API misuse; for example, doing a Write + // while another Write is already pending on the same RPC or invoking + // WritesDone multiple times + // gpr_log(GPR_ERROR, "API misuse of type %s observed", + // g_core_codegen_interface->grpc_call_error_to_string(err)); + GPR_CODEGEN_ASSERT(false); + } + } + + // Should be called after interceptors are done running on the finalize result + // path + void ContinueFinalizeResultAfterInterception() override { + done_intercepting_ = true; + // The following call_start_batch is internally-generated so no need for an + // explanatory log on failure. + GPR_CODEGEN_ASSERT(g_core_codegen_interface->grpc_call_start_batch( + call_.call(), nullptr, 0, core_cq_tag(), nullptr) == + GRPC_CALL_OK); + } + + private: + // Returns true if no interceptors need to be run + bool RunInterceptors() { + interceptor_methods_.ClearState(); + interceptor_methods_.SetCallOpSetInterface(this); + interceptor_methods_.SetCall(&call_); + this->Op1::SetInterceptionHookPoint(&interceptor_methods_); + this->Op2::SetInterceptionHookPoint(&interceptor_methods_); + this->Op3::SetInterceptionHookPoint(&interceptor_methods_); + this->Op4::SetInterceptionHookPoint(&interceptor_methods_); + this->Op5::SetInterceptionHookPoint(&interceptor_methods_); + this->Op6::SetInterceptionHookPoint(&interceptor_methods_); + if (interceptor_methods_.InterceptorsListEmpty()) { + return true; + } + // This call will go through interceptors and would need to + // schedule new batches, so delay completion queue shutdown + call_.cq()->RegisterAvalanching(); + return interceptor_methods_.RunInterceptors(); + } + // Returns true if no interceptors need to be run + bool RunInterceptorsPostRecv() { + // Call and OpSet had already been set on the set state. + // SetReverse also clears previously set hook points + interceptor_methods_.SetReverse(); + this->Op1::SetFinishInterceptionHookPoint(&interceptor_methods_); + this->Op2::SetFinishInterceptionHookPoint(&interceptor_methods_); + this->Op3::SetFinishInterceptionHookPoint(&interceptor_methods_); + this->Op4::SetFinishInterceptionHookPoint(&interceptor_methods_); + this->Op5::SetFinishInterceptionHookPoint(&interceptor_methods_); + this->Op6::SetFinishInterceptionHookPoint(&interceptor_methods_); + return interceptor_methods_.RunInterceptors(); + } + + void* core_cq_tag_; + void* return_tag_; + Call call_; + bool done_intercepting_ = false; + InterceptorBatchMethodsImpl interceptor_methods_; + bool saved_status_; +}; + +} // namespace internal +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_CALL_OP_SET_H diff --git a/include/grpcpp/impl/codegen/call_op_set_interface.h b/include/grpcpp/impl/codegen/call_op_set_interface.h new file mode 100644 index 00000000..3b74566a --- /dev/null +++ b/include/grpcpp/impl/codegen/call_op_set_interface.h @@ -0,0 +1,59 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_CALL_OP_SET_INTERFACE_H +#define GRPCPP_IMPL_CODEGEN_CALL_OP_SET_INTERFACE_H + +#include + +namespace grpc { +namespace internal { + +class Call; + +/// An abstract collection of call ops, used to generate the +/// grpc_call_op structure to pass down to the lower layers, +/// and as it is-a CompletionQueueTag, also massages the final +/// completion into the correct form for consumption in the C++ +/// API. +class CallOpSetInterface : public CompletionQueueTag { + public: + /// Fills in grpc_op, starting from ops[*nops] and moving + /// upwards. + virtual void FillOps(internal::Call* call) = 0; + + /// Get the tag to be used at the core completion queue. Generally, the + /// value of core_cq_tag will be "this". However, it can be overridden if we + /// want core to process the tag differently (e.g., as a core callback) + virtual void* core_cq_tag() = 0; + + // This will be called while interceptors are run if the RPC is a hijacked + // RPC. This should set hijacking state for each of the ops. + virtual void SetHijackingState() = 0; + + // Should be called after interceptors are done running + virtual void ContinueFillOpsAfterInterception() = 0; + + // Should be called after interceptors are done running on the finalize result + // path + virtual void ContinueFinalizeResultAfterInterception() = 0; +}; +} // namespace internal +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_CALL_OP_SET_INTERFACE_H diff --git a/include/grpcpp/impl/codegen/callback_common.h b/include/grpcpp/impl/codegen/callback_common.h new file mode 100644 index 00000000..aa3bd26e --- /dev/null +++ b/include/grpcpp/impl/codegen/callback_common.h @@ -0,0 +1,222 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_CALLBACK_COMMON_H +#define GRPCPP_IMPL_CODEGEN_CALLBACK_COMMON_H + +#include + +#include +#include +#include +#include +#include +#include + +namespace grpc { +namespace internal { + +/// An exception-safe way of invoking a user-specified callback function +// TODO(vjpai): decide whether it is better for this to take a const lvalue +// parameter or an rvalue parameter, or if it even matters +template +void CatchingCallback(Func&& func, Args&&... args) { +#if GRPC_ALLOW_EXCEPTIONS + try { + func(std::forward(args)...); + } catch (...) { + // nothing to return or change here, just don't crash the library + } +#else // GRPC_ALLOW_EXCEPTIONS + func(std::forward(args)...); +#endif // GRPC_ALLOW_EXCEPTIONS +} + +template +Reactor* CatchingReactorGetter(Func&& func, Args&&... args) { +#if GRPC_ALLOW_EXCEPTIONS + try { + return func(std::forward(args)...); + } catch (...) { + // fail the RPC, don't crash the library + return nullptr; + } +#else // GRPC_ALLOW_EXCEPTIONS + return func(std::forward(args)...); +#endif // GRPC_ALLOW_EXCEPTIONS +} + +// The contract on these tags is that they are single-shot. They must be +// constructed and then fired at exactly one point. There is no expectation +// that they can be reused without reconstruction. + +class CallbackWithStatusTag + : public grpc_experimental_completion_queue_functor { + public: + // always allocated against a call arena, no memory free required + static void operator delete(void* /*ptr*/, std::size_t size) { + GPR_CODEGEN_ASSERT(size == sizeof(CallbackWithStatusTag)); + } + + // This operator should never be called as the memory should be freed as part + // of the arena destruction. It only exists to provide a matching operator + // delete to the operator new so that some compilers will not complain (see + // https://github.com/grpc/grpc/issues/11301) Note at the time of adding this + // there are no tests catching the compiler warning. + static void operator delete(void*, void*) { GPR_CODEGEN_ASSERT(false); } + + CallbackWithStatusTag(grpc_call* call, std::function f, + CompletionQueueTag* ops) + : call_(call), func_(std::move(f)), ops_(ops) { + g_core_codegen_interface->grpc_call_ref(call); + functor_run = &CallbackWithStatusTag::StaticRun; + // A client-side callback should never be run inline since they will always + // have work to do from the user application. So, set the parent's + // inlineable field to false + inlineable = false; + } + ~CallbackWithStatusTag() {} + Status* status_ptr() { return &status_; } + + // force_run can not be performed on a tag if operations using this tag + // have been sent to PerformOpsOnCall. It is intended for error conditions + // that are detected before the operations are internally processed. + void force_run(Status s) { + status_ = std::move(s); + Run(true); + } + + private: + grpc_call* call_; + std::function func_; + CompletionQueueTag* ops_; + Status status_; + + static void StaticRun(grpc_experimental_completion_queue_functor* cb, + int ok) { + static_cast(cb)->Run(static_cast(ok)); + } + void Run(bool ok) { + void* ignored = ops_; + + if (!ops_->FinalizeResult(&ignored, &ok)) { + // The tag was swallowed + return; + } + GPR_CODEGEN_ASSERT(ignored == ops_); + + // Last use of func_ or status_, so ok to move them out + auto func = std::move(func_); + auto status = std::move(status_); + func_ = nullptr; // reset to clear this out for sure + status_ = Status(); // reset to clear this out for sure + CatchingCallback(std::move(func), std::move(status)); + g_core_codegen_interface->grpc_call_unref(call_); + } +}; + +/// CallbackWithSuccessTag can be reused multiple times, and will be used in +/// this fashion for streaming operations. As a result, it shouldn't clear +/// anything up until its destructor +class CallbackWithSuccessTag + : public grpc_experimental_completion_queue_functor { + public: + // always allocated against a call arena, no memory free required + static void operator delete(void* /*ptr*/, std::size_t size) { + GPR_CODEGEN_ASSERT(size == sizeof(CallbackWithSuccessTag)); + } + + // This operator should never be called as the memory should be freed as part + // of the arena destruction. It only exists to provide a matching operator + // delete to the operator new so that some compilers will not complain (see + // https://github.com/grpc/grpc/issues/11301) Note at the time of adding this + // there are no tests catching the compiler warning. + static void operator delete(void*, void*) { GPR_CODEGEN_ASSERT(false); } + + CallbackWithSuccessTag() : call_(nullptr) {} + + CallbackWithSuccessTag(const CallbackWithSuccessTag&) = delete; + CallbackWithSuccessTag& operator=(const CallbackWithSuccessTag&) = delete; + + ~CallbackWithSuccessTag() { Clear(); } + + // Set can only be called on a default-constructed or Clear'ed tag. + // It should never be called on a tag that was constructed with arguments + // or on a tag that has been Set before unless the tag has been cleared. + // can_inline indicates that this particular callback can be executed inline + // (without needing a thread hop) and is only used for library-provided server + // callbacks. + void Set(grpc_call* call, std::function f, + CompletionQueueTag* ops, bool can_inline) { + GPR_CODEGEN_ASSERT(call_ == nullptr); + g_core_codegen_interface->grpc_call_ref(call); + call_ = call; + func_ = std::move(f); + ops_ = ops; + functor_run = &CallbackWithSuccessTag::StaticRun; + inlineable = can_inline; + } + + void Clear() { + if (call_ != nullptr) { + grpc_call* call = call_; + call_ = nullptr; + func_ = nullptr; + g_core_codegen_interface->grpc_call_unref(call); + } + } + + CompletionQueueTag* ops() { return ops_; } + + // force_run can not be performed on a tag if operations using this tag + // have been sent to PerformOpsOnCall. It is intended for error conditions + // that are detected before the operations are internally processed. + void force_run(bool ok) { Run(ok); } + + /// check if this tag is currently set + operator bool() const { return call_ != nullptr; } + + private: + grpc_call* call_; + std::function func_; + CompletionQueueTag* ops_; + + static void StaticRun(grpc_experimental_completion_queue_functor* cb, + int ok) { + static_cast(cb)->Run(static_cast(ok)); + } + void Run(bool ok) { + void* ignored = ops_; + // Allow a "false" return value from FinalizeResult to silence the + // callback, just as it silences a CQ tag in the async cases +#ifndef NDEBUG + auto* ops = ops_; +#endif + bool do_callback = ops_->FinalizeResult(&ignored, &ok); + GPR_CODEGEN_DEBUG_ASSERT(ignored == ops); + + if (do_callback) { + CatchingCallback(func_, ok); + } + } +}; + +} // namespace internal +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_CALLBACK_COMMON_H diff --git a/include/grpcpp/impl/codegen/channel_interface.h b/include/grpcpp/impl/codegen/channel_interface.h new file mode 100644 index 00000000..4fed2f67 --- /dev/null +++ b/include/grpcpp/impl/codegen/channel_interface.h @@ -0,0 +1,176 @@ +/* + * + * Copyright 2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_CHANNEL_INTERFACE_H +#define GRPCPP_IMPL_CODEGEN_CHANNEL_INTERFACE_H + +#include +#include +#include +#include + +namespace grpc_impl { +class ClientContext; +class CompletionQueue; +template +class ClientReader; +template +class ClientWriter; +template +class ClientReaderWriter; +namespace internal { +template +class CallbackUnaryCallImpl; +template +class ClientAsyncReaderFactory; +template +class ClientAsyncWriterFactory; +template +class ClientAsyncReaderWriterFactory; +template +class ClientAsyncResponseReaderFactory; +template +class ClientCallbackReaderWriterFactory; +template +class ClientCallbackReaderFactory; +template +class ClientCallbackWriterFactory; +class ClientCallbackUnaryFactory; +} // namespace internal +} // namespace grpc_impl + +namespace grpc { +class ChannelInterface; + +namespace experimental { +class DelegatingChannel; +} + +namespace internal { +class Call; +class CallOpSetInterface; +class RpcMethod; +class InterceptedChannel; +template +class BlockingUnaryCallImpl; +} // namespace internal + +/// Codegen interface for \a grpc::Channel. +class ChannelInterface { + public: + virtual ~ChannelInterface() {} + /// Get the current channel state. If the channel is in IDLE and + /// \a try_to_connect is set to true, try to connect. + virtual grpc_connectivity_state GetState(bool try_to_connect) = 0; + + /// Return the \a tag on \a cq when the channel state is changed or \a + /// deadline expires. \a GetState needs to called to get the current state. + template + void NotifyOnStateChange(grpc_connectivity_state last_observed, T deadline, + ::grpc_impl::CompletionQueue* cq, void* tag) { + TimePoint deadline_tp(deadline); + NotifyOnStateChangeImpl(last_observed, deadline_tp.raw_time(), cq, tag); + } + + /// Blocking wait for channel state change or \a deadline expiration. + /// \a GetState needs to called to get the current state. + template + bool WaitForStateChange(grpc_connectivity_state last_observed, T deadline) { + TimePoint deadline_tp(deadline); + return WaitForStateChangeImpl(last_observed, deadline_tp.raw_time()); + } + + /// Wait for this channel to be connected + template + bool WaitForConnected(T deadline) { + grpc_connectivity_state state; + while ((state = GetState(true)) != GRPC_CHANNEL_READY) { + if (!WaitForStateChange(state, deadline)) return false; + } + return true; + } + + private: + template + friend class ::grpc_impl::ClientReader; + template + friend class ::grpc_impl::ClientWriter; + template + friend class ::grpc_impl::ClientReaderWriter; + template + friend class ::grpc_impl::internal::ClientAsyncReaderFactory; + template + friend class ::grpc_impl::internal::ClientAsyncWriterFactory; + template + friend class ::grpc_impl::internal::ClientAsyncReaderWriterFactory; + template + friend class ::grpc_impl::internal::ClientAsyncResponseReaderFactory; + template + friend class ::grpc_impl::internal::ClientCallbackReaderWriterFactory; + template + friend class ::grpc_impl::internal::ClientCallbackReaderFactory; + template + friend class ::grpc_impl::internal::ClientCallbackWriterFactory; + friend class ::grpc_impl::internal::ClientCallbackUnaryFactory; + template + friend class ::grpc::internal::BlockingUnaryCallImpl; + template + friend class ::grpc_impl::internal::CallbackUnaryCallImpl; + friend class ::grpc::internal::RpcMethod; + friend class ::grpc::experimental::DelegatingChannel; + friend class ::grpc::internal::InterceptedChannel; + virtual internal::Call CreateCall(const internal::RpcMethod& method, + ::grpc_impl::ClientContext* context, + ::grpc_impl::CompletionQueue* cq) = 0; + virtual void PerformOpsOnCall(internal::CallOpSetInterface* ops, + internal::Call* call) = 0; + virtual void* RegisterMethod(const char* method) = 0; + virtual void NotifyOnStateChangeImpl(grpc_connectivity_state last_observed, + gpr_timespec deadline, + ::grpc_impl::CompletionQueue* cq, + void* tag) = 0; + virtual bool WaitForStateChangeImpl(grpc_connectivity_state last_observed, + gpr_timespec deadline) = 0; + + // EXPERIMENTAL + // This is needed to keep codegen_test_minimal happy. InterceptedChannel needs + // to make use of this but can't directly call Channel's implementation + // because of the test. + // Returns an empty Call object (rather than being pure) since this is a new + // method and adding a new pure method to an interface would be a breaking + // change (even though this is private and non-API) + virtual internal::Call CreateCallInternal( + const internal::RpcMethod& /*method*/, + ::grpc_impl::ClientContext* /*context*/, + ::grpc_impl::CompletionQueue* /*cq*/, size_t /*interceptor_pos*/) { + return internal::Call(); + } + + // EXPERIMENTAL + // A method to get the callbackable completion queue associated with this + // channel. If the return value is nullptr, this channel doesn't support + // callback operations. + // TODO(vjpai): Consider a better default like using a global CQ + // Returns nullptr (rather than being pure) since this is a post-1.0 method + // and adding a new pure method to an interface would be a breaking change + // (even though this is private and non-API) + virtual ::grpc_impl::CompletionQueue* CallbackCQ() { return nullptr; } +}; +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_CHANNEL_INTERFACE_H diff --git a/include/grpcpp/impl/codegen/client_callback.h b/include/grpcpp/impl/codegen/client_callback.h new file mode 100644 index 00000000..a8b58f6b --- /dev/null +++ b/include/grpcpp/impl/codegen/client_callback.h @@ -0,0 +1,76 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_CLIENT_CALLBACK_H +#define GRPCPP_IMPL_CODEGEN_CLIENT_CALLBACK_H + +#include + +namespace grpc { + +#ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL +template +using ClientCallbackReader = ::grpc_impl::ClientCallbackReader; + +template +using ClientCallbackWriter = ::grpc_impl::ClientCallbackWriter; + +template +using ClientCallbackReaderWriter = + ::grpc_impl::ClientCallbackReaderWriter; + +template +using ClientReadReactor = ::grpc_impl::ClientReadReactor; + +template +using ClientWriteReactor = ::grpc_impl::ClientWriteReactor; + +template +using ClientBidiReactor = ::grpc_impl::ClientBidiReactor; + +typedef ::grpc_impl::ClientUnaryReactor ClientUnaryReactor; +#endif + +// TODO(vjpai): Remove namespace experimental when de-experimentalized fully. +namespace experimental { + +template +using ClientCallbackReader = ::grpc_impl::ClientCallbackReader; + +template +using ClientCallbackWriter = ::grpc_impl::ClientCallbackWriter; + +template +using ClientCallbackReaderWriter = + ::grpc_impl::ClientCallbackReaderWriter; + +template +using ClientReadReactor = ::grpc_impl::ClientReadReactor; + +template +using ClientWriteReactor = ::grpc_impl::ClientWriteReactor; + +template +using ClientBidiReactor = ::grpc_impl::ClientBidiReactor; + +typedef ::grpc_impl::ClientUnaryReactor ClientUnaryReactor; + +} // namespace experimental +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_CLIENT_CALLBACK_H diff --git a/include/grpcpp/impl/codegen/client_callback_impl.h b/include/grpcpp/impl/codegen/client_callback_impl.h new file mode 100644 index 00000000..8e683743 --- /dev/null +++ b/include/grpcpp/impl/codegen/client_callback_impl.h @@ -0,0 +1,1080 @@ +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef GRPCPP_IMPL_CODEGEN_CLIENT_CALLBACK_IMPL_H +#define GRPCPP_IMPL_CODEGEN_CLIENT_CALLBACK_IMPL_H +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace grpc { +namespace internal { +class RpcMethod; +} // namespace internal +} // namespace grpc + +namespace grpc_impl { +class Channel; +class ClientContext; + +namespace internal { + +/// Perform a callback-based unary call +/// TODO(vjpai): Combine as much as possible with the blocking unary call code +template +void CallbackUnaryCall(::grpc::ChannelInterface* channel, + const ::grpc::internal::RpcMethod& method, + ::grpc_impl::ClientContext* context, + const InputMessage* request, OutputMessage* result, + std::function on_completion) { + CallbackUnaryCallImpl x( + channel, method, context, request, result, on_completion); +} + +template +class CallbackUnaryCallImpl { + public: + CallbackUnaryCallImpl(::grpc::ChannelInterface* channel, + const ::grpc::internal::RpcMethod& method, + ::grpc_impl::ClientContext* context, + const InputMessage* request, OutputMessage* result, + std::function on_completion) { + ::grpc_impl::CompletionQueue* cq = channel->CallbackCQ(); + GPR_CODEGEN_ASSERT(cq != nullptr); + grpc::internal::Call call(channel->CreateCall(method, context, cq)); + + using FullCallOpSet = grpc::internal::CallOpSet< + ::grpc::internal::CallOpSendInitialMetadata, + grpc::internal::CallOpSendMessage, + grpc::internal::CallOpRecvInitialMetadata, + grpc::internal::CallOpRecvMessage, + grpc::internal::CallOpClientSendClose, + grpc::internal::CallOpClientRecvStatus>; + + struct OpSetAndTag { + FullCallOpSet opset; + grpc::internal::CallbackWithStatusTag tag; + }; + const size_t alloc_sz = sizeof(OpSetAndTag); + auto* const alloced = static_cast( + ::grpc::g_core_codegen_interface->grpc_call_arena_alloc(call.call(), + alloc_sz)); + auto* ops = new (&alloced->opset) FullCallOpSet; + auto* tag = new (&alloced->tag) + grpc::internal::CallbackWithStatusTag(call.call(), on_completion, ops); + + // TODO(vjpai): Unify code with sync API as much as possible + ::grpc::Status s = ops->SendMessagePtr(request); + if (!s.ok()) { + tag->force_run(s); + return; + } + ops->SendInitialMetadata(&context->send_initial_metadata_, + context->initial_metadata_flags()); + ops->RecvInitialMetadata(context); + ops->RecvMessage(result); + ops->AllowNoMessage(); + ops->ClientSendClose(); + ops->ClientRecvStatus(context, tag->status_ptr()); + ops->set_core_cq_tag(tag); + call.PerformOps(ops); + } +}; +} // namespace internal + +// Forward declarations +template +class ClientBidiReactor; +template +class ClientReadReactor; +template +class ClientWriteReactor; +class ClientUnaryReactor; + +// NOTE: The streaming objects are not actually implemented in the public API. +// These interfaces are provided for mocking only. Typical applications +// will interact exclusively with the reactors that they define. +template +class ClientCallbackReaderWriter { + public: + virtual ~ClientCallbackReaderWriter() {} + virtual void StartCall() = 0; + virtual void Write(const Request* req, ::grpc::WriteOptions options) = 0; + virtual void WritesDone() = 0; + virtual void Read(Response* resp) = 0; + virtual void AddHold(int holds) = 0; + virtual void RemoveHold() = 0; + + protected: + void BindReactor(ClientBidiReactor* reactor) { + reactor->BindStream(this); + } +}; + +template +class ClientCallbackReader { + public: + virtual ~ClientCallbackReader() {} + virtual void StartCall() = 0; + virtual void Read(Response* resp) = 0; + virtual void AddHold(int holds) = 0; + virtual void RemoveHold() = 0; + + protected: + void BindReactor(ClientReadReactor* reactor) { + reactor->BindReader(this); + } +}; + +template +class ClientCallbackWriter { + public: + virtual ~ClientCallbackWriter() {} + virtual void StartCall() = 0; + void Write(const Request* req) { Write(req, ::grpc::WriteOptions()); } + virtual void Write(const Request* req, ::grpc::WriteOptions options) = 0; + void WriteLast(const Request* req, ::grpc::WriteOptions options) { + Write(req, options.set_last_message()); + } + virtual void WritesDone() = 0; + + virtual void AddHold(int holds) = 0; + virtual void RemoveHold() = 0; + + protected: + void BindReactor(ClientWriteReactor* reactor) { + reactor->BindWriter(this); + } +}; + +class ClientCallbackUnary { + public: + virtual ~ClientCallbackUnary() {} + virtual void StartCall() = 0; + + protected: + void BindReactor(ClientUnaryReactor* reactor); +}; + +// The following classes are the reactor interfaces that are to be implemented +// by the user. They are passed in to the library as an argument to a call on a +// stub (either a codegen-ed call or a generic call). The streaming RPC is +// activated by calling StartCall, possibly after initiating StartRead, +// StartWrite, or AddHold operations on the streaming object. Note that none of +// the classes are pure; all reactions have a default empty reaction so that the +// user class only needs to override those classes that it cares about. +// The reactor must be passed to the stub invocation before any of the below +// operations can be called. + +/// \a ClientBidiReactor is the interface for a bidirectional streaming RPC. +template +class ClientBidiReactor { + public: + virtual ~ClientBidiReactor() {} + + /// Activate the RPC and initiate any reads or writes that have been Start'ed + /// before this call. All streaming RPCs issued by the client MUST have + /// StartCall invoked on them (even if they are canceled) as this call is the + /// activation of their lifecycle. + void StartCall() { stream_->StartCall(); } + + /// Initiate a read operation (or post it for later initiation if StartCall + /// has not yet been invoked). + /// + /// \param[out] resp Where to eventually store the read message. Valid when + /// the library calls OnReadDone + void StartRead(Response* resp) { stream_->Read(resp); } + + /// Initiate a write operation (or post it for later initiation if StartCall + /// has not yet been invoked). + /// + /// \param[in] req The message to be written. The library does not take + /// ownership but the caller must ensure that the message is + /// not deleted or modified until OnWriteDone is called. + void StartWrite(const Request* req) { + StartWrite(req, ::grpc::WriteOptions()); + } + + /// Initiate/post a write operation with specified options. + /// + /// \param[in] req The message to be written. The library does not take + /// ownership but the caller must ensure that the message is + /// not deleted or modified until OnWriteDone is called. + /// \param[in] options The WriteOptions to use for writing this message + void StartWrite(const Request* req, ::grpc::WriteOptions options) { + stream_->Write(req, std::move(options)); + } + + /// Initiate/post a write operation with specified options and an indication + /// that this is the last write (like StartWrite and StartWritesDone, merged). + /// Note that calling this means that no more calls to StartWrite, + /// StartWriteLast, or StartWritesDone are allowed. + /// + /// \param[in] req The message to be written. The library does not take + /// ownership but the caller must ensure that the message is + /// not deleted or modified until OnWriteDone is called. + /// \param[in] options The WriteOptions to use for writing this message + void StartWriteLast(const Request* req, ::grpc::WriteOptions options) { + StartWrite(req, std::move(options.set_last_message())); + } + + /// Indicate that the RPC will have no more write operations. This can only be + /// issued once for a given RPC. This is not required or allowed if + /// StartWriteLast is used since that already has the same implication. + /// Note that calling this means that no more calls to StartWrite, + /// StartWriteLast, or StartWritesDone are allowed. + void StartWritesDone() { stream_->WritesDone(); } + + /// Holds are needed if (and only if) this stream has operations that take + /// place on it after StartCall but from outside one of the reactions + /// (OnReadDone, etc). This is _not_ a common use of the streaming API. + /// + /// Holds must be added before calling StartCall. If a stream still has a hold + /// in place, its resources will not be destroyed even if the status has + /// already come in from the wire and there are currently no active callbacks + /// outstanding. Similarly, the stream will not call OnDone if there are still + /// holds on it. + /// + /// For example, if a StartRead or StartWrite operation is going to be + /// initiated from elsewhere in the application, the application should call + /// AddHold or AddMultipleHolds before StartCall. If there is going to be, + /// for example, a read-flow and a write-flow taking place outside the + /// reactions, then call AddMultipleHolds(2) before StartCall. When the + /// application knows that it won't issue any more read operations (such as + /// when a read comes back as not ok), it should issue a RemoveHold(). It + /// should also call RemoveHold() again after it does StartWriteLast or + /// StartWritesDone that indicates that there will be no more write ops. + /// The number of RemoveHold calls must match the total number of AddHold + /// calls plus the number of holds added by AddMultipleHolds. + /// The argument to AddMultipleHolds must be positive. + void AddHold() { AddMultipleHolds(1); } + void AddMultipleHolds(int holds) { + GPR_CODEGEN_DEBUG_ASSERT(holds > 0); + stream_->AddHold(holds); + } + void RemoveHold() { stream_->RemoveHold(); } + + /// Notifies the application that all operations associated with this RPC + /// have completed and all Holds have been removed. OnDone provides the RPC + /// status outcome for both successful and failed RPCs and will be called in + /// all cases. If it is not called, it indicates an application-level problem + /// (like failure to remove a hold). + /// + /// \param[in] s The status outcome of this RPC + virtual void OnDone(const ::grpc::Status& /*s*/) {} + + /// Notifies the application that a read of initial metadata from the + /// server is done. If the application chooses not to implement this method, + /// it can assume that the initial metadata has been read before the first + /// call of OnReadDone or OnDone. + /// + /// \param[in] ok Was the initial metadata read successfully? If false, no + /// new read/write operation will succeed, and any further + /// Start* operations should not be called. + virtual void OnReadInitialMetadataDone(bool /*ok*/) {} + + /// Notifies the application that a StartRead operation completed. + /// + /// \param[in] ok Was it successful? If false, no new read/write operation + /// will succeed, and any further Start* should not be called. + virtual void OnReadDone(bool /*ok*/) {} + + /// Notifies the application that a StartWrite or StartWriteLast operation + /// completed. + /// + /// \param[in] ok Was it successful? If false, no new read/write operation + /// will succeed, and any further Start* should not be called. + virtual void OnWriteDone(bool /*ok*/) {} + + /// Notifies the application that a StartWritesDone operation completed. Note + /// that this is only used on explicit StartWritesDone operations and not for + /// those that are implicitly invoked as part of a StartWriteLast. + /// + /// \param[in] ok Was it successful? If false, the application will later see + /// the failure reflected as a bad status in OnDone and no + /// further Start* should be called. + virtual void OnWritesDoneDone(bool /*ok*/) {} + + private: + friend class ClientCallbackReaderWriter; + void BindStream(ClientCallbackReaderWriter* stream) { + stream_ = stream; + } + ClientCallbackReaderWriter* stream_; +}; + +/// \a ClientReadReactor is the interface for a server-streaming RPC. +/// All public methods behave as in ClientBidiReactor. +template +class ClientReadReactor { + public: + virtual ~ClientReadReactor() {} + + void StartCall() { reader_->StartCall(); } + void StartRead(Response* resp) { reader_->Read(resp); } + + void AddHold() { AddMultipleHolds(1); } + void AddMultipleHolds(int holds) { + GPR_CODEGEN_DEBUG_ASSERT(holds > 0); + reader_->AddHold(holds); + } + void RemoveHold() { reader_->RemoveHold(); } + + virtual void OnDone(const ::grpc::Status& /*s*/) {} + virtual void OnReadInitialMetadataDone(bool /*ok*/) {} + virtual void OnReadDone(bool /*ok*/) {} + + private: + friend class ClientCallbackReader; + void BindReader(ClientCallbackReader* reader) { reader_ = reader; } + ClientCallbackReader* reader_; +}; + +/// \a ClientWriteReactor is the interface for a client-streaming RPC. +/// All public methods behave as in ClientBidiReactor. +template +class ClientWriteReactor { + public: + virtual ~ClientWriteReactor() {} + + void StartCall() { writer_->StartCall(); } + void StartWrite(const Request* req) { + StartWrite(req, ::grpc::WriteOptions()); + } + void StartWrite(const Request* req, ::grpc::WriteOptions options) { + writer_->Write(req, std::move(options)); + } + void StartWriteLast(const Request* req, ::grpc::WriteOptions options) { + StartWrite(req, std::move(options.set_last_message())); + } + void StartWritesDone() { writer_->WritesDone(); } + + void AddHold() { AddMultipleHolds(1); } + void AddMultipleHolds(int holds) { + GPR_CODEGEN_DEBUG_ASSERT(holds > 0); + writer_->AddHold(holds); + } + void RemoveHold() { writer_->RemoveHold(); } + + virtual void OnDone(const ::grpc::Status& /*s*/) {} + virtual void OnReadInitialMetadataDone(bool /*ok*/) {} + virtual void OnWriteDone(bool /*ok*/) {} + virtual void OnWritesDoneDone(bool /*ok*/) {} + + private: + friend class ClientCallbackWriter; + void BindWriter(ClientCallbackWriter* writer) { writer_ = writer; } + ClientCallbackWriter* writer_; +}; + +/// \a ClientUnaryReactor is a reactor-style interface for a unary RPC. +/// This is _not_ a common way of invoking a unary RPC. In practice, this +/// option should be used only if the unary RPC wants to receive initial +/// metadata without waiting for the response to complete. Most deployments of +/// RPC systems do not use this option, but it is needed for generality. +/// All public methods behave as in ClientBidiReactor. +/// StartCall is included for consistency with the other reactor flavors: even +/// though there are no StartRead or StartWrite operations to queue before the +/// call (that is part of the unary call itself) and there is no reactor object +/// being created as a result of this call, we keep a consistent 2-phase +/// initiation API among all the reactor flavors. +class ClientUnaryReactor { + public: + virtual ~ClientUnaryReactor() {} + + void StartCall() { call_->StartCall(); } + virtual void OnDone(const ::grpc::Status& /*s*/) {} + virtual void OnReadInitialMetadataDone(bool /*ok*/) {} + + private: + friend class ClientCallbackUnary; + void BindCall(ClientCallbackUnary* call) { call_ = call; } + ClientCallbackUnary* call_; +}; + +// Define function out-of-line from class to avoid forward declaration issue +inline void ClientCallbackUnary::BindReactor(ClientUnaryReactor* reactor) { + reactor->BindCall(this); +} + +namespace internal { + +// Forward declare factory classes for friendship +template +class ClientCallbackReaderWriterFactory; +template +class ClientCallbackReaderFactory; +template +class ClientCallbackWriterFactory; + +template +class ClientCallbackReaderWriterImpl + : public ClientCallbackReaderWriter { + public: + // always allocated against a call arena, no memory free required + static void operator delete(void* /*ptr*/, std::size_t size) { + GPR_CODEGEN_ASSERT(size == sizeof(ClientCallbackReaderWriterImpl)); + } + + // This operator should never be called as the memory should be freed as part + // of the arena destruction. It only exists to provide a matching operator + // delete to the operator new so that some compilers will not complain (see + // https://github.com/grpc/grpc/issues/11301) Note at the time of adding this + // there are no tests catching the compiler warning. + static void operator delete(void*, void*) { GPR_CODEGEN_ASSERT(false); } + + void MaybeFinish() { + if (GPR_UNLIKELY(callbacks_outstanding_.fetch_sub( + 1, std::memory_order_acq_rel) == 1)) { + ::grpc::Status s = std::move(finish_status_); + auto* reactor = reactor_; + auto* call = call_.call(); + this->~ClientCallbackReaderWriterImpl(); + ::grpc::g_core_codegen_interface->grpc_call_unref(call); + reactor->OnDone(s); + } + } + + void StartCall() override { + // This call initiates two batches, plus any backlog, each with a callback + // 1. Send initial metadata (unless corked) + recv initial metadata + // 2. Any read backlog + // 3. Any write backlog + // 4. Recv trailing metadata, on_completion callback + started_ = true; + + start_tag_.Set(call_.call(), + [this](bool ok) { + reactor_->OnReadInitialMetadataDone(ok); + MaybeFinish(); + }, + &start_ops_, /*can_inline=*/false); + if (!start_corked_) { + start_ops_.SendInitialMetadata(&context_->send_initial_metadata_, + context_->initial_metadata_flags()); + } + start_ops_.RecvInitialMetadata(context_); + start_ops_.set_core_cq_tag(&start_tag_); + call_.PerformOps(&start_ops_); + + // Also set up the read and write tags so that they don't have to be set up + // each time + write_tag_.Set(call_.call(), + [this](bool ok) { + reactor_->OnWriteDone(ok); + MaybeFinish(); + }, + &write_ops_, /*can_inline=*/false); + write_ops_.set_core_cq_tag(&write_tag_); + + read_tag_.Set(call_.call(), + [this](bool ok) { + reactor_->OnReadDone(ok); + MaybeFinish(); + }, + &read_ops_, /*can_inline=*/false); + read_ops_.set_core_cq_tag(&read_tag_); + if (read_ops_at_start_) { + call_.PerformOps(&read_ops_); + } + + if (write_ops_at_start_) { + call_.PerformOps(&write_ops_); + } + + if (writes_done_ops_at_start_) { + call_.PerformOps(&writes_done_ops_); + } + + finish_tag_.Set(call_.call(), [this](bool /*ok*/) { MaybeFinish(); }, + &finish_ops_, /*can_inline=*/false); + finish_ops_.ClientRecvStatus(context_, &finish_status_); + finish_ops_.set_core_cq_tag(&finish_tag_); + call_.PerformOps(&finish_ops_); + } + + void Read(Response* msg) override { + read_ops_.RecvMessage(msg); + callbacks_outstanding_.fetch_add(1, std::memory_order_relaxed); + if (started_) { + call_.PerformOps(&read_ops_); + } else { + read_ops_at_start_ = true; + } + } + + void Write(const Request* msg, ::grpc::WriteOptions options) override { + if (start_corked_) { + write_ops_.SendInitialMetadata(&context_->send_initial_metadata_, + context_->initial_metadata_flags()); + start_corked_ = false; + } + + if (options.is_last_message()) { + options.set_buffer_hint(); + write_ops_.ClientSendClose(); + } + // TODO(vjpai): don't assert + GPR_CODEGEN_ASSERT(write_ops_.SendMessagePtr(msg, options).ok()); + callbacks_outstanding_.fetch_add(1, std::memory_order_relaxed); + if (started_) { + call_.PerformOps(&write_ops_); + } else { + write_ops_at_start_ = true; + } + } + void WritesDone() override { + if (start_corked_) { + writes_done_ops_.SendInitialMetadata(&context_->send_initial_metadata_, + context_->initial_metadata_flags()); + start_corked_ = false; + } + writes_done_ops_.ClientSendClose(); + writes_done_tag_.Set(call_.call(), + [this](bool ok) { + reactor_->OnWritesDoneDone(ok); + MaybeFinish(); + }, + &writes_done_ops_, /*can_inline=*/false); + writes_done_ops_.set_core_cq_tag(&writes_done_tag_); + callbacks_outstanding_.fetch_add(1, std::memory_order_relaxed); + if (started_) { + call_.PerformOps(&writes_done_ops_); + } else { + writes_done_ops_at_start_ = true; + } + } + + void AddHold(int holds) override { + callbacks_outstanding_.fetch_add(holds, std::memory_order_relaxed); + } + void RemoveHold() override { MaybeFinish(); } + + private: + friend class ClientCallbackReaderWriterFactory; + + ClientCallbackReaderWriterImpl(grpc::internal::Call call, + ::grpc_impl::ClientContext* context, + ClientBidiReactor* reactor) + : context_(context), + call_(call), + reactor_(reactor), + start_corked_(context_->initial_metadata_corked_) { + this->BindReactor(reactor); + } + + ::grpc_impl::ClientContext* const context_; + grpc::internal::Call call_; + ClientBidiReactor* const reactor_; + + grpc::internal::CallOpSet + start_ops_; + grpc::internal::CallbackWithSuccessTag start_tag_; + bool start_corked_; + + grpc::internal::CallOpSet finish_ops_; + grpc::internal::CallbackWithSuccessTag finish_tag_; + ::grpc::Status finish_status_; + + grpc::internal::CallOpSet + write_ops_; + grpc::internal::CallbackWithSuccessTag write_tag_; + bool write_ops_at_start_{false}; + + grpc::internal::CallOpSet + writes_done_ops_; + grpc::internal::CallbackWithSuccessTag writes_done_tag_; + bool writes_done_ops_at_start_{false}; + + grpc::internal::CallOpSet> + read_ops_; + grpc::internal::CallbackWithSuccessTag read_tag_; + bool read_ops_at_start_{false}; + + // Minimum of 2 callbacks to pre-register for start and finish + std::atomic callbacks_outstanding_{2}; + bool started_{false}; +}; + +template +class ClientCallbackReaderWriterFactory { + public: + static void Create(::grpc::ChannelInterface* channel, + const ::grpc::internal::RpcMethod& method, + ::grpc_impl::ClientContext* context, + ClientBidiReactor* reactor) { + grpc::internal::Call call = + channel->CreateCall(method, context, channel->CallbackCQ()); + + ::grpc::g_core_codegen_interface->grpc_call_ref(call.call()); + new (::grpc::g_core_codegen_interface->grpc_call_arena_alloc( + call.call(), sizeof(ClientCallbackReaderWriterImpl))) + ClientCallbackReaderWriterImpl(call, context, + reactor); + } +}; + +template +class ClientCallbackReaderImpl : public ClientCallbackReader { + public: + // always allocated against a call arena, no memory free required + static void operator delete(void* /*ptr*/, std::size_t size) { + GPR_CODEGEN_ASSERT(size == sizeof(ClientCallbackReaderImpl)); + } + + // This operator should never be called as the memory should be freed as part + // of the arena destruction. It only exists to provide a matching operator + // delete to the operator new so that some compilers will not complain (see + // https://github.com/grpc/grpc/issues/11301) Note at the time of adding this + // there are no tests catching the compiler warning. + static void operator delete(void*, void*) { GPR_CODEGEN_ASSERT(false); } + + void MaybeFinish() { + if (GPR_UNLIKELY(callbacks_outstanding_.fetch_sub( + 1, std::memory_order_acq_rel) == 1)) { + ::grpc::Status s = std::move(finish_status_); + auto* reactor = reactor_; + auto* call = call_.call(); + this->~ClientCallbackReaderImpl(); + ::grpc::g_core_codegen_interface->grpc_call_unref(call); + reactor->OnDone(s); + } + } + + void StartCall() override { + // This call initiates two batches, plus any backlog, each with a callback + // 1. Send initial metadata (unless corked) + recv initial metadata + // 2. Any backlog + // 3. Recv trailing metadata, on_completion callback + started_ = true; + + start_tag_.Set(call_.call(), + [this](bool ok) { + reactor_->OnReadInitialMetadataDone(ok); + MaybeFinish(); + }, + &start_ops_, /*can_inline=*/false); + start_ops_.SendInitialMetadata(&context_->send_initial_metadata_, + context_->initial_metadata_flags()); + start_ops_.RecvInitialMetadata(context_); + start_ops_.set_core_cq_tag(&start_tag_); + call_.PerformOps(&start_ops_); + + // Also set up the read tag so it doesn't have to be set up each time + read_tag_.Set(call_.call(), + [this](bool ok) { + reactor_->OnReadDone(ok); + MaybeFinish(); + }, + &read_ops_, /*can_inline=*/false); + read_ops_.set_core_cq_tag(&read_tag_); + if (read_ops_at_start_) { + call_.PerformOps(&read_ops_); + } + + finish_tag_.Set(call_.call(), [this](bool /*ok*/) { MaybeFinish(); }, + &finish_ops_, /*can_inline=*/false); + finish_ops_.ClientRecvStatus(context_, &finish_status_); + finish_ops_.set_core_cq_tag(&finish_tag_); + call_.PerformOps(&finish_ops_); + } + + void Read(Response* msg) override { + read_ops_.RecvMessage(msg); + callbacks_outstanding_.fetch_add(1, std::memory_order_relaxed); + if (started_) { + call_.PerformOps(&read_ops_); + } else { + read_ops_at_start_ = true; + } + } + + void AddHold(int holds) override { + callbacks_outstanding_.fetch_add(holds, std::memory_order_relaxed); + } + void RemoveHold() override { MaybeFinish(); } + + private: + friend class ClientCallbackReaderFactory; + + template + ClientCallbackReaderImpl(::grpc::internal::Call call, + ::grpc_impl::ClientContext* context, + Request* request, + ClientReadReactor* reactor) + : context_(context), call_(call), reactor_(reactor) { + this->BindReactor(reactor); + // TODO(vjpai): don't assert + GPR_CODEGEN_ASSERT(start_ops_.SendMessagePtr(request).ok()); + start_ops_.ClientSendClose(); + } + + ::grpc_impl::ClientContext* const context_; + grpc::internal::Call call_; + ClientReadReactor* const reactor_; + + grpc::internal::CallOpSet + start_ops_; + grpc::internal::CallbackWithSuccessTag start_tag_; + + grpc::internal::CallOpSet finish_ops_; + grpc::internal::CallbackWithSuccessTag finish_tag_; + ::grpc::Status finish_status_; + + grpc::internal::CallOpSet> + read_ops_; + grpc::internal::CallbackWithSuccessTag read_tag_; + bool read_ops_at_start_{false}; + + // Minimum of 2 callbacks to pre-register for start and finish + std::atomic callbacks_outstanding_{2}; + bool started_{false}; +}; + +template +class ClientCallbackReaderFactory { + public: + template + static void Create(::grpc::ChannelInterface* channel, + const ::grpc::internal::RpcMethod& method, + ::grpc_impl::ClientContext* context, + const Request* request, + ClientReadReactor* reactor) { + grpc::internal::Call call = + channel->CreateCall(method, context, channel->CallbackCQ()); + + ::grpc::g_core_codegen_interface->grpc_call_ref(call.call()); + new (::grpc::g_core_codegen_interface->grpc_call_arena_alloc( + call.call(), sizeof(ClientCallbackReaderImpl))) + ClientCallbackReaderImpl(call, context, request, reactor); + } +}; + +template +class ClientCallbackWriterImpl : public ClientCallbackWriter { + public: + // always allocated against a call arena, no memory free required + static void operator delete(void* /*ptr*/, std::size_t size) { + GPR_CODEGEN_ASSERT(size == sizeof(ClientCallbackWriterImpl)); + } + + // This operator should never be called as the memory should be freed as part + // of the arena destruction. It only exists to provide a matching operator + // delete to the operator new so that some compilers will not complain (see + // https://github.com/grpc/grpc/issues/11301) Note at the time of adding this + // there are no tests catching the compiler warning. + static void operator delete(void*, void*) { GPR_CODEGEN_ASSERT(false); } + + void MaybeFinish() { + if (GPR_UNLIKELY(callbacks_outstanding_.fetch_sub( + 1, std::memory_order_acq_rel) == 1)) { + ::grpc::Status s = std::move(finish_status_); + auto* reactor = reactor_; + auto* call = call_.call(); + this->~ClientCallbackWriterImpl(); + ::grpc::g_core_codegen_interface->grpc_call_unref(call); + reactor->OnDone(s); + } + } + + void StartCall() override { + // This call initiates two batches, plus any backlog, each with a callback + // 1. Send initial metadata (unless corked) + recv initial metadata + // 2. Any backlog + // 3. Recv trailing metadata, on_completion callback + started_ = true; + + start_tag_.Set(call_.call(), + [this](bool ok) { + reactor_->OnReadInitialMetadataDone(ok); + MaybeFinish(); + }, + &start_ops_, /*can_inline=*/false); + if (!start_corked_) { + start_ops_.SendInitialMetadata(&context_->send_initial_metadata_, + context_->initial_metadata_flags()); + } + start_ops_.RecvInitialMetadata(context_); + start_ops_.set_core_cq_tag(&start_tag_); + call_.PerformOps(&start_ops_); + + // Also set up the read and write tags so that they don't have to be set up + // each time + write_tag_.Set(call_.call(), + [this](bool ok) { + reactor_->OnWriteDone(ok); + MaybeFinish(); + }, + &write_ops_, /*can_inline=*/false); + write_ops_.set_core_cq_tag(&write_tag_); + + if (write_ops_at_start_) { + call_.PerformOps(&write_ops_); + } + + if (writes_done_ops_at_start_) { + call_.PerformOps(&writes_done_ops_); + } + + finish_tag_.Set(call_.call(), [this](bool /*ok*/) { MaybeFinish(); }, + &finish_ops_, /*can_inline=*/false); + finish_ops_.ClientRecvStatus(context_, &finish_status_); + finish_ops_.set_core_cq_tag(&finish_tag_); + call_.PerformOps(&finish_ops_); + } + + void Write(const Request* msg, ::grpc::WriteOptions options) override { + if (start_corked_) { + write_ops_.SendInitialMetadata(&context_->send_initial_metadata_, + context_->initial_metadata_flags()); + start_corked_ = false; + } + + if (options.is_last_message()) { + options.set_buffer_hint(); + write_ops_.ClientSendClose(); + } + // TODO(vjpai): don't assert + GPR_CODEGEN_ASSERT(write_ops_.SendMessagePtr(msg, options).ok()); + callbacks_outstanding_.fetch_add(1, std::memory_order_relaxed); + if (started_) { + call_.PerformOps(&write_ops_); + } else { + write_ops_at_start_ = true; + } + } + void WritesDone() override { + if (start_corked_) { + writes_done_ops_.SendInitialMetadata(&context_->send_initial_metadata_, + context_->initial_metadata_flags()); + start_corked_ = false; + } + writes_done_ops_.ClientSendClose(); + writes_done_tag_.Set(call_.call(), + [this](bool ok) { + reactor_->OnWritesDoneDone(ok); + MaybeFinish(); + }, + &writes_done_ops_, /*can_inline=*/false); + writes_done_ops_.set_core_cq_tag(&writes_done_tag_); + callbacks_outstanding_.fetch_add(1, std::memory_order_relaxed); + if (started_) { + call_.PerformOps(&writes_done_ops_); + } else { + writes_done_ops_at_start_ = true; + } + } + + void AddHold(int holds) override { + callbacks_outstanding_.fetch_add(holds, std::memory_order_relaxed); + } + void RemoveHold() override { MaybeFinish(); } + + private: + friend class ClientCallbackWriterFactory; + + template + ClientCallbackWriterImpl(::grpc::internal::Call call, + ::grpc_impl::ClientContext* context, + Response* response, + ClientWriteReactor* reactor) + : context_(context), + call_(call), + reactor_(reactor), + start_corked_(context_->initial_metadata_corked_) { + this->BindReactor(reactor); + finish_ops_.RecvMessage(response); + finish_ops_.AllowNoMessage(); + } + + ::grpc_impl::ClientContext* const context_; + grpc::internal::Call call_; + ClientWriteReactor* const reactor_; + + grpc::internal::CallOpSet + start_ops_; + grpc::internal::CallbackWithSuccessTag start_tag_; + bool start_corked_; + + grpc::internal::CallOpSet + finish_ops_; + grpc::internal::CallbackWithSuccessTag finish_tag_; + ::grpc::Status finish_status_; + + grpc::internal::CallOpSet + write_ops_; + grpc::internal::CallbackWithSuccessTag write_tag_; + bool write_ops_at_start_{false}; + + grpc::internal::CallOpSet + writes_done_ops_; + grpc::internal::CallbackWithSuccessTag writes_done_tag_; + bool writes_done_ops_at_start_{false}; + + // Minimum of 2 callbacks to pre-register for start and finish + std::atomic callbacks_outstanding_{2}; + bool started_{false}; +}; + +template +class ClientCallbackWriterFactory { + public: + template + static void Create(::grpc::ChannelInterface* channel, + const ::grpc::internal::RpcMethod& method, + ::grpc_impl::ClientContext* context, Response* response, + ClientWriteReactor* reactor) { + grpc::internal::Call call = + channel->CreateCall(method, context, channel->CallbackCQ()); + + ::grpc::g_core_codegen_interface->grpc_call_ref(call.call()); + new (::grpc::g_core_codegen_interface->grpc_call_arena_alloc( + call.call(), sizeof(ClientCallbackWriterImpl))) + ClientCallbackWriterImpl(call, context, response, reactor); + } +}; + +class ClientCallbackUnaryImpl final : public ClientCallbackUnary { + public: + // always allocated against a call arena, no memory free required + static void operator delete(void* /*ptr*/, std::size_t size) { + GPR_CODEGEN_ASSERT(size == sizeof(ClientCallbackUnaryImpl)); + } + + // This operator should never be called as the memory should be freed as part + // of the arena destruction. It only exists to provide a matching operator + // delete to the operator new so that some compilers will not complain (see + // https://github.com/grpc/grpc/issues/11301) Note at the time of adding this + // there are no tests catching the compiler warning. + static void operator delete(void*, void*) { GPR_CODEGEN_ASSERT(false); } + + void StartCall() override { + // This call initiates two batches, each with a callback + // 1. Send initial metadata + write + writes done + recv initial metadata + // 2. Read message, recv trailing metadata + started_ = true; + + start_tag_.Set(call_.call(), + [this](bool ok) { + reactor_->OnReadInitialMetadataDone(ok); + MaybeFinish(); + }, + &start_ops_, /*can_inline=*/false); + start_ops_.SendInitialMetadata(&context_->send_initial_metadata_, + context_->initial_metadata_flags()); + start_ops_.RecvInitialMetadata(context_); + start_ops_.set_core_cq_tag(&start_tag_); + call_.PerformOps(&start_ops_); + + finish_tag_.Set(call_.call(), [this](bool /*ok*/) { MaybeFinish(); }, + &finish_ops_, /*can_inline=*/false); + finish_ops_.ClientRecvStatus(context_, &finish_status_); + finish_ops_.set_core_cq_tag(&finish_tag_); + call_.PerformOps(&finish_ops_); + } + + void MaybeFinish() { + if (GPR_UNLIKELY(callbacks_outstanding_.fetch_sub( + 1, std::memory_order_acq_rel) == 1)) { + ::grpc::Status s = std::move(finish_status_); + auto* reactor = reactor_; + auto* call = call_.call(); + this->~ClientCallbackUnaryImpl(); + ::grpc::g_core_codegen_interface->grpc_call_unref(call); + reactor->OnDone(s); + } + } + + private: + friend class ClientCallbackUnaryFactory; + + template + ClientCallbackUnaryImpl(::grpc::internal::Call call, + ::grpc_impl::ClientContext* context, Request* request, + Response* response, ClientUnaryReactor* reactor) + : context_(context), call_(call), reactor_(reactor) { + this->BindReactor(reactor); + // TODO(vjpai): don't assert + GPR_CODEGEN_ASSERT(start_ops_.SendMessagePtr(request).ok()); + start_ops_.ClientSendClose(); + finish_ops_.RecvMessage(response); + finish_ops_.AllowNoMessage(); + } + + ::grpc_impl::ClientContext* const context_; + grpc::internal::Call call_; + ClientUnaryReactor* const reactor_; + + grpc::internal::CallOpSet + start_ops_; + grpc::internal::CallbackWithSuccessTag start_tag_; + + grpc::internal::CallOpSet + finish_ops_; + grpc::internal::CallbackWithSuccessTag finish_tag_; + ::grpc::Status finish_status_; + + // This call will have 2 callbacks: start and finish + std::atomic callbacks_outstanding_{2}; + bool started_{false}; +}; + +class ClientCallbackUnaryFactory { + public: + template + static void Create(::grpc::ChannelInterface* channel, + const ::grpc::internal::RpcMethod& method, + ::grpc_impl::ClientContext* context, + const Request* request, Response* response, + ClientUnaryReactor* reactor) { + grpc::internal::Call call = + channel->CreateCall(method, context, channel->CallbackCQ()); + + ::grpc::g_core_codegen_interface->grpc_call_ref(call.call()); + + new (::grpc::g_core_codegen_interface->grpc_call_arena_alloc( + call.call(), sizeof(ClientCallbackUnaryImpl))) + ClientCallbackUnaryImpl(call, context, request, response, reactor); + } +}; + +} // namespace internal +} // namespace grpc_impl +#endif // GRPCPP_IMPL_CODEGEN_CLIENT_CALLBACK_IMPL_H diff --git a/include/grpcpp/impl/codegen/client_context.h b/include/grpcpp/impl/codegen/client_context.h new file mode 100644 index 00000000..02389464 --- /dev/null +++ b/include/grpcpp/impl/codegen/client_context.h @@ -0,0 +1,31 @@ +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_CLIENT_CONTEXT_H +#define GRPCPP_IMPL_CODEGEN_CLIENT_CONTEXT_H + +#include + +namespace grpc { + +typedef ::grpc_impl::ClientContext ClientContext; +typedef ::grpc_impl::PropagationOptions PropagationOptions; + +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_CLIENT_CONTEXT_H diff --git a/include/grpcpp/impl/codegen/client_context_impl.h b/include/grpcpp/impl/codegen/client_context_impl.h new file mode 100644 index 00000000..b8e90722 --- /dev/null +++ b/include/grpcpp/impl/codegen/client_context_impl.h @@ -0,0 +1,519 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +/// A ClientContext allows the person implementing a service client to: +/// +/// - Add custom metadata key-value pairs that will propagated to the server +/// side. +/// - Control call settings such as compression and authentication. +/// - Initial and trailing metadata coming from the server. +/// - Get performance metrics (ie, census). +/// +/// Context settings are only relevant to the call they are invoked with, that +/// is to say, they aren't sticky. Some of these settings, such as the +/// compression options, can be made persistent at channel construction time +/// (see \a grpc::CreateCustomChannel). +/// +/// \warning ClientContext instances should \em not be reused across rpcs. + +#ifndef GRPCPP_IMPL_CODEGEN_CLIENT_CONTEXT_IMPL_H +#define GRPCPP_IMPL_CODEGEN_CLIENT_CONTEXT_IMPL_H + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct census_context; +struct grpc_call; + +namespace grpc { + +class ChannelInterface; + +namespace internal { +class RpcMethod; +template +class BlockingUnaryCallImpl; +class CallOpClientRecvStatus; +class CallOpRecvInitialMetadata; +class ServerContextImpl; +} // namespace internal + +namespace testing { +class InteropClientContextInspector; +} // namespace testing +} // namespace grpc +namespace grpc_impl { + +namespace internal { +template +class CallbackUnaryCallImpl; +template +class ClientCallbackReaderWriterImpl; +template +class ClientCallbackReaderImpl; +template +class ClientCallbackWriterImpl; +class ClientCallbackUnaryImpl; +class ClientContextAccessor; +} // namespace internal + +class CallCredentials; +class Channel; +class CompletionQueue; +class ServerContext; +template +class ClientReader; +template +class ClientWriter; +template +class ClientReaderWriter; +template +class ClientAsyncReader; +template +class ClientAsyncWriter; +template +class ClientAsyncReaderWriter; +template +class ClientAsyncResponseReader; + +class ServerContextBase; +class CallbackServerContext; + +/// Options for \a ClientContext::FromServerContext specifying which traits from +/// the \a ServerContext to propagate (copy) from it into a new \a +/// ClientContext. +/// +/// \see ClientContext::FromServerContext +class PropagationOptions { + public: + PropagationOptions() : propagate_(GRPC_PROPAGATE_DEFAULTS) {} + + PropagationOptions& enable_deadline_propagation() { + propagate_ |= GRPC_PROPAGATE_DEADLINE; + return *this; + } + + PropagationOptions& disable_deadline_propagation() { + propagate_ &= ~GRPC_PROPAGATE_DEADLINE; + return *this; + } + + PropagationOptions& enable_census_stats_propagation() { + propagate_ |= GRPC_PROPAGATE_CENSUS_STATS_CONTEXT; + return *this; + } + + PropagationOptions& disable_census_stats_propagation() { + propagate_ &= ~GRPC_PROPAGATE_CENSUS_STATS_CONTEXT; + return *this; + } + + PropagationOptions& enable_census_tracing_propagation() { + propagate_ |= GRPC_PROPAGATE_CENSUS_TRACING_CONTEXT; + return *this; + } + + PropagationOptions& disable_census_tracing_propagation() { + propagate_ &= ~GRPC_PROPAGATE_CENSUS_TRACING_CONTEXT; + return *this; + } + + PropagationOptions& enable_cancellation_propagation() { + propagate_ |= GRPC_PROPAGATE_CANCELLATION; + return *this; + } + + PropagationOptions& disable_cancellation_propagation() { + propagate_ &= ~GRPC_PROPAGATE_CANCELLATION; + return *this; + } + + uint32_t c_bitmask() const { return propagate_; } + + private: + uint32_t propagate_; +}; + +/// A ClientContext allows the person implementing a service client to: +/// +/// - Add custom metadata key-value pairs that will propagated to the server +/// side. +/// - Control call settings such as compression and authentication. +/// - Initial and trailing metadata coming from the server. +/// - Get performance metrics (ie, census). +/// +/// Context settings are only relevant to the call they are invoked with, that +/// is to say, they aren't sticky. Some of these settings, such as the +/// compression options, can be made persistent at channel construction time +/// (see \a grpc::CreateCustomChannel). +/// +/// \warning ClientContext instances should \em not be reused across rpcs. +/// \warning The ClientContext instance used for creating an rpc must remain +/// alive and valid for the lifetime of the rpc. +class ClientContext { + public: + ClientContext(); + ~ClientContext(); + + /// Create a new \a ClientContext as a child of an incoming server call, + /// according to \a options (\see PropagationOptions). + /// + /// \param server_context The source server context to use as the basis for + /// constructing the client context. + /// \param options The options controlling what to copy from the \a + /// server_context. + /// + /// \return A newly constructed \a ClientContext instance based on \a + /// server_context, with traits propagated (copied) according to \a options. + static std::unique_ptr FromServerContext( + const grpc_impl::ServerContext& server_context, + PropagationOptions options = PropagationOptions()); + static std::unique_ptr FromCallbackServerContext( + const grpc_impl::CallbackServerContext& server_context, + PropagationOptions options = PropagationOptions()); + + /// Add the (\a meta_key, \a meta_value) pair to the metadata associated with + /// a client call. These are made available at the server side by the \a + /// grpc::ServerContext::client_metadata() method. + /// + /// \warning This method should only be called before invoking the rpc. + /// + /// \param meta_key The metadata key. If \a meta_value is binary data, it must + /// end in "-bin". + /// \param meta_value The metadata value. If its value is binary, the key name + /// must end in "-bin". + /// + /// Metadata must conform to the following format: + /// Custom-Metadata -> Binary-Header / ASCII-Header + /// Binary-Header -> {Header-Name "-bin" } {binary value} + /// ASCII-Header -> Header-Name ASCII-Value + /// Header-Name -> 1*( %x30-39 / %x61-7A / "_" / "-" / ".") ; 0-9 a-z _ - . + /// ASCII-Value -> 1*( %x20-%x7E ) ; space and printable ASCII + void AddMetadata(const grpc::string& meta_key, + const grpc::string& meta_value); + + /// Return a collection of initial metadata key-value pairs. Note that keys + /// may happen more than once (ie, a \a std::multimap is returned). + /// + /// \warning This method should only be called after initial metadata has been + /// received. For streaming calls, see \a + /// ClientReaderInterface::WaitForInitialMetadata(). + /// + /// \return A multimap of initial metadata key-value pairs from the server. + const std::multimap& + GetServerInitialMetadata() const { + GPR_CODEGEN_ASSERT(initial_metadata_received_); + return *recv_initial_metadata_.map(); + } + + /// Return a collection of trailing metadata key-value pairs. Note that keys + /// may happen more than once (ie, a \a std::multimap is returned). + /// + /// \warning This method is only callable once the stream has finished. + /// + /// \return A multimap of metadata trailing key-value pairs from the server. + const std::multimap& + GetServerTrailingMetadata() const { + // TODO(yangg) check finished + return *trailing_metadata_.map(); + } + + /// Set the deadline for the client call. + /// + /// \warning This method should only be called before invoking the rpc. + /// + /// \param deadline the deadline for the client call. Units are determined by + /// the type used. The deadline is an absolute (not relative) time. + template + void set_deadline(const T& deadline) { + grpc::TimePoint deadline_tp(deadline); + deadline_ = deadline_tp.raw_time(); + } + + /// EXPERIMENTAL: Indicate that this request is idempotent. + /// By default, RPCs are assumed to not be idempotent. + /// + /// If true, the gRPC library assumes that it's safe to initiate + /// this RPC multiple times. + void set_idempotent(bool idempotent) { idempotent_ = idempotent; } + + /// EXPERIMENTAL: Set this request to be cacheable. + /// If set, grpc is free to use the HTTP GET verb for sending the request, + /// with the possibility of receiving a cached response. + void set_cacheable(bool cacheable) { cacheable_ = cacheable; } + + /// EXPERIMENTAL: Trigger wait-for-ready or not on this request. + /// See https://github.com/grpc/grpc/blob/master/doc/wait-for-ready.md. + /// If set, if an RPC is made when a channel's connectivity state is + /// TRANSIENT_FAILURE or CONNECTING, the call will not "fail fast", + /// and the channel will wait until the channel is READY before making the + /// call. + void set_wait_for_ready(bool wait_for_ready) { + wait_for_ready_ = wait_for_ready; + wait_for_ready_explicitly_set_ = true; + } + + /// DEPRECATED: Use set_wait_for_ready() instead. + void set_fail_fast(bool fail_fast) { set_wait_for_ready(!fail_fast); } + + /// Return the deadline for the client call. + std::chrono::system_clock::time_point deadline() const { + return grpc::Timespec2Timepoint(deadline_); + } + + /// Return a \a gpr_timespec representation of the client call's deadline. + gpr_timespec raw_deadline() const { return deadline_; } + + /// Set the per call authority header (see + /// https://tools.ietf.org/html/rfc7540#section-8.1.2.3). + void set_authority(const grpc::string& authority) { authority_ = authority; } + + /// Return the authentication context for the associated client call. + /// It is only valid to call this during the lifetime of the client call. + /// + /// \see grpc::AuthContext. + std::shared_ptr auth_context() const { + if (auth_context_.get() == nullptr) { + auth_context_ = grpc::CreateAuthContext(call_); + } + return auth_context_; + } + + /// Set credentials for the client call. + /// + /// A credentials object encapsulates all the state needed by a client to + /// authenticate with a server and make various assertions, e.g., about the + /// client’s identity, role, or whether it is authorized to make a particular + /// call. + /// + /// It is legal to call this only before initial metadata is sent. + /// + /// \see https://grpc.io/docs/guides/auth.html + void set_credentials( + const std::shared_ptr& creds); + + /// EXPERIMENTAL debugging API + /// + /// Returns the credentials for the client call. This should be used only in + /// tests and for diagnostic purposes, and should not be used by application + /// logic. + std::shared_ptr credentials() { return creds_; } + + /// Return the compression algorithm the client call will request be used. + /// Note that the gRPC runtime may decide to ignore this request, for example, + /// due to resource constraints. + grpc_compression_algorithm compression_algorithm() const { + return compression_algorithm_; + } + + /// Set \a algorithm to be the compression algorithm used for the client call. + /// + /// \param algorithm The compression algorithm used for the client call. + void set_compression_algorithm(grpc_compression_algorithm algorithm); + + /// Flag whether the initial metadata should be \a corked + /// + /// If \a corked is true, then the initial metadata will be coalesced with the + /// write of first message in the stream. As a result, any tag set for the + /// initial metadata operation (starting a client-streaming or bidi-streaming + /// RPC) will not actually be sent to the completion queue or delivered + /// via Next. + /// + /// \param corked The flag indicating whether the initial metadata is to be + /// corked or not. + void set_initial_metadata_corked(bool corked) { + initial_metadata_corked_ = corked; + } + + /// Return the peer uri in a string. + /// It is only valid to call this during the lifetime of the client call. + /// + /// \warning This value is never authenticated or subject to any security + /// related code. It must not be used for any authentication related + /// functionality. Instead, use auth_context. + /// + /// \return The call's peer URI. + grpc::string peer() const; + + /// Sets the census context. + /// It is only valid to call this before the client call is created. A common + /// place of setting census context is from within the DefaultConstructor + /// method of GlobalCallbacks. + void set_census_context(struct census_context* ccp) { census_context_ = ccp; } + + /// Returns the census context that has been set, or nullptr if not set. + struct census_context* census_context() const { + return census_context_; + } + + /// Send a best-effort out-of-band cancel on the call associated with + /// this client context. The call could be in any stage; e.g., if it is + /// already finished, it may still return success. + /// + /// There is no guarantee the call will be cancelled. + /// + /// Note that TryCancel() does not change any of the tags that are pending + /// on the completion queue. All pending tags will still be delivered + /// (though their ok result may reflect the effect of cancellation). + void TryCancel(); + + /// Global Callbacks + /// + /// Can be set exactly once per application to install hooks whenever + /// a client context is constructed and destructed. + class GlobalCallbacks { + public: + virtual ~GlobalCallbacks() {} + virtual void DefaultConstructor(ClientContext* context) = 0; + virtual void Destructor(ClientContext* context) = 0; + }; + static void SetGlobalCallbacks(GlobalCallbacks* callbacks); + + /// Should be used for framework-level extensions only. + /// Applications never need to call this method. + grpc_call* c_call() { return call_; } + + /// EXPERIMENTAL debugging API + /// + /// if status is not ok() for an RPC, this will return a detailed string + /// of the gRPC Core error that led to the failure. It should not be relied + /// upon for anything other than gaining more debug data in failure cases. + grpc::string debug_error_string() const { return debug_error_string_; } + + private: + // Disallow copy and assign. + ClientContext(const ClientContext&); + ClientContext& operator=(const ClientContext&); + + friend class ::grpc::testing::InteropClientContextInspector; + friend class ::grpc::internal::CallOpClientRecvStatus; + friend class ::grpc::internal::CallOpRecvInitialMetadata; + friend class ::grpc_impl::Channel; + template + friend class ::grpc_impl::ClientReader; + template + friend class ::grpc_impl::ClientWriter; + template + friend class ::grpc_impl::ClientReaderWriter; + template + friend class ::grpc_impl::ClientAsyncReader; + template + friend class ::grpc_impl::ClientAsyncWriter; + template + friend class ::grpc_impl::ClientAsyncReaderWriter; + template + friend class ::grpc_impl::ClientAsyncResponseReader; + template + friend class ::grpc::internal::BlockingUnaryCallImpl; + template + friend class ::grpc_impl::internal::CallbackUnaryCallImpl; + template + friend class ::grpc_impl::internal::ClientCallbackReaderWriterImpl; + template + friend class ::grpc_impl::internal::ClientCallbackReaderImpl; + template + friend class ::grpc_impl::internal::ClientCallbackWriterImpl; + friend class ::grpc_impl::internal::ClientCallbackUnaryImpl; + friend class ::grpc_impl::internal::ClientContextAccessor; + + // Used by friend class CallOpClientRecvStatus + void set_debug_error_string(const grpc::string& debug_error_string) { + debug_error_string_ = debug_error_string; + } + + grpc_call* call() const { return call_; } + void set_call(grpc_call* call, + const std::shared_ptr<::grpc_impl::Channel>& channel); + + grpc::experimental::ClientRpcInfo* set_client_rpc_info( + const char* method, grpc::internal::RpcMethod::RpcType type, + grpc::ChannelInterface* channel, + const std::vector>& creators, + size_t interceptor_pos) { + rpc_info_ = grpc::experimental::ClientRpcInfo(this, type, method, channel); + rpc_info_.RegisterInterceptors(creators, interceptor_pos); + return &rpc_info_; + } + + uint32_t initial_metadata_flags() const { + return (idempotent_ ? GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST : 0) | + (wait_for_ready_ ? GRPC_INITIAL_METADATA_WAIT_FOR_READY : 0) | + (cacheable_ ? GRPC_INITIAL_METADATA_CACHEABLE_REQUEST : 0) | + (wait_for_ready_explicitly_set_ + ? GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET + : 0) | + (initial_metadata_corked_ ? GRPC_INITIAL_METADATA_CORKED : 0); + } + + grpc::string authority() { return authority_; } + + void SendCancelToInterceptors(); + + static std::unique_ptr FromInternalServerContext( + const grpc_impl::ServerContextBase& server_context, + PropagationOptions options); + + bool initial_metadata_received_; + bool wait_for_ready_; + bool wait_for_ready_explicitly_set_; + bool idempotent_; + bool cacheable_; + std::shared_ptr<::grpc_impl::Channel> channel_; + grpc::internal::Mutex mu_; + grpc_call* call_; + bool call_canceled_; + gpr_timespec deadline_; + grpc::string authority_; + std::shared_ptr creds_; + mutable std::shared_ptr auth_context_; + struct census_context* census_context_; + std::multimap send_initial_metadata_; + mutable grpc::internal::MetadataMap recv_initial_metadata_; + mutable grpc::internal::MetadataMap trailing_metadata_; + + grpc_call* propagate_from_call_; + PropagationOptions propagation_options_; + + grpc_compression_algorithm compression_algorithm_; + bool initial_metadata_corked_; + + grpc::string debug_error_string_; + + grpc::experimental::ClientRpcInfo rpc_info_; +}; + +} // namespace grpc_impl + +#endif // GRPCPP_IMPL_CODEGEN_CLIENT_CONTEXT_IMPL_H diff --git a/include/grpcpp/impl/codegen/client_interceptor.h b/include/grpcpp/impl/codegen/client_interceptor.h new file mode 100644 index 00000000..03cb41fb --- /dev/null +++ b/include/grpcpp/impl/codegen/client_interceptor.h @@ -0,0 +1,194 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_CLIENT_INTERCEPTOR_H +#define GRPCPP_IMPL_CODEGEN_CLIENT_INTERCEPTOR_H + +#include +#include + +#include +#include +#include + +namespace grpc_impl { + +class Channel; +class ClientContext; +} // namespace grpc_impl + +namespace grpc { + +namespace internal { +class InterceptorBatchMethodsImpl; +} + +namespace experimental { +class ClientRpcInfo; + +// A factory interface for creation of client interceptors. A vector of +// factories can be provided at channel creation which will be used to create a +// new vector of client interceptors per RPC. Client interceptor authors should +// create a subclass of ClientInterceptorFactorInterface which creates objects +// of their interceptors. +class ClientInterceptorFactoryInterface { + public: + virtual ~ClientInterceptorFactoryInterface() {} + // Returns a pointer to an Interceptor object on successful creation, nullptr + // otherwise. If nullptr is returned, this server interceptor factory is + // ignored for the purposes of that RPC. + virtual Interceptor* CreateClientInterceptor(ClientRpcInfo* info) = 0; +}; +} // namespace experimental + +namespace internal { +extern experimental::ClientInterceptorFactoryInterface* + g_global_client_interceptor_factory; +} + +/// ClientRpcInfo represents the state of a particular RPC as it +/// appears to an interceptor. It is created and owned by the library and +/// passed to the CreateClientInterceptor method of the application's +/// ClientInterceptorFactoryInterface implementation +namespace experimental { +class ClientRpcInfo { + public: + // TODO(yashykt): Stop default-constructing ClientRpcInfo and remove UNKNOWN + // from the list of possible Types. + /// Type categorizes RPCs by unary or streaming type + enum class Type { + UNARY, + CLIENT_STREAMING, + SERVER_STREAMING, + BIDI_STREAMING, + UNKNOWN // UNKNOWN is not API and will be removed later + }; + + ~ClientRpcInfo() {} + + // Delete copy constructor but allow default move constructor + ClientRpcInfo(const ClientRpcInfo&) = delete; + ClientRpcInfo(ClientRpcInfo&&) = default; + + // Getter methods + + /// Return the fully-specified method name + const char* method() const { return method_; } + + /// Return a pointer to the channel on which the RPC is being sent + ChannelInterface* channel() { return channel_; } + + /// Return a pointer to the underlying ClientContext structure associated + /// with the RPC to support features that apply to it + grpc_impl::ClientContext* client_context() { return ctx_; } + + /// Return the type of the RPC (unary or a streaming flavor) + Type type() const { return type_; } + + private: + static_assert(Type::UNARY == + static_cast(internal::RpcMethod::NORMAL_RPC), + "violated expectation about Type enum"); + static_assert(Type::CLIENT_STREAMING == + static_cast(internal::RpcMethod::CLIENT_STREAMING), + "violated expectation about Type enum"); + static_assert(Type::SERVER_STREAMING == + static_cast(internal::RpcMethod::SERVER_STREAMING), + "violated expectation about Type enum"); + static_assert(Type::BIDI_STREAMING == + static_cast(internal::RpcMethod::BIDI_STREAMING), + "violated expectation about Type enum"); + + // Default constructor should only be used by ClientContext + ClientRpcInfo() = default; + + // Constructor will only be called from ClientContext + ClientRpcInfo(grpc_impl::ClientContext* ctx, + internal::RpcMethod::RpcType type, const char* method, + grpc::ChannelInterface* channel) + : ctx_(ctx), + type_(static_cast(type)), + method_(method), + channel_(channel) {} + + // Move assignment should only be used by ClientContext + // TODO(yashykt): Delete move assignment + ClientRpcInfo& operator=(ClientRpcInfo&&) = default; + + // Runs interceptor at pos \a pos. + void RunInterceptor( + experimental::InterceptorBatchMethods* interceptor_methods, size_t pos) { + GPR_CODEGEN_ASSERT(pos < interceptors_.size()); + interceptors_[pos]->Intercept(interceptor_methods); + } + + void RegisterInterceptors( + const std::vector>& creators, + size_t interceptor_pos) { + if (interceptor_pos > creators.size()) { + // No interceptors to register + return; + } + // NOTE: The following is not a range-based for loop because it will only + // iterate over a portion of the creators vector. + for (auto it = creators.begin() + interceptor_pos; it != creators.end(); + ++it) { + auto* interceptor = (*it)->CreateClientInterceptor(this); + if (interceptor != nullptr) { + interceptors_.push_back( + std::unique_ptr(interceptor)); + } + } + if (internal::g_global_client_interceptor_factory != nullptr) { + interceptors_.push_back(std::unique_ptr( + internal::g_global_client_interceptor_factory + ->CreateClientInterceptor(this))); + } + } + + grpc_impl::ClientContext* ctx_ = nullptr; + // TODO(yashykt): make type_ const once move-assignment is deleted + Type type_{Type::UNKNOWN}; + const char* method_ = nullptr; + grpc::ChannelInterface* channel_ = nullptr; + std::vector> interceptors_; + bool hijacked_ = false; + size_t hijacked_interceptor_ = 0; + + friend class internal::InterceptorBatchMethodsImpl; + friend class grpc_impl::ClientContext; +}; + +// PLEASE DO NOT USE THIS. ALWAYS PREFER PER CHANNEL INTERCEPTORS OVER A GLOBAL +// INTERCEPTOR. IF USAGE IS ABSOLUTELY NECESSARY, PLEASE READ THE SAFETY NOTES. +// Registers a global client interceptor factory object, which is used for all +// RPCs made in this process. The application is responsible for maintaining the +// life of the object while gRPC operations are in progress. The global +// interceptor factory should only be registered once at the start of the +// process before any gRPC operations have begun. +void RegisterGlobalClientInterceptorFactory( + ClientInterceptorFactoryInterface* factory); + +// For testing purposes only +void TestOnlyResetGlobalClientInterceptorFactory(); + +} // namespace experimental +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_CLIENT_INTERCEPTOR_H diff --git a/include/grpcpp/impl/codegen/client_unary_call.h b/include/grpcpp/impl/codegen/client_unary_call.h new file mode 100644 index 00000000..7f80e571 --- /dev/null +++ b/include/grpcpp/impl/codegen/client_unary_call.h @@ -0,0 +1,94 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_CLIENT_UNARY_CALL_H +#define GRPCPP_IMPL_CODEGEN_CLIENT_UNARY_CALL_H + +#include +#include +#include +#include +#include + +namespace grpc_impl { + +class ClientContext; +} // namespace grpc_impl +namespace grpc { + +namespace internal { +class RpcMethod; +/// Wrapper that performs a blocking unary call +template +Status BlockingUnaryCall(ChannelInterface* channel, const RpcMethod& method, + grpc_impl::ClientContext* context, + const InputMessage& request, OutputMessage* result) { + return BlockingUnaryCallImpl( + channel, method, context, request, result) + .status(); +} + +template +class BlockingUnaryCallImpl { + public: + BlockingUnaryCallImpl(ChannelInterface* channel, const RpcMethod& method, + grpc_impl::ClientContext* context, + const InputMessage& request, OutputMessage* result) { + ::grpc_impl::CompletionQueue cq(grpc_completion_queue_attributes{ + GRPC_CQ_CURRENT_VERSION, GRPC_CQ_PLUCK, GRPC_CQ_DEFAULT_POLLING, + nullptr}); // Pluckable completion queue + ::grpc::internal::Call call(channel->CreateCall(method, context, &cq)); + CallOpSet, + CallOpClientSendClose, CallOpClientRecvStatus> + ops; + status_ = ops.SendMessagePtr(&request); + if (!status_.ok()) { + return; + } + ops.SendInitialMetadata(&context->send_initial_metadata_, + context->initial_metadata_flags()); + ops.RecvInitialMetadata(context); + ops.RecvMessage(result); + ops.AllowNoMessage(); + ops.ClientSendClose(); + ops.ClientRecvStatus(context, &status_); + call.PerformOps(&ops); + cq.Pluck(&ops); + // Some of the ops might fail. If the ops fail in the core layer, status + // would reflect the error. But, if the ops fail in the C++ layer, the + // status would still be the same as the one returned by gRPC Core. This can + // happen if deserialization of the message fails. + // TODO(yashykt): If deserialization fails, but the status received is OK, + // then it might be a good idea to change the status to something better + // than StatusCode::UNIMPLEMENTED to reflect this. + if (!ops.got_message && status_.ok()) { + status_ = Status(StatusCode::UNIMPLEMENTED, + "No message returned for unary request"); + } + } + Status status() { return status_; } + + private: + Status status_; +}; + +} // namespace internal +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_CLIENT_UNARY_CALL_H diff --git a/include/grpcpp/impl/codegen/completion_queue.h b/include/grpcpp/impl/codegen/completion_queue.h new file mode 100644 index 00000000..f67a3780 --- /dev/null +++ b/include/grpcpp/impl/codegen/completion_queue.h @@ -0,0 +1,31 @@ +/* + * + * Copyright 2015-2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_COMPLETION_QUEUE_H +#define GRPCPP_IMPL_CODEGEN_COMPLETION_QUEUE_H + +#include + +namespace grpc { + +typedef ::grpc_impl::CompletionQueue CompletionQueue; +typedef ::grpc_impl::ServerCompletionQueue ServerCompletionQueue; + +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_COMPLETION_QUEUE_H diff --git a/include/grpcpp/impl/codegen/completion_queue_impl.h b/include/grpcpp/impl/codegen/completion_queue_impl.h new file mode 100644 index 00000000..c65b1219 --- /dev/null +++ b/include/grpcpp/impl/codegen/completion_queue_impl.h @@ -0,0 +1,454 @@ +/* + * + * Copyright 2015-2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +/// A completion queue implements a concurrent producer-consumer queue, with +/// two main API-exposed methods: \a Next and \a AsyncNext. These +/// methods are the essential component of the gRPC C++ asynchronous API. +/// There is also a \a Shutdown method to indicate that a given completion queue +/// will no longer have regular events. This must be called before the +/// completion queue is destroyed. +/// All completion queue APIs are thread-safe and may be used concurrently with +/// any other completion queue API invocation; it is acceptable to have +/// multiple threads calling \a Next or \a AsyncNext on the same or different +/// completion queues, or to call these methods concurrently with a \a Shutdown +/// elsewhere. +/// \remark{All other API calls on completion queue should be completed before +/// a completion queue destructor is called.} +#ifndef GRPCPP_IMPL_CODEGEN_COMPLETION_QUEUE_IMPL_H +#define GRPCPP_IMPL_CODEGEN_COMPLETION_QUEUE_IMPL_H + +#include + +#include +#include +#include +#include +#include +#include +#include + +struct grpc_completion_queue; + +namespace grpc_impl { + +class Channel; +class Server; +class ServerBuilder; +template +class ClientReader; +template +class ClientWriter; +template +class ClientReaderWriter; +template +class ServerReader; +template +class ServerWriter; +class ServerContextBase; +namespace internal { +template +class ServerReaderWriterBody; + +template +class RpcMethodHandler; +template +class ClientStreamingHandler; +template +class ServerStreamingHandler; +template +class TemplatedBidiStreamingHandler; +template <::grpc::StatusCode code> +class ErrorMethodHandler; +} // namespace internal +} // namespace grpc_impl +namespace grpc { + +class ChannelInterface; +class ServerInterface; + +namespace internal { +class CompletionQueueTag; +class RpcMethod; +template +class BlockingUnaryCallImpl; +template +class CallOpSet; +} // namespace internal + +extern CoreCodegenInterface* g_core_codegen_interface; + +} // namespace grpc + +namespace grpc_impl { + +/// A thin wrapper around \ref grpc_completion_queue (see \ref +/// src/core/lib/surface/completion_queue.h). +/// See \ref doc/cpp/perf_notes.md for notes on best practices for high +/// performance servers. +class CompletionQueue : private ::grpc::GrpcLibraryCodegen { + public: + /// Default constructor. Implicitly creates a \a grpc_completion_queue + /// instance. + CompletionQueue() + : CompletionQueue(grpc_completion_queue_attributes{ + GRPC_CQ_CURRENT_VERSION, GRPC_CQ_NEXT, GRPC_CQ_DEFAULT_POLLING, + nullptr}) {} + + /// Wrap \a take, taking ownership of the instance. + /// + /// \param take The completion queue instance to wrap. Ownership is taken. + explicit CompletionQueue(grpc_completion_queue* take); + + /// Destructor. Destroys the owned wrapped completion queue / instance. + ~CompletionQueue() { + ::grpc::g_core_codegen_interface->grpc_completion_queue_destroy(cq_); + } + + /// Tri-state return for AsyncNext: SHUTDOWN, GOT_EVENT, TIMEOUT. + enum NextStatus { + SHUTDOWN, ///< The completion queue has been shutdown and fully-drained + GOT_EVENT, ///< Got a new event; \a tag will be filled in with its + ///< associated value; \a ok indicating its success. + TIMEOUT ///< deadline was reached. + }; + + /// Read from the queue, blocking until an event is available or the queue is + /// shutting down. + /// + /// \param tag [out] Updated to point to the read event's tag. + /// \param ok [out] true if read a successful event, false otherwise. + /// + /// Note that each tag sent to the completion queue (through RPC operations + /// or alarms) will be delivered out of the completion queue by a call to + /// Next (or a related method), regardless of whether the operation succeeded + /// or not. Success here means that this operation completed in the normal + /// valid manner. + /// + /// Server-side RPC request: \a ok indicates that the RPC has indeed + /// been started. If it is false, the server has been Shutdown + /// before this particular call got matched to an incoming RPC. + /// + /// Client-side StartCall/RPC invocation: \a ok indicates that the RPC is + /// going to go to the wire. If it is false, it not going to the wire. This + /// would happen if the channel is either permanently broken or + /// transiently broken but with the fail-fast option. (Note that async unary + /// RPCs don't post a CQ tag at this point, nor do client-streaming + /// or bidi-streaming RPCs that have the initial metadata corked option set.) + /// + /// Client-side Write, Client-side WritesDone, Server-side Write, + /// Server-side Finish, Server-side SendInitialMetadata (which is + /// typically included in Write or Finish when not done explicitly): + /// \a ok means that the data/metadata/status/etc is going to go to the + /// wire. If it is false, it not going to the wire because the call + /// is already dead (i.e., canceled, deadline expired, other side + /// dropped the channel, etc). + /// + /// Client-side Read, Server-side Read, Client-side + /// RecvInitialMetadata (which is typically included in Read if not + /// done explicitly): \a ok indicates whether there is a valid message + /// that got read. If not, you know that there are certainly no more + /// messages that can ever be read from this stream. For the client-side + /// operations, this only happens because the call is dead. For the + /// server-sider operation, though, this could happen because the client + /// has done a WritesDone already. + /// + /// Client-side Finish: \a ok should always be true + /// + /// Server-side AsyncNotifyWhenDone: \a ok should always be true + /// + /// Alarm: \a ok is true if it expired, false if it was canceled + /// + /// \return true if got an event, false if the queue is fully drained and + /// shut down. + bool Next(void** tag, bool* ok) { + return (AsyncNextInternal(tag, ok, + ::grpc::g_core_codegen_interface->gpr_inf_future( + GPR_CLOCK_REALTIME)) != SHUTDOWN); + } + + /// Read from the queue, blocking up to \a deadline (or the queue's shutdown). + /// Both \a tag and \a ok are updated upon success (if an event is available + /// within the \a deadline). A \a tag points to an arbitrary location usually + /// employed to uniquely identify an event. + /// + /// \param tag [out] Upon success, updated to point to the event's tag. + /// \param ok [out] Upon success, true if a successful event, false otherwise + /// See documentation for CompletionQueue::Next for explanation of ok + /// \param deadline [in] How long to block in wait for an event. + /// + /// \return The type of event read. + template + NextStatus AsyncNext(void** tag, bool* ok, const T& deadline) { + ::grpc::TimePoint deadline_tp(deadline); + return AsyncNextInternal(tag, ok, deadline_tp.raw_time()); + } + + /// EXPERIMENTAL + /// First executes \a F, then reads from the queue, blocking up to + /// \a deadline (or the queue's shutdown). + /// Both \a tag and \a ok are updated upon success (if an event is available + /// within the \a deadline). A \a tag points to an arbitrary location usually + /// employed to uniquely identify an event. + /// + /// \param f [in] Function to execute before calling AsyncNext on this queue. + /// \param tag [out] Upon success, updated to point to the event's tag. + /// \param ok [out] Upon success, true if read a regular event, false + /// otherwise. + /// \param deadline [in] How long to block in wait for an event. + /// + /// \return The type of event read. + template + NextStatus DoThenAsyncNext(F&& f, void** tag, bool* ok, const T& deadline) { + CompletionQueueTLSCache cache = CompletionQueueTLSCache(this); + f(); + if (cache.Flush(tag, ok)) { + return GOT_EVENT; + } else { + return AsyncNext(tag, ok, deadline); + } + } + + /// Request the shutdown of the queue. + /// + /// \warning This method must be called at some point if this completion queue + /// is accessed with Next or AsyncNext. \a Next will not return false + /// until this method has been called and all pending tags have been drained. + /// (Likewise for \a AsyncNext returning \a NextStatus::SHUTDOWN .) + /// Only once either one of these methods does that (that is, once the queue + /// has been \em drained) can an instance of this class be destroyed. + /// Also note that applications must ensure that no work is enqueued on this + /// completion queue after this method is called. + void Shutdown(); + + /// Returns a \em raw pointer to the underlying \a grpc_completion_queue + /// instance. + /// + /// \warning Remember that the returned instance is owned. No transfer of + /// owership is performed. + grpc_completion_queue* cq() { return cq_; } + + protected: + /// Private constructor of CompletionQueue only visible to friend classes + CompletionQueue(const grpc_completion_queue_attributes& attributes) { + cq_ = ::grpc::g_core_codegen_interface->grpc_completion_queue_create( + ::grpc::g_core_codegen_interface->grpc_completion_queue_factory_lookup( + &attributes), + &attributes, NULL); + InitialAvalanching(); // reserve this for the future shutdown + } + + private: + // Friends for access to server registration lists that enable checking and + // logging on shutdown + friend class ::grpc_impl::ServerBuilder; + friend class ::grpc_impl::Server; + + // Friend synchronous wrappers so that they can access Pluck(), which is + // a semi-private API geared towards the synchronous implementation. + template + friend class ::grpc_impl::ClientReader; + template + friend class ::grpc_impl::ClientWriter; + template + friend class ::grpc_impl::ClientReaderWriter; + template + friend class ::grpc_impl::ServerReader; + template + friend class ::grpc_impl::ServerWriter; + template + friend class ::grpc_impl::internal::ServerReaderWriterBody; + template + friend class ::grpc_impl::internal::RpcMethodHandler; + template + friend class ::grpc_impl::internal::ClientStreamingHandler; + template + friend class ::grpc_impl::internal::ServerStreamingHandler; + template + friend class ::grpc_impl::internal::TemplatedBidiStreamingHandler; + template <::grpc::StatusCode code> + friend class ::grpc_impl::internal::ErrorMethodHandler; + friend class ::grpc_impl::ServerContextBase; + friend class ::grpc::ServerInterface; + template + friend class ::grpc::internal::BlockingUnaryCallImpl; + + // Friends that need access to constructor for callback CQ + friend class ::grpc_impl::Channel; + + // For access to Register/CompleteAvalanching + template + friend class ::grpc::internal::CallOpSet; + + /// EXPERIMENTAL + /// Creates a Thread Local cache to store the first event + /// On this completion queue queued from this thread. Once + /// initialized, it must be flushed on the same thread. + class CompletionQueueTLSCache { + public: + CompletionQueueTLSCache(CompletionQueue* cq); + ~CompletionQueueTLSCache(); + bool Flush(void** tag, bool* ok); + + private: + CompletionQueue* cq_; + bool flushed_; + }; + + NextStatus AsyncNextInternal(void** tag, bool* ok, gpr_timespec deadline); + + /// Wraps \a grpc_completion_queue_pluck. + /// \warning Must not be mixed with calls to \a Next. + bool Pluck(::grpc::internal::CompletionQueueTag* tag) { + auto deadline = + ::grpc::g_core_codegen_interface->gpr_inf_future(GPR_CLOCK_REALTIME); + while (true) { + auto ev = ::grpc::g_core_codegen_interface->grpc_completion_queue_pluck( + cq_, tag, deadline, nullptr); + bool ok = ev.success != 0; + void* ignored = tag; + if (tag->FinalizeResult(&ignored, &ok)) { + GPR_CODEGEN_ASSERT(ignored == tag); + return ok; + } + } + } + + /// Performs a single polling pluck on \a tag. + /// \warning Must not be mixed with calls to \a Next. + /// + /// TODO: sreek - This calls tag->FinalizeResult() even if the cq_ is already + /// shutdown. This is most likely a bug and if it is a bug, then change this + /// implementation to simple call the other TryPluck function with a zero + /// timeout. i.e: + /// TryPluck(tag, gpr_time_0(GPR_CLOCK_REALTIME)) + void TryPluck(::grpc::internal::CompletionQueueTag* tag) { + auto deadline = + ::grpc::g_core_codegen_interface->gpr_time_0(GPR_CLOCK_REALTIME); + auto ev = ::grpc::g_core_codegen_interface->grpc_completion_queue_pluck( + cq_, tag, deadline, nullptr); + if (ev.type == GRPC_QUEUE_TIMEOUT) return; + bool ok = ev.success != 0; + void* ignored = tag; + // the tag must be swallowed if using TryPluck + GPR_CODEGEN_ASSERT(!tag->FinalizeResult(&ignored, &ok)); + } + + /// Performs a single polling pluck on \a tag. Calls tag->FinalizeResult if + /// the pluck() was successful and returned the tag. + /// + /// This exects tag->FinalizeResult (if called) to return 'false' i.e expects + /// that the tag is internal not something that is returned to the user. + void TryPluck(::grpc::internal::CompletionQueueTag* tag, + gpr_timespec deadline) { + auto ev = ::grpc::g_core_codegen_interface->grpc_completion_queue_pluck( + cq_, tag, deadline, nullptr); + if (ev.type == GRPC_QUEUE_TIMEOUT || ev.type == GRPC_QUEUE_SHUTDOWN) { + return; + } + + bool ok = ev.success != 0; + void* ignored = tag; + GPR_CODEGEN_ASSERT(!tag->FinalizeResult(&ignored, &ok)); + } + + /// Manage state of avalanching operations : completion queue tags that + /// trigger other completion queue operations. The underlying core completion + /// queue should not really shutdown until all avalanching operations have + /// been finalized. Note that we maintain the requirement that an avalanche + /// registration must take place before CQ shutdown (which must be maintained + /// elsehwere) + void InitialAvalanching() { + gpr_atm_rel_store(&avalanches_in_flight_, static_cast(1)); + } + void RegisterAvalanching() { + gpr_atm_no_barrier_fetch_add(&avalanches_in_flight_, + static_cast(1)); + } + void CompleteAvalanching() { + if (gpr_atm_no_barrier_fetch_add(&avalanches_in_flight_, + static_cast(-1)) == 1) { + ::grpc::g_core_codegen_interface->grpc_completion_queue_shutdown(cq_); + } + } + + void RegisterServer(const Server* server) { + (void)server; +#ifndef NDEBUG + grpc::internal::MutexLock l(&server_list_mutex_); + server_list_.push_back(server); +#endif + } + void UnregisterServer(const Server* server) { + (void)server; +#ifndef NDEBUG + grpc::internal::MutexLock l(&server_list_mutex_); + server_list_.remove(server); +#endif + } + bool ServerListEmpty() const { +#ifndef NDEBUG + grpc::internal::MutexLock l(&server_list_mutex_); + return server_list_.empty(); +#endif + return true; + } + + grpc_completion_queue* cq_; // owned + + gpr_atm avalanches_in_flight_; + + // List of servers associated with this CQ. Even though this is only used with + // NDEBUG, instantiate it in all cases since otherwise the size will be + // inconsistent. + mutable grpc::internal::Mutex server_list_mutex_; + std::list server_list_ /* GUARDED_BY(server_list_mutex_) */; +}; + +/// A specific type of completion queue used by the processing of notifications +/// by servers. Instantiated by \a ServerBuilder or Server (for health checker). +class ServerCompletionQueue : public CompletionQueue { + public: + bool IsFrequentlyPolled() { return polling_type_ != GRPC_CQ_NON_LISTENING; } + + protected: + /// Default constructor + ServerCompletionQueue() : polling_type_(GRPC_CQ_DEFAULT_POLLING) {} + + private: + /// \param completion_type indicates whether this is a NEXT or CALLBACK + /// completion queue. + /// \param polling_type Informs the GRPC library about the type of polling + /// allowed on this completion queue. See grpc_cq_polling_type's description + /// in grpc_types.h for more details. + /// \param shutdown_cb is the shutdown callback used for CALLBACK api queues + ServerCompletionQueue(grpc_cq_completion_type completion_type, + grpc_cq_polling_type polling_type, + grpc_experimental_completion_queue_functor* shutdown_cb) + : CompletionQueue(grpc_completion_queue_attributes{ + GRPC_CQ_CURRENT_VERSION, completion_type, polling_type, + shutdown_cb}), + polling_type_(polling_type) {} + + grpc_cq_polling_type polling_type_; + friend class ::grpc_impl::ServerBuilder; + friend class ::grpc_impl::Server; +}; + +} // namespace grpc_impl + +#endif // GRPCPP_IMPL_CODEGEN_COMPLETION_QUEUE_IMPL_H diff --git a/include/grpcpp/impl/codegen/completion_queue_tag.h b/include/grpcpp/impl/codegen/completion_queue_tag.h new file mode 100644 index 00000000..304386a9 --- /dev/null +++ b/include/grpcpp/impl/codegen/completion_queue_tag.h @@ -0,0 +1,54 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_COMPLETION_QUEUE_TAG_H +#define GRPCPP_IMPL_CODEGEN_COMPLETION_QUEUE_TAG_H + +namespace grpc { + +namespace internal { +/// An interface allowing implementors to process and filter event tags. +class CompletionQueueTag { + public: + virtual ~CompletionQueueTag() {} + + /// FinalizeResult must be called before informing user code that the + /// operation bound to the underlying core completion queue tag has + /// completed. In practice, this means: + /// + /// 1. For the sync API - before returning from Pluck + /// 2. For the CQ-based async API - before returning from Next + /// 3. For the callback-based API - before invoking the user callback + /// + /// This is the method that translates from core-side tag/status to + /// C++ API-observable tag/status. + /// + /// The return value is the status of the operation (returning status is the + /// general behavior of this function). If this function returns false, the + /// tag is dropped and not returned from the completion queue: this concept is + /// for events that are observed at core but not requested by the user + /// application (e.g., server shutdown, for server unimplemented method + /// responses, or for cases where a server-side RPC doesn't have a completion + /// notification registered using AsyncNotifyWhenDone) + virtual bool FinalizeResult(void** tag, bool* status) = 0; +}; +} // namespace internal + +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_COMPLETION_QUEUE_TAG_H diff --git a/include/grpcpp/impl/codegen/config.h b/include/grpcpp/impl/codegen/config.h new file mode 100644 index 00000000..37f0fd1f --- /dev/null +++ b/include/grpcpp/impl/codegen/config.h @@ -0,0 +1,41 @@ +/* + * + * Copyright 2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_CONFIG_H +#define GRPCPP_IMPL_CODEGEN_CONFIG_H + +#ifndef GRPC_CUSTOM_STRING +#include +#define GRPC_CUSTOM_STRING std::string +#endif + +/// The following macros are deprecated and appear only for users +/// with PB files generated using gRPC 1.0.x plugins. They should +/// not be used in new code +#define GRPC_OVERRIDE override // deprecated +#define GRPC_FINAL final // deprecated + +namespace grpc { + +typedef GRPC_CUSTOM_STRING string; + +using std::to_string; + +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_CONFIG_H diff --git a/include/grpcpp/impl/codegen/config_protobuf.h b/include/grpcpp/impl/codegen/config_protobuf.h new file mode 100644 index 00000000..c4012fb0 --- /dev/null +++ b/include/grpcpp/impl/codegen/config_protobuf.h @@ -0,0 +1,104 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_CONFIG_PROTOBUF_H +#define GRPCPP_IMPL_CODEGEN_CONFIG_PROTOBUF_H + +#define GRPC_OPEN_SOURCE_PROTO + +#ifndef GRPC_CUSTOM_MESSAGE +#ifdef GRPC_USE_PROTO_LITE +#include +#define GRPC_CUSTOM_MESSAGE ::google::protobuf::MessageLite +#define GRPC_CUSTOM_MESSAGELITE ::google::protobuf::MessageLite +#else +#include +#define GRPC_CUSTOM_MESSAGE ::google::protobuf::Message +#define GRPC_CUSTOM_MESSAGELITE ::google::protobuf::MessageLite +#endif +#endif + +#ifndef GRPC_CUSTOM_DESCRIPTOR +#include +#include +#define GRPC_CUSTOM_DESCRIPTOR ::google::protobuf::Descriptor +#define GRPC_CUSTOM_DESCRIPTORPOOL ::google::protobuf::DescriptorPool +#define GRPC_CUSTOM_FIELDDESCRIPTOR ::google::protobuf::FieldDescriptor +#define GRPC_CUSTOM_FILEDESCRIPTOR ::google::protobuf::FileDescriptor +#define GRPC_CUSTOM_FILEDESCRIPTORPROTO ::google::protobuf::FileDescriptorProto +#define GRPC_CUSTOM_METHODDESCRIPTOR ::google::protobuf::MethodDescriptor +#define GRPC_CUSTOM_SERVICEDESCRIPTOR ::google::protobuf::ServiceDescriptor +#define GRPC_CUSTOM_SOURCELOCATION ::google::protobuf::SourceLocation +#endif + +#ifndef GRPC_CUSTOM_DESCRIPTORDATABASE +#include +#define GRPC_CUSTOM_DESCRIPTORDATABASE ::google::protobuf::DescriptorDatabase +#define GRPC_CUSTOM_SIMPLEDESCRIPTORDATABASE \ + ::google::protobuf::SimpleDescriptorDatabase +#endif + +#ifndef GRPC_CUSTOM_ZEROCOPYOUTPUTSTREAM +#include +#include +#define GRPC_CUSTOM_ZEROCOPYOUTPUTSTREAM \ + ::google::protobuf::io::ZeroCopyOutputStream +#define GRPC_CUSTOM_ZEROCOPYINPUTSTREAM \ + ::google::protobuf::io::ZeroCopyInputStream +#define GRPC_CUSTOM_CODEDINPUTSTREAM ::google::protobuf::io::CodedInputStream +#endif + +#ifndef GRPC_CUSTOM_JSONUTIL +#include +#define GRPC_CUSTOM_JSONUTIL ::google::protobuf::util +#define GRPC_CUSTOM_UTIL_STATUS ::google::protobuf::util::Status +#endif + +namespace grpc { +namespace protobuf { + +typedef GRPC_CUSTOM_MESSAGE Message; +typedef GRPC_CUSTOM_MESSAGELITE MessageLite; + +typedef GRPC_CUSTOM_DESCRIPTOR Descriptor; +typedef GRPC_CUSTOM_DESCRIPTORPOOL DescriptorPool; +typedef GRPC_CUSTOM_DESCRIPTORDATABASE DescriptorDatabase; +typedef GRPC_CUSTOM_FIELDDESCRIPTOR FieldDescriptor; +typedef GRPC_CUSTOM_FILEDESCRIPTOR FileDescriptor; +typedef GRPC_CUSTOM_FILEDESCRIPTORPROTO FileDescriptorProto; +typedef GRPC_CUSTOM_METHODDESCRIPTOR MethodDescriptor; +typedef GRPC_CUSTOM_SERVICEDESCRIPTOR ServiceDescriptor; +typedef GRPC_CUSTOM_SIMPLEDESCRIPTORDATABASE SimpleDescriptorDatabase; +typedef GRPC_CUSTOM_SOURCELOCATION SourceLocation; + +namespace util { +typedef GRPC_CUSTOM_UTIL_STATUS Status; +} // namespace util + +namespace json = GRPC_CUSTOM_JSONUTIL; + +namespace io { +typedef GRPC_CUSTOM_ZEROCOPYOUTPUTSTREAM ZeroCopyOutputStream; +typedef GRPC_CUSTOM_ZEROCOPYINPUTSTREAM ZeroCopyInputStream; +typedef GRPC_CUSTOM_CODEDINPUTSTREAM CodedInputStream; +} // namespace io + +} // namespace protobuf +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_CONFIG_PROTOBUF_H diff --git a/include/grpcpp/impl/codegen/core_codegen.h b/include/grpcpp/impl/codegen/core_codegen.h new file mode 100644 index 00000000..50c8da4f --- /dev/null +++ b/include/grpcpp/impl/codegen/core_codegen.h @@ -0,0 +1,127 @@ +/* + * + * Copyright 2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_CORE_CODEGEN_H +#define GRPCPP_IMPL_CODEGEN_CORE_CODEGEN_H + +// This file should be compiled as part of grpcpp. + +#include +#include +#include +#include + +namespace grpc { + +/// Implementation of the core codegen interface. +class CoreCodegen final : public CoreCodegenInterface { + private: + virtual const grpc_completion_queue_factory* + grpc_completion_queue_factory_lookup( + const grpc_completion_queue_attributes* attributes) override; + virtual grpc_completion_queue* grpc_completion_queue_create( + const grpc_completion_queue_factory* factory, + const grpc_completion_queue_attributes* attributes, + void* reserved) override; + grpc_completion_queue* grpc_completion_queue_create_for_next( + void* reserved) override; + grpc_completion_queue* grpc_completion_queue_create_for_pluck( + void* reserved) override; + void grpc_completion_queue_shutdown(grpc_completion_queue* cq) override; + void grpc_completion_queue_destroy(grpc_completion_queue* cq) override; + grpc_event grpc_completion_queue_pluck(grpc_completion_queue* cq, void* tag, + gpr_timespec deadline, + void* reserved) override; + + void* gpr_malloc(size_t size) override; + void gpr_free(void* p) override; + + void grpc_init() override; + void grpc_shutdown() override; + + void gpr_mu_init(gpr_mu* mu) override; + void gpr_mu_destroy(gpr_mu* mu) override; + void gpr_mu_lock(gpr_mu* mu) override; + void gpr_mu_unlock(gpr_mu* mu) override; + void gpr_cv_init(gpr_cv* cv) override; + void gpr_cv_destroy(gpr_cv* cv) override; + int gpr_cv_wait(gpr_cv* cv, gpr_mu* mu, gpr_timespec abs_deadline) override; + void gpr_cv_signal(gpr_cv* cv) override; + void gpr_cv_broadcast(gpr_cv* cv) override; + + grpc_call_error grpc_call_start_batch(grpc_call* call, const grpc_op* ops, + size_t nops, void* tag, + void* reserved) override; + grpc_call_error grpc_call_cancel_with_status(grpc_call* call, + grpc_status_code status, + const char* description, + void* reserved) override; + void grpc_call_ref(grpc_call* call) override; + void grpc_call_unref(grpc_call* call) override; + void* grpc_call_arena_alloc(grpc_call* call, size_t length) override; + const char* grpc_call_error_to_string(grpc_call_error error) override; + + grpc_byte_buffer* grpc_byte_buffer_copy(grpc_byte_buffer* bb) override; + void grpc_byte_buffer_destroy(grpc_byte_buffer* bb) override; + size_t grpc_byte_buffer_length(grpc_byte_buffer* bb) override; + + int grpc_byte_buffer_reader_init(grpc_byte_buffer_reader* reader, + grpc_byte_buffer* buffer) override; + void grpc_byte_buffer_reader_destroy( + grpc_byte_buffer_reader* reader) override; + int grpc_byte_buffer_reader_next(grpc_byte_buffer_reader* reader, + grpc_slice* slice) override; + int grpc_byte_buffer_reader_peek(grpc_byte_buffer_reader* reader, + grpc_slice** slice) override; + + grpc_byte_buffer* grpc_raw_byte_buffer_create(grpc_slice* slice, + size_t nslices) override; + grpc_slice grpc_slice_new_with_user_data(void* p, size_t len, + void (*destroy)(void*), + void* user_data) override; + grpc_slice grpc_slice_new_with_len(void* p, size_t len, + void (*destroy)(void*, size_t)) override; + grpc_slice grpc_empty_slice() override; + grpc_slice grpc_slice_malloc(size_t length) override; + void grpc_slice_unref(grpc_slice slice) override; + grpc_slice grpc_slice_ref(grpc_slice slice) override; + grpc_slice grpc_slice_split_tail(grpc_slice* s, size_t split) override; + grpc_slice grpc_slice_split_head(grpc_slice* s, size_t split) override; + grpc_slice grpc_slice_sub(grpc_slice s, size_t begin, size_t end) override; + void grpc_slice_buffer_add(grpc_slice_buffer* sb, grpc_slice slice) override; + void grpc_slice_buffer_pop(grpc_slice_buffer* sb) override; + grpc_slice grpc_slice_from_static_buffer(const void* buffer, + size_t length) override; + grpc_slice grpc_slice_from_copied_buffer(const void* buffer, + size_t length) override; + void grpc_metadata_array_init(grpc_metadata_array* array) override; + void grpc_metadata_array_destroy(grpc_metadata_array* array) override; + + gpr_timespec gpr_inf_future(gpr_clock_type type) override; + gpr_timespec gpr_time_0(gpr_clock_type type) override; + + virtual const Status& ok() override; + virtual const Status& cancelled() override; + + void assert_fail(const char* failed_assertion, const char* file, + int line) override; +}; + +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_CORE_CODEGEN_H diff --git a/include/grpcpp/impl/codegen/core_codegen_interface.h b/include/grpcpp/impl/codegen/core_codegen_interface.h new file mode 100644 index 00000000..c08cf6c6 --- /dev/null +++ b/include/grpcpp/impl/codegen/core_codegen_interface.h @@ -0,0 +1,164 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_CORE_CODEGEN_INTERFACE_H +#define GRPCPP_IMPL_CODEGEN_CORE_CODEGEN_INTERFACE_H + +#include +#include +#include +#include +#include +#include + +namespace grpc { + +/// Interface between the codegen library and the minimal subset of core +/// features required by the generated code. +/// +/// All undocumented methods are simply forwarding the call to their namesakes. +/// Please refer to their corresponding documentation for details. +/// +/// \warning This interface should be considered internal and private. +class CoreCodegenInterface { + public: + virtual ~CoreCodegenInterface() = default; + + /// Upon a failed assertion, log the error. + virtual void assert_fail(const char* failed_assertion, const char* file, + int line) = 0; + + virtual const grpc_completion_queue_factory* + grpc_completion_queue_factory_lookup( + const grpc_completion_queue_attributes* attributes) = 0; + virtual grpc_completion_queue* grpc_completion_queue_create( + const grpc_completion_queue_factory* factory, + const grpc_completion_queue_attributes* attributes, void* reserved) = 0; + virtual grpc_completion_queue* grpc_completion_queue_create_for_next( + void* reserved) = 0; + virtual grpc_completion_queue* grpc_completion_queue_create_for_pluck( + void* reserved) = 0; + virtual void grpc_completion_queue_shutdown(grpc_completion_queue* cq) = 0; + virtual void grpc_completion_queue_destroy(grpc_completion_queue* cq) = 0; + virtual grpc_event grpc_completion_queue_pluck(grpc_completion_queue* cq, + void* tag, + gpr_timespec deadline, + void* reserved) = 0; + + virtual void* gpr_malloc(size_t size) = 0; + virtual void gpr_free(void* p) = 0; + + // These are only to be used to fix edge cases involving grpc_init and + // grpc_shutdown. Calling grpc_init from the codegen interface before + // the real grpc_init is called will cause a crash, so if you use this + // function, ensure that it is not the first call to grpc_init. + virtual void grpc_init() = 0; + virtual void grpc_shutdown() = 0; + + virtual void gpr_mu_init(gpr_mu* mu) = 0; + virtual void gpr_mu_destroy(gpr_mu* mu) = 0; + virtual void gpr_mu_lock(gpr_mu* mu) = 0; + virtual void gpr_mu_unlock(gpr_mu* mu) = 0; + virtual void gpr_cv_init(gpr_cv* cv) = 0; + virtual void gpr_cv_destroy(gpr_cv* cv) = 0; + virtual int gpr_cv_wait(gpr_cv* cv, gpr_mu* mu, + gpr_timespec abs_deadline) = 0; + virtual void gpr_cv_signal(gpr_cv* cv) = 0; + virtual void gpr_cv_broadcast(gpr_cv* cv) = 0; + + virtual grpc_byte_buffer* grpc_byte_buffer_copy(grpc_byte_buffer* bb) = 0; + virtual void grpc_byte_buffer_destroy(grpc_byte_buffer* bb) = 0; + virtual size_t grpc_byte_buffer_length(grpc_byte_buffer* bb) + GRPC_MUST_USE_RESULT = 0; + + virtual int grpc_byte_buffer_reader_init(grpc_byte_buffer_reader* reader, + grpc_byte_buffer* buffer) + GRPC_MUST_USE_RESULT = 0; + virtual void grpc_byte_buffer_reader_destroy( + grpc_byte_buffer_reader* reader) = 0; + virtual int grpc_byte_buffer_reader_next(grpc_byte_buffer_reader* reader, + grpc_slice* slice) = 0; + virtual int grpc_byte_buffer_reader_peek(grpc_byte_buffer_reader* reader, + grpc_slice** slice) = 0; + + virtual grpc_byte_buffer* grpc_raw_byte_buffer_create(grpc_slice* slice, + size_t nslices) = 0; + virtual grpc_slice grpc_slice_new_with_user_data(void* p, size_t len, + void (*destroy)(void*), + void* user_data) = 0; + virtual grpc_slice grpc_slice_new_with_len(void* p, size_t len, + void (*destroy)(void*, + size_t)) = 0; + virtual grpc_call_error grpc_call_start_batch(grpc_call* call, + const grpc_op* ops, size_t nops, + void* tag, void* reserved) = 0; + virtual grpc_call_error grpc_call_cancel_with_status(grpc_call* call, + grpc_status_code status, + const char* description, + void* reserved) = 0; + virtual void grpc_call_ref(grpc_call* call) = 0; + virtual void grpc_call_unref(grpc_call* call) = 0; + virtual void* grpc_call_arena_alloc(grpc_call* call, size_t length) = 0; + virtual const char* grpc_call_error_to_string(grpc_call_error error) = 0; + virtual grpc_slice grpc_empty_slice() = 0; + virtual grpc_slice grpc_slice_malloc(size_t length) = 0; + virtual void grpc_slice_unref(grpc_slice slice) = 0; + virtual grpc_slice grpc_slice_ref(grpc_slice slice) = 0; + virtual grpc_slice grpc_slice_split_tail(grpc_slice* s, size_t split) = 0; + virtual grpc_slice grpc_slice_split_head(grpc_slice* s, size_t split) = 0; + virtual grpc_slice grpc_slice_sub(grpc_slice s, size_t begin, size_t end) = 0; + virtual void grpc_slice_buffer_add(grpc_slice_buffer* sb, + grpc_slice slice) = 0; + virtual void grpc_slice_buffer_pop(grpc_slice_buffer* sb) = 0; + virtual grpc_slice grpc_slice_from_static_buffer(const void* buffer, + size_t length) = 0; + virtual grpc_slice grpc_slice_from_copied_buffer(const void* buffer, + size_t length) = 0; + + virtual void grpc_metadata_array_init(grpc_metadata_array* array) = 0; + virtual void grpc_metadata_array_destroy(grpc_metadata_array* array) = 0; + + virtual const Status& ok() = 0; + virtual const Status& cancelled() = 0; + + virtual gpr_timespec gpr_inf_future(gpr_clock_type type) = 0; + virtual gpr_timespec gpr_time_0(gpr_clock_type type) = 0; +}; + +extern CoreCodegenInterface* g_core_codegen_interface; + +/// Codegen specific version of \a GPR_ASSERT. +#define GPR_CODEGEN_ASSERT(x) \ + do { \ + if (GPR_UNLIKELY(!(x))) { \ + grpc::g_core_codegen_interface->assert_fail(#x, __FILE__, __LINE__); \ + } \ + } while (0) + +/// Codegen specific version of \a GPR_DEBUG_ASSERT. +#ifndef NDEBUG +#define GPR_CODEGEN_DEBUG_ASSERT(x) GPR_CODEGEN_ASSERT(x) +#else +#define GPR_CODEGEN_DEBUG_ASSERT(x) \ + do { \ + } while (0) +#endif + +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_CORE_CODEGEN_INTERFACE_H diff --git a/include/grpcpp/impl/codegen/create_auth_context.h b/include/grpcpp/impl/codegen/create_auth_context.h new file mode 100644 index 00000000..cb6095c3 --- /dev/null +++ b/include/grpcpp/impl/codegen/create_auth_context.h @@ -0,0 +1,33 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_CREATE_AUTH_CONTEXT_H +#define GRPCPP_IMPL_CODEGEN_CREATE_AUTH_CONTEXT_H + +#include + +#include +#include + +namespace grpc { + +std::shared_ptr CreateAuthContext(grpc_call* call); + +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_CREATE_AUTH_CONTEXT_H diff --git a/include/grpcpp/impl/codegen/delegating_channel.h b/include/grpcpp/impl/codegen/delegating_channel.h new file mode 100644 index 00000000..a1862223 --- /dev/null +++ b/include/grpcpp/impl/codegen/delegating_channel.h @@ -0,0 +1,87 @@ +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_DELEGATING_CHANNEL_H +#define GRPCPP_IMPL_CODEGEN_DELEGATING_CHANNEL_H + +namespace grpc { +namespace experimental { + +class DelegatingChannel : public ::grpc::ChannelInterface { + public: + virtual ~DelegatingChannel() {} + + DelegatingChannel(std::shared_ptr<::grpc::ChannelInterface> delegate_channel) + : delegate_channel_(delegate_channel) {} + + grpc_connectivity_state GetState(bool try_to_connect) override { + return delegate_channel()->GetState(try_to_connect); + } + + std::shared_ptr<::grpc::ChannelInterface> delegate_channel() { + return delegate_channel_; + } + + private: + internal::Call CreateCall(const internal::RpcMethod& method, + ClientContext* context, + ::grpc_impl::CompletionQueue* cq) final { + return delegate_channel()->CreateCall(method, context, cq); + } + + void PerformOpsOnCall(internal::CallOpSetInterface* ops, + internal::Call* call) final { + delegate_channel()->PerformOpsOnCall(ops, call); + } + + void* RegisterMethod(const char* method) final { + return delegate_channel()->RegisterMethod(method); + } + + void NotifyOnStateChangeImpl(grpc_connectivity_state last_observed, + gpr_timespec deadline, + ::grpc_impl::CompletionQueue* cq, + void* tag) override { + delegate_channel()->NotifyOnStateChangeImpl(last_observed, deadline, cq, + tag); + } + + bool WaitForStateChangeImpl(grpc_connectivity_state last_observed, + gpr_timespec deadline) override { + return delegate_channel()->WaitForStateChangeImpl(last_observed, deadline); + } + + internal::Call CreateCallInternal(const internal::RpcMethod& method, + ClientContext* context, + ::grpc_impl::CompletionQueue* cq, + size_t interceptor_pos) final { + return delegate_channel()->CreateCallInternal(method, context, cq, + interceptor_pos); + } + + ::grpc_impl::CompletionQueue* CallbackCQ() final { + return delegate_channel()->CallbackCQ(); + } + + std::shared_ptr<::grpc::ChannelInterface> delegate_channel_; +}; + +} // namespace experimental +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_DELEGATING_CHANNEL_H diff --git a/include/grpcpp/impl/codegen/grpc_library.h b/include/grpcpp/impl/codegen/grpc_library.h new file mode 100644 index 00000000..17c904d7 --- /dev/null +++ b/include/grpcpp/impl/codegen/grpc_library.h @@ -0,0 +1,64 @@ +/* + * + * Copyright 2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_GRPC_LIBRARY_H +#define GRPCPP_IMPL_CODEGEN_GRPC_LIBRARY_H + +#include + +namespace grpc { + +class GrpcLibraryInterface { + public: + virtual ~GrpcLibraryInterface() = default; + virtual void init() = 0; + virtual void shutdown() = 0; +}; + +/// Initialized by \a grpc::GrpcLibraryInitializer from +/// +extern GrpcLibraryInterface* g_glip; + +/// Classes that require gRPC to be initialized should inherit from this class. +class GrpcLibraryCodegen { + public: + GrpcLibraryCodegen(bool call_grpc_init = true) : grpc_init_called_(false) { + if (call_grpc_init) { + GPR_CODEGEN_ASSERT(g_glip && + "gRPC library not initialized. See " + "grpc::internal::GrpcLibraryInitializer."); + g_glip->init(); + grpc_init_called_ = true; + } + } + virtual ~GrpcLibraryCodegen() { + if (grpc_init_called_) { + GPR_CODEGEN_ASSERT(g_glip && + "gRPC library not initialized. See " + "grpc::internal::GrpcLibraryInitializer."); + g_glip->shutdown(); + } + } + + private: + bool grpc_init_called_; +}; + +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_GRPC_LIBRARY_H diff --git a/include/grpcpp/impl/codegen/intercepted_channel.h b/include/grpcpp/impl/codegen/intercepted_channel.h new file mode 100644 index 00000000..bcdd89db --- /dev/null +++ b/include/grpcpp/impl/codegen/intercepted_channel.h @@ -0,0 +1,87 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_INTERCEPTED_CHANNEL_H +#define GRPCPP_IMPL_CODEGEN_INTERCEPTED_CHANNEL_H + +#include + +namespace grpc_impl { +class CompletionQueue; +} + +namespace grpc { + +namespace internal { + +class InterceptorBatchMethodsImpl; + +/// An InterceptedChannel is available to client Interceptors. An +/// InterceptedChannel is unique to an interceptor, and when an RPC is started +/// on this channel, only those interceptors that come after this interceptor +/// see the RPC. +class InterceptedChannel : public ChannelInterface { + public: + virtual ~InterceptedChannel() { channel_ = nullptr; } + + /// Get the current channel state. If the channel is in IDLE and + /// \a try_to_connect is set to true, try to connect. + grpc_connectivity_state GetState(bool try_to_connect) override { + return channel_->GetState(try_to_connect); + } + + private: + InterceptedChannel(ChannelInterface* channel, size_t pos) + : channel_(channel), interceptor_pos_(pos) {} + + Call CreateCall(const RpcMethod& method, ::grpc_impl::ClientContext* context, + ::grpc_impl::CompletionQueue* cq) override { + return channel_->CreateCallInternal(method, context, cq, interceptor_pos_); + } + + void PerformOpsOnCall(CallOpSetInterface* ops, Call* call) override { + return channel_->PerformOpsOnCall(ops, call); + } + void* RegisterMethod(const char* method) override { + return channel_->RegisterMethod(method); + } + + void NotifyOnStateChangeImpl(grpc_connectivity_state last_observed, + gpr_timespec deadline, + ::grpc_impl::CompletionQueue* cq, + void* tag) override { + return channel_->NotifyOnStateChangeImpl(last_observed, deadline, cq, tag); + } + bool WaitForStateChangeImpl(grpc_connectivity_state last_observed, + gpr_timespec deadline) override { + return channel_->WaitForStateChangeImpl(last_observed, deadline); + } + + ::grpc_impl::CompletionQueue* CallbackCQ() override { + return channel_->CallbackCQ(); + } + + ChannelInterface* channel_; + size_t interceptor_pos_; + + friend class InterceptorBatchMethodsImpl; +}; +} // namespace internal +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_INTERCEPTED_CHANNEL_H diff --git a/include/grpcpp/impl/codegen/interceptor.h b/include/grpcpp/impl/codegen/interceptor.h new file mode 100644 index 00000000..71c32d70 --- /dev/null +++ b/include/grpcpp/impl/codegen/interceptor.h @@ -0,0 +1,229 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_INTERCEPTOR_H +#define GRPCPP_IMPL_CODEGEN_INTERCEPTOR_H + +#include + +#include +#include +#include +#include +#include + +namespace grpc { + +class ChannelInterface; +class Status; + +namespace experimental { + +/// An enumeration of different possible points at which the \a Intercept +/// method of the \a Interceptor interface may be called. Any given call +/// to \a Intercept will include one or more of these hook points, and +/// each hook point makes certain types of information available to the +/// interceptor. +/// In these enumeration names, PRE_SEND means that an interception has taken +/// place between the time the application provided a certain type of data +/// (e.g., initial metadata, status) and the time that that data goes to the +/// other side. POST_SEND means that the data has been committed for going to +/// the other side (even if it has not yet been received at the other side). +/// PRE_RECV means an interception between the time that a certain +/// operation has been requested and it is available. POST_RECV means that a +/// result is available but has not yet been passed back to the application. +/// A batch of interception points will only contain either PRE or POST hooks +/// but not both types. For example, a batch with PRE_SEND hook points will not +/// contain POST_RECV or POST_SEND ops. Likewise, a batch with POST_* ops can +/// not contain PRE_* ops. +enum class InterceptionHookPoints { + /// The first three in this list are for clients and servers + PRE_SEND_INITIAL_METADATA, + PRE_SEND_MESSAGE, + POST_SEND_MESSAGE, + PRE_SEND_STATUS, // server only + PRE_SEND_CLOSE, // client only: WritesDone for stream; after write in unary + /// The following three are for hijacked clients only. A batch with PRE_RECV_* + /// hook points will never contain hook points of other types. + PRE_RECV_INITIAL_METADATA, + PRE_RECV_MESSAGE, + PRE_RECV_STATUS, + /// The following two are for all clients and servers + POST_RECV_INITIAL_METADATA, + POST_RECV_MESSAGE, + POST_RECV_STATUS, // client only + POST_RECV_CLOSE, // server only + /// This is a special hook point available to both clients and servers when + /// TryCancel() is performed. + /// - No other hook points will be present along with this. + /// - It is illegal for an interceptor to block/delay this operation. + /// - ALL interceptors see this hook point irrespective of whether the + /// RPC was hijacked or not. + PRE_SEND_CANCEL, + NUM_INTERCEPTION_HOOKS +}; + +/// Class that is passed as an argument to the \a Intercept method +/// of the application's \a Interceptor interface implementation. It has five +/// purposes: +/// 1. Indicate which hook points are present at a specific interception +/// 2. Allow an interceptor to inform the library that an RPC should +/// continue to the next stage of its processing (which may be another +/// interceptor or the main path of the library) +/// 3. Allow an interceptor to hijack the processing of the RPC (only for +/// client-side RPCs with PRE_SEND_INITIAL_METADATA) so that it does not +/// proceed with normal processing beyond that stage +/// 4. Access the relevant fields of an RPC at each interception point +/// 5. Set some fields of an RPC at each interception point, when possible +class InterceptorBatchMethods { + public: + virtual ~InterceptorBatchMethods() {} + /// Determine whether the current batch has an interception hook point + /// of type \a type + virtual bool QueryInterceptionHookPoint(InterceptionHookPoints type) = 0; + /// Signal that the interceptor is done intercepting the current batch of the + /// RPC. Every interceptor must either call Proceed or Hijack on each + /// interception. In most cases, only Proceed will be used. Explicit use of + /// Proceed is what enables interceptors to delay the processing of RPCs + /// while they perform other work. + /// Proceed is a no-op if the batch contains PRE_SEND_CANCEL. Simply returning + /// from the Intercept method does the job of continuing the RPC in this case. + /// This is because PRE_SEND_CANCEL is always in a separate batch and is not + /// allowed to be delayed. + virtual void Proceed() = 0; + /// Indicate that the interceptor has hijacked the RPC (only valid if the + /// batch contains send_initial_metadata on the client side). Later + /// interceptors in the interceptor list will not be called. Later batches + /// on the same RPC will go through interception, but only up to the point + /// of the hijacking interceptor. + virtual void Hijack() = 0; + + /// Send Message Methods + /// GetSerializedSendMessage and GetSendMessage/ModifySendMessage are the + /// available methods to view and modify the request payload. An interceptor + /// can access the payload in either serialized form or non-serialized form + /// but not both at the same time. + /// gRPC performs serialization in a lazy manner, which means + /// that a call to GetSerializedSendMessage will result in a serialization + /// operation if the payload stored is not in the serialized form already; the + /// non-serialized form will be lost and GetSendMessage will no longer return + /// a valid pointer, and this will remain true for later interceptors too. + /// This can change however if ModifySendMessage is used to replace the + /// current payload. Note that ModifySendMessage requires a new payload + /// message in the non-serialized form. This will overwrite the existing + /// payload irrespective of whether it had been serialized earlier. Also note + /// that gRPC Async API requires early serialization of the payload which + /// means that the payload would be available in the serialized form only + /// unless an interceptor replaces the payload with ModifySendMessage. + + /// Returns a modifable ByteBuffer holding the serialized form of the message + /// that is going to be sent. Valid for PRE_SEND_MESSAGE interceptions. + /// A return value of nullptr indicates that this ByteBuffer is not valid. + virtual ByteBuffer* GetSerializedSendMessage() = 0; + + /// Returns a non-modifiable pointer to the non-serialized form of the message + /// to be sent. Valid for PRE_SEND_MESSAGE interceptions. A return value of + /// nullptr indicates that this field is not valid. + virtual const void* GetSendMessage() = 0; + + /// Overwrites the message to be sent with \a message. \a message should be in + /// the non-serialized form expected by the method. Valid for PRE_SEND_MESSAGE + /// interceptions. Note that the interceptor is responsible for maintaining + /// the life of the message till it is serialized or it receives the + /// POST_SEND_MESSAGE interception point, whichever happens earlier. The + /// modifying interceptor may itself force early serialization by calling + /// GetSerializedSendMessage. + virtual void ModifySendMessage(const void* message) = 0; + + /// Checks whether the SEND MESSAGE op succeeded. Valid for POST_SEND_MESSAGE + /// interceptions. + virtual bool GetSendMessageStatus() = 0; + + /// Returns a modifiable multimap of the initial metadata to be sent. Valid + /// for PRE_SEND_INITIAL_METADATA interceptions. A value of nullptr indicates + /// that this field is not valid. + virtual std::multimap* + GetSendInitialMetadata() = 0; + + /// Returns the status to be sent. Valid for PRE_SEND_STATUS interceptions. + virtual Status GetSendStatus() = 0; + + /// Overwrites the status with \a status. Valid for PRE_SEND_STATUS + /// interceptions. + virtual void ModifySendStatus(const Status& status) = 0; + + /// Returns a modifiable multimap of the trailing metadata to be sent. Valid + /// for PRE_SEND_STATUS interceptions. A value of nullptr indicates + /// that this field is not valid. + virtual std::multimap* + GetSendTrailingMetadata() = 0; + + /// Returns a pointer to the modifiable received message. Note that the + /// message is already deserialized but the type is not set; the interceptor + /// should static_cast to the appropriate type before using it. This is valid + /// for PRE_RECV_MESSAGE and POST_RECV_MESSAGE interceptions; nullptr for not + /// valid + virtual void* GetRecvMessage() = 0; + + /// Returns a modifiable multimap of the received initial metadata. + /// Valid for PRE_RECV_INITIAL_METADATA and POST_RECV_INITIAL_METADATA + /// interceptions; nullptr if not valid + virtual std::multimap* + GetRecvInitialMetadata() = 0; + + /// Returns a modifiable view of the received status on PRE_RECV_STATUS and + /// POST_RECV_STATUS interceptions; nullptr if not valid. + virtual Status* GetRecvStatus() = 0; + + /// Returns a modifiable multimap of the received trailing metadata on + /// PRE_RECV_STATUS and POST_RECV_STATUS interceptions; nullptr if not valid + virtual std::multimap* + GetRecvTrailingMetadata() = 0; + + /// Gets an intercepted channel. When a call is started on this interceptor, + /// only interceptors after the current interceptor are created from the + /// factory objects registered with the channel. This allows calls to be + /// started from interceptors without infinite regress through the interceptor + /// list. + virtual std::unique_ptr GetInterceptedChannel() = 0; + + /// On a hijacked RPC, an interceptor can decide to fail a PRE_RECV_MESSAGE + /// op. This would be a signal to the reader that there will be no more + /// messages, or the stream has failed or been cancelled. + virtual void FailHijackedRecvMessage() = 0; + + /// On a hijacked RPC/ to-be hijacked RPC, this can be called to fail a SEND + /// MESSAGE op + virtual void FailHijackedSendMessage() = 0; +}; + +/// Interface for an interceptor. Interceptor authors must create a class +/// that derives from this parent class. +class Interceptor { + public: + virtual ~Interceptor() {} + + /// The one public method of an Interceptor interface. Override this to + /// trigger the desired actions at the hook points described above. + virtual void Intercept(InterceptorBatchMethods* methods) = 0; +}; + +} // namespace experimental +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_INTERCEPTOR_H diff --git a/include/grpcpp/impl/codegen/interceptor_common.h b/include/grpcpp/impl/codegen/interceptor_common.h new file mode 100644 index 00000000..c87c8034 --- /dev/null +++ b/include/grpcpp/impl/codegen/interceptor_common.h @@ -0,0 +1,556 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_INTERCEPTOR_COMMON_H +#define GRPCPP_IMPL_CODEGEN_INTERCEPTOR_COMMON_H + +#include +#include + +#include +#include +#include +#include +#include + +#include + +namespace grpc { +namespace internal { + +class InterceptorBatchMethodsImpl + : public experimental::InterceptorBatchMethods { + public: + InterceptorBatchMethodsImpl() { + for (auto i = static_cast(0); + i < experimental::InterceptionHookPoints::NUM_INTERCEPTION_HOOKS; + i = static_cast( + static_cast(i) + 1)) { + hooks_[static_cast(i)] = false; + } + } + + ~InterceptorBatchMethodsImpl() {} + + bool QueryInterceptionHookPoint( + experimental::InterceptionHookPoints type) override { + return hooks_[static_cast(type)]; + } + + void Proceed() override { + if (call_->client_rpc_info() != nullptr) { + return ProceedClient(); + } + GPR_CODEGEN_ASSERT(call_->server_rpc_info() != nullptr); + ProceedServer(); + } + + void Hijack() override { + // Only the client can hijack when sending down initial metadata + GPR_CODEGEN_ASSERT(!reverse_ && ops_ != nullptr && + call_->client_rpc_info() != nullptr); + // It is illegal to call Hijack twice + GPR_CODEGEN_ASSERT(!ran_hijacking_interceptor_); + auto* rpc_info = call_->client_rpc_info(); + rpc_info->hijacked_ = true; + rpc_info->hijacked_interceptor_ = current_interceptor_index_; + ClearHookPoints(); + ops_->SetHijackingState(); + ran_hijacking_interceptor_ = true; + rpc_info->RunInterceptor(this, current_interceptor_index_); + } + + void AddInterceptionHookPoint(experimental::InterceptionHookPoints type) { + hooks_[static_cast(type)] = true; + } + + ByteBuffer* GetSerializedSendMessage() override { + GPR_CODEGEN_ASSERT(orig_send_message_ != nullptr); + if (*orig_send_message_ != nullptr) { + GPR_CODEGEN_ASSERT(serializer_(*orig_send_message_).ok()); + *orig_send_message_ = nullptr; + } + return send_message_; + } + + const void* GetSendMessage() override { + GPR_CODEGEN_ASSERT(orig_send_message_ != nullptr); + return *orig_send_message_; + } + + void ModifySendMessage(const void* message) override { + GPR_CODEGEN_ASSERT(orig_send_message_ != nullptr); + *orig_send_message_ = message; + } + + bool GetSendMessageStatus() override { return !*fail_send_message_; } + + std::multimap* GetSendInitialMetadata() override { + return send_initial_metadata_; + } + + Status GetSendStatus() override { + return Status(static_cast(*code_), *error_message_, + *error_details_); + } + + void ModifySendStatus(const Status& status) override { + *code_ = static_cast(status.error_code()); + *error_details_ = status.error_details(); + *error_message_ = status.error_message(); + } + + std::multimap* GetSendTrailingMetadata() + override { + return send_trailing_metadata_; + } + + void* GetRecvMessage() override { return recv_message_; } + + std::multimap* GetRecvInitialMetadata() + override { + return recv_initial_metadata_->map(); + } + + Status* GetRecvStatus() override { return recv_status_; } + + void FailHijackedSendMessage() override { + GPR_CODEGEN_ASSERT(hooks_[static_cast( + experimental::InterceptionHookPoints::PRE_SEND_MESSAGE)]); + *fail_send_message_ = true; + } + + std::multimap* GetRecvTrailingMetadata() + override { + return recv_trailing_metadata_->map(); + } + + void SetSendMessage(ByteBuffer* buf, const void** msg, + bool* fail_send_message, + std::function serializer) { + send_message_ = buf; + orig_send_message_ = msg; + fail_send_message_ = fail_send_message; + serializer_ = serializer; + } + + void SetSendInitialMetadata( + std::multimap* metadata) { + send_initial_metadata_ = metadata; + } + + void SetSendStatus(grpc_status_code* code, grpc::string* error_details, + grpc::string* error_message) { + code_ = code; + error_details_ = error_details; + error_message_ = error_message; + } + + void SetSendTrailingMetadata( + std::multimap* metadata) { + send_trailing_metadata_ = metadata; + } + + void SetRecvMessage(void* message, bool* hijacked_recv_message_failed) { + recv_message_ = message; + hijacked_recv_message_failed_ = hijacked_recv_message_failed; + } + + void SetRecvInitialMetadata(MetadataMap* map) { + recv_initial_metadata_ = map; + } + + void SetRecvStatus(Status* status) { recv_status_ = status; } + + void SetRecvTrailingMetadata(MetadataMap* map) { + recv_trailing_metadata_ = map; + } + + std::unique_ptr GetInterceptedChannel() override { + auto* info = call_->client_rpc_info(); + if (info == nullptr) { + return std::unique_ptr(nullptr); + } + // The intercepted channel starts from the interceptor just after the + // current interceptor + return std::unique_ptr(new InterceptedChannel( + info->channel(), current_interceptor_index_ + 1)); + } + + void FailHijackedRecvMessage() override { + GPR_CODEGEN_ASSERT(hooks_[static_cast( + experimental::InterceptionHookPoints::PRE_RECV_MESSAGE)]); + *hijacked_recv_message_failed_ = true; + } + + // Clears all state + void ClearState() { + reverse_ = false; + ran_hijacking_interceptor_ = false; + ClearHookPoints(); + } + + // Prepares for Post_recv operations + void SetReverse() { + reverse_ = true; + ran_hijacking_interceptor_ = false; + ClearHookPoints(); + } + + // This needs to be set before interceptors are run + void SetCall(Call* call) { call_ = call; } + + // This needs to be set before interceptors are run using RunInterceptors(). + // Alternatively, RunInterceptors(std::function f) can be used. + void SetCallOpSetInterface(CallOpSetInterface* ops) { ops_ = ops; } + + // SetCall should have been called before this. + // Returns true if the interceptors list is empty + bool InterceptorsListEmpty() { + auto* client_rpc_info = call_->client_rpc_info(); + if (client_rpc_info != nullptr) { + if (client_rpc_info->interceptors_.size() == 0) { + return true; + } else { + return false; + } + } + + auto* server_rpc_info = call_->server_rpc_info(); + if (server_rpc_info == nullptr || + server_rpc_info->interceptors_.size() == 0) { + return true; + } + return false; + } + + // This should be used only by subclasses of CallOpSetInterface. SetCall and + // SetCallOpSetInterface should have been called before this. After all the + // interceptors are done running, either ContinueFillOpsAfterInterception or + // ContinueFinalizeOpsAfterInterception will be called. Note that neither of + // them is invoked if there were no interceptors registered. + bool RunInterceptors() { + GPR_CODEGEN_ASSERT(ops_); + auto* client_rpc_info = call_->client_rpc_info(); + if (client_rpc_info != nullptr) { + if (client_rpc_info->interceptors_.size() == 0) { + return true; + } else { + RunClientInterceptors(); + return false; + } + } + + auto* server_rpc_info = call_->server_rpc_info(); + if (server_rpc_info == nullptr || + server_rpc_info->interceptors_.size() == 0) { + return true; + } + RunServerInterceptors(); + return false; + } + + // Returns true if no interceptors are run. Returns false otherwise if there + // are interceptors registered. After the interceptors are done running \a f + // will be invoked. This is to be used only by BaseAsyncRequest and + // SyncRequest. + bool RunInterceptors(std::function f) { + // This is used only by the server for initial call request + GPR_CODEGEN_ASSERT(reverse_ == true); + GPR_CODEGEN_ASSERT(call_->client_rpc_info() == nullptr); + auto* server_rpc_info = call_->server_rpc_info(); + if (server_rpc_info == nullptr || + server_rpc_info->interceptors_.size() == 0) { + return true; + } + callback_ = std::move(f); + RunServerInterceptors(); + return false; + } + + private: + void RunClientInterceptors() { + auto* rpc_info = call_->client_rpc_info(); + if (!reverse_) { + current_interceptor_index_ = 0; + } else { + if (rpc_info->hijacked_) { + current_interceptor_index_ = rpc_info->hijacked_interceptor_; + } else { + current_interceptor_index_ = rpc_info->interceptors_.size() - 1; + } + } + rpc_info->RunInterceptor(this, current_interceptor_index_); + } + + void RunServerInterceptors() { + auto* rpc_info = call_->server_rpc_info(); + if (!reverse_) { + current_interceptor_index_ = 0; + } else { + current_interceptor_index_ = rpc_info->interceptors_.size() - 1; + } + rpc_info->RunInterceptor(this, current_interceptor_index_); + } + + void ProceedClient() { + auto* rpc_info = call_->client_rpc_info(); + if (rpc_info->hijacked_ && !reverse_ && + current_interceptor_index_ == rpc_info->hijacked_interceptor_ && + !ran_hijacking_interceptor_) { + // We now need to provide hijacked recv ops to this interceptor + ClearHookPoints(); + ops_->SetHijackingState(); + ran_hijacking_interceptor_ = true; + rpc_info->RunInterceptor(this, current_interceptor_index_); + return; + } + if (!reverse_) { + current_interceptor_index_++; + // We are going down the stack of interceptors + if (current_interceptor_index_ < rpc_info->interceptors_.size()) { + if (rpc_info->hijacked_ && + current_interceptor_index_ > rpc_info->hijacked_interceptor_) { + // This is a hijacked RPC and we are done with hijacking + ops_->ContinueFillOpsAfterInterception(); + } else { + rpc_info->RunInterceptor(this, current_interceptor_index_); + } + } else { + // we are done running all the interceptors without any hijacking + ops_->ContinueFillOpsAfterInterception(); + } + } else { + // We are going up the stack of interceptors + if (current_interceptor_index_ > 0) { + // Continue running interceptors + current_interceptor_index_--; + rpc_info->RunInterceptor(this, current_interceptor_index_); + } else { + // we are done running all the interceptors without any hijacking + ops_->ContinueFinalizeResultAfterInterception(); + } + } + } + + void ProceedServer() { + auto* rpc_info = call_->server_rpc_info(); + if (!reverse_) { + current_interceptor_index_++; + if (current_interceptor_index_ < rpc_info->interceptors_.size()) { + return rpc_info->RunInterceptor(this, current_interceptor_index_); + } else if (ops_) { + return ops_->ContinueFillOpsAfterInterception(); + } + } else { + // We are going up the stack of interceptors + if (current_interceptor_index_ > 0) { + // Continue running interceptors + current_interceptor_index_--; + return rpc_info->RunInterceptor(this, current_interceptor_index_); + } else if (ops_) { + return ops_->ContinueFinalizeResultAfterInterception(); + } + } + GPR_CODEGEN_ASSERT(callback_); + callback_(); + } + + void ClearHookPoints() { + for (auto i = static_cast(0); + i < experimental::InterceptionHookPoints::NUM_INTERCEPTION_HOOKS; + i = static_cast( + static_cast(i) + 1)) { + hooks_[static_cast(i)] = false; + } + } + + std::array( + experimental::InterceptionHookPoints::NUM_INTERCEPTION_HOOKS)> + hooks_; + + size_t current_interceptor_index_ = 0; // Current iterator + bool reverse_ = false; + bool ran_hijacking_interceptor_ = false; + Call* call_ = nullptr; // The Call object is present along with CallOpSet + // object/callback + CallOpSetInterface* ops_ = nullptr; + std::function callback_; + + ByteBuffer* send_message_ = nullptr; + bool* fail_send_message_ = nullptr; + const void** orig_send_message_ = nullptr; + std::function serializer_; + + std::multimap* send_initial_metadata_; + + grpc_status_code* code_ = nullptr; + grpc::string* error_details_ = nullptr; + grpc::string* error_message_ = nullptr; + + std::multimap* send_trailing_metadata_ = nullptr; + + void* recv_message_ = nullptr; + bool* hijacked_recv_message_failed_ = nullptr; + + MetadataMap* recv_initial_metadata_ = nullptr; + + Status* recv_status_ = nullptr; + + MetadataMap* recv_trailing_metadata_ = nullptr; +}; + +// A special implementation of InterceptorBatchMethods to send a Cancel +// notification down the interceptor stack +class CancelInterceptorBatchMethods + : public experimental::InterceptorBatchMethods { + public: + bool QueryInterceptionHookPoint( + experimental::InterceptionHookPoints type) override { + if (type == experimental::InterceptionHookPoints::PRE_SEND_CANCEL) { + return true; + } else { + return false; + } + } + + void Proceed() override { + // This is a no-op. For actual continuation of the RPC simply needs to + // return from the Intercept method + } + + void Hijack() override { + // Only the client can hijack when sending down initial metadata + GPR_CODEGEN_ASSERT(false && + "It is illegal to call Hijack on a method which has a " + "Cancel notification"); + } + + ByteBuffer* GetSerializedSendMessage() override { + GPR_CODEGEN_ASSERT(false && + "It is illegal to call GetSendMessage on a method which " + "has a Cancel notification"); + return nullptr; + } + + bool GetSendMessageStatus() override { + GPR_CODEGEN_ASSERT( + false && + "It is illegal to call GetSendMessageStatus on a method which " + "has a Cancel notification"); + return false; + } + + const void* GetSendMessage() override { + GPR_CODEGEN_ASSERT( + false && + "It is illegal to call GetOriginalSendMessage on a method which " + "has a Cancel notification"); + return nullptr; + } + + void ModifySendMessage(const void* /*message*/) override { + GPR_CODEGEN_ASSERT( + false && + "It is illegal to call ModifySendMessage on a method which " + "has a Cancel notification"); + } + + std::multimap* GetSendInitialMetadata() override { + GPR_CODEGEN_ASSERT(false && + "It is illegal to call GetSendInitialMetadata on a " + "method which has a Cancel notification"); + return nullptr; + } + + Status GetSendStatus() override { + GPR_CODEGEN_ASSERT(false && + "It is illegal to call GetSendStatus on a method which " + "has a Cancel notification"); + return Status(); + } + + void ModifySendStatus(const Status& /*status*/) override { + GPR_CODEGEN_ASSERT(false && + "It is illegal to call ModifySendStatus on a method " + "which has a Cancel notification"); + return; + } + + std::multimap* GetSendTrailingMetadata() + override { + GPR_CODEGEN_ASSERT(false && + "It is illegal to call GetSendTrailingMetadata on a " + "method which has a Cancel notification"); + return nullptr; + } + + void* GetRecvMessage() override { + GPR_CODEGEN_ASSERT(false && + "It is illegal to call GetRecvMessage on a method which " + "has a Cancel notification"); + return nullptr; + } + + std::multimap* GetRecvInitialMetadata() + override { + GPR_CODEGEN_ASSERT(false && + "It is illegal to call GetRecvInitialMetadata on a " + "method which has a Cancel notification"); + return nullptr; + } + + Status* GetRecvStatus() override { + GPR_CODEGEN_ASSERT(false && + "It is illegal to call GetRecvStatus on a method which " + "has a Cancel notification"); + return nullptr; + } + + std::multimap* GetRecvTrailingMetadata() + override { + GPR_CODEGEN_ASSERT(false && + "It is illegal to call GetRecvTrailingMetadata on a " + "method which has a Cancel notification"); + return nullptr; + } + + std::unique_ptr GetInterceptedChannel() override { + GPR_CODEGEN_ASSERT(false && + "It is illegal to call GetInterceptedChannel on a " + "method which has a Cancel notification"); + return std::unique_ptr(nullptr); + } + + void FailHijackedRecvMessage() override { + GPR_CODEGEN_ASSERT(false && + "It is illegal to call FailHijackedRecvMessage on a " + "method which has a Cancel notification"); + } + + void FailHijackedSendMessage() override { + GPR_CODEGEN_ASSERT(false && + "It is illegal to call FailHijackedSendMessage on a " + "method which has a Cancel notification"); + } +}; +} // namespace internal +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_INTERCEPTOR_COMMON_H diff --git a/include/grpcpp/impl/codegen/message_allocator.h b/include/grpcpp/impl/codegen/message_allocator.h new file mode 100644 index 00000000..4048ea11 --- /dev/null +++ b/include/grpcpp/impl/codegen/message_allocator.h @@ -0,0 +1,93 @@ +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_MESSAGE_ALLOCATOR_H +#define GRPCPP_IMPL_CODEGEN_MESSAGE_ALLOCATOR_H + +namespace grpc { +#ifndef GRPC_CALLBACK_API_NONEXPERIMENTAL +namespace experimental { +#endif + +// NOTE: This is an API for advanced users who need custom allocators. +// Per rpc struct for the allocator. This is the interface to return to user. +class RpcAllocatorState { + public: + virtual ~RpcAllocatorState() = default; + // Optionally deallocate request early to reduce the size of working set. + // A custom MessageAllocator needs to be registered to make use of this. + // This is not abstract because implementing it is optional. + virtual void FreeRequest() {} +}; + +// This is the interface returned by the allocator. +// grpc library will call the methods to get request/response pointers and to +// release the object when it is done. +template +class MessageHolder : public RpcAllocatorState { + public: + // Release this object. For example, if the custom allocator's + // AllocateMessasge creates an instance of a subclass with new, the Release() + // should do a "delete this;". + virtual void Release() = 0; + RequestT* request() { return request_; } + ResponseT* response() { return response_; } + + protected: + void set_request(RequestT* request) { request_ = request; } + void set_response(ResponseT* response) { response_ = response; } + + private: + // NOTE: subclasses should set these pointers. + RequestT* request_; + ResponseT* response_; +}; + +// A custom allocator can be set via the generated code to a callback unary +// method, such as SetMessageAllocatorFor_Echo(custom_allocator). The allocator +// needs to be alive for the lifetime of the server. +// Implementations need to be thread-safe. +template +class MessageAllocator { + public: + virtual ~MessageAllocator() = default; + virtual MessageHolder* AllocateMessages() = 0; +}; + +#ifndef GRPC_CALLBACK_API_NONEXPERIMENTAL +} // namespace experimental +#endif + +// TODO(vjpai): Remove namespace experimental when de-experimentalized fully. +#ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL +namespace experimental { + +using ::grpc::RpcAllocatorState; + +template +using MessageHolder = ::grpc::MessageHolder; + +template +using MessageAllocator = ::grpc::MessageAllocator; + +} // namespace experimental +#endif + +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_MESSAGE_ALLOCATOR_H diff --git a/include/grpcpp/impl/codegen/metadata_map.h b/include/grpcpp/impl/codegen/metadata_map.h new file mode 100644 index 00000000..9cec54d9 --- /dev/null +++ b/include/grpcpp/impl/codegen/metadata_map.h @@ -0,0 +1,105 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_METADATA_MAP_H +#define GRPCPP_IMPL_CODEGEN_METADATA_MAP_H + +#include + +#include +#include + +namespace grpc { + +namespace internal { + +const char kBinaryErrorDetailsKey[] = "grpc-status-details-bin"; + +class MetadataMap { + public: + MetadataMap() { Setup(); } + + ~MetadataMap() { Destroy(); } + + grpc::string GetBinaryErrorDetails() { + // if filled_, extract from the multimap for O(log(n)) + if (filled_) { + auto iter = map_.find(kBinaryErrorDetailsKey); + if (iter != map_.end()) { + return grpc::string(iter->second.begin(), iter->second.length()); + } + } + // if not yet filled, take the O(n) lookup to avoid allocating the + // multimap until it is requested. + // TODO(ncteisen): plumb this through core as a first class object, just + // like code and message. + else { + for (size_t i = 0; i < arr_.count; i++) { + if (strncmp(reinterpret_cast( + GRPC_SLICE_START_PTR(arr_.metadata[i].key)), + kBinaryErrorDetailsKey, + GRPC_SLICE_LENGTH(arr_.metadata[i].key)) == 0) { + return grpc::string(reinterpret_cast( + GRPC_SLICE_START_PTR(arr_.metadata[i].value)), + GRPC_SLICE_LENGTH(arr_.metadata[i].value)); + } + } + } + return grpc::string(); + } + + std::multimap* map() { + FillMap(); + return &map_; + } + grpc_metadata_array* arr() { return &arr_; } + + void Reset() { + filled_ = false; + map_.clear(); + Destroy(); + Setup(); + } + + private: + bool filled_ = false; + grpc_metadata_array arr_; + std::multimap map_; + + void Destroy() { + g_core_codegen_interface->grpc_metadata_array_destroy(&arr_); + } + + void Setup() { memset(&arr_, 0, sizeof(arr_)); } + + void FillMap() { + if (filled_) return; + filled_ = true; + for (size_t i = 0; i < arr_.count; i++) { + // TODO(yangg) handle duplicates? + map_.insert(std::pair( + StringRefFromSlice(&arr_.metadata[i].key), + StringRefFromSlice(&arr_.metadata[i].value))); + } + } +}; +} // namespace internal + +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_METADATA_MAP_H diff --git a/include/grpcpp/impl/codegen/method_handler.h b/include/grpcpp/impl/codegen/method_handler.h new file mode 100644 index 00000000..4b0f594f --- /dev/null +++ b/include/grpcpp/impl/codegen/method_handler.h @@ -0,0 +1,73 @@ +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_METHOD_HANDLER_H +#define GRPCPP_IMPL_CODEGEN_METHOD_HANDLER_H + +#include + +namespace grpc { + +namespace internal { + +template +using BidiStreamingHandler = + ::grpc_impl::internal::BidiStreamingHandler; + +template +using RpcMethodHandler = + ::grpc_impl::internal::RpcMethodHandler; + +template +using ClientStreamingHandler = + ::grpc_impl::internal::ClientStreamingHandler; + +template +using ServerStreamingHandler = + ::grpc_impl::internal::ServerStreamingHandler; + +template +using TemplatedBidiStreamingHandler = + ::grpc_impl::internal::TemplatedBidiStreamingHandler; + +template +using StreamedUnaryHandler = + ::grpc_impl::internal::StreamedUnaryHandler; + +template +using SplitServerStreamingHandler = + ::grpc_impl::internal::SplitServerStreamingHandler; + +template +using ErrorMethodHandler = ::grpc_impl::internal::ErrorMethodHandler; + +using UnknownMethodHandler = ::grpc_impl::internal::UnknownMethodHandler; + +using ResourceExhaustedHandler = + ::grpc_impl::internal::ResourceExhaustedHandler; + +} // namespace internal + +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_METHOD_HANDLER_H diff --git a/include/grpcpp/impl/codegen/method_handler_impl.h b/include/grpcpp/impl/codegen/method_handler_impl.h new file mode 100644 index 00000000..2de19345 --- /dev/null +++ b/include/grpcpp/impl/codegen/method_handler_impl.h @@ -0,0 +1,391 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_METHOD_HANDLER_IMPL_H +#define GRPCPP_IMPL_CODEGEN_METHOD_HANDLER_IMPL_H + +#include +#include +#include +#include + +namespace grpc_impl { + +namespace internal { + +// Invoke the method handler, fill in the status, and +// return whether or not we finished safely (without an exception). +// Note that exception handling is 0-cost in most compiler/library +// implementations (except when an exception is actually thrown), +// so this process doesn't require additional overhead in the common case. +// Additionally, we don't need to return if we caught an exception or not; +// the handling is the same in either case. +template +::grpc::Status CatchingFunctionHandler(Callable&& handler) { +#if GRPC_ALLOW_EXCEPTIONS + try { + return handler(); + } catch (...) { + return ::grpc::Status(::grpc::StatusCode::UNKNOWN, + "Unexpected error in RPC handling"); + } +#else // GRPC_ALLOW_EXCEPTIONS + return handler(); +#endif // GRPC_ALLOW_EXCEPTIONS +} + +/// A wrapper class of an application provided rpc method handler. +template +class RpcMethodHandler : public ::grpc::internal::MethodHandler { + public: + RpcMethodHandler( + std::function<::grpc::Status(ServiceType*, ::grpc_impl::ServerContext*, + const RequestType*, ResponseType*)> + func, + ServiceType* service) + : func_(func), service_(service) {} + + void RunHandler(const HandlerParameter& param) final { + ResponseType rsp; + ::grpc::Status status = param.status; + if (status.ok()) { + status = CatchingFunctionHandler([this, ¶m, &rsp] { + return func_( + service_, + static_cast<::grpc_impl::ServerContext*>(param.server_context), + static_cast(param.request), &rsp); + }); + static_cast(param.request)->~RequestType(); + } + + GPR_CODEGEN_ASSERT(!param.server_context->sent_initial_metadata_); + ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata, + ::grpc::internal::CallOpSendMessage, + ::grpc::internal::CallOpServerSendStatus> + ops; + ops.SendInitialMetadata(¶m.server_context->initial_metadata_, + param.server_context->initial_metadata_flags()); + if (param.server_context->compression_level_set()) { + ops.set_compression_level(param.server_context->compression_level()); + } + if (status.ok()) { + status = ops.SendMessagePtr(&rsp); + } + ops.ServerSendStatus(¶m.server_context->trailing_metadata_, status); + param.call->PerformOps(&ops); + param.call->cq()->Pluck(&ops); + } + + void* Deserialize(grpc_call* call, grpc_byte_buffer* req, + ::grpc::Status* status, void** /*handler_data*/) final { + ::grpc::ByteBuffer buf; + buf.set_buffer(req); + auto* request = + new (::grpc::g_core_codegen_interface->grpc_call_arena_alloc( + call, sizeof(RequestType))) RequestType(); + *status = + ::grpc::SerializationTraits::Deserialize(&buf, request); + buf.Release(); + if (status->ok()) { + return request; + } + request->~RequestType(); + return nullptr; + } + + private: + /// Application provided rpc handler function. + std::function<::grpc::Status(ServiceType*, ::grpc_impl::ServerContext*, + const RequestType*, ResponseType*)> + func_; + // The class the above handler function lives in. + ServiceType* service_; +}; + +/// A wrapper class of an application provided client streaming handler. +template +class ClientStreamingHandler : public ::grpc::internal::MethodHandler { + public: + ClientStreamingHandler( + std::function<::grpc::Status(ServiceType*, ::grpc_impl::ServerContext*, + ::grpc_impl::ServerReader*, + ResponseType*)> + func, + ServiceType* service) + : func_(func), service_(service) {} + + void RunHandler(const HandlerParameter& param) final { + ::grpc_impl::ServerReader reader( + param.call, + static_cast<::grpc_impl::ServerContext*>(param.server_context)); + ResponseType rsp; + ::grpc::Status status = + CatchingFunctionHandler([this, ¶m, &reader, &rsp] { + return func_( + service_, + static_cast<::grpc_impl::ServerContext*>(param.server_context), + &reader, &rsp); + }); + + ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata, + ::grpc::internal::CallOpSendMessage, + ::grpc::internal::CallOpServerSendStatus> + ops; + if (!param.server_context->sent_initial_metadata_) { + ops.SendInitialMetadata(¶m.server_context->initial_metadata_, + param.server_context->initial_metadata_flags()); + if (param.server_context->compression_level_set()) { + ops.set_compression_level(param.server_context->compression_level()); + } + } + if (status.ok()) { + status = ops.SendMessagePtr(&rsp); + } + ops.ServerSendStatus(¶m.server_context->trailing_metadata_, status); + param.call->PerformOps(&ops); + param.call->cq()->Pluck(&ops); + } + + private: + std::function<::grpc::Status(ServiceType*, ::grpc_impl::ServerContext*, + ::grpc_impl::ServerReader*, + ResponseType*)> + func_; + ServiceType* service_; +}; + +/// A wrapper class of an application provided server streaming handler. +template +class ServerStreamingHandler : public ::grpc::internal::MethodHandler { + public: + ServerStreamingHandler( + std::function<::grpc::Status(ServiceType*, ::grpc_impl::ServerContext*, + const RequestType*, + ::grpc_impl::ServerWriter*)> + func, + ServiceType* service) + : func_(func), service_(service) {} + + void RunHandler(const HandlerParameter& param) final { + ::grpc::Status status = param.status; + if (status.ok()) { + ::grpc_impl::ServerWriter writer( + param.call, + static_cast<::grpc_impl::ServerContext*>(param.server_context)); + status = CatchingFunctionHandler([this, ¶m, &writer] { + return func_( + service_, + static_cast<::grpc_impl::ServerContext*>(param.server_context), + static_cast(param.request), &writer); + }); + static_cast(param.request)->~RequestType(); + } + + ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata, + ::grpc::internal::CallOpServerSendStatus> + ops; + if (!param.server_context->sent_initial_metadata_) { + ops.SendInitialMetadata(¶m.server_context->initial_metadata_, + param.server_context->initial_metadata_flags()); + if (param.server_context->compression_level_set()) { + ops.set_compression_level(param.server_context->compression_level()); + } + } + ops.ServerSendStatus(¶m.server_context->trailing_metadata_, status); + param.call->PerformOps(&ops); + if (param.server_context->has_pending_ops_) { + param.call->cq()->Pluck(¶m.server_context->pending_ops_); + } + param.call->cq()->Pluck(&ops); + } + + void* Deserialize(grpc_call* call, grpc_byte_buffer* req, + ::grpc::Status* status, void** /*handler_data*/) final { + ::grpc::ByteBuffer buf; + buf.set_buffer(req); + auto* request = + new (::grpc::g_core_codegen_interface->grpc_call_arena_alloc( + call, sizeof(RequestType))) RequestType(); + *status = + ::grpc::SerializationTraits::Deserialize(&buf, request); + buf.Release(); + if (status->ok()) { + return request; + } + request->~RequestType(); + return nullptr; + } + + private: + std::function<::grpc::Status(ServiceType*, ::grpc_impl::ServerContext*, + const RequestType*, + ::grpc_impl::ServerWriter*)> + func_; + ServiceType* service_; +}; + +/// A wrapper class of an application provided bidi-streaming handler. +/// This also applies to server-streamed implementation of a unary method +/// with the additional requirement that such methods must have done a +/// write for status to be ok +/// Since this is used by more than 1 class, the service is not passed in. +/// Instead, it is expected to be an implicitly-captured argument of func +/// (through bind or something along those lines) +template +class TemplatedBidiStreamingHandler : public ::grpc::internal::MethodHandler { + public: + TemplatedBidiStreamingHandler( + std::function<::grpc::Status(::grpc_impl::ServerContext*, Streamer*)> + func) + : func_(func), write_needed_(WriteNeeded) {} + + void RunHandler(const HandlerParameter& param) final { + Streamer stream(param.call, static_cast<::grpc_impl::ServerContext*>( + param.server_context)); + ::grpc::Status status = CatchingFunctionHandler([this, ¶m, &stream] { + return func_( + static_cast<::grpc_impl::ServerContext*>(param.server_context), + &stream); + }); + + ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata, + ::grpc::internal::CallOpServerSendStatus> + ops; + if (!param.server_context->sent_initial_metadata_) { + ops.SendInitialMetadata(¶m.server_context->initial_metadata_, + param.server_context->initial_metadata_flags()); + if (param.server_context->compression_level_set()) { + ops.set_compression_level(param.server_context->compression_level()); + } + if (write_needed_ && status.ok()) { + // If we needed a write but never did one, we need to mark the + // status as a fail + status = ::grpc::Status(::grpc::StatusCode::INTERNAL, + "Service did not provide response message"); + } + } + ops.ServerSendStatus(¶m.server_context->trailing_metadata_, status); + param.call->PerformOps(&ops); + if (param.server_context->has_pending_ops_) { + param.call->cq()->Pluck(¶m.server_context->pending_ops_); + } + param.call->cq()->Pluck(&ops); + } + + private: + std::function<::grpc::Status(::grpc_impl::ServerContext*, Streamer*)> func_; + const bool write_needed_; +}; + +template +class BidiStreamingHandler + : public TemplatedBidiStreamingHandler< + ::grpc_impl::ServerReaderWriter, false> { + public: + BidiStreamingHandler( + std::function<::grpc::Status( + ServiceType*, ::grpc_impl::ServerContext*, + ::grpc_impl::ServerReaderWriter*)> + func, + ServiceType* service) + // TODO(vjpai): When gRPC supports C++14, move-capture func in the below + : TemplatedBidiStreamingHandler< + ::grpc_impl::ServerReaderWriter, false>( + [func, service]( + ::grpc_impl::ServerContext* ctx, + ::grpc_impl::ServerReaderWriter* + streamer) { return func(service, ctx, streamer); }) {} +}; + +template +class StreamedUnaryHandler + : public TemplatedBidiStreamingHandler< + ::grpc_impl::ServerUnaryStreamer, true> { + public: + explicit StreamedUnaryHandler( + std::function<::grpc::Status( + ::grpc_impl::ServerContext*, + ::grpc_impl::ServerUnaryStreamer*)> + func) + : TemplatedBidiStreamingHandler< + ::grpc_impl::ServerUnaryStreamer, true>( + std::move(func)) {} +}; + +template +class SplitServerStreamingHandler + : public TemplatedBidiStreamingHandler< + ::grpc_impl::ServerSplitStreamer, false> { + public: + explicit SplitServerStreamingHandler( + std::function<::grpc::Status( + ::grpc_impl::ServerContext*, + ::grpc_impl::ServerSplitStreamer*)> + func) + : TemplatedBidiStreamingHandler< + ::grpc_impl::ServerSplitStreamer, false>( + std::move(func)) {} +}; + +/// General method handler class for errors that prevent real method use +/// e.g., handle unknown method by returning UNIMPLEMENTED error. +template <::grpc::StatusCode code> +class ErrorMethodHandler : public ::grpc::internal::MethodHandler { + public: + template + static void FillOps(::grpc_impl::ServerContextBase* context, T* ops) { + ::grpc::Status status(code, ""); + if (!context->sent_initial_metadata_) { + ops->SendInitialMetadata(&context->initial_metadata_, + context->initial_metadata_flags()); + if (context->compression_level_set()) { + ops->set_compression_level(context->compression_level()); + } + context->sent_initial_metadata_ = true; + } + ops->ServerSendStatus(&context->trailing_metadata_, status); + } + + void RunHandler(const HandlerParameter& param) final { + ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata, + ::grpc::internal::CallOpServerSendStatus> + ops; + FillOps(param.server_context, &ops); + param.call->PerformOps(&ops); + param.call->cq()->Pluck(&ops); + } + + void* Deserialize(grpc_call* /*call*/, grpc_byte_buffer* req, + ::grpc::Status* /*status*/, void** /*handler_data*/) final { + // We have to destroy any request payload + if (req != nullptr) { + ::grpc::g_core_codegen_interface->grpc_byte_buffer_destroy(req); + } + return nullptr; + } +}; + +typedef ErrorMethodHandler<::grpc::StatusCode::UNIMPLEMENTED> + UnknownMethodHandler; +typedef ErrorMethodHandler<::grpc::StatusCode::RESOURCE_EXHAUSTED> + ResourceExhaustedHandler; + +} // namespace internal +} // namespace grpc_impl + +#endif // GRPCPP_IMPL_CODEGEN_METHOD_HANDLER_IMPL_H diff --git a/include/grpcpp/impl/codegen/proto_buffer_reader.h b/include/grpcpp/impl/codegen/proto_buffer_reader.h new file mode 100644 index 00000000..48747129 --- /dev/null +++ b/include/grpcpp/impl/codegen/proto_buffer_reader.h @@ -0,0 +1,149 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_PROTO_BUFFER_READER_H +#define GRPCPP_IMPL_CODEGEN_PROTO_BUFFER_READER_H + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +/// This header provides an object that reads bytes directly from a +/// grpc::ByteBuffer, via the ZeroCopyInputStream interface + +namespace grpc { + +extern CoreCodegenInterface* g_core_codegen_interface; + +/// This is a specialization of the protobuf class ZeroCopyInputStream +/// The principle is to get one chunk of data at a time from the proto layer, +/// with options to backup (re-see some bytes) or skip (forward past some bytes) +/// +/// Read more about ZeroCopyInputStream interface here: +/// https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.io.zero_copy_stream#ZeroCopyInputStream +class ProtoBufferReader : public ::grpc::protobuf::io::ZeroCopyInputStream { + public: + /// Constructs buffer reader from \a buffer. Will set \a status() to non ok + /// if \a buffer is invalid (the internal buffer has not been initialized). + explicit ProtoBufferReader(ByteBuffer* buffer) + : byte_count_(0), backup_count_(0), status_() { + /// Implemented through a grpc_byte_buffer_reader which iterates + /// over the slices that make up a byte buffer + if (!buffer->Valid() || + !g_core_codegen_interface->grpc_byte_buffer_reader_init( + &reader_, buffer->c_buffer())) { + status_ = Status(StatusCode::INTERNAL, + "Couldn't initialize byte buffer reader"); + } + } + + ~ProtoBufferReader() { + if (status_.ok()) { + g_core_codegen_interface->grpc_byte_buffer_reader_destroy(&reader_); + } + } + + /// Give the proto library a chunk of data from the stream. The caller + /// may safely read from data[0, size - 1]. + bool Next(const void** data, int* size) override { + if (!status_.ok()) { + return false; + } + /// If we have backed up previously, we need to return the backed-up slice + if (backup_count_ > 0) { + *data = GRPC_SLICE_START_PTR(*slice_) + GRPC_SLICE_LENGTH(*slice_) - + backup_count_; + GPR_CODEGEN_ASSERT(backup_count_ <= INT_MAX); + *size = (int)backup_count_; + backup_count_ = 0; + return true; + } + /// Otherwise get the next slice from the byte buffer reader + if (!g_core_codegen_interface->grpc_byte_buffer_reader_peek(&reader_, + &slice_)) { + return false; + } + *data = GRPC_SLICE_START_PTR(*slice_); + // On win x64, int is only 32bit + GPR_CODEGEN_ASSERT(GRPC_SLICE_LENGTH(*slice_) <= INT_MAX); + byte_count_ += * size = (int)GRPC_SLICE_LENGTH(*slice_); + return true; + } + + /// Returns the status of the buffer reader. + Status status() const { return status_; } + + /// The proto library calls this to indicate that we should back up \a count + /// bytes that have already been returned by the last call of Next. + /// So do the backup and have that ready for a later Next. + void BackUp(int count) override { + GPR_CODEGEN_ASSERT(count <= static_cast(GRPC_SLICE_LENGTH(*slice_))); + backup_count_ = count; + } + + /// The proto library calls this to skip over \a count bytes. Implement this + /// using Next and BackUp combined. + bool Skip(int count) override { + const void* data; + int size; + while (Next(&data, &size)) { + if (size >= count) { + BackUp(size - count); + return true; + } + // size < count; + count -= size; + } + // error or we have too large count; + return false; + } + + /// Returns the total number of bytes read since this object was created. + int64_t ByteCount() const override { return byte_count_ - backup_count_; } + + // These protected members are needed to support internal optimizations. + // they expose internal bits of grpc core that are NOT stable. If you have + // a use case needs to use one of these functions, please send an email to + // https://groups.google.com/forum/#!forum/grpc-io. + protected: + void set_byte_count(int64_t byte_count) { byte_count_ = byte_count; } + int64_t backup_count() { return backup_count_; } + void set_backup_count(int64_t backup_count) { backup_count_ = backup_count; } + grpc_byte_buffer_reader* reader() { return &reader_; } + grpc_slice* slice() { return slice_; } + grpc_slice** mutable_slice_ptr() { return &slice_; } + + private: + int64_t byte_count_; ///< total bytes read since object creation + int64_t backup_count_; ///< how far backed up in the stream we are + grpc_byte_buffer_reader reader_; ///< internal object to read \a grpc_slice + ///< from the \a grpc_byte_buffer + grpc_slice* slice_; ///< current slice passed back to the caller + Status status_; ///< status of the entire object +}; + +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_PROTO_BUFFER_READER_H diff --git a/include/grpcpp/impl/codegen/proto_buffer_writer.h b/include/grpcpp/impl/codegen/proto_buffer_writer.h new file mode 100644 index 00000000..0af4616e --- /dev/null +++ b/include/grpcpp/impl/codegen/proto_buffer_writer.h @@ -0,0 +1,167 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_PROTO_BUFFER_WRITER_H +#define GRPCPP_IMPL_CODEGEN_PROTO_BUFFER_WRITER_H + +#include + +#include +#include +#include +#include +#include +#include +#include + +/// This header provides an object that writes bytes directly into a +/// grpc::ByteBuffer, via the ZeroCopyOutputStream interface + +namespace grpc { + +extern CoreCodegenInterface* g_core_codegen_interface; + +// Forward declaration for testing use only +namespace internal { +class ProtoBufferWriterPeer; +} // namespace internal + +const int kProtoBufferWriterMaxBufferLength = 1024 * 1024; + +/// This is a specialization of the protobuf class ZeroCopyOutputStream. +/// The principle is to give the proto layer one buffer of bytes at a time +/// that it can use to serialize the next portion of the message, with the +/// option to "backup" if more buffer is given than required at the last buffer. +/// +/// Read more about ZeroCopyOutputStream interface here: +/// https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.io.zero_copy_stream#ZeroCopyOutputStream +class ProtoBufferWriter : public ::grpc::protobuf::io::ZeroCopyOutputStream { + public: + /// Constructor for this derived class + /// + /// \param[out] byte_buffer A pointer to the grpc::ByteBuffer created + /// \param block_size How big are the chunks to allocate at a time + /// \param total_size How many total bytes are required for this proto + ProtoBufferWriter(ByteBuffer* byte_buffer, int block_size, int total_size) + : block_size_(block_size), + total_size_(total_size), + byte_count_(0), + have_backup_(false) { + GPR_CODEGEN_ASSERT(!byte_buffer->Valid()); + /// Create an empty raw byte buffer and look at its underlying slice buffer + grpc_byte_buffer* bp = + g_core_codegen_interface->grpc_raw_byte_buffer_create(NULL, 0); + byte_buffer->set_buffer(bp); + slice_buffer_ = &bp->data.raw.slice_buffer; + } + + ~ProtoBufferWriter() { + if (have_backup_) { + g_core_codegen_interface->grpc_slice_unref(backup_slice_); + } + } + + /// Give the proto library the next buffer of bytes and its size. It is + /// safe for the caller to write from data[0, size - 1]. + bool Next(void** data, int* size) override { + // Protobuf should not ask for more memory than total_size_. + GPR_CODEGEN_ASSERT(byte_count_ < total_size_); + // 1. Use the remaining backup slice if we have one + // 2. Otherwise allocate a slice, up to the remaining length needed + // or our maximum allocation size + // 3. Provide the slice start and size available + // 4. Add the slice being returned to the slice buffer + size_t remain = static_cast(total_size_ - byte_count_); + if (have_backup_) { + /// If we have a backup slice, we should use it first + slice_ = backup_slice_; + have_backup_ = false; + if (GRPC_SLICE_LENGTH(slice_) > remain) { + GRPC_SLICE_SET_LENGTH(slice_, remain); + } + } else { + // When less than a whole block is needed, only allocate that much. + // But make sure the allocated slice is not inlined. + size_t allocate_length = + remain > static_cast(block_size_) ? block_size_ : remain; + slice_ = g_core_codegen_interface->grpc_slice_malloc( + allocate_length > GRPC_SLICE_INLINED_SIZE + ? allocate_length + : GRPC_SLICE_INLINED_SIZE + 1); + } + *data = GRPC_SLICE_START_PTR(slice_); + // On win x64, int is only 32bit + GPR_CODEGEN_ASSERT(GRPC_SLICE_LENGTH(slice_) <= INT_MAX); + byte_count_ += * size = (int)GRPC_SLICE_LENGTH(slice_); + g_core_codegen_interface->grpc_slice_buffer_add(slice_buffer_, slice_); + return true; + } + + /// Backup by \a count bytes because Next returned more bytes than needed + /// (only used in the last buffer). \a count must be less than or equal too + /// the last buffer returned from next. + void BackUp(int count) override { + /// 1. Remove the partially-used last slice from the slice buffer + /// 2. Split it into the needed (if any) and unneeded part + /// 3. Add the needed part back to the slice buffer + /// 4. Mark that we still have the remaining part (for later use/unref) + GPR_CODEGEN_ASSERT(count <= static_cast(GRPC_SLICE_LENGTH(slice_))); + g_core_codegen_interface->grpc_slice_buffer_pop(slice_buffer_); + if ((size_t)count == GRPC_SLICE_LENGTH(slice_)) { + backup_slice_ = slice_; + } else { + backup_slice_ = g_core_codegen_interface->grpc_slice_split_tail( + &slice_, GRPC_SLICE_LENGTH(slice_) - count); + g_core_codegen_interface->grpc_slice_buffer_add(slice_buffer_, slice_); + } + // It's dangerous to keep an inlined grpc_slice as the backup slice, since + // on a following Next() call, a reference will be returned to this slice + // via GRPC_SLICE_START_PTR, which will not be an address held by + // slice_buffer_. + have_backup_ = backup_slice_.refcount != NULL; + byte_count_ -= count; + } + + /// Returns the total number of bytes written since this object was created. + int64_t ByteCount() const override { return byte_count_; } + + // These protected members are needed to support internal optimizations. + // they expose internal bits of grpc core that are NOT stable. If you have + // a use case needs to use one of these functions, please send an email to + // https://groups.google.com/forum/#!forum/grpc-io. + protected: + grpc_slice_buffer* slice_buffer() { return slice_buffer_; } + void set_byte_count(int64_t byte_count) { byte_count_ = byte_count; } + + private: + // friend for testing purposes only + friend class internal::ProtoBufferWriterPeer; + const int block_size_; ///< size to alloc for each new \a grpc_slice needed + const int total_size_; ///< byte size of proto being serialized + int64_t byte_count_; ///< bytes written since this object was created + grpc_slice_buffer* + slice_buffer_; ///< internal buffer of slices holding the serialized data + bool have_backup_; ///< if we are holding a backup slice or not + grpc_slice backup_slice_; ///< holds space we can still write to, if the + ///< caller has called BackUp + grpc_slice slice_; ///< current slice passed back to the caller +}; + +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_PROTO_BUFFER_WRITER_H diff --git a/include/grpcpp/impl/codegen/proto_utils.h b/include/grpcpp/impl/codegen/proto_utils.h new file mode 100644 index 00000000..2e102135 --- /dev/null +++ b/include/grpcpp/impl/codegen/proto_utils.h @@ -0,0 +1,119 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_PROTO_UTILS_H +#define GRPCPP_IMPL_CODEGEN_PROTO_UTILS_H + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/// This header provides serialization and deserialization between gRPC +/// messages serialized using protobuf and the C++ objects they represent. + +namespace grpc { + +extern CoreCodegenInterface* g_core_codegen_interface; + +// ProtoBufferWriter must be a subclass of ::protobuf::io::ZeroCopyOutputStream. +template +Status GenericSerialize(const grpc::protobuf::MessageLite& msg, ByteBuffer* bb, + bool* own_buffer) { + static_assert(std::is_base_of::value, + "ProtoBufferWriter must be a subclass of " + "::protobuf::io::ZeroCopyOutputStream"); + *own_buffer = true; + int byte_size = msg.ByteSizeLong(); + if ((size_t)byte_size <= GRPC_SLICE_INLINED_SIZE) { + Slice slice(byte_size); + // We serialize directly into the allocated slices memory + GPR_CODEGEN_ASSERT(slice.end() == msg.SerializeWithCachedSizesToArray( + const_cast(slice.begin()))); + ByteBuffer tmp(&slice, 1); + bb->Swap(&tmp); + + return g_core_codegen_interface->ok(); + } + ProtoBufferWriter writer(bb, kProtoBufferWriterMaxBufferLength, byte_size); + return msg.SerializeToZeroCopyStream(&writer) + ? g_core_codegen_interface->ok() + : Status(StatusCode::INTERNAL, "Failed to serialize message"); +} + +// BufferReader must be a subclass of ::protobuf::io::ZeroCopyInputStream. +template +Status GenericDeserialize(ByteBuffer* buffer, + grpc::protobuf::MessageLite* msg) { + static_assert(std::is_base_of::value, + "ProtoBufferReader must be a subclass of " + "::protobuf::io::ZeroCopyInputStream"); + if (buffer == nullptr) { + return Status(StatusCode::INTERNAL, "No payload"); + } + Status result = g_core_codegen_interface->ok(); + { + ProtoBufferReader reader(buffer); + if (!reader.status().ok()) { + return reader.status(); + } + if (!msg->ParseFromZeroCopyStream(&reader)) { + result = Status(StatusCode::INTERNAL, msg->InitializationErrorString()); + } + } + buffer->Clear(); + return result; +} + +// this is needed so the following class does not conflict with protobuf +// serializers that utilize internal-only tools. +#ifdef GRPC_OPEN_SOURCE_PROTO +// This class provides a protobuf serializer. It translates between protobuf +// objects and grpc_byte_buffers. More information about SerializationTraits can +// be found in include/grpcpp/impl/codegen/serialization_traits.h. +template +class SerializationTraits< + T, typename std::enable_if< + std::is_base_of::value>::type> { + public: + static Status Serialize(const grpc::protobuf::MessageLite& msg, + ByteBuffer* bb, bool* own_buffer) { + return GenericSerialize(msg, bb, own_buffer); + } + + static Status Deserialize(ByteBuffer* buffer, + grpc::protobuf::MessageLite* msg) { + return GenericDeserialize(buffer, msg); + } +}; +#endif + +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_PROTO_UTILS_H diff --git a/include/grpcpp/impl/codegen/rpc_method.h b/include/grpcpp/impl/codegen/rpc_method.h new file mode 100644 index 00000000..9dcde954 --- /dev/null +++ b/include/grpcpp/impl/codegen/rpc_method.h @@ -0,0 +1,61 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_RPC_METHOD_H +#define GRPCPP_IMPL_CODEGEN_RPC_METHOD_H + +#include + +#include + +namespace grpc { +namespace internal { +/// Descriptor of an RPC method +class RpcMethod { + public: + enum RpcType { + NORMAL_RPC = 0, + CLIENT_STREAMING, // request streaming + SERVER_STREAMING, // response streaming + BIDI_STREAMING + }; + + RpcMethod(const char* name, RpcType type) + : name_(name), method_type_(type), channel_tag_(NULL) {} + + RpcMethod(const char* name, RpcType type, + const std::shared_ptr& channel) + : name_(name), + method_type_(type), + channel_tag_(channel->RegisterMethod(name)) {} + + const char* name() const { return name_; } + RpcType method_type() const { return method_type_; } + void SetMethodType(RpcType type) { method_type_ = type; } + void* channel_tag() const { return channel_tag_; } + + private: + const char* const name_; + RpcType method_type_; + void* const channel_tag_; +}; + +} // namespace internal +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_RPC_METHOD_H diff --git a/include/grpcpp/impl/codegen/rpc_service_method.h b/include/grpcpp/impl/codegen/rpc_service_method.h new file mode 100644 index 00000000..da0e5b60 --- /dev/null +++ b/include/grpcpp/impl/codegen/rpc_service_method.h @@ -0,0 +1,156 @@ +/* + * + * Copyright 2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_RPC_SERVICE_METHOD_H +#define GRPCPP_IMPL_CODEGEN_RPC_SERVICE_METHOD_H + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace grpc_impl { +class ServerContextBase; +} // namespace grpc_impl + +namespace grpc { +namespace internal { +/// Base class for running an RPC handler. +class MethodHandler { + public: + virtual ~MethodHandler() {} + struct HandlerParameter { + /// Constructor for HandlerParameter + /// + /// \param c : the gRPC Call structure for this server call + /// \param context : the ServerContext structure for this server call + /// \param req : the request payload, if appropriate for this RPC + /// \param req_status : the request status after any interceptors have run + /// \param handler_data: internal data for the handler. + /// \param requester : used only by the callback API. It is a function + /// called by the RPC Controller to request another RPC (and also + /// to set up the state required to make that request possible) + HandlerParameter(Call* c, ::grpc_impl::ServerContextBase* context, + void* req, Status req_status, void* handler_data, + std::function requester) + : call(c), + server_context(context), + request(req), + status(req_status), + internal_data(handler_data), + call_requester(std::move(requester)) {} + ~HandlerParameter() {} + Call* const call; + ::grpc_impl::ServerContextBase* const server_context; + void* const request; + const Status status; + void* const internal_data; + const std::function call_requester; + }; + virtual void RunHandler(const HandlerParameter& param) = 0; + + /* Returns a pointer to the deserialized request. \a status reflects the + result of deserialization. This pointer and the status should be filled in + a HandlerParameter and passed to RunHandler. It is illegal to access the + pointer after calling RunHandler. Ownership of the deserialized request is + retained by the handler. Returns nullptr if deserialization failed. */ + virtual void* Deserialize(grpc_call* /*call*/, grpc_byte_buffer* req, + Status* /*status*/, void** /*handler_data*/) { + GPR_CODEGEN_ASSERT(req == nullptr); + return nullptr; + } +}; + +/// Server side rpc method class +class RpcServiceMethod : public RpcMethod { + public: + /// Takes ownership of the handler + RpcServiceMethod(const char* name, RpcMethod::RpcType type, + MethodHandler* handler) + : RpcMethod(name, type), + server_tag_(nullptr), + api_type_(ApiType::SYNC), + handler_(handler) {} + + enum class ApiType { + SYNC, + ASYNC, + RAW, + CALL_BACK, // not CALLBACK because that is reserved in Windows + RAW_CALL_BACK, + }; + + void set_server_tag(void* tag) { server_tag_ = tag; } + void* server_tag() const { return server_tag_; } + /// if MethodHandler is nullptr, then this is an async method + MethodHandler* handler() const { return handler_.get(); } + ApiType api_type() const { return api_type_; } + void SetHandler(MethodHandler* handler) { handler_.reset(handler); } + void SetServerApiType(RpcServiceMethod::ApiType type) { + if ((api_type_ == ApiType::SYNC) && + (type == ApiType::ASYNC || type == ApiType::RAW)) { + // this marks this method as async + handler_.reset(); + } else if (api_type_ != ApiType::SYNC) { + // this is not an error condition, as it allows users to declare a server + // like WithRawMethod_foo. However since it + // overwrites behavior, it should be logged. + gpr_log( + GPR_INFO, + "You are marking method %s as '%s', even though it was " + "previously marked '%s'. This behavior will overwrite the original " + "behavior. If you expected this then ignore this message.", + name(), TypeToString(api_type_), TypeToString(type)); + } + api_type_ = type; + } + + private: + void* server_tag_; + ApiType api_type_; + std::unique_ptr handler_; + + const char* TypeToString(RpcServiceMethod::ApiType type) { + switch (type) { + case ApiType::SYNC: + return "sync"; + case ApiType::ASYNC: + return "async"; + case ApiType::RAW: + return "raw"; + case ApiType::CALL_BACK: + return "callback"; + case ApiType::RAW_CALL_BACK: + return "raw_callback"; + default: + GPR_UNREACHABLE_CODE(return "unknown"); + } + } +}; +} // namespace internal + +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_RPC_SERVICE_METHOD_H diff --git a/include/grpcpp/impl/codegen/security/auth_context.h b/include/grpcpp/impl/codegen/security/auth_context.h new file mode 100644 index 00000000..6c0089ca --- /dev/null +++ b/include/grpcpp/impl/codegen/security/auth_context.h @@ -0,0 +1,95 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_SECURITY_AUTH_CONTEXT_H +#define GRPCPP_IMPL_CODEGEN_SECURITY_AUTH_CONTEXT_H + +#include +#include + +#include +#include + +struct grpc_auth_context; +struct grpc_auth_property; +struct grpc_auth_property_iterator; + +namespace grpc { +class SecureAuthContext; + +typedef std::pair AuthProperty; + +class AuthPropertyIterator + : public std::iterator { + public: + ~AuthPropertyIterator(); + AuthPropertyIterator& operator++(); + AuthPropertyIterator operator++(int); + bool operator==(const AuthPropertyIterator& rhs) const; + bool operator!=(const AuthPropertyIterator& rhs) const; + const AuthProperty operator*(); + + protected: + AuthPropertyIterator(); + AuthPropertyIterator(const grpc_auth_property* property, + const grpc_auth_property_iterator* iter); + + private: + friend class SecureAuthContext; + const grpc_auth_property* property_; + // The following items form a grpc_auth_property_iterator. + const grpc_auth_context* ctx_; + size_t index_; + const char* name_; +}; + +/// Class encapsulating the Authentication Information. +/// +/// It includes the secure identity of the peer, the type of secure transport +/// used as well as any other properties required by the authorization layer. +class AuthContext { + public: + virtual ~AuthContext() {} + + /// Returns true if the peer is authenticated. + virtual bool IsPeerAuthenticated() const = 0; + + /// A peer identity. + /// + /// It is, in general, comprised of one or more properties (in which case they + /// have the same name). + virtual std::vector GetPeerIdentity() const = 0; + virtual grpc::string GetPeerIdentityPropertyName() const = 0; + + /// Returns all the property values with the given name. + virtual std::vector FindPropertyValues( + const grpc::string& name) const = 0; + + /// Iteration over all the properties. + virtual AuthPropertyIterator begin() const = 0; + virtual AuthPropertyIterator end() const = 0; + + /// Mutation functions: should only be used by an AuthMetadataProcessor. + virtual void AddProperty(const grpc::string& key, + const string_ref& value) = 0; + virtual bool SetPeerIdentityPropertyName(const string& name) = 0; +}; + +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_SECURITY_AUTH_CONTEXT_H diff --git a/include/grpcpp/impl/codegen/serialization_traits.h b/include/grpcpp/impl/codegen/serialization_traits.h new file mode 100644 index 00000000..8f792232 --- /dev/null +++ b/include/grpcpp/impl/codegen/serialization_traits.h @@ -0,0 +1,62 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_SERIALIZATION_TRAITS_H +#define GRPCPP_IMPL_CODEGEN_SERIALIZATION_TRAITS_H + +namespace grpc { + +/// Defines how to serialize and deserialize some type. +/// +/// Used for hooking different message serialization API's into GRPC. +/// Each SerializationTraits implementation must provide the +/// following functions: +/// 1. static Status Serialize(const Message& msg, +/// ByteBuffer* buffer, +/// bool* own_buffer); +/// OR +/// static Status Serialize(const Message& msg, +/// grpc_byte_buffer** buffer, +/// bool* own_buffer); +/// The former is preferred; the latter is deprecated +/// +/// 2. static Status Deserialize(ByteBuffer* buffer, +/// Message* msg); +/// OR +/// static Status Deserialize(grpc_byte_buffer* buffer, +/// Message* msg); +/// The former is preferred; the latter is deprecated +/// +/// Serialize is required to convert message to a ByteBuffer, and +/// return that byte buffer through *buffer. *own_buffer should +/// be set to true if the caller owns said byte buffer, or false if +/// ownership is retained elsewhere. +/// +/// Deserialize is required to convert buffer into the message stored at +/// msg. max_receive_message_size is passed in as a bound on the maximum +/// number of message bytes Deserialize should accept. +/// +/// Both functions return a Status, allowing them to explain what went +/// wrong if required. +template +class SerializationTraits; + +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_SERIALIZATION_TRAITS_H diff --git a/include/grpcpp/impl/codegen/server_callback.h b/include/grpcpp/impl/codegen/server_callback.h new file mode 100644 index 00000000..1d8b2f6f --- /dev/null +++ b/include/grpcpp/impl/codegen/server_callback.h @@ -0,0 +1,56 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_SERVER_CALLBACK_H +#define GRPCPP_IMPL_CODEGEN_SERVER_CALLBACK_H + +#include + +namespace grpc { + +#ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL +template +using ServerReadReactor = ::grpc_impl::ServerReadReactor; + +template +using ServerWriteReactor = ::grpc_impl::ServerWriteReactor; + +template +using ServerBidiReactor = ::grpc_impl::ServerBidiReactor; + +using ServerUnaryReactor = ::grpc_impl::ServerUnaryReactor; +#endif + +// TODO(vjpai): Remove namespace experimental when de-experimentalized fully. +namespace experimental { + +template +using ServerReadReactor = ::grpc_impl::ServerReadReactor; + +template +using ServerWriteReactor = ::grpc_impl::ServerWriteReactor; + +template +using ServerBidiReactor = ::grpc_impl::ServerBidiReactor; + +using ServerUnaryReactor = ::grpc_impl::ServerUnaryReactor; + +} // namespace experimental +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_SERVER_CALLBACK_H diff --git a/include/grpcpp/impl/codegen/server_callback_handlers.h b/include/grpcpp/impl/codegen/server_callback_handlers.h new file mode 100644 index 00000000..0c651245 --- /dev/null +++ b/include/grpcpp/impl/codegen/server_callback_handlers.h @@ -0,0 +1,880 @@ +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef GRPCPP_IMPL_CODEGEN_SERVER_CALLBACK_HANDLERS_H +#define GRPCPP_IMPL_CODEGEN_SERVER_CALLBACK_HANDLERS_H + +#include +#include +#include +#include +#include + +namespace grpc_impl { +namespace internal { + +template +class CallbackUnaryHandler : public ::grpc::internal::MethodHandler { + public: + explicit CallbackUnaryHandler( + std::function + get_reactor) + : get_reactor_(std::move(get_reactor)) {} + + void SetMessageAllocator( + ::grpc::experimental::MessageAllocator* + allocator) { + allocator_ = allocator; + } + + void RunHandler(const HandlerParameter& param) final { + // Arena allocate a controller structure (that includes request/response) + ::grpc::g_core_codegen_interface->grpc_call_ref(param.call->call()); + auto* allocator_state = static_cast< + ::grpc::experimental::MessageHolder*>( + param.internal_data); + + auto* call = new (::grpc::g_core_codegen_interface->grpc_call_arena_alloc( + param.call->call(), sizeof(ServerCallbackUnaryImpl))) + ServerCallbackUnaryImpl( + static_cast<::grpc_impl::CallbackServerContext*>( + param.server_context), + param.call, allocator_state, std::move(param.call_requester)); + param.server_context->BeginCompletionOp( + param.call, [call](bool) { call->MaybeDone(); }, call); + + ServerUnaryReactor* reactor = nullptr; + if (param.status.ok()) { + reactor = ::grpc::internal::CatchingReactorGetter( + get_reactor_, + static_cast<::grpc_impl::CallbackServerContext*>( + param.server_context), + call->request(), call->response()); + } + + if (reactor == nullptr) { + // if deserialization or reactor creator failed, we need to fail the call + reactor = new (::grpc::g_core_codegen_interface->grpc_call_arena_alloc( + param.call->call(), sizeof(UnimplementedUnaryReactor))) + UnimplementedUnaryReactor( + ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "")); + } + + /// Invoke SetupReactor as the last part of the handler + call->SetupReactor(reactor); + } + + void* Deserialize(grpc_call* call, grpc_byte_buffer* req, + ::grpc::Status* status, void** handler_data) final { + ::grpc::ByteBuffer buf; + buf.set_buffer(req); + RequestType* request = nullptr; + ::grpc::experimental::MessageHolder* + allocator_state = nullptr; + if (allocator_ != nullptr) { + allocator_state = allocator_->AllocateMessages(); + } else { + allocator_state = + new (::grpc::g_core_codegen_interface->grpc_call_arena_alloc( + call, sizeof(DefaultMessageHolder))) + DefaultMessageHolder(); + } + *handler_data = allocator_state; + request = allocator_state->request(); + *status = + ::grpc::SerializationTraits::Deserialize(&buf, request); + buf.Release(); + if (status->ok()) { + return request; + } + // Clean up on deserialization failure. + allocator_state->Release(); + return nullptr; + } + + private: + std::function + get_reactor_; + ::grpc::experimental::MessageAllocator* + allocator_ = nullptr; + + class ServerCallbackUnaryImpl : public ServerCallbackUnary { + public: + void Finish(::grpc::Status s) override { + // A callback that only contains a call to MaybeDone can be run as an + // inline callback regardless of whether or not OnDone is inlineable + // because if the actual OnDone callback needs to be scheduled, MaybeDone + // is responsible for dispatching to an executor thread if needed. Thus, + // when setting up the finish_tag_, we can set its own callback to + // inlineable. + finish_tag_.Set( + call_.call(), + [this](bool) { + this->MaybeDone( + reactor_.load(std::memory_order_relaxed)->InternalInlineable()); + }, + &finish_ops_, /*can_inline=*/true); + finish_ops_.set_core_cq_tag(&finish_tag_); + + if (!ctx_->sent_initial_metadata_) { + finish_ops_.SendInitialMetadata(&ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); + if (ctx_->compression_level_set()) { + finish_ops_.set_compression_level(ctx_->compression_level()); + } + ctx_->sent_initial_metadata_ = true; + } + // The response is dropped if the status is not OK. + if (s.ok()) { + finish_ops_.ServerSendStatus(&ctx_->trailing_metadata_, + finish_ops_.SendMessagePtr(response())); + } else { + finish_ops_.ServerSendStatus(&ctx_->trailing_metadata_, s); + } + finish_ops_.set_core_cq_tag(&finish_tag_); + call_.PerformOps(&finish_ops_); + } + + void SendInitialMetadata() override { + GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); + this->Ref(); + // The callback for this function should not be marked inline because it + // is directly invoking a user-controlled reaction + // (OnSendInitialMetadataDone). Thus it must be dispatched to an executor + // thread. However, any OnDone needed after that can be inlined because it + // is already running on an executor thread. + meta_tag_.Set(call_.call(), + [this](bool ok) { + ServerUnaryReactor* reactor = + reactor_.load(std::memory_order_relaxed); + reactor->OnSendInitialMetadataDone(ok); + this->MaybeDone(/*inlineable_ondone=*/true); + }, + &meta_ops_, /*can_inline=*/false); + meta_ops_.SendInitialMetadata(&ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); + if (ctx_->compression_level_set()) { + meta_ops_.set_compression_level(ctx_->compression_level()); + } + ctx_->sent_initial_metadata_ = true; + meta_ops_.set_core_cq_tag(&meta_tag_); + call_.PerformOps(&meta_ops_); + } + + private: + friend class CallbackUnaryHandler; + + ServerCallbackUnaryImpl( + ::grpc_impl::CallbackServerContext* ctx, ::grpc::internal::Call* call, + ::grpc::experimental::MessageHolder* + allocator_state, + std::function call_requester) + : ctx_(ctx), + call_(*call), + allocator_state_(allocator_state), + call_requester_(std::move(call_requester)) { + ctx_->set_message_allocator_state(allocator_state); + } + + /// SetupReactor binds the reactor (which also releases any queued + /// operations), maybe calls OnCancel if possible/needed, and maybe marks + /// the completion of the RPC. This should be the last component of the + /// handler. + void SetupReactor(ServerUnaryReactor* reactor) { + reactor_.store(reactor, std::memory_order_relaxed); + this->BindReactor(reactor); + this->MaybeCallOnCancel(reactor); + this->MaybeDone(reactor->InternalInlineable()); + } + + const RequestType* request() { return allocator_state_->request(); } + ResponseType* response() { return allocator_state_->response(); } + + void CallOnDone() override { + reactor_.load(std::memory_order_relaxed)->OnDone(); + grpc_call* call = call_.call(); + auto call_requester = std::move(call_requester_); + allocator_state_->Release(); + this->~ServerCallbackUnaryImpl(); // explicitly call destructor + ::grpc::g_core_codegen_interface->grpc_call_unref(call); + call_requester(); + } + + ServerReactor* reactor() override { + return reactor_.load(std::memory_order_relaxed); + } + + ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata> + meta_ops_; + ::grpc::internal::CallbackWithSuccessTag meta_tag_; + ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata, + ::grpc::internal::CallOpSendMessage, + ::grpc::internal::CallOpServerSendStatus> + finish_ops_; + ::grpc::internal::CallbackWithSuccessTag finish_tag_; + + ::grpc_impl::CallbackServerContext* const ctx_; + ::grpc::internal::Call call_; + ::grpc::experimental::MessageHolder* const + allocator_state_; + std::function call_requester_; + // reactor_ can always be loaded/stored with relaxed memory ordering because + // its value is only set once, independently of other data in the object, + // and the loads that use it will always actually come provably later even + // though they are from different threads since they are triggered by + // actions initiated only by the setting up of the reactor_ variable. In + // a sense, it's a delayed "const": it gets its value from the SetupReactor + // method (not the constructor, so it's not a true const), but it doesn't + // change after that and it only gets used by actions caused, directly or + // indirectly, by that setup. This comment also applies to the reactor_ + // variables of the other streaming objects in this file. + std::atomic reactor_; + // callbacks_outstanding_ follows a refcount pattern + std::atomic callbacks_outstanding_{ + 3}; // reserve for start, Finish, and CompletionOp + }; +}; + +template +class CallbackClientStreamingHandler : public ::grpc::internal::MethodHandler { + public: + explicit CallbackClientStreamingHandler( + std::function*( + ::grpc_impl::CallbackServerContext*, ResponseType*)> + get_reactor) + : get_reactor_(std::move(get_reactor)) {} + void RunHandler(const HandlerParameter& param) final { + // Arena allocate a reader structure (that includes response) + ::grpc::g_core_codegen_interface->grpc_call_ref(param.call->call()); + + auto* reader = new (::grpc::g_core_codegen_interface->grpc_call_arena_alloc( + param.call->call(), sizeof(ServerCallbackReaderImpl))) + ServerCallbackReaderImpl( + static_cast<::grpc_impl::CallbackServerContext*>( + param.server_context), + param.call, std::move(param.call_requester)); + // Inlineable OnDone can be false in the CompletionOp callback because there + // is no read reactor that has an inlineable OnDone; this only applies to + // the DefaultReactor (which is unary). + param.server_context->BeginCompletionOp( + param.call, + [reader](bool) { reader->MaybeDone(/*inlineable_ondone=*/false); }, + reader); + + ServerReadReactor* reactor = nullptr; + if (param.status.ok()) { + reactor = ::grpc::internal::CatchingReactorGetter< + ServerReadReactor>( + get_reactor_, + static_cast<::grpc_impl::CallbackServerContext*>( + param.server_context), + reader->response()); + } + + if (reactor == nullptr) { + // if deserialization or reactor creator failed, we need to fail the call + reactor = new (::grpc::g_core_codegen_interface->grpc_call_arena_alloc( + param.call->call(), sizeof(UnimplementedReadReactor))) + UnimplementedReadReactor( + ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "")); + } + + reader->SetupReactor(reactor); + } + + private: + std::function*( + ::grpc_impl::CallbackServerContext*, ResponseType*)> + get_reactor_; + + class ServerCallbackReaderImpl : public ServerCallbackReader { + public: + void Finish(::grpc::Status s) override { + // A finish tag with only MaybeDone can have its callback inlined + // regardless even if OnDone is not inlineable because this callback just + // checks a ref and then decides whether or not to dispatch OnDone. + finish_tag_.Set(call_.call(), + [this](bool) { + // Inlineable OnDone can be false here because there is + // no read reactor that has an inlineable OnDone; this + // only applies to the DefaultReactor (which is unary). + this->MaybeDone(/*inlineable_ondone=*/false); + }, + &finish_ops_, /*can_inline=*/true); + if (!ctx_->sent_initial_metadata_) { + finish_ops_.SendInitialMetadata(&ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); + if (ctx_->compression_level_set()) { + finish_ops_.set_compression_level(ctx_->compression_level()); + } + ctx_->sent_initial_metadata_ = true; + } + // The response is dropped if the status is not OK. + if (s.ok()) { + finish_ops_.ServerSendStatus(&ctx_->trailing_metadata_, + finish_ops_.SendMessagePtr(&resp_)); + } else { + finish_ops_.ServerSendStatus(&ctx_->trailing_metadata_, s); + } + finish_ops_.set_core_cq_tag(&finish_tag_); + call_.PerformOps(&finish_ops_); + } + + void SendInitialMetadata() override { + GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); + this->Ref(); + // The callback for this function should not be inlined because it invokes + // a user-controlled reaction, but any resulting OnDone can be inlined in + // the executor to which this callback is dispatched. + meta_tag_.Set(call_.call(), + [this](bool ok) { + ServerReadReactor* reactor = + reactor_.load(std::memory_order_relaxed); + reactor->OnSendInitialMetadataDone(ok); + this->MaybeDone(/*inlineable_ondone=*/true); + }, + &meta_ops_, /*can_inline=*/false); + meta_ops_.SendInitialMetadata(&ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); + if (ctx_->compression_level_set()) { + meta_ops_.set_compression_level(ctx_->compression_level()); + } + ctx_->sent_initial_metadata_ = true; + meta_ops_.set_core_cq_tag(&meta_tag_); + call_.PerformOps(&meta_ops_); + } + + void Read(RequestType* req) override { + this->Ref(); + read_ops_.RecvMessage(req); + call_.PerformOps(&read_ops_); + } + + private: + friend class CallbackClientStreamingHandler; + + ServerCallbackReaderImpl(::grpc_impl::CallbackServerContext* ctx, + ::grpc::internal::Call* call, + std::function call_requester) + : ctx_(ctx), call_(*call), call_requester_(std::move(call_requester)) {} + + void SetupReactor(ServerReadReactor* reactor) { + reactor_.store(reactor, std::memory_order_relaxed); + // The callback for this function should not be inlined because it invokes + // a user-controlled reaction, but any resulting OnDone can be inlined in + // the executor to which this callback is dispatched. + read_tag_.Set(call_.call(), + [this, reactor](bool ok) { + reactor->OnReadDone(ok); + this->MaybeDone(/*inlineable_ondone=*/true); + }, + &read_ops_, /*can_inline=*/false); + read_ops_.set_core_cq_tag(&read_tag_); + this->BindReactor(reactor); + this->MaybeCallOnCancel(reactor); + // Inlineable OnDone can be false here because there is no read + // reactor that has an inlineable OnDone; this only applies to the + // DefaultReactor (which is unary). + this->MaybeDone(/*inlineable_ondone=*/false); + } + + ~ServerCallbackReaderImpl() {} + + ResponseType* response() { return &resp_; } + + void CallOnDone() override { + reactor_.load(std::memory_order_relaxed)->OnDone(); + grpc_call* call = call_.call(); + auto call_requester = std::move(call_requester_); + this->~ServerCallbackReaderImpl(); // explicitly call destructor + ::grpc::g_core_codegen_interface->grpc_call_unref(call); + call_requester(); + } + + ServerReactor* reactor() override { + return reactor_.load(std::memory_order_relaxed); + } + + ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata> + meta_ops_; + ::grpc::internal::CallbackWithSuccessTag meta_tag_; + ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata, + ::grpc::internal::CallOpSendMessage, + ::grpc::internal::CallOpServerSendStatus> + finish_ops_; + ::grpc::internal::CallbackWithSuccessTag finish_tag_; + ::grpc::internal::CallOpSet< + ::grpc::internal::CallOpRecvMessage> + read_ops_; + ::grpc::internal::CallbackWithSuccessTag read_tag_; + + ::grpc_impl::CallbackServerContext* const ctx_; + ::grpc::internal::Call call_; + ResponseType resp_; + std::function call_requester_; + // The memory ordering of reactor_ follows ServerCallbackUnaryImpl. + std::atomic*> reactor_; + // callbacks_outstanding_ follows a refcount pattern + std::atomic callbacks_outstanding_{ + 3}; // reserve for OnStarted, Finish, and CompletionOp + }; +}; + +template +class CallbackServerStreamingHandler : public ::grpc::internal::MethodHandler { + public: + explicit CallbackServerStreamingHandler( + std::function*( + ::grpc_impl::CallbackServerContext*, const RequestType*)> + get_reactor) + : get_reactor_(std::move(get_reactor)) {} + void RunHandler(const HandlerParameter& param) final { + // Arena allocate a writer structure + ::grpc::g_core_codegen_interface->grpc_call_ref(param.call->call()); + + auto* writer = new (::grpc::g_core_codegen_interface->grpc_call_arena_alloc( + param.call->call(), sizeof(ServerCallbackWriterImpl))) + ServerCallbackWriterImpl( + static_cast<::grpc_impl::CallbackServerContext*>( + param.server_context), + param.call, static_cast(param.request), + std::move(param.call_requester)); + // Inlineable OnDone can be false in the CompletionOp callback because there + // is no write reactor that has an inlineable OnDone; this only applies to + // the DefaultReactor (which is unary). + param.server_context->BeginCompletionOp( + param.call, + [writer](bool) { writer->MaybeDone(/*inlineable_ondone=*/false); }, + writer); + + ServerWriteReactor* reactor = nullptr; + if (param.status.ok()) { + reactor = ::grpc::internal::CatchingReactorGetter< + ServerWriteReactor>( + get_reactor_, + static_cast<::grpc_impl::CallbackServerContext*>( + param.server_context), + writer->request()); + } + if (reactor == nullptr) { + // if deserialization or reactor creator failed, we need to fail the call + reactor = new (::grpc::g_core_codegen_interface->grpc_call_arena_alloc( + param.call->call(), sizeof(UnimplementedWriteReactor))) + UnimplementedWriteReactor( + ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "")); + } + + writer->SetupReactor(reactor); + } + + void* Deserialize(grpc_call* call, grpc_byte_buffer* req, + ::grpc::Status* status, void** /*handler_data*/) final { + ::grpc::ByteBuffer buf; + buf.set_buffer(req); + auto* request = + new (::grpc::g_core_codegen_interface->grpc_call_arena_alloc( + call, sizeof(RequestType))) RequestType(); + *status = + ::grpc::SerializationTraits::Deserialize(&buf, request); + buf.Release(); + if (status->ok()) { + return request; + } + request->~RequestType(); + return nullptr; + } + + private: + std::function*( + ::grpc_impl::CallbackServerContext*, const RequestType*)> + get_reactor_; + + class ServerCallbackWriterImpl : public ServerCallbackWriter { + public: + void Finish(::grpc::Status s) override { + // A finish tag with only MaybeDone can have its callback inlined + // regardless even if OnDone is not inlineable because this callback just + // checks a ref and then decides whether or not to dispatch OnDone. + finish_tag_.Set(call_.call(), + [this](bool) { + // Inlineable OnDone can be false here because there is + // no write reactor that has an inlineable OnDone; this + // only applies to the DefaultReactor (which is unary). + this->MaybeDone(/*inlineable_ondone=*/false); + }, + &finish_ops_, /*can_inline=*/true); + finish_ops_.set_core_cq_tag(&finish_tag_); + + if (!ctx_->sent_initial_metadata_) { + finish_ops_.SendInitialMetadata(&ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); + if (ctx_->compression_level_set()) { + finish_ops_.set_compression_level(ctx_->compression_level()); + } + ctx_->sent_initial_metadata_ = true; + } + finish_ops_.ServerSendStatus(&ctx_->trailing_metadata_, s); + call_.PerformOps(&finish_ops_); + } + + void SendInitialMetadata() override { + GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); + this->Ref(); + // The callback for this function should not be inlined because it invokes + // a user-controlled reaction, but any resulting OnDone can be inlined in + // the executor to which this callback is dispatched. + meta_tag_.Set(call_.call(), + [this](bool ok) { + ServerWriteReactor* reactor = + reactor_.load(std::memory_order_relaxed); + reactor->OnSendInitialMetadataDone(ok); + this->MaybeDone(/*inlineable_ondone=*/true); + }, + &meta_ops_, /*can_inline=*/false); + meta_ops_.SendInitialMetadata(&ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); + if (ctx_->compression_level_set()) { + meta_ops_.set_compression_level(ctx_->compression_level()); + } + ctx_->sent_initial_metadata_ = true; + meta_ops_.set_core_cq_tag(&meta_tag_); + call_.PerformOps(&meta_ops_); + } + + void Write(const ResponseType* resp, + ::grpc::WriteOptions options) override { + this->Ref(); + if (options.is_last_message()) { + options.set_buffer_hint(); + } + if (!ctx_->sent_initial_metadata_) { + write_ops_.SendInitialMetadata(&ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); + if (ctx_->compression_level_set()) { + write_ops_.set_compression_level(ctx_->compression_level()); + } + ctx_->sent_initial_metadata_ = true; + } + // TODO(vjpai): don't assert + GPR_CODEGEN_ASSERT(write_ops_.SendMessagePtr(resp, options).ok()); + call_.PerformOps(&write_ops_); + } + + void WriteAndFinish(const ResponseType* resp, ::grpc::WriteOptions options, + ::grpc::Status s) override { + // This combines the write into the finish callback + // Don't send any message if the status is bad + if (s.ok()) { + // TODO(vjpai): don't assert + GPR_CODEGEN_ASSERT(finish_ops_.SendMessagePtr(resp, options).ok()); + } + Finish(std::move(s)); + } + + private: + friend class CallbackServerStreamingHandler; + + ServerCallbackWriterImpl(::grpc_impl::CallbackServerContext* ctx, + ::grpc::internal::Call* call, + const RequestType* req, + std::function call_requester) + : ctx_(ctx), + call_(*call), + req_(req), + call_requester_(std::move(call_requester)) {} + + void SetupReactor(ServerWriteReactor* reactor) { + reactor_.store(reactor, std::memory_order_relaxed); + // The callback for this function should not be inlined because it invokes + // a user-controlled reaction, but any resulting OnDone can be inlined in + // the executor to which this callback is dispatched. + write_tag_.Set(call_.call(), + [this, reactor](bool ok) { + reactor->OnWriteDone(ok); + this->MaybeDone(/*inlineable_ondone=*/true); + }, + &write_ops_, /*can_inline=*/false); + write_ops_.set_core_cq_tag(&write_tag_); + this->BindReactor(reactor); + this->MaybeCallOnCancel(reactor); + // Inlineable OnDone can be false here because there is no write + // reactor that has an inlineable OnDone; this only applies to the + // DefaultReactor (which is unary). + this->MaybeDone(/*inlineable_ondone=*/false); + } + ~ServerCallbackWriterImpl() { req_->~RequestType(); } + + const RequestType* request() { return req_; } + + void CallOnDone() override { + reactor_.load(std::memory_order_relaxed)->OnDone(); + grpc_call* call = call_.call(); + auto call_requester = std::move(call_requester_); + this->~ServerCallbackWriterImpl(); // explicitly call destructor + ::grpc::g_core_codegen_interface->grpc_call_unref(call); + call_requester(); + } + + ServerReactor* reactor() override { + return reactor_.load(std::memory_order_relaxed); + } + + ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata> + meta_ops_; + ::grpc::internal::CallbackWithSuccessTag meta_tag_; + ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata, + ::grpc::internal::CallOpSendMessage, + ::grpc::internal::CallOpServerSendStatus> + finish_ops_; + ::grpc::internal::CallbackWithSuccessTag finish_tag_; + ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata, + ::grpc::internal::CallOpSendMessage> + write_ops_; + ::grpc::internal::CallbackWithSuccessTag write_tag_; + + ::grpc_impl::CallbackServerContext* const ctx_; + ::grpc::internal::Call call_; + const RequestType* req_; + std::function call_requester_; + // The memory ordering of reactor_ follows ServerCallbackUnaryImpl. + std::atomic*> reactor_; + // callbacks_outstanding_ follows a refcount pattern + std::atomic callbacks_outstanding_{ + 3}; // reserve for OnStarted, Finish, and CompletionOp + }; +}; + +template +class CallbackBidiHandler : public ::grpc::internal::MethodHandler { + public: + explicit CallbackBidiHandler( + std::function*( + ::grpc_impl::CallbackServerContext*)> + get_reactor) + : get_reactor_(std::move(get_reactor)) {} + void RunHandler(const HandlerParameter& param) final { + ::grpc::g_core_codegen_interface->grpc_call_ref(param.call->call()); + + auto* stream = new (::grpc::g_core_codegen_interface->grpc_call_arena_alloc( + param.call->call(), sizeof(ServerCallbackReaderWriterImpl))) + ServerCallbackReaderWriterImpl( + static_cast<::grpc_impl::CallbackServerContext*>( + param.server_context), + param.call, std::move(param.call_requester)); + // Inlineable OnDone can be false in the CompletionOp callback because there + // is no bidi reactor that has an inlineable OnDone; this only applies to + // the DefaultReactor (which is unary). + param.server_context->BeginCompletionOp( + param.call, + [stream](bool) { stream->MaybeDone(/*inlineable_ondone=*/false); }, + stream); + + ServerBidiReactor* reactor = nullptr; + if (param.status.ok()) { + reactor = ::grpc::internal::CatchingReactorGetter< + ServerBidiReactor>( + get_reactor_, static_cast<::grpc_impl::CallbackServerContext*>( + param.server_context)); + } + + if (reactor == nullptr) { + // if deserialization or reactor creator failed, we need to fail the call + reactor = new (::grpc::g_core_codegen_interface->grpc_call_arena_alloc( + param.call->call(), + sizeof(UnimplementedBidiReactor))) + UnimplementedBidiReactor( + ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "")); + } + + stream->SetupReactor(reactor); + } + + private: + std::function*( + ::grpc_impl::CallbackServerContext*)> + get_reactor_; + + class ServerCallbackReaderWriterImpl + : public ServerCallbackReaderWriter { + public: + void Finish(::grpc::Status s) override { + // A finish tag with only MaybeDone can have its callback inlined + // regardless even if OnDone is not inlineable because this callback just + // checks a ref and then decides whether or not to dispatch OnDone. + finish_tag_.Set(call_.call(), + [this](bool) { + // Inlineable OnDone can be false here because there is + // no bidi reactor that has an inlineable OnDone; this + // only applies to the DefaultReactor (which is unary). + this->MaybeDone(/*inlineable_ondone=*/false); + }, + &finish_ops_, /*can_inline=*/true); + finish_ops_.set_core_cq_tag(&finish_tag_); + + if (!ctx_->sent_initial_metadata_) { + finish_ops_.SendInitialMetadata(&ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); + if (ctx_->compression_level_set()) { + finish_ops_.set_compression_level(ctx_->compression_level()); + } + ctx_->sent_initial_metadata_ = true; + } + finish_ops_.ServerSendStatus(&ctx_->trailing_metadata_, s); + call_.PerformOps(&finish_ops_); + } + + void SendInitialMetadata() override { + GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); + this->Ref(); + // The callback for this function should not be inlined because it invokes + // a user-controlled reaction, but any resulting OnDone can be inlined in + // the executor to which this callback is dispatched. + meta_tag_.Set(call_.call(), + [this](bool ok) { + ServerBidiReactor* reactor = + reactor_.load(std::memory_order_relaxed); + reactor->OnSendInitialMetadataDone(ok); + this->MaybeDone(/*inlineable_ondone=*/true); + }, + &meta_ops_, /*can_inline=*/false); + meta_ops_.SendInitialMetadata(&ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); + if (ctx_->compression_level_set()) { + meta_ops_.set_compression_level(ctx_->compression_level()); + } + ctx_->sent_initial_metadata_ = true; + meta_ops_.set_core_cq_tag(&meta_tag_); + call_.PerformOps(&meta_ops_); + } + + void Write(const ResponseType* resp, + ::grpc::WriteOptions options) override { + this->Ref(); + if (options.is_last_message()) { + options.set_buffer_hint(); + } + if (!ctx_->sent_initial_metadata_) { + write_ops_.SendInitialMetadata(&ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); + if (ctx_->compression_level_set()) { + write_ops_.set_compression_level(ctx_->compression_level()); + } + ctx_->sent_initial_metadata_ = true; + } + // TODO(vjpai): don't assert + GPR_CODEGEN_ASSERT(write_ops_.SendMessagePtr(resp, options).ok()); + call_.PerformOps(&write_ops_); + } + + void WriteAndFinish(const ResponseType* resp, ::grpc::WriteOptions options, + ::grpc::Status s) override { + // Don't send any message if the status is bad + if (s.ok()) { + // TODO(vjpai): don't assert + GPR_CODEGEN_ASSERT(finish_ops_.SendMessagePtr(resp, options).ok()); + } + Finish(std::move(s)); + } + + void Read(RequestType* req) override { + this->Ref(); + read_ops_.RecvMessage(req); + call_.PerformOps(&read_ops_); + } + + private: + friend class CallbackBidiHandler; + + ServerCallbackReaderWriterImpl(::grpc_impl::CallbackServerContext* ctx, + ::grpc::internal::Call* call, + std::function call_requester) + : ctx_(ctx), call_(*call), call_requester_(std::move(call_requester)) {} + + void SetupReactor(ServerBidiReactor* reactor) { + reactor_.store(reactor, std::memory_order_relaxed); + // The callbacks for these functions should not be inlined because they + // invoke user-controlled reactions, but any resulting OnDones can be + // inlined in the executor to which a callback is dispatched. + write_tag_.Set(call_.call(), + [this, reactor](bool ok) { + reactor->OnWriteDone(ok); + this->MaybeDone(/*inlineable_ondone=*/true); + }, + &write_ops_, /*can_inline=*/false); + write_ops_.set_core_cq_tag(&write_tag_); + read_tag_.Set(call_.call(), + [this, reactor](bool ok) { + reactor->OnReadDone(ok); + this->MaybeDone(/*inlineable_ondone=*/true); + }, + &read_ops_, /*can_inline=*/false); + read_ops_.set_core_cq_tag(&read_tag_); + this->BindReactor(reactor); + this->MaybeCallOnCancel(reactor); + // Inlineable OnDone can be false here because there is no bidi + // reactor that has an inlineable OnDone; this only applies to the + // DefaultReactor (which is unary). + this->MaybeDone(/*inlineable_ondone=*/false); + } + + void CallOnDone() override { + reactor_.load(std::memory_order_relaxed)->OnDone(); + grpc_call* call = call_.call(); + auto call_requester = std::move(call_requester_); + this->~ServerCallbackReaderWriterImpl(); // explicitly call destructor + ::grpc::g_core_codegen_interface->grpc_call_unref(call); + call_requester(); + } + + ServerReactor* reactor() override { + return reactor_.load(std::memory_order_relaxed); + } + + ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata> + meta_ops_; + ::grpc::internal::CallbackWithSuccessTag meta_tag_; + ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata, + ::grpc::internal::CallOpSendMessage, + ::grpc::internal::CallOpServerSendStatus> + finish_ops_; + ::grpc::internal::CallbackWithSuccessTag finish_tag_; + ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata, + ::grpc::internal::CallOpSendMessage> + write_ops_; + ::grpc::internal::CallbackWithSuccessTag write_tag_; + ::grpc::internal::CallOpSet< + ::grpc::internal::CallOpRecvMessage> + read_ops_; + ::grpc::internal::CallbackWithSuccessTag read_tag_; + + ::grpc_impl::CallbackServerContext* const ctx_; + ::grpc::internal::Call call_; + std::function call_requester_; + // The memory ordering of reactor_ follows ServerCallbackUnaryImpl. + std::atomic*> reactor_; + // callbacks_outstanding_ follows a refcount pattern + std::atomic callbacks_outstanding_{ + 3}; // reserve for OnStarted, Finish, and CompletionOp + }; +}; + +} // namespace internal +} // namespace grpc_impl + +#endif // GRPCPP_IMPL_CODEGEN_SERVER_CALLBACK_HANDLERS_H diff --git a/include/grpcpp/impl/codegen/server_callback_impl.h b/include/grpcpp/impl/codegen/server_callback_impl.h new file mode 100644 index 00000000..f19ab427 --- /dev/null +++ b/include/grpcpp/impl/codegen/server_callback_impl.h @@ -0,0 +1,783 @@ +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef GRPCPP_IMPL_CODEGEN_SERVER_CALLBACK_IMPL_H +#define GRPCPP_IMPL_CODEGEN_SERVER_CALLBACK_IMPL_H + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace grpc_impl { + +// Declare base class of all reactors as internal +namespace internal { + +// Forward declarations +template +class CallbackUnaryHandler; +template +class CallbackClientStreamingHandler; +template +class CallbackServerStreamingHandler; +template +class CallbackBidiHandler; + +class ServerReactor { + public: + virtual ~ServerReactor() = default; + virtual void OnDone() = 0; + virtual void OnCancel() = 0; + + // The following is not API. It is for internal use only and specifies whether + // all reactions of this Reactor can be run without an extra executor + // scheduling. This should only be used for internally-defined reactors with + // trivial reactions. + virtual bool InternalInlineable() { return false; } + + private: + template + friend class CallbackUnaryHandler; + template + friend class CallbackClientStreamingHandler; + template + friend class CallbackServerStreamingHandler; + template + friend class CallbackBidiHandler; +}; + +/// The base class of ServerCallbackUnary etc. +class ServerCallbackCall { + public: + virtual ~ServerCallbackCall() {} + + // This object is responsible for tracking when it is safe to call OnDone and + // OnCancel. OnDone should not be called until the method handler is complete, + // Finish has been called, the ServerContext CompletionOp (which tracks + // cancellation or successful completion) has completed, and all outstanding + // Read/Write actions have seen their reactions. OnCancel should not be called + // until after the method handler is done and the RPC has completed with a + // cancellation. This is tracked by counting how many of these conditions have + // been met and calling OnCancel when none remain unmet. + + // Public versions of MaybeDone: one where we don't know the reactor in + // advance (used for the ServerContext CompletionOp), and one for where we + // know the inlineability of the OnDone reaction. You should set the inline + // flag to true if either the Reactor is InternalInlineable() or if this + // callback is already being forced to run dispatched to an executor + // (typically because it contains additional work than just the MaybeDone). + + void MaybeDone() { + if (GPR_UNLIKELY(Unref() == 1)) { + ScheduleOnDone(reactor()->InternalInlineable()); + } + } + + void MaybeDone(bool inline_ondone) { + if (GPR_UNLIKELY(Unref() == 1)) { + ScheduleOnDone(inline_ondone); + } + } + + // Fast version called with known reactor passed in, used from derived + // classes, typically in non-cancel case + void MaybeCallOnCancel(ServerReactor* reactor) { + if (GPR_UNLIKELY(UnblockCancellation())) { + CallOnCancel(reactor); + } + } + + // Slower version called from object that doesn't know the reactor a priori + // (such as the ServerContext CompletionOp which is formed before the + // reactor). This is used in cancel cases only, so it's ok to be slower and + // invoke a virtual function. + void MaybeCallOnCancel() { + if (GPR_UNLIKELY(UnblockCancellation())) { + CallOnCancel(reactor()); + } + } + + protected: + /// Increases the reference count + void Ref() { callbacks_outstanding_.fetch_add(1, std::memory_order_relaxed); } + + private: + virtual ServerReactor* reactor() = 0; + + // CallOnDone performs the work required at completion of the RPC: invoking + // the OnDone function and doing all necessary cleanup. This function is only + // ever invoked on a fully-Unref'fed ServerCallbackCall. + virtual void CallOnDone() = 0; + + // If the OnDone reaction is inlineable, execute it inline. Otherwise send it + // to an executor. + void ScheduleOnDone(bool inline_ondone); + + // If the OnCancel reaction is inlineable, execute it inline. Otherwise send + // it to an executor. + void CallOnCancel(ServerReactor* reactor); + + // Implement the cancellation constraint counter. Return true if OnCancel + // should be called, false otherwise. + bool UnblockCancellation() { + return on_cancel_conditions_remaining_.fetch_sub( + 1, std::memory_order_acq_rel) == 1; + } + + /// Decreases the reference count and returns the previous value + int Unref() { + return callbacks_outstanding_.fetch_sub(1, std::memory_order_acq_rel); + } + + std::atomic_int on_cancel_conditions_remaining_{2}; + std::atomic_int callbacks_outstanding_{ + 3}; // reserve for start, Finish, and CompletionOp +}; + +template +class DefaultMessageHolder + : public ::grpc::experimental::MessageHolder { + public: + DefaultMessageHolder() { + this->set_request(&request_obj_); + this->set_response(&response_obj_); + } + void Release() override { + // the object is allocated in the call arena. + this->~DefaultMessageHolder(); + } + + private: + Request request_obj_; + Response response_obj_; +}; + +} // namespace internal + +// Forward declarations +class ServerUnaryReactor; +template +class ServerReadReactor; +template +class ServerWriteReactor; +template +class ServerBidiReactor; + +// NOTE: The actual call/stream object classes are provided as API only to +// support mocking. There are no implementations of these class interfaces in +// the API. +class ServerCallbackUnary : public internal::ServerCallbackCall { + public: + virtual ~ServerCallbackUnary() {} + virtual void Finish(::grpc::Status s) = 0; + virtual void SendInitialMetadata() = 0; + + protected: + // Use a template rather than explicitly specifying ServerUnaryReactor to + // delay binding and avoid a circular forward declaration issue + template + void BindReactor(Reactor* reactor) { + reactor->InternalBindCall(this); + } +}; + +template +class ServerCallbackReader : public internal::ServerCallbackCall { + public: + virtual ~ServerCallbackReader() {} + virtual void Finish(::grpc::Status s) = 0; + virtual void SendInitialMetadata() = 0; + virtual void Read(Request* msg) = 0; + + protected: + void BindReactor(ServerReadReactor* reactor) { + reactor->InternalBindReader(this); + } +}; + +template +class ServerCallbackWriter : public internal::ServerCallbackCall { + public: + virtual ~ServerCallbackWriter() {} + + virtual void Finish(::grpc::Status s) = 0; + virtual void SendInitialMetadata() = 0; + virtual void Write(const Response* msg, ::grpc::WriteOptions options) = 0; + virtual void WriteAndFinish(const Response* msg, ::grpc::WriteOptions options, + ::grpc::Status s) = 0; + + protected: + void BindReactor(ServerWriteReactor* reactor) { + reactor->InternalBindWriter(this); + } +}; + +template +class ServerCallbackReaderWriter : public internal::ServerCallbackCall { + public: + virtual ~ServerCallbackReaderWriter() {} + + virtual void Finish(::grpc::Status s) = 0; + virtual void SendInitialMetadata() = 0; + virtual void Read(Request* msg) = 0; + virtual void Write(const Response* msg, ::grpc::WriteOptions options) = 0; + virtual void WriteAndFinish(const Response* msg, ::grpc::WriteOptions options, + ::grpc::Status s) = 0; + + protected: + void BindReactor(ServerBidiReactor* reactor) { + reactor->InternalBindStream(this); + } +}; + +// The following classes are the reactor interfaces that are to be implemented +// by the user, returned as the output parameter of the method handler for a +// callback method. Note that none of the classes are pure; all reactions have a +// default empty reaction so that the user class only needs to override those +// classes that it cares about. + +/// \a ServerBidiReactor is the interface for a bidirectional streaming RPC. +template +class ServerBidiReactor : public internal::ServerReactor { + public: + // NOTE: Initializing stream_ as a constructor initializer rather than a + // default initializer because gcc-4.x requires a copy constructor for + // default initializing a templated member, which isn't ok for atomic. + // TODO(vjpai): Switch to default constructor and default initializer when + // gcc-4.x is no longer supported + ServerBidiReactor() : stream_(nullptr) {} + ~ServerBidiReactor() = default; + + /// Send any initial metadata stored in the RPC context. If not invoked, + /// any initial metadata will be passed along with the first Write or the + /// Finish (if there are no writes). + void StartSendInitialMetadata() { + ServerCallbackReaderWriter* stream = + stream_.load(std::memory_order_acquire); + if (stream == nullptr) { + grpc::internal::MutexLock l(&stream_mu_); + stream = stream_.load(std::memory_order_relaxed); + if (stream == nullptr) { + backlog_.send_initial_metadata_wanted = true; + return; + } + } + stream->SendInitialMetadata(); + } + + /// Initiate a read operation. + /// + /// \param[out] req Where to eventually store the read message. Valid when + /// the library calls OnReadDone + void StartRead(Request* req) { + ServerCallbackReaderWriter* stream = + stream_.load(std::memory_order_acquire); + if (stream == nullptr) { + grpc::internal::MutexLock l(&stream_mu_); + stream = stream_.load(std::memory_order_relaxed); + if (stream == nullptr) { + backlog_.read_wanted = req; + return; + } + } + stream->Read(req); + } + + /// Initiate a write operation. + /// + /// \param[in] resp The message to be written. The library does not take + /// ownership but the caller must ensure that the message is + /// not deleted or modified until OnWriteDone is called. + void StartWrite(const Response* resp) { + StartWrite(resp, ::grpc::WriteOptions()); + } + + /// Initiate a write operation with specified options. + /// + /// \param[in] resp The message to be written. The library does not take + /// ownership but the caller must ensure that the message is + /// not deleted or modified until OnWriteDone is called. + /// \param[in] options The WriteOptions to use for writing this message + void StartWrite(const Response* resp, ::grpc::WriteOptions options) { + ServerCallbackReaderWriter* stream = + stream_.load(std::memory_order_acquire); + if (stream == nullptr) { + grpc::internal::MutexLock l(&stream_mu_); + stream = stream_.load(std::memory_order_relaxed); + if (stream == nullptr) { + backlog_.write_wanted = resp; + backlog_.write_options_wanted = std::move(options); + return; + } + } + stream->Write(resp, std::move(options)); + } + + /// Initiate a write operation with specified options and final RPC Status, + /// which also causes any trailing metadata for this RPC to be sent out. + /// StartWriteAndFinish is like merging StartWriteLast and Finish into a + /// single step. A key difference, though, is that this operation doesn't have + /// an OnWriteDone reaction - it is considered complete only when OnDone is + /// available. An RPC can either have StartWriteAndFinish or Finish, but not + /// both. + /// + /// \param[in] resp The message to be written. The library does not take + /// ownership but the caller must ensure that the message is + /// not deleted or modified until OnDone is called. + /// \param[in] options The WriteOptions to use for writing this message + /// \param[in] s The status outcome of this RPC + void StartWriteAndFinish(const Response* resp, ::grpc::WriteOptions options, + ::grpc::Status s) { + ServerCallbackReaderWriter* stream = + stream_.load(std::memory_order_acquire); + if (stream == nullptr) { + grpc::internal::MutexLock l(&stream_mu_); + stream = stream_.load(std::memory_order_relaxed); + if (stream == nullptr) { + backlog_.write_and_finish_wanted = true; + backlog_.write_wanted = resp; + backlog_.write_options_wanted = std::move(options); + backlog_.status_wanted = std::move(s); + return; + } + } + stream->WriteAndFinish(resp, std::move(options), std::move(s)); + } + + /// Inform system of a planned write operation with specified options, but + /// allow the library to schedule the actual write coalesced with the writing + /// of trailing metadata (which takes place on a Finish call). + /// + /// \param[in] resp The message to be written. The library does not take + /// ownership but the caller must ensure that the message is + /// not deleted or modified until OnWriteDone is called. + /// \param[in] options The WriteOptions to use for writing this message + void StartWriteLast(const Response* resp, ::grpc::WriteOptions options) { + StartWrite(resp, std::move(options.set_last_message())); + } + + /// Indicate that the stream is to be finished and the trailing metadata and + /// RPC status are to be sent. Every RPC MUST be finished using either Finish + /// or StartWriteAndFinish (but not both), even if the RPC is already + /// cancelled. + /// + /// \param[in] s The status outcome of this RPC + void Finish(::grpc::Status s) { + ServerCallbackReaderWriter* stream = + stream_.load(std::memory_order_acquire); + if (stream == nullptr) { + grpc::internal::MutexLock l(&stream_mu_); + stream = stream_.load(std::memory_order_relaxed); + if (stream == nullptr) { + backlog_.finish_wanted = true; + backlog_.status_wanted = std::move(s); + return; + } + } + stream->Finish(std::move(s)); + } + + /// Notifies the application that an explicit StartSendInitialMetadata + /// operation completed. Not used when the sending of initial metadata + /// piggybacks onto the first write. + /// + /// \param[in] ok Was it successful? If false, no further write-side operation + /// will succeed. + virtual void OnSendInitialMetadataDone(bool /*ok*/) {} + + /// Notifies the application that a StartRead operation completed. + /// + /// \param[in] ok Was it successful? If false, no further read-side operation + /// will succeed. + virtual void OnReadDone(bool /*ok*/) {} + + /// Notifies the application that a StartWrite (or StartWriteLast) operation + /// completed. + /// + /// \param[in] ok Was it successful? If false, no further write-side operation + /// will succeed. + virtual void OnWriteDone(bool /*ok*/) {} + + /// Notifies the application that all operations associated with this RPC + /// have completed. This is an override (from the internal base class) but + /// still abstract, so derived classes MUST override it to be instantiated. + void OnDone() override = 0; + + /// Notifies the application that this RPC has been cancelled. This is an + /// override (from the internal base class) but not final, so derived classes + /// should override it if they want to take action. + void OnCancel() override {} + + private: + friend class ServerCallbackReaderWriter; + // May be overridden by internal implementation details. This is not a public + // customization point. + virtual void InternalBindStream( + ServerCallbackReaderWriter* stream) { + // TODO(vjpai): When stream_or_backlog_ becomes a variant (see below), use + // a scoped MutexLock and std::swap stream_or_backlog_ with a variant that + // has stream, then std::get out of that after the lock. + // Do likewise with the remaining InternalBind* functions as well. + grpc::internal::ReleasableMutexLock l(&stream_mu_); + PreBindBacklog ops(std::move(backlog_)); + stream_.store(stream, std::memory_order_release); + l.Unlock(); + + if (ops.send_initial_metadata_wanted) { + stream->SendInitialMetadata(); + } + if (ops.read_wanted != nullptr) { + stream->Read(ops.read_wanted); + } + if (ops.write_and_finish_wanted) { + stream->WriteAndFinish(ops.write_wanted, + std::move(ops.write_options_wanted), + std::move(ops.status_wanted)); + } else { + if (ops.write_wanted != nullptr) { + stream->Write(ops.write_wanted, std::move(ops.write_options_wanted)); + } + if (ops.finish_wanted) { + stream->Finish(std::move(ops.status_wanted)); + } + } + } + + grpc::internal::Mutex stream_mu_; + // TODO(vjpai): Make stream_or_backlog_ into a std::variant or absl::variant + // once C++17 or ABSL is supported since stream and backlog are + // mutually exclusive in this class. Do likewise with the + // remaining reactor classes and their backlogs as well. + std::atomic*> stream_{nullptr}; + struct PreBindBacklog { + bool send_initial_metadata_wanted = false; + bool write_and_finish_wanted = false; + bool finish_wanted = false; + Request* read_wanted = nullptr; + const Response* write_wanted = nullptr; + ::grpc::WriteOptions write_options_wanted; + ::grpc::Status status_wanted; + }; + PreBindBacklog backlog_ /* GUARDED_BY(stream_mu_) */; +}; + +/// \a ServerReadReactor is the interface for a client-streaming RPC. +template +class ServerReadReactor : public internal::ServerReactor { + public: + ServerReadReactor() : reader_(nullptr) {} + ~ServerReadReactor() = default; + + /// The following operation initiations are exactly like ServerBidiReactor. + void StartSendInitialMetadata() { + ServerCallbackReader* reader = + reader_.load(std::memory_order_acquire); + if (reader == nullptr) { + grpc::internal::MutexLock l(&reader_mu_); + reader = reader_.load(std::memory_order_relaxed); + if (reader == nullptr) { + backlog_.send_initial_metadata_wanted = true; + return; + } + } + reader->SendInitialMetadata(); + } + void StartRead(Request* req) { + ServerCallbackReader* reader = + reader_.load(std::memory_order_acquire); + if (reader == nullptr) { + grpc::internal::MutexLock l(&reader_mu_); + reader = reader_.load(std::memory_order_relaxed); + if (reader == nullptr) { + backlog_.read_wanted = req; + return; + } + } + reader->Read(req); + } + void Finish(::grpc::Status s) { + ServerCallbackReader* reader = + reader_.load(std::memory_order_acquire); + if (reader == nullptr) { + grpc::internal::MutexLock l(&reader_mu_); + reader = reader_.load(std::memory_order_relaxed); + if (reader == nullptr) { + backlog_.finish_wanted = true; + backlog_.status_wanted = std::move(s); + return; + } + } + reader->Finish(std::move(s)); + } + + /// The following notifications are exactly like ServerBidiReactor. + virtual void OnSendInitialMetadataDone(bool /*ok*/) {} + virtual void OnReadDone(bool /*ok*/) {} + void OnDone() override = 0; + void OnCancel() override {} + + private: + friend class ServerCallbackReader; + + // May be overridden by internal implementation details. This is not a public + // customization point. + virtual void InternalBindReader(ServerCallbackReader* reader) { + grpc::internal::ReleasableMutexLock l(&reader_mu_); + PreBindBacklog ops(std::move(backlog_)); + reader_.store(reader, std::memory_order_release); + l.Unlock(); + + if (ops.send_initial_metadata_wanted) { + reader->SendInitialMetadata(); + } + if (ops.read_wanted != nullptr) { + reader->Read(ops.read_wanted); + } + if (ops.finish_wanted) { + reader->Finish(std::move(ops.status_wanted)); + } + } + + grpc::internal::Mutex reader_mu_; + std::atomic*> reader_{nullptr}; + struct PreBindBacklog { + bool send_initial_metadata_wanted = false; + bool finish_wanted = false; + Request* read_wanted = nullptr; + ::grpc::Status status_wanted; + }; + PreBindBacklog backlog_ /* GUARDED_BY(reader_mu_) */; +}; + +/// \a ServerWriteReactor is the interface for a server-streaming RPC. +template +class ServerWriteReactor : public internal::ServerReactor { + public: + ServerWriteReactor() : writer_(nullptr) {} + ~ServerWriteReactor() = default; + + /// The following operation initiations are exactly like ServerBidiReactor. + void StartSendInitialMetadata() { + ServerCallbackWriter* writer = + writer_.load(std::memory_order_acquire); + if (writer == nullptr) { + grpc::internal::MutexLock l(&writer_mu_); + writer = writer_.load(std::memory_order_relaxed); + if (writer == nullptr) { + backlog_.send_initial_metadata_wanted = true; + return; + } + } + writer->SendInitialMetadata(); + } + void StartWrite(const Response* resp) { + StartWrite(resp, ::grpc::WriteOptions()); + } + void StartWrite(const Response* resp, ::grpc::WriteOptions options) { + ServerCallbackWriter* writer = + writer_.load(std::memory_order_acquire); + if (writer == nullptr) { + grpc::internal::MutexLock l(&writer_mu_); + writer = writer_.load(std::memory_order_relaxed); + if (writer == nullptr) { + backlog_.write_wanted = resp; + backlog_.write_options_wanted = std::move(options); + return; + } + } + writer->Write(resp, std::move(options)); + } + void StartWriteAndFinish(const Response* resp, ::grpc::WriteOptions options, + ::grpc::Status s) { + ServerCallbackWriter* writer = + writer_.load(std::memory_order_acquire); + if (writer == nullptr) { + grpc::internal::MutexLock l(&writer_mu_); + writer = writer_.load(std::memory_order_relaxed); + if (writer == nullptr) { + backlog_.write_and_finish_wanted = true; + backlog_.write_wanted = resp; + backlog_.write_options_wanted = std::move(options); + backlog_.status_wanted = std::move(s); + return; + } + } + writer->WriteAndFinish(resp, std::move(options), std::move(s)); + } + void StartWriteLast(const Response* resp, ::grpc::WriteOptions options) { + StartWrite(resp, std::move(options.set_last_message())); + } + void Finish(::grpc::Status s) { + ServerCallbackWriter* writer = + writer_.load(std::memory_order_acquire); + if (writer == nullptr) { + grpc::internal::MutexLock l(&writer_mu_); + writer = writer_.load(std::memory_order_relaxed); + if (writer == nullptr) { + backlog_.finish_wanted = true; + backlog_.status_wanted = std::move(s); + return; + } + } + writer->Finish(std::move(s)); + } + + /// The following notifications are exactly like ServerBidiReactor. + virtual void OnSendInitialMetadataDone(bool /*ok*/) {} + virtual void OnWriteDone(bool /*ok*/) {} + void OnDone() override = 0; + void OnCancel() override {} + + private: + friend class ServerCallbackWriter; + // May be overridden by internal implementation details. This is not a public + // customization point. + virtual void InternalBindWriter(ServerCallbackWriter* writer) { + grpc::internal::ReleasableMutexLock l(&writer_mu_); + PreBindBacklog ops(std::move(backlog_)); + writer_.store(writer, std::memory_order_release); + l.Unlock(); + + if (ops.send_initial_metadata_wanted) { + writer->SendInitialMetadata(); + } + if (ops.write_and_finish_wanted) { + writer->WriteAndFinish(ops.write_wanted, + std::move(ops.write_options_wanted), + std::move(ops.status_wanted)); + } else { + if (ops.write_wanted != nullptr) { + writer->Write(ops.write_wanted, std::move(ops.write_options_wanted)); + } + if (ops.finish_wanted) { + writer->Finish(std::move(ops.status_wanted)); + } + } + } + + grpc::internal::Mutex writer_mu_; + std::atomic*> writer_{nullptr}; + struct PreBindBacklog { + bool send_initial_metadata_wanted = false; + bool write_and_finish_wanted = false; + bool finish_wanted = false; + const Response* write_wanted = nullptr; + ::grpc::WriteOptions write_options_wanted; + ::grpc::Status status_wanted; + }; + PreBindBacklog backlog_ /* GUARDED_BY(writer_mu_) */; +}; + +class ServerUnaryReactor : public internal::ServerReactor { + public: + ServerUnaryReactor() : call_(nullptr) {} + ~ServerUnaryReactor() = default; + + /// StartSendInitialMetadata is exactly like ServerBidiReactor. + void StartSendInitialMetadata() { + ServerCallbackUnary* call = call_.load(std::memory_order_acquire); + if (call == nullptr) { + grpc::internal::MutexLock l(&call_mu_); + call = call_.load(std::memory_order_relaxed); + if (call == nullptr) { + backlog_.send_initial_metadata_wanted = true; + return; + } + } + call->SendInitialMetadata(); + } + /// Finish is similar to ServerBidiReactor except for one detail. + /// If the status is non-OK, any message will not be sent. Instead, + /// the client will only receive the status and any trailing metadata. + void Finish(::grpc::Status s) { + ServerCallbackUnary* call = call_.load(std::memory_order_acquire); + if (call == nullptr) { + grpc::internal::MutexLock l(&call_mu_); + call = call_.load(std::memory_order_relaxed); + if (call == nullptr) { + backlog_.finish_wanted = true; + backlog_.status_wanted = std::move(s); + return; + } + } + call->Finish(std::move(s)); + } + + /// The following notifications are exactly like ServerBidiReactor. + virtual void OnSendInitialMetadataDone(bool /*ok*/) {} + void OnDone() override = 0; + void OnCancel() override {} + + private: + friend class ServerCallbackUnary; + // May be overridden by internal implementation details. This is not a public + // customization point. + virtual void InternalBindCall(ServerCallbackUnary* call) { + grpc::internal::ReleasableMutexLock l(&call_mu_); + PreBindBacklog ops(std::move(backlog_)); + call_.store(call, std::memory_order_release); + l.Unlock(); + + if (ops.send_initial_metadata_wanted) { + call->SendInitialMetadata(); + } + if (ops.finish_wanted) { + call->Finish(std::move(ops.status_wanted)); + } + } + + grpc::internal::Mutex call_mu_; + std::atomic call_{nullptr}; + struct PreBindBacklog { + bool send_initial_metadata_wanted = false; + bool finish_wanted = false; + ::grpc::Status status_wanted; + }; + PreBindBacklog backlog_ /* GUARDED_BY(call_mu_) */; +}; + +namespace internal { + +template +class FinishOnlyReactor : public Base { + public: + explicit FinishOnlyReactor(::grpc::Status s) { this->Finish(std::move(s)); } + void OnDone() override { this->~FinishOnlyReactor(); } +}; + +using UnimplementedUnaryReactor = FinishOnlyReactor; +template +using UnimplementedReadReactor = FinishOnlyReactor>; +template +using UnimplementedWriteReactor = + FinishOnlyReactor>; +template +using UnimplementedBidiReactor = + FinishOnlyReactor>; + +} // namespace internal +} // namespace grpc_impl + +#endif // GRPCPP_IMPL_CODEGEN_SERVER_CALLBACK_IMPL_H diff --git a/include/grpcpp/impl/codegen/server_context.h b/include/grpcpp/impl/codegen/server_context.h new file mode 100644 index 00000000..85b309e6 --- /dev/null +++ b/include/grpcpp/impl/codegen/server_context.h @@ -0,0 +1,42 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_SERVER_CONTEXT_H +#define GRPCPP_IMPL_CODEGEN_SERVER_CONTEXT_H + +#include + +namespace grpc { + +typedef ::grpc_impl::ServerContext ServerContext; + +#ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL +typedef ::grpc_impl::ServerContextBase ServerContextBase; +typedef ::grpc_impl::CallbackServerContext CallbackServerContext; +#endif + +// TODO(vjpai): Remove namespace experimental when de-experimentalized fully. +namespace experimental { + +typedef ::grpc_impl::ServerContextBase ServerContextBase; +typedef ::grpc_impl::CallbackServerContext CallbackServerContext; + +} // namespace experimental +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_SERVER_CONTEXT_H diff --git a/include/grpcpp/impl/codegen/server_context_impl.h b/include/grpcpp/impl/codegen/server_context_impl.h new file mode 100644 index 00000000..c5b874aa --- /dev/null +++ b/include/grpcpp/impl/codegen/server_context_impl.h @@ -0,0 +1,602 @@ +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_SERVER_CONTEXT_IMPL_H +#define GRPCPP_IMPL_CODEGEN_SERVER_CONTEXT_IMPL_H + +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct grpc_metadata; +struct grpc_call; +struct census_context; + +namespace grpc_impl { +class ClientContext; +class CompletionQueue; +class Server; +template +class ServerAsyncReader; +template +class ServerAsyncWriter; +template +class ServerAsyncResponseWriter; +template +class ServerAsyncReaderWriter; +template +class ServerReader; +template +class ServerWriter; + +namespace internal { +template +class BidiStreamingHandler; +template +class CallbackUnaryHandler; +template +class CallbackClientStreamingHandler; +template +class CallbackServerStreamingHandler; +template +class CallbackBidiHandler; +template +class ClientStreamingHandler; +template +class RpcMethodHandler; +template +class FinishOnlyReactor; +template +class ServerReaderWriterBody; +template +class ServerStreamingHandler; +class ServerReactor; +template +class TemplatedBidiStreamingHandler; +template <::grpc::StatusCode code> +class ErrorMethodHandler; +} // namespace internal + +} // namespace grpc_impl +namespace grpc { +class GenericServerContext; +class ServerInterface; + +#ifndef GRPC_CALLBACK_API_NONEXPERIMENTAL +namespace experimental { +#endif +class GenericCallbackServerContext; +#ifndef GRPC_CALLBACK_API_NONEXPERIMENTAL +} // namespace experimental +#endif +namespace internal { +class Call; +} // namespace internal + +namespace testing { +class InteropServerContextInspector; +class ServerContextTestSpouse; +class DefaultReactorTestPeer; +} // namespace testing + +} // namespace grpc + +namespace grpc_impl { + +/// Base class of ServerContext. Experimental until callback API is final. +class ServerContextBase { + public: + virtual ~ServerContextBase(); + + /// Return the deadline for the server call. + std::chrono::system_clock::time_point deadline() const { + return ::grpc::Timespec2Timepoint(deadline_); + } + + /// Return a \a gpr_timespec representation of the server call's deadline. + gpr_timespec raw_deadline() const { return deadline_; } + + /// Add the (\a key, \a value) pair to the initial metadata + /// associated with a server call. These are made available at the client side + /// by the \a grpc::ClientContext::GetServerInitialMetadata() method. + /// + /// \warning This method should only be called before sending initial metadata + /// to the client (which can happen explicitly, or implicitly when sending a + /// a response message or status to the client). + /// + /// \param key The metadata key. If \a value is binary data, it must + /// end in "-bin". + /// \param value The metadata value. If its value is binary, the key name + /// must end in "-bin". + /// + /// Metadata must conform to the following format: + /// Custom-Metadata -> Binary-Header / ASCII-Header + /// Binary-Header -> {Header-Name "-bin" } {binary value} + /// ASCII-Header -> Header-Name ASCII-Value + /// Header-Name -> 1*( %x30-39 / %x61-7A / "_" / "-" / ".") ; 0-9 a-z _ - . + /// ASCII-Value -> 1*( %x20-%x7E ) ; space and printable ASCII + void AddInitialMetadata(const grpc::string& key, const grpc::string& value); + + /// Add the (\a key, \a value) pair to the initial metadata + /// associated with a server call. These are made available at the client + /// side by the \a grpc::ClientContext::GetServerTrailingMetadata() method. + /// + /// \warning This method should only be called before sending trailing + /// metadata to the client (which happens when the call is finished and a + /// status is sent to the client). + /// + /// \param key The metadata key. If \a value is binary data, + /// it must end in "-bin". + /// \param value The metadata value. If its value is binary, the key name + /// must end in "-bin". + /// + /// Metadata must conform to the following format: + /// Custom-Metadata -> Binary-Header / ASCII-Header + /// Binary-Header -> {Header-Name "-bin" } {binary value} + /// ASCII-Header -> Header-Name ASCII-Value + /// Header-Name -> 1*( %x30-39 / %x61-7A / "_" / "-" / ".") ; 0-9 a-z _ - . + /// ASCII-Value -> 1*( %x20-%x7E ) ; space and printable ASCII + void AddTrailingMetadata(const grpc::string& key, const grpc::string& value); + + /// IsCancelled is always safe to call when using sync or callback API. + /// When using async API, it is only safe to call IsCancelled after + /// the AsyncNotifyWhenDone tag has been delivered. Thread-safe. + bool IsCancelled() const; + + /// Cancel the Call from the server. This is a best-effort API and + /// depending on when it is called, the RPC may still appear successful to + /// the client. + /// For example, if TryCancel() is called on a separate thread, it might race + /// with the server handler which might return success to the client before + /// TryCancel() was even started by the thread. + /// + /// It is the caller's responsibility to prevent such races and ensure that if + /// TryCancel() is called, the serverhandler must return Status::CANCELLED. + /// The only exception is that if the serverhandler is already returning an + /// error status code, it is ok to not return Status::CANCELLED even if + /// TryCancel() was called. + /// + /// Note that TryCancel() does not change any of the tags that are pending + /// on the completion queue. All pending tags will still be delivered + /// (though their ok result may reflect the effect of cancellation). + void TryCancel() const; + + /// Return a collection of initial metadata key-value pairs sent from the + /// client. Note that keys may happen more than + /// once (ie, a \a std::multimap is returned). + /// + /// It is safe to use this method after initial metadata has been received, + /// Calls always begin with the client sending initial metadata, so this is + /// safe to access as soon as the call has begun on the server side. + /// + /// \return A multimap of initial metadata key-value pairs from the server. + const std::multimap& client_metadata() + const { + return *client_metadata_.map(); + } + + /// Return the compression algorithm to be used by the server call. + grpc_compression_level compression_level() const { + return compression_level_; + } + + /// Set \a level to be the compression level used for the server call. + /// + /// \param level The compression level used for the server call. + void set_compression_level(grpc_compression_level level) { + compression_level_set_ = true; + compression_level_ = level; + } + + /// Return a bool indicating whether the compression level for this call + /// has been set (either implicitly or through a previous call to + /// \a set_compression_level. + bool compression_level_set() const { return compression_level_set_; } + + /// Return the compression algorithm the server call will request be used. + /// Note that the gRPC runtime may decide to ignore this request, for example, + /// due to resource constraints, or if the server is aware the client doesn't + /// support the requested algorithm. + grpc_compression_algorithm compression_algorithm() const { + return compression_algorithm_; + } + /// Set \a algorithm to be the compression algorithm used for the server call. + /// + /// \param algorithm The compression algorithm used for the server call. + void set_compression_algorithm(grpc_compression_algorithm algorithm); + + /// Set the serialized load reporting costs in \a cost_data for the call. + void SetLoadReportingCosts(const std::vector& cost_data); + + /// Return the authentication context for this server call. + /// + /// \see grpc::AuthContext. + std::shared_ptr auth_context() const { + if (auth_context_.get() == nullptr) { + auth_context_ = ::grpc::CreateAuthContext(call_); + } + return auth_context_; + } + + /// Return the peer uri in a string. + /// WARNING: this value is never authenticated or subject to any security + /// related code. It must not be used for any authentication related + /// functionality. Instead, use auth_context. + grpc::string peer() const; + + /// Get the census context associated with this server call. + const struct census_context* census_context() const; + + /// Should be used for framework-level extensions only. + /// Applications never need to call this method. + grpc_call* c_call() { return call_; } + + protected: + /// Async only. Has to be called before the rpc starts. + /// Returns the tag in completion queue when the rpc finishes. + /// IsCancelled() can then be called to check whether the rpc was cancelled. + /// TODO(vjpai): Fix this so that the tag is returned even if the call never + /// starts (https://github.com/grpc/grpc/issues/10136). + void AsyncNotifyWhenDone(void* tag) { + has_notify_when_done_tag_ = true; + async_notify_when_done_tag_ = tag; + } + + /// NOTE: This is an API for advanced users who need custom allocators. + /// Get and maybe mutate the allocator state associated with the current RPC. + /// Currently only applicable for callback unary RPC methods. + /// WARNING: This is experimental API and could be changed or removed. + ::grpc::experimental::RpcAllocatorState* GetRpcAllocatorState() { + return message_allocator_state_; + } + + /// Get a library-owned default unary reactor for use in minimal reaction + /// cases. This supports typical unary RPC usage of providing a response and + /// status. It supports immediate Finish (finish from within the method + /// handler) or delayed Finish (finish called after the method handler + /// invocation). It does not support reacting to cancellation or completion, + /// or early sending of initial metadata. Since this is a library-owned + /// reactor, it should not be delete'd or freed in any way. This is more + /// efficient than creating a user-owned reactor both because of avoiding an + /// allocation and because its minimal reactions are optimized using a core + /// surface flag that allows their reactions to run inline without any + /// thread-hop. + /// + /// This method should not be called more than once or called after return + /// from the method handler. + /// + /// WARNING: This is experimental API and could be changed or removed. + ::grpc_impl::ServerUnaryReactor* DefaultReactor() { + // Short-circuit the case where a default reactor was already set up by + // the TestPeer. + if (test_unary_ != nullptr) { + return reinterpret_cast(&default_reactor_); + } + new (&default_reactor_) Reactor; +#ifndef NDEBUG + bool old = false; + assert(default_reactor_used_.compare_exchange_strong( + old, true, std::memory_order_relaxed)); +#else + default_reactor_used_.store(true, std::memory_order_relaxed); +#endif + return reinterpret_cast(&default_reactor_); + } + + /// Constructors for use by derived classes + ServerContextBase(); + ServerContextBase(gpr_timespec deadline, grpc_metadata_array* arr); + + private: + friend class ::grpc::testing::InteropServerContextInspector; + friend class ::grpc::testing::ServerContextTestSpouse; + friend class ::grpc::testing::DefaultReactorTestPeer; + friend class ::grpc::ServerInterface; + friend class ::grpc_impl::Server; + template + friend class ::grpc_impl::ServerAsyncReader; + template + friend class ::grpc_impl::ServerAsyncWriter; + template + friend class ::grpc_impl::ServerAsyncResponseWriter; + template + friend class ::grpc_impl::ServerAsyncReaderWriter; + template + friend class ::grpc_impl::ServerReader; + template + friend class ::grpc_impl::ServerWriter; + template + friend class ::grpc_impl::internal::ServerReaderWriterBody; + template + friend class ::grpc_impl::internal::RpcMethodHandler; + template + friend class ::grpc_impl::internal::ClientStreamingHandler; + template + friend class ::grpc_impl::internal::ServerStreamingHandler; + template + friend class ::grpc_impl::internal::TemplatedBidiStreamingHandler; + template + friend class ::grpc_impl::internal::CallbackUnaryHandler; + template + friend class ::grpc_impl::internal::CallbackClientStreamingHandler; + template + friend class ::grpc_impl::internal::CallbackServerStreamingHandler; + template + friend class ::grpc_impl::internal::CallbackBidiHandler; + template <::grpc::StatusCode code> + friend class ::grpc_impl::internal::ErrorMethodHandler; + template + friend class ::grpc_impl::internal::FinishOnlyReactor; + friend class ::grpc_impl::ClientContext; + friend class ::grpc::GenericServerContext; +#ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL + friend class ::grpc::GenericCallbackServerContext; +#else + friend class ::grpc::experimental::GenericCallbackServerContext; +#endif + + /// Prevent copying. + ServerContextBase(const ServerContextBase&); + ServerContextBase& operator=(const ServerContextBase&); + + class CompletionOp; + + void BeginCompletionOp( + ::grpc::internal::Call* call, std::function callback, + ::grpc_impl::internal::ServerCallbackCall* callback_controller); + /// Return the tag queued by BeginCompletionOp() + ::grpc::internal::CompletionQueueTag* GetCompletionOpTag(); + + void set_call(grpc_call* call) { call_ = call; } + + void BindDeadlineAndMetadata(gpr_timespec deadline, grpc_metadata_array* arr); + + void Clear(); + + void Setup(gpr_timespec deadline); + + uint32_t initial_metadata_flags() const { return 0; } + + ::grpc::experimental::ServerRpcInfo* set_server_rpc_info( + const char* method, ::grpc::internal::RpcMethod::RpcType type, + const std::vector>& creators) { + if (creators.size() != 0) { + rpc_info_ = new ::grpc::experimental::ServerRpcInfo(this, method, type); + rpc_info_->RegisterInterceptors(creators); + } + return rpc_info_; + } + + void set_message_allocator_state( + ::grpc::experimental::RpcAllocatorState* allocator_state) { + message_allocator_state_ = allocator_state; + } + + CompletionOp* completion_op_; + bool has_notify_when_done_tag_; + void* async_notify_when_done_tag_; + ::grpc::internal::CallbackWithSuccessTag completion_tag_; + + gpr_timespec deadline_; + grpc_call* call_; + ::grpc_impl::CompletionQueue* cq_; + bool sent_initial_metadata_; + mutable std::shared_ptr auth_context_; + mutable ::grpc::internal::MetadataMap client_metadata_; + std::multimap initial_metadata_; + std::multimap trailing_metadata_; + + bool compression_level_set_; + grpc_compression_level compression_level_; + grpc_compression_algorithm compression_algorithm_; + + ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata, + ::grpc::internal::CallOpSendMessage> + pending_ops_; + bool has_pending_ops_; + + ::grpc::experimental::ServerRpcInfo* rpc_info_; + ::grpc::experimental::RpcAllocatorState* message_allocator_state_ = nullptr; + + class Reactor : public ServerUnaryReactor { + public: + void OnCancel() override {} + void OnDone() override {} + // Override InternalInlineable for this class since its reactions are + // trivial and thus do not need to be run from the executor (triggering a + // thread hop). This should only be used by internal reactors (thus the + // name) and not by user application code. + bool InternalInlineable() override { return true; } + }; + + void SetupTestDefaultReactor(std::function func) { + test_unary_.reset(new TestServerCallbackUnary(this, std::move(func))); + } + bool test_status_set() const { + return (test_unary_ != nullptr) && test_unary_->status_set(); + } + ::grpc::Status test_status() const { return test_unary_->status(); } + + class TestServerCallbackUnary : public ::grpc_impl::ServerCallbackUnary { + public: + TestServerCallbackUnary(ServerContextBase* ctx, + std::function func) + : reactor_(ctx->DefaultReactor()), func_(std::move(func)) { + this->BindReactor(reactor_); + } + void Finish(::grpc::Status s) override { + status_ = s; + func_(std::move(s)); + status_set_.store(true, std::memory_order_release); + } + void SendInitialMetadata() override {} + + bool status_set() const { + return status_set_.load(std::memory_order_acquire); + } + ::grpc::Status status() const { return status_; } + + private: + void CallOnDone() override {} + ::grpc_impl::internal::ServerReactor* reactor() override { + return reactor_; + } + + ::grpc_impl::ServerUnaryReactor* const reactor_; + std::atomic_bool status_set_{false}; + ::grpc::Status status_; + const std::function func_; + }; + + typename std::aligned_storage::type + default_reactor_; + std::atomic_bool default_reactor_used_{false}; + std::unique_ptr test_unary_; +}; + +/// A ServerContext or CallbackServerContext allows the code implementing a +/// service handler to: +/// +/// - Add custom initial and trailing metadata key-value pairs that will +/// propagated to the client side. +/// - Control call settings such as compression and authentication. +/// - Access metadata coming from the client. +/// - Get performance metrics (ie, census). +/// +/// Context settings are only relevant to the call handler they are supplied to, +/// that is to say, they aren't sticky across multiple calls. Some of these +/// settings, such as the compression options, can be made persistent at server +/// construction time by specifying the appropriate \a ChannelArguments +/// to a \a grpc::ServerBuilder, via \a ServerBuilder::AddChannelArgument. +/// +/// \warning ServerContext instances should \em not be reused across rpcs. +class ServerContext : public ServerContextBase { + public: + ServerContext() {} // for async calls + + using ServerContextBase::AddInitialMetadata; + using ServerContextBase::AddTrailingMetadata; + using ServerContextBase::auth_context; + using ServerContextBase::c_call; + using ServerContextBase::census_context; + using ServerContextBase::client_metadata; + using ServerContextBase::compression_algorithm; + using ServerContextBase::compression_level; + using ServerContextBase::compression_level_set; + using ServerContextBase::deadline; + using ServerContextBase::IsCancelled; + using ServerContextBase::peer; + using ServerContextBase::raw_deadline; + using ServerContextBase::set_compression_algorithm; + using ServerContextBase::set_compression_level; + using ServerContextBase::SetLoadReportingCosts; + using ServerContextBase::TryCancel; + + // Sync/CQ-based Async ServerContext only + using ServerContextBase::AsyncNotifyWhenDone; + + private: + // Constructor for internal use by server only + friend class ::grpc_impl::Server; + ServerContext(gpr_timespec deadline, grpc_metadata_array* arr) + : ServerContextBase(deadline, arr) {} + + // CallbackServerContext only + using ServerContextBase::DefaultReactor; + using ServerContextBase::GetRpcAllocatorState; + + /// Prevent copying. + ServerContext(const ServerContext&) = delete; + ServerContext& operator=(const ServerContext&) = delete; +}; + +class CallbackServerContext : public ServerContextBase { + public: + /// Public constructors are for direct use only by mocking tests. In practice, + /// these objects will be owned by the library. + CallbackServerContext() {} + + using ServerContextBase::AddInitialMetadata; + using ServerContextBase::AddTrailingMetadata; + using ServerContextBase::auth_context; + using ServerContextBase::c_call; + using ServerContextBase::census_context; + using ServerContextBase::client_metadata; + using ServerContextBase::compression_algorithm; + using ServerContextBase::compression_level; + using ServerContextBase::compression_level_set; + using ServerContextBase::deadline; + using ServerContextBase::IsCancelled; + using ServerContextBase::peer; + using ServerContextBase::raw_deadline; + using ServerContextBase::set_compression_algorithm; + using ServerContextBase::set_compression_level; + using ServerContextBase::SetLoadReportingCosts; + using ServerContextBase::TryCancel; + + // CallbackServerContext only + using ServerContextBase::DefaultReactor; + using ServerContextBase::GetRpcAllocatorState; + + private: + // Sync/CQ-based Async ServerContext only + using ServerContextBase::AsyncNotifyWhenDone; + + /// Prevent copying. + CallbackServerContext(const CallbackServerContext&) = delete; + CallbackServerContext& operator=(const CallbackServerContext&) = delete; +}; + +} // namespace grpc_impl + +static_assert(std::is_base_of<::grpc_impl::ServerContextBase, + ::grpc_impl::ServerContext>::value, + "improper base class"); +static_assert(std::is_base_of<::grpc_impl::ServerContextBase, + ::grpc_impl::CallbackServerContext>::value, + "improper base class"); +static_assert(sizeof(::grpc_impl::ServerContextBase) == + sizeof(::grpc_impl::ServerContext), + "wrong size"); +static_assert(sizeof(::grpc_impl::ServerContextBase) == + sizeof(::grpc_impl::CallbackServerContext), + "wrong size"); + +#endif // GRPCPP_IMPL_CODEGEN_SERVER_CONTEXT_IMPL_H diff --git a/include/grpcpp/impl/codegen/server_interceptor.h b/include/grpcpp/impl/codegen/server_interceptor.h new file mode 100644 index 00000000..cee6869f --- /dev/null +++ b/include/grpcpp/impl/codegen/server_interceptor.h @@ -0,0 +1,143 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_SERVER_INTERCEPTOR_H +#define GRPCPP_IMPL_CODEGEN_SERVER_INTERCEPTOR_H + +#include +#include + +#include +#include +#include + +namespace grpc_impl { +class ServerContextBase; +} // namespace grpc_impl + +namespace grpc { + +namespace internal { +class InterceptorBatchMethodsImpl; +} + +namespace experimental { +class ServerRpcInfo; + +// A factory interface for creation of server interceptors. A vector of +// factories can be provided to ServerBuilder which will be used to create a new +// vector of server interceptors per RPC. Server interceptor authors should +// create a subclass of ServerInterceptorFactorInterface which creates objects +// of their interceptors. +class ServerInterceptorFactoryInterface { + public: + virtual ~ServerInterceptorFactoryInterface() {} + // Returns a pointer to an Interceptor object on successful creation, nullptr + // otherwise. If nullptr is returned, this server interceptor factory is + // ignored for the purposes of that RPC. + virtual Interceptor* CreateServerInterceptor(ServerRpcInfo* info) = 0; +}; + +/// ServerRpcInfo represents the state of a particular RPC as it +/// appears to an interceptor. It is created and owned by the library and +/// passed to the CreateServerInterceptor method of the application's +/// ServerInterceptorFactoryInterface implementation +class ServerRpcInfo { + public: + /// Type categorizes RPCs by unary or streaming type + enum class Type { UNARY, CLIENT_STREAMING, SERVER_STREAMING, BIDI_STREAMING }; + + ~ServerRpcInfo() {} + + // Delete all copy and move constructors and assignments + ServerRpcInfo(const ServerRpcInfo&) = delete; + ServerRpcInfo& operator=(const ServerRpcInfo&) = delete; + ServerRpcInfo(ServerRpcInfo&&) = delete; + ServerRpcInfo& operator=(ServerRpcInfo&&) = delete; + + // Getter methods + + /// Return the fully-specified method name + const char* method() const { return method_; } + + /// Return the type of the RPC (unary or a streaming flavor) + Type type() const { return type_; } + + /// Return a pointer to the underlying ServerContext structure associated + /// with the RPC to support features that apply to it + grpc_impl::ServerContextBase* server_context() { return ctx_; } + + private: + static_assert(Type::UNARY == + static_cast(internal::RpcMethod::NORMAL_RPC), + "violated expectation about Type enum"); + static_assert(Type::CLIENT_STREAMING == + static_cast(internal::RpcMethod::CLIENT_STREAMING), + "violated expectation about Type enum"); + static_assert(Type::SERVER_STREAMING == + static_cast(internal::RpcMethod::SERVER_STREAMING), + "violated expectation about Type enum"); + static_assert(Type::BIDI_STREAMING == + static_cast(internal::RpcMethod::BIDI_STREAMING), + "violated expectation about Type enum"); + + ServerRpcInfo(grpc_impl::ServerContextBase* ctx, const char* method, + internal::RpcMethod::RpcType type) + : ctx_(ctx), method_(method), type_(static_cast(type)) {} + + // Runs interceptor at pos \a pos. + void RunInterceptor( + experimental::InterceptorBatchMethods* interceptor_methods, size_t pos) { + GPR_CODEGEN_ASSERT(pos < interceptors_.size()); + interceptors_[pos]->Intercept(interceptor_methods); + } + + void RegisterInterceptors( + const std::vector< + std::unique_ptr>& + creators) { + for (const auto& creator : creators) { + auto* interceptor = creator->CreateServerInterceptor(this); + if (interceptor != nullptr) { + interceptors_.push_back( + std::unique_ptr(interceptor)); + } + } + } + + void Ref() { ref_.fetch_add(1, std::memory_order_relaxed); } + void Unref() { + if (GPR_UNLIKELY(ref_.fetch_sub(1, std::memory_order_acq_rel) == 1)) { + delete this; + } + } + + grpc_impl::ServerContextBase* ctx_ = nullptr; + const char* method_ = nullptr; + const Type type_; + std::atomic ref_{1}; + std::vector> interceptors_; + + friend class internal::InterceptorBatchMethodsImpl; + friend class grpc_impl::ServerContextBase; +}; + +} // namespace experimental +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_SERVER_INTERCEPTOR_H diff --git a/include/grpcpp/impl/codegen/server_interface.h b/include/grpcpp/impl/codegen/server_interface.h new file mode 100644 index 00000000..80fba7fe --- /dev/null +++ b/include/grpcpp/impl/codegen/server_interface.h @@ -0,0 +1,403 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_SERVER_INTERFACE_H +#define GRPCPP_IMPL_CODEGEN_SERVER_INTERFACE_H + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace grpc_impl { + +class Channel; +class CompletionQueue; +class ServerCompletionQueue; +class ServerCredentials; +} // namespace grpc_impl +namespace grpc { + +class AsyncGenericService; +class GenericServerContext; +class Service; + +extern CoreCodegenInterface* g_core_codegen_interface; + +/// Models a gRPC server. +/// +/// Servers are configured and started via \a grpc::ServerBuilder. +namespace internal { +class ServerAsyncStreamingInterface; +} // namespace internal + +#ifndef GRPC_CALLBACK_API_NONEXPERIMENTAL +namespace experimental { +#endif +class CallbackGenericService; +#ifndef GRPC_CALLBACK_API_NONEXPERIMENTAL +} // namespace experimental +#endif + +namespace experimental { +class ServerInterceptorFactoryInterface; +} // namespace experimental + +class ServerInterface : public internal::CallHook { + public: + virtual ~ServerInterface() {} + + /// \a Shutdown does the following things: + /// + /// 1. Shutdown the server: deactivate all listening ports, mark it in + /// "shutdown mode" so that further call Request's or incoming RPC matches + /// are no longer allowed. Also return all Request'ed-but-not-yet-active + /// calls as failed (!ok). This refers to calls that have been requested + /// at the server by the server-side library or application code but that + /// have not yet been matched to incoming RPCs from the client. Note that + /// this would even include default calls added automatically by the gRPC + /// C++ API without the user's input (e.g., "Unimplemented RPC method") + /// + /// 2. Block until all rpc method handlers invoked automatically by the sync + /// API finish. + /// + /// 3. If all pending calls complete (and all their operations are + /// retrieved by Next) before \a deadline expires, this finishes + /// gracefully. Otherwise, forcefully cancel all pending calls associated + /// with the server after \a deadline expires. In the case of the sync API, + /// if the RPC function for a streaming call has already been started and + /// takes a week to complete, the RPC function won't be forcefully + /// terminated (since that would leave state corrupt and incomplete) and + /// the method handler will just keep running (which will prevent the + /// server from completing the "join" operation that it needs to do at + /// shutdown time). + /// + /// All completion queue associated with the server (for example, for async + /// serving) must be shutdown *after* this method has returned: + /// See \a ServerBuilder::AddCompletionQueue for details. + /// They must also be drained (by repeated Next) after being shutdown. + /// + /// \param deadline How long to wait until pending rpcs are forcefully + /// terminated. + template + void Shutdown(const T& deadline) { + ShutdownInternal(TimePoint(deadline).raw_time()); + } + + /// Shutdown the server without a deadline and forced cancellation. + /// + /// All completion queue associated with the server (for example, for async + /// serving) must be shutdown *after* this method has returned: + /// See \a ServerBuilder::AddCompletionQueue for details. + void Shutdown() { + ShutdownInternal( + g_core_codegen_interface->gpr_inf_future(GPR_CLOCK_MONOTONIC)); + } + + /// Block waiting for all work to complete. + /// + /// \warning The server must be either shutting down or some other thread must + /// call \a Shutdown for this function to ever return. + virtual void Wait() = 0; + + protected: + friend class ::grpc::Service; + + /// Register a service. This call does not take ownership of the service. + /// The service must exist for the lifetime of the Server instance. + virtual bool RegisterService(const grpc::string* host, Service* service) = 0; + + /// Register a generic service. This call does not take ownership of the + /// service. The service must exist for the lifetime of the Server instance. + virtual void RegisterAsyncGenericService(AsyncGenericService* service) = 0; + +#ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL + /// Register a callback generic service. This call does not take ownership of + /// the service. The service must exist for the lifetime of the Server + /// instance. May not be abstract since this is a post-1.0 API addition. + + virtual void RegisterCallbackGenericService(CallbackGenericService* + /*service*/) {} +#else + /// NOTE: class experimental_registration_interface is not part of the public + /// API of this class + /// TODO(vjpai): Move these contents to public API when no longer experimental + class experimental_registration_interface { + public: + virtual ~experimental_registration_interface() {} + /// May not be abstract since this is a post-1.0 API addition + virtual void RegisterCallbackGenericService( + experimental::CallbackGenericService* /*service*/) {} + }; + + /// NOTE: The function experimental_registration() is not stable public API. + /// It is a view to the experimental components of this class. It may be + /// changed or removed at any time. May not be abstract since this is a + /// post-1.0 API addition + virtual experimental_registration_interface* experimental_registration() { + return nullptr; + } +#endif + + /// Tries to bind \a server to the given \a addr. + /// + /// It can be invoked multiple times. + /// + /// \param addr The address to try to bind to the server (eg, localhost:1234, + /// 192.168.1.1:31416, [::1]:27182, etc.). + /// \params creds The credentials associated with the server. + /// + /// \return bound port number on success, 0 on failure. + /// + /// \warning It's an error to call this method on an already started server. + virtual int AddListeningPort(const grpc::string& addr, + grpc_impl::ServerCredentials* creds) = 0; + + /// Start the server. + /// + /// \param cqs Completion queues for handling asynchronous services. The + /// caller is required to keep all completion queues live until the server is + /// destroyed. + /// \param num_cqs How many completion queues does \a cqs hold. + virtual void Start(::grpc_impl::ServerCompletionQueue** cqs, + size_t num_cqs) = 0; + + virtual void ShutdownInternal(gpr_timespec deadline) = 0; + + virtual int max_receive_message_size() const = 0; + + virtual grpc_server* server() = 0; + + virtual void PerformOpsOnCall(internal::CallOpSetInterface* ops, + internal::Call* call) = 0; + + class BaseAsyncRequest : public internal::CompletionQueueTag { + public: + BaseAsyncRequest(ServerInterface* server, + ::grpc_impl::ServerContext* context, + internal::ServerAsyncStreamingInterface* stream, + ::grpc_impl::CompletionQueue* call_cq, + ::grpc_impl::ServerCompletionQueue* notification_cq, + void* tag, bool delete_on_finalize); + virtual ~BaseAsyncRequest(); + + bool FinalizeResult(void** tag, bool* status) override; + + private: + void ContinueFinalizeResultAfterInterception(); + + protected: + ServerInterface* const server_; + ::grpc_impl::ServerContext* const context_; + internal::ServerAsyncStreamingInterface* const stream_; + ::grpc_impl::CompletionQueue* const call_cq_; + ::grpc_impl::ServerCompletionQueue* const notification_cq_; + void* const tag_; + const bool delete_on_finalize_; + grpc_call* call_; + internal::Call call_wrapper_; + internal::InterceptorBatchMethodsImpl interceptor_methods_; + bool done_intercepting_; + }; + + /// RegisteredAsyncRequest is not part of the C++ API + class RegisteredAsyncRequest : public BaseAsyncRequest { + public: + RegisteredAsyncRequest(ServerInterface* server, + ::grpc_impl::ServerContext* context, + internal::ServerAsyncStreamingInterface* stream, + ::grpc_impl::CompletionQueue* call_cq, + ::grpc_impl::ServerCompletionQueue* notification_cq, + void* tag, const char* name, + internal::RpcMethod::RpcType type); + + virtual bool FinalizeResult(void** tag, bool* status) override { + /* If we are done intercepting, then there is nothing more for us to do */ + if (done_intercepting_) { + return BaseAsyncRequest::FinalizeResult(tag, status); + } + call_wrapper_ = ::grpc::internal::Call( + call_, server_, call_cq_, server_->max_receive_message_size(), + context_->set_server_rpc_info(name_, type_, + *server_->interceptor_creators())); + return BaseAsyncRequest::FinalizeResult(tag, status); + } + + protected: + void IssueRequest(void* registered_method, grpc_byte_buffer** payload, + ::grpc_impl::ServerCompletionQueue* notification_cq); + const char* name_; + const internal::RpcMethod::RpcType type_; + }; + + class NoPayloadAsyncRequest final : public RegisteredAsyncRequest { + public: + NoPayloadAsyncRequest(internal::RpcServiceMethod* registered_method, + ServerInterface* server, + ::grpc_impl::ServerContext* context, + internal::ServerAsyncStreamingInterface* stream, + ::grpc_impl::CompletionQueue* call_cq, + ::grpc_impl::ServerCompletionQueue* notification_cq, + void* tag) + : RegisteredAsyncRequest( + server, context, stream, call_cq, notification_cq, tag, + registered_method->name(), registered_method->method_type()) { + IssueRequest(registered_method->server_tag(), nullptr, notification_cq); + } + + // uses RegisteredAsyncRequest::FinalizeResult + }; + + template + class PayloadAsyncRequest final : public RegisteredAsyncRequest { + public: + PayloadAsyncRequest(internal::RpcServiceMethod* registered_method, + ServerInterface* server, + ::grpc_impl::ServerContext* context, + internal::ServerAsyncStreamingInterface* stream, + ::grpc_impl::CompletionQueue* call_cq, + ::grpc_impl::ServerCompletionQueue* notification_cq, + void* tag, Message* request) + : RegisteredAsyncRequest( + server, context, stream, call_cq, notification_cq, tag, + registered_method->name(), registered_method->method_type()), + registered_method_(registered_method), + request_(request) { + IssueRequest(registered_method->server_tag(), payload_.bbuf_ptr(), + notification_cq); + } + + ~PayloadAsyncRequest() { + payload_.Release(); // We do not own the payload_ + } + + bool FinalizeResult(void** tag, bool* status) override { + /* If we are done intercepting, then there is nothing more for us to do */ + if (done_intercepting_) { + return RegisteredAsyncRequest::FinalizeResult(tag, status); + } + if (*status) { + if (!payload_.Valid() || !SerializationTraits::Deserialize( + payload_.bbuf_ptr(), request_) + .ok()) { + // If deserialization fails, we cancel the call and instantiate + // a new instance of ourselves to request another call. We then + // return false, which prevents the call from being returned to + // the application. + g_core_codegen_interface->grpc_call_cancel_with_status( + call_, GRPC_STATUS_INTERNAL, "Unable to parse request", nullptr); + g_core_codegen_interface->grpc_call_unref(call_); + new PayloadAsyncRequest(registered_method_, server_, context_, + stream_, call_cq_, notification_cq_, tag_, + request_); + delete this; + return false; + } + } + /* Set interception point for recv message */ + interceptor_methods_.AddInterceptionHookPoint( + experimental::InterceptionHookPoints::POST_RECV_MESSAGE); + interceptor_methods_.SetRecvMessage(request_, nullptr); + return RegisteredAsyncRequest::FinalizeResult(tag, status); + } + + private: + internal::RpcServiceMethod* const registered_method_; + Message* const request_; + ByteBuffer payload_; + }; + + class GenericAsyncRequest : public BaseAsyncRequest { + public: + GenericAsyncRequest(ServerInterface* server, GenericServerContext* context, + internal::ServerAsyncStreamingInterface* stream, + ::grpc_impl::CompletionQueue* call_cq, + ::grpc_impl::ServerCompletionQueue* notification_cq, + void* tag, bool delete_on_finalize); + + bool FinalizeResult(void** tag, bool* status) override; + + private: + grpc_call_details call_details_; + }; + + template + void RequestAsyncCall(internal::RpcServiceMethod* method, + ::grpc_impl::ServerContext* context, + internal::ServerAsyncStreamingInterface* stream, + ::grpc_impl::CompletionQueue* call_cq, + ::grpc_impl::ServerCompletionQueue* notification_cq, + void* tag, Message* message) { + GPR_CODEGEN_ASSERT(method); + new PayloadAsyncRequest(method, this, context, stream, call_cq, + notification_cq, tag, message); + } + + void RequestAsyncCall(internal::RpcServiceMethod* method, + ::grpc_impl::ServerContext* context, + internal::ServerAsyncStreamingInterface* stream, + ::grpc_impl::CompletionQueue* call_cq, + ::grpc_impl::ServerCompletionQueue* notification_cq, + void* tag) { + GPR_CODEGEN_ASSERT(method); + new NoPayloadAsyncRequest(method, this, context, stream, call_cq, + notification_cq, tag); + } + + void RequestAsyncGenericCall( + GenericServerContext* context, + internal::ServerAsyncStreamingInterface* stream, + ::grpc_impl::CompletionQueue* call_cq, + ::grpc_impl::ServerCompletionQueue* notification_cq, void* tag) { + new GenericAsyncRequest(this, context, stream, call_cq, notification_cq, + tag, true); + } + + private: + // EXPERIMENTAL + // Getter method for the vector of interceptor factory objects. + // Returns a nullptr (rather than being pure) since this is a post-1.0 method + // and adding a new pure method to an interface would be a breaking change + // (even though this is private and non-API) + virtual std::vector< + std::unique_ptr>* + interceptor_creators() { + return nullptr; + } + + // EXPERIMENTAL + // A method to get the callbackable completion queue associated with this + // server. If the return value is nullptr, this server doesn't support + // callback operations. + // TODO(vjpai): Consider a better default like using a global CQ + // Returns nullptr (rather than being pure) since this is a post-1.0 method + // and adding a new pure method to an interface would be a breaking change + // (even though this is private and non-API) + virtual ::grpc_impl::CompletionQueue* CallbackCQ() { return nullptr; } +}; + +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_SERVER_INTERFACE_H diff --git a/include/grpcpp/impl/codegen/service_type.h b/include/grpcpp/impl/codegen/service_type.h new file mode 100644 index 00000000..34f97b6a --- /dev/null +++ b/include/grpcpp/impl/codegen/service_type.h @@ -0,0 +1,279 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_SERVICE_TYPE_H +#define GRPCPP_IMPL_CODEGEN_SERVICE_TYPE_H + +#include +#include +#include +#include +#include +#include + +namespace grpc_impl { + +class Server; +class CompletionQueue; +class ServerContext; +} // namespace grpc_impl +namespace grpc { + +class ServerInterface; + +namespace internal { +class Call; +class ServerAsyncStreamingInterface { + public: + virtual ~ServerAsyncStreamingInterface() {} + + /// Request notification of the sending of initial metadata to the client. + /// Completion will be notified by \a tag on the associated completion + /// queue. This call is optional, but if it is used, it cannot be used + /// concurrently with or after the \a Finish method. + /// + /// \param[in] tag Tag identifying this request. + virtual void SendInitialMetadata(void* tag) = 0; + + private: + friend class ::grpc::ServerInterface; + virtual void BindCall(Call* call) = 0; +}; +} // namespace internal + +/// Desriptor of an RPC service and its various RPC methods +class Service { + public: + Service() : server_(nullptr) {} + virtual ~Service() {} + + bool has_async_methods() const { + for (const auto& method : methods_) { + if (method && method->handler() == nullptr) { + return true; + } + } + return false; + } + + bool has_synchronous_methods() const { + for (const auto& method : methods_) { + if (method && + method->api_type() == internal::RpcServiceMethod::ApiType::SYNC) { + return true; + } + } + return false; + } + + bool has_callback_methods() const { + for (const auto& method : methods_) { + if (method && (method->api_type() == + internal::RpcServiceMethod::ApiType::CALL_BACK || + method->api_type() == + internal::RpcServiceMethod::ApiType::RAW_CALL_BACK)) { + return true; + } + } + return false; + } + + bool has_generic_methods() const { + for (const auto& method : methods_) { + if (method.get() == nullptr) { + return true; + } + } + return false; + } + + protected: + // TODO(vjpai): Promote experimental contents once callback API is accepted + class experimental_type { + public: + explicit experimental_type(Service* service) : service_(service) {} + + void MarkMethodCallback(int index, internal::MethodHandler* handler) { + service_->MarkMethodCallbackInternal(index, handler); + } + + void MarkMethodRawCallback(int index, internal::MethodHandler* handler) { + service_->MarkMethodRawCallbackInternal(index, handler); + } + + internal::MethodHandler* GetHandler(int index) { + return service_->GetHandlerInternal(index); + } + + private: + Service* service_; + }; + + experimental_type experimental() { return experimental_type(this); } + + template + void RequestAsyncUnary(int index, ::grpc_impl::ServerContext* context, + Message* request, + internal::ServerAsyncStreamingInterface* stream, + ::grpc_impl::CompletionQueue* call_cq, + ::grpc_impl::ServerCompletionQueue* notification_cq, + void* tag) { + // Typecast the index to size_t for indexing into a vector + // while preserving the API that existed before a compiler + // warning was first seen (grpc/grpc#11664) + size_t idx = static_cast(index); + server_->RequestAsyncCall(methods_[idx].get(), context, stream, call_cq, + notification_cq, tag, request); + } + void RequestAsyncClientStreaming( + int index, ::grpc_impl::ServerContext* context, + internal::ServerAsyncStreamingInterface* stream, + ::grpc_impl::CompletionQueue* call_cq, + ::grpc_impl::ServerCompletionQueue* notification_cq, void* tag) { + size_t idx = static_cast(index); + server_->RequestAsyncCall(methods_[idx].get(), context, stream, call_cq, + notification_cq, tag); + } + template + void RequestAsyncServerStreaming( + int index, ::grpc_impl::ServerContext* context, Message* request, + internal::ServerAsyncStreamingInterface* stream, + ::grpc_impl::CompletionQueue* call_cq, + ::grpc_impl::ServerCompletionQueue* notification_cq, void* tag) { + size_t idx = static_cast(index); + server_->RequestAsyncCall(methods_[idx].get(), context, stream, call_cq, + notification_cq, tag, request); + } + void RequestAsyncBidiStreaming( + int index, ::grpc_impl::ServerContext* context, + internal::ServerAsyncStreamingInterface* stream, + ::grpc_impl::CompletionQueue* call_cq, + ::grpc_impl::ServerCompletionQueue* notification_cq, void* tag) { + size_t idx = static_cast(index); + server_->RequestAsyncCall(methods_[idx].get(), context, stream, call_cq, + notification_cq, tag); + } + + void AddMethod(internal::RpcServiceMethod* method) { + methods_.emplace_back(method); + } + + void MarkMethodAsync(int index) { + // This does not have to be a hard error, however no one has approached us + // with a use case yet. Please file an issue if you believe you have one. + size_t idx = static_cast(index); + GPR_CODEGEN_ASSERT( + methods_[idx].get() != nullptr && + "Cannot mark the method as 'async' because it has already been " + "marked as 'generic'."); + methods_[idx]->SetServerApiType(internal::RpcServiceMethod::ApiType::ASYNC); + } + + void MarkMethodRaw(int index) { + // This does not have to be a hard error, however no one has approached us + // with a use case yet. Please file an issue if you believe you have one. + size_t idx = static_cast(index); + GPR_CODEGEN_ASSERT(methods_[idx].get() != nullptr && + "Cannot mark the method as 'raw' because it has already " + "been marked as 'generic'."); + methods_[idx]->SetServerApiType(internal::RpcServiceMethod::ApiType::RAW); + } + + void MarkMethodGeneric(int index) { + // This does not have to be a hard error, however no one has approached us + // with a use case yet. Please file an issue if you believe you have one. + size_t idx = static_cast(index); + GPR_CODEGEN_ASSERT( + methods_[idx]->handler() != nullptr && + "Cannot mark the method as 'generic' because it has already been " + "marked as 'async' or 'raw'."); + methods_[idx].reset(); + } + + void MarkMethodStreamed(int index, internal::MethodHandler* streamed_method) { + // This does not have to be a hard error, however no one has approached us + // with a use case yet. Please file an issue if you believe you have one. + size_t idx = static_cast(index); + GPR_CODEGEN_ASSERT(methods_[idx] && methods_[idx]->handler() && + "Cannot mark an async or generic method Streamed"); + methods_[idx]->SetHandler(streamed_method); + + // From the server's point of view, streamed unary is a special + // case of BIDI_STREAMING that has 1 read and 1 write, in that order, + // and split server-side streaming is BIDI_STREAMING with 1 read and + // any number of writes, in that order. + methods_[idx]->SetMethodType(internal::RpcMethod::BIDI_STREAMING); + } + +#ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL + void MarkMethodCallback(int index, internal::MethodHandler* handler) { + MarkMethodCallbackInternal(index, handler); + } + + void MarkMethodRawCallback(int index, internal::MethodHandler* handler) { + MarkMethodRawCallbackInternal(index, handler); + } + + internal::MethodHandler* GetHandler(int index) { + return GetHandlerInternal(index); + } +#endif + private: + // TODO(vjpai): migrate the Internal functions to mainline functions once + // callback API is fully de-experimental + void MarkMethodCallbackInternal(int index, internal::MethodHandler* handler) { + // This does not have to be a hard error, however no one has approached us + // with a use case yet. Please file an issue if you believe you have one. + size_t idx = static_cast(index); + GPR_CODEGEN_ASSERT( + methods_[idx].get() != nullptr && + "Cannot mark the method as 'callback' because it has already been " + "marked as 'generic'."); + methods_[idx]->SetHandler(handler); + methods_[idx]->SetServerApiType( + internal::RpcServiceMethod::ApiType::CALL_BACK); + } + + void MarkMethodRawCallbackInternal(int index, + internal::MethodHandler* handler) { + // This does not have to be a hard error, however no one has approached us + // with a use case yet. Please file an issue if you believe you have one. + size_t idx = static_cast(index); + GPR_CODEGEN_ASSERT( + methods_[idx].get() != nullptr && + "Cannot mark the method as 'raw callback' because it has already " + "been marked as 'generic'."); + methods_[idx]->SetHandler(handler); + methods_[idx]->SetServerApiType( + internal::RpcServiceMethod::ApiType::RAW_CALL_BACK); + } + + internal::MethodHandler* GetHandlerInternal(int index) { + size_t idx = static_cast(index); + return methods_[idx]->handler(); + } + + friend class grpc_impl::Server; + friend class ServerInterface; + ServerInterface* server_; + std::vector> methods_; +}; + +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_SERVICE_TYPE_H diff --git a/include/grpcpp/impl/codegen/slice.h b/include/grpcpp/impl/codegen/slice.h new file mode 100644 index 00000000..8966559d --- /dev/null +++ b/include/grpcpp/impl/codegen/slice.h @@ -0,0 +1,143 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_SLICE_H +#define GRPCPP_IMPL_CODEGEN_SLICE_H + +#include +#include +#include + +#include + +namespace grpc { + +/// A wrapper around \a grpc_slice. +/// +/// A slice represents a contiguous reference counted array of bytes. +/// It is cheap to take references to a slice, and it is cheap to create a +/// slice pointing to a subset of another slice. +class Slice final { + public: + /// Construct an empty slice. + Slice() : slice_(g_core_codegen_interface->grpc_empty_slice()) {} + /// Destructor - drops one reference. + ~Slice() { g_core_codegen_interface->grpc_slice_unref(slice_); } + + enum AddRef { ADD_REF }; + /// Construct a slice from \a slice, adding a reference. + Slice(grpc_slice slice, AddRef) + : slice_(g_core_codegen_interface->grpc_slice_ref(slice)) {} + + enum StealRef { STEAL_REF }; + /// Construct a slice from \a slice, stealing a reference. + Slice(grpc_slice slice, StealRef) : slice_(slice) {} + + /// Allocate a slice of specified size + Slice(size_t len) + : slice_(g_core_codegen_interface->grpc_slice_malloc(len)) {} + + /// Construct a slice from a copied buffer + Slice(const void* buf, size_t len) + : slice_(g_core_codegen_interface->grpc_slice_from_copied_buffer( + reinterpret_cast(buf), len)) {} + + /// Construct a slice from a copied string + Slice(const grpc::string& str) + : slice_(g_core_codegen_interface->grpc_slice_from_copied_buffer( + str.c_str(), str.length())) {} + + enum StaticSlice { STATIC_SLICE }; + + /// Construct a slice from a static buffer + Slice(const void* buf, size_t len, StaticSlice) + : slice_(g_core_codegen_interface->grpc_slice_from_static_buffer( + reinterpret_cast(buf), len)) {} + + /// Copy constructor, adds a reference. + Slice(const Slice& other) + : slice_(g_core_codegen_interface->grpc_slice_ref(other.slice_)) {} + + /// Assignment, reference count is unchanged. + Slice& operator=(Slice other) { + std::swap(slice_, other.slice_); + return *this; + } + + /// Create a slice pointing at some data. Calls malloc to allocate a refcount + /// for the object, and arranges that destroy will be called with the + /// user data pointer passed in at destruction. Can be the same as buf or + /// different (e.g., if data is part of a larger structure that must be + /// destroyed when the data is no longer needed) + Slice(void* buf, size_t len, void (*destroy)(void*), void* user_data) + : slice_(g_core_codegen_interface->grpc_slice_new_with_user_data( + buf, len, destroy, user_data)) {} + + /// Specialization of above for common case where buf == user_data + Slice(void* buf, size_t len, void (*destroy)(void*)) + : Slice(buf, len, destroy, buf) {} + + /// Similar to the above but has a destroy that also takes slice length + Slice(void* buf, size_t len, void (*destroy)(void*, size_t)) + : slice_(g_core_codegen_interface->grpc_slice_new_with_len(buf, len, + destroy)) {} + + /// Byte size. + size_t size() const { return GRPC_SLICE_LENGTH(slice_); } + + /// Raw pointer to the beginning (first element) of the slice. + const uint8_t* begin() const { return GRPC_SLICE_START_PTR(slice_); } + + /// Raw pointer to the end (one byte \em past the last element) of the slice. + const uint8_t* end() const { return GRPC_SLICE_END_PTR(slice_); } + + /// Raw C slice. Caller needs to call grpc_slice_unref when done. + grpc_slice c_slice() const { + return g_core_codegen_interface->grpc_slice_ref(slice_); + } + + private: + friend class ByteBuffer; + + grpc_slice slice_; +}; + +inline grpc::string_ref StringRefFromSlice(const grpc_slice* slice) { + return grpc::string_ref( + reinterpret_cast(GRPC_SLICE_START_PTR(*slice)), + GRPC_SLICE_LENGTH(*slice)); +} + +inline grpc::string StringFromCopiedSlice(grpc_slice slice) { + return grpc::string(reinterpret_cast(GRPC_SLICE_START_PTR(slice)), + GRPC_SLICE_LENGTH(slice)); +} + +inline grpc_slice SliceReferencingString(const grpc::string& str) { + return g_core_codegen_interface->grpc_slice_from_static_buffer(str.data(), + str.length()); +} + +inline grpc_slice SliceFromCopiedString(const grpc::string& str) { + return g_core_codegen_interface->grpc_slice_from_copied_buffer(str.data(), + str.length()); +} + +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_SLICE_H diff --git a/include/grpcpp/impl/codegen/status.h b/include/grpcpp/impl/codegen/status.h new file mode 100644 index 00000000..e625a76b --- /dev/null +++ b/include/grpcpp/impl/codegen/status.h @@ -0,0 +1,133 @@ +/* + * + * Copyright 2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_STATUS_H +#define GRPCPP_IMPL_CODEGEN_STATUS_H + +#include +#include +#include + +namespace grpc { + +/// Did it work? If it didn't, why? +/// +/// See \a grpc::StatusCode for details on the available code and their meaning. +class Status { + public: + /// Construct an OK instance. + Status() : code_(StatusCode::OK) { + // Static assertions to make sure that the C++ API value correctly + // maps to the core surface API value + static_assert(StatusCode::OK == static_cast(GRPC_STATUS_OK), + "Mismatched status code"); + static_assert( + StatusCode::CANCELLED == static_cast(GRPC_STATUS_CANCELLED), + "Mismatched status code"); + static_assert( + StatusCode::UNKNOWN == static_cast(GRPC_STATUS_UNKNOWN), + "Mismatched status code"); + static_assert(StatusCode::INVALID_ARGUMENT == + static_cast(GRPC_STATUS_INVALID_ARGUMENT), + "Mismatched status code"); + static_assert(StatusCode::DEADLINE_EXCEEDED == + static_cast(GRPC_STATUS_DEADLINE_EXCEEDED), + "Mismatched status code"); + static_assert( + StatusCode::NOT_FOUND == static_cast(GRPC_STATUS_NOT_FOUND), + "Mismatched status code"); + static_assert(StatusCode::ALREADY_EXISTS == + static_cast(GRPC_STATUS_ALREADY_EXISTS), + "Mismatched status code"); + static_assert(StatusCode::PERMISSION_DENIED == + static_cast(GRPC_STATUS_PERMISSION_DENIED), + "Mismatched status code"); + static_assert(StatusCode::UNAUTHENTICATED == + static_cast(GRPC_STATUS_UNAUTHENTICATED), + "Mismatched status code"); + static_assert(StatusCode::RESOURCE_EXHAUSTED == + static_cast(GRPC_STATUS_RESOURCE_EXHAUSTED), + "Mismatched status code"); + static_assert(StatusCode::FAILED_PRECONDITION == + static_cast(GRPC_STATUS_FAILED_PRECONDITION), + "Mismatched status code"); + static_assert( + StatusCode::ABORTED == static_cast(GRPC_STATUS_ABORTED), + "Mismatched status code"); + static_assert(StatusCode::OUT_OF_RANGE == + static_cast(GRPC_STATUS_OUT_OF_RANGE), + "Mismatched status code"); + static_assert(StatusCode::UNIMPLEMENTED == + static_cast(GRPC_STATUS_UNIMPLEMENTED), + "Mismatched status code"); + static_assert( + StatusCode::INTERNAL == static_cast(GRPC_STATUS_INTERNAL), + "Mismatched status code"); + static_assert(StatusCode::UNAVAILABLE == + static_cast(GRPC_STATUS_UNAVAILABLE), + "Mismatched status code"); + static_assert( + StatusCode::DATA_LOSS == static_cast(GRPC_STATUS_DATA_LOSS), + "Mismatched status code"); + } + + /// Construct an instance with associated \a code and \a error_message. + /// It is an error to construct an OK status with non-empty \a error_message. + Status(StatusCode code, const grpc::string& error_message) + : code_(code), error_message_(error_message) {} + + /// Construct an instance with \a code, \a error_message and + /// \a error_details. It is an error to construct an OK status with non-empty + /// \a error_message and/or \a error_details. + Status(StatusCode code, const grpc::string& error_message, + const grpc::string& error_details) + : code_(code), + error_message_(error_message), + binary_error_details_(error_details) {} + + // Pre-defined special status objects. + /// An OK pre-defined instance. + static const Status& OK; + /// A CANCELLED pre-defined instance. + static const Status& CANCELLED; + + /// Return the instance's error code. + StatusCode error_code() const { return code_; } + /// Return the instance's error message. + grpc::string error_message() const { return error_message_; } + /// Return the (binary) error details. + // Usually it contains a serialized google.rpc.Status proto. + grpc::string error_details() const { return binary_error_details_; } + + /// Is the status OK? + bool ok() const { return code_ == StatusCode::OK; } + + // Ignores any errors. This method does nothing except potentially suppress + // complaints from any tools that are checking that errors are not dropped on + // the floor. + void IgnoreError() const {} + + private: + StatusCode code_; + grpc::string error_message_; + grpc::string binary_error_details_; +}; + +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_STATUS_H diff --git a/include/grpcpp/impl/codegen/status_code_enum.h b/include/grpcpp/impl/codegen/status_code_enum.h new file mode 100644 index 00000000..bdd7ead6 --- /dev/null +++ b/include/grpcpp/impl/codegen/status_code_enum.h @@ -0,0 +1,143 @@ +/* + * + * Copyright 2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_STATUS_CODE_ENUM_H +#define GRPCPP_IMPL_CODEGEN_STATUS_CODE_ENUM_H + +namespace grpc { + +enum StatusCode { + /// Not an error; returned on success. + OK = 0, + + /// The operation was cancelled (typically by the caller). + CANCELLED = 1, + + /// Unknown error. An example of where this error may be returned is if a + /// Status value received from another address space belongs to an error-space + /// that is not known in this address space. Also errors raised by APIs that + /// do not return enough error information may be converted to this error. + UNKNOWN = 2, + + /// Client specified an invalid argument. Note that this differs from + /// FAILED_PRECONDITION. INVALID_ARGUMENT indicates arguments that are + /// problematic regardless of the state of the system (e.g., a malformed file + /// name). + INVALID_ARGUMENT = 3, + + /// Deadline expired before operation could complete. For operations that + /// change the state of the system, this error may be returned even if the + /// operation has completed successfully. For example, a successful response + /// from a server could have been delayed long enough for the deadline to + /// expire. + DEADLINE_EXCEEDED = 4, + + /// Some requested entity (e.g., file or directory) was not found. + NOT_FOUND = 5, + + /// Some entity that we attempted to create (e.g., file or directory) already + /// exists. + ALREADY_EXISTS = 6, + + /// The caller does not have permission to execute the specified operation. + /// PERMISSION_DENIED must not be used for rejections caused by exhausting + /// some resource (use RESOURCE_EXHAUSTED instead for those errors). + /// PERMISSION_DENIED must not be used if the caller can not be identified + /// (use UNAUTHENTICATED instead for those errors). + PERMISSION_DENIED = 7, + + /// The request does not have valid authentication credentials for the + /// operation. + UNAUTHENTICATED = 16, + + /// Some resource has been exhausted, perhaps a per-user quota, or perhaps the + /// entire file system is out of space. + RESOURCE_EXHAUSTED = 8, + + /// Operation was rejected because the system is not in a state required for + /// the operation's execution. For example, directory to be deleted may be + /// non-empty, an rmdir operation is applied to a non-directory, etc. + /// + /// A litmus test that may help a service implementor in deciding + /// between FAILED_PRECONDITION, ABORTED, and UNAVAILABLE: + /// (a) Use UNAVAILABLE if the client can retry just the failing call. + /// (b) Use ABORTED if the client should retry at a higher-level + /// (e.g., restarting a read-modify-write sequence). + /// (c) Use FAILED_PRECONDITION if the client should not retry until + /// the system state has been explicitly fixed. E.g., if an "rmdir" + /// fails because the directory is non-empty, FAILED_PRECONDITION + /// should be returned since the client should not retry unless + /// they have first fixed up the directory by deleting files from it. + /// (d) Use FAILED_PRECONDITION if the client performs conditional + /// REST Get/Update/Delete on a resource and the resource on the + /// server does not match the condition. E.g., conflicting + /// read-modify-write on the same resource. + FAILED_PRECONDITION = 9, + + /// The operation was aborted, typically due to a concurrency issue like + /// sequencer check failures, transaction aborts, etc. + /// + /// See litmus test above for deciding between FAILED_PRECONDITION, ABORTED, + /// and UNAVAILABLE. + ABORTED = 10, + + /// Operation was attempted past the valid range. E.g., seeking or reading + /// past end of file. + /// + /// Unlike INVALID_ARGUMENT, this error indicates a problem that may be fixed + /// if the system state changes. For example, a 32-bit file system will + /// generate INVALID_ARGUMENT if asked to read at an offset that is not in the + /// range [0,2^32-1], but it will generate OUT_OF_RANGE if asked to read from + /// an offset past the current file size. + /// + /// There is a fair bit of overlap between FAILED_PRECONDITION and + /// OUT_OF_RANGE. We recommend using OUT_OF_RANGE (the more specific error) + /// when it applies so that callers who are iterating through a space can + /// easily look for an OUT_OF_RANGE error to detect when they are done. + OUT_OF_RANGE = 11, + + /// Operation is not implemented or not supported/enabled in this service. + UNIMPLEMENTED = 12, + + /// Internal errors. Means some invariants expected by underlying System has + /// been broken. If you see one of these errors, Something is very broken. + INTERNAL = 13, + + /// The service is currently unavailable. This is a most likely a transient + /// condition and may be corrected by retrying with a backoff. Note that it is + /// not always safe to retry non-idempotent operations. + /// + /// \warning Although data MIGHT not have been transmitted when this + /// status occurs, there is NOT A GUARANTEE that the server has not seen + /// anything. So in general it is unsafe to retry on this status code + /// if the call is non-idempotent. + /// + /// See litmus test above for deciding between FAILED_PRECONDITION, ABORTED, + /// and UNAVAILABLE. + UNAVAILABLE = 14, + + /// Unrecoverable data loss or corruption. + DATA_LOSS = 15, + + /// Force users to include a default branch: + DO_NOT_USE = -1 +}; + +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_STATUS_CODE_ENUM_H diff --git a/include/grpcpp/impl/codegen/string_ref.h b/include/grpcpp/impl/codegen/string_ref.h new file mode 100644 index 00000000..5d55fc41 --- /dev/null +++ b/include/grpcpp/impl/codegen/string_ref.h @@ -0,0 +1,146 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_STRING_REF_H +#define GRPCPP_IMPL_CODEGEN_STRING_REF_H + +#include + +#include +#include +#include +#include + +#include + +namespace grpc { + +/// This class is a non owning reference to a string. +/// +/// It should be a strict subset of the upcoming std::string_ref. +/// +/// \see http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3442.html +/// +/// The constexpr is dropped or replaced with const for legacy compiler +/// compatibility. +class string_ref { + public: + /// types + typedef const char* const_iterator; + typedef std::reverse_iterator const_reverse_iterator; + + /// constants + const static size_t npos; + + /// construct/copy. + string_ref() : data_(nullptr), length_(0) {} + string_ref(const string_ref& other) + : data_(other.data_), length_(other.length_) {} + string_ref& operator=(const string_ref& rhs) { + data_ = rhs.data_; + length_ = rhs.length_; + return *this; + } + + string_ref(const char* s) : data_(s), length_(strlen(s)) {} + string_ref(const char* s, size_t l) : data_(s), length_(l) {} + string_ref(const grpc::string& s) : data_(s.data()), length_(s.length()) {} + + /// iterators + const_iterator begin() const { return data_; } + const_iterator end() const { return data_ + length_; } + const_iterator cbegin() const { return data_; } + const_iterator cend() const { return data_ + length_; } + const_reverse_iterator rbegin() const { + return const_reverse_iterator(end()); + } + const_reverse_iterator rend() const { + return const_reverse_iterator(begin()); + } + const_reverse_iterator crbegin() const { + return const_reverse_iterator(end()); + } + const_reverse_iterator crend() const { + return const_reverse_iterator(begin()); + } + + /// capacity + size_t size() const { return length_; } + size_t length() const { return length_; } + size_t max_size() const { return length_; } + bool empty() const { return length_ == 0; } + + /// element access + const char* data() const { return data_; } + + /// string operations + int compare(string_ref x) const { + size_t min_size = length_ < x.length_ ? length_ : x.length_; + int r = memcmp(data_, x.data_, min_size); + if (r < 0) return -1; + if (r > 0) return 1; + if (length_ < x.length_) return -1; + if (length_ > x.length_) return 1; + return 0; + } + + bool starts_with(string_ref x) const { + return length_ >= x.length_ && (memcmp(data_, x.data_, x.length_) == 0); + } + + bool ends_with(string_ref x) const { + return length_ >= x.length_ && + (memcmp(data_ + (length_ - x.length_), x.data_, x.length_) == 0); + } + + size_t find(string_ref s) const { + auto it = std::search(cbegin(), cend(), s.cbegin(), s.cend()); + return it == cend() ? npos : std::distance(cbegin(), it); + } + + size_t find(char c) const { + auto it = std::find(cbegin(), cend(), c); + return it == cend() ? npos : std::distance(cbegin(), it); + } + + string_ref substr(size_t pos, size_t n = npos) const { + if (pos > length_) pos = length_; + if (n > (length_ - pos)) n = length_ - pos; + return string_ref(data_ + pos, n); + } + + private: + const char* data_; + size_t length_; +}; + +/// Comparison operators +inline bool operator==(string_ref x, string_ref y) { return x.compare(y) == 0; } +inline bool operator!=(string_ref x, string_ref y) { return x.compare(y) != 0; } +inline bool operator<(string_ref x, string_ref y) { return x.compare(y) < 0; } +inline bool operator<=(string_ref x, string_ref y) { return x.compare(y) <= 0; } +inline bool operator>(string_ref x, string_ref y) { return x.compare(y) > 0; } +inline bool operator>=(string_ref x, string_ref y) { return x.compare(y) >= 0; } + +inline std::ostream& operator<<(std::ostream& out, const string_ref& string) { + return out << grpc::string(string.begin(), string.end()); +} + +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_STRING_REF_H diff --git a/include/grpcpp/impl/codegen/stub_options.h b/include/grpcpp/impl/codegen/stub_options.h new file mode 100644 index 00000000..a56695a8 --- /dev/null +++ b/include/grpcpp/impl/codegen/stub_options.h @@ -0,0 +1,29 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_STUB_OPTIONS_H +#define GRPCPP_IMPL_CODEGEN_STUB_OPTIONS_H + +namespace grpc { + +/// Useful interface for generated stubs +class StubOptions {}; + +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_STUB_OPTIONS_H diff --git a/include/grpcpp/impl/codegen/sync.h b/include/grpcpp/impl/codegen/sync.h new file mode 100644 index 00000000..146f182e --- /dev/null +++ b/include/grpcpp/impl/codegen/sync.h @@ -0,0 +1,151 @@ +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_SYNC_H +#define GRPCPP_IMPL_CODEGEN_SYNC_H + +#include + +#ifdef GPR_HAS_PTHREAD_H +#include +#endif + +#include + +#include +#include + +#include + +// The core library is not accessible in C++ codegen headers, and vice versa. +// Thus, we need to have duplicate headers with similar functionality. +// Make sure any change to this file is also reflected in +// src/core/lib/gprpp/sync.h too. +// +// Whenever possible, prefer "src/core/lib/gprpp/sync.h" over this file, +// since in core we do not rely on g_core_codegen_interface and hence do not +// pay the costs of virtual function calls. + +namespace grpc { +namespace internal { + +class Mutex { + public: + Mutex() { g_core_codegen_interface->gpr_mu_init(&mu_); } + ~Mutex() { g_core_codegen_interface->gpr_mu_destroy(&mu_); } + + Mutex(const Mutex&) = delete; + Mutex& operator=(const Mutex&) = delete; + + gpr_mu* get() { return &mu_; } + const gpr_mu* get() const { return &mu_; } + + private: + union { + gpr_mu mu_; + std::mutex do_not_use_sth_; +#ifdef GPR_HAS_PTHREAD_H + pthread_mutex_t do_not_use_pth_; +#endif + }; +}; + +// MutexLock is a std:: +class MutexLock { + public: + explicit MutexLock(Mutex* mu) : mu_(mu->get()) { + g_core_codegen_interface->gpr_mu_lock(mu_); + } + explicit MutexLock(gpr_mu* mu) : mu_(mu) { + g_core_codegen_interface->gpr_mu_lock(mu_); + } + ~MutexLock() { g_core_codegen_interface->gpr_mu_unlock(mu_); } + + MutexLock(const MutexLock&) = delete; + MutexLock& operator=(const MutexLock&) = delete; + + private: + gpr_mu* const mu_; +}; + +class ReleasableMutexLock { + public: + explicit ReleasableMutexLock(Mutex* mu) : mu_(mu->get()) { + g_core_codegen_interface->gpr_mu_lock(mu_); + } + explicit ReleasableMutexLock(gpr_mu* mu) : mu_(mu) { + g_core_codegen_interface->gpr_mu_lock(mu_); + } + ~ReleasableMutexLock() { + if (!released_) g_core_codegen_interface->gpr_mu_unlock(mu_); + } + + ReleasableMutexLock(const ReleasableMutexLock&) = delete; + ReleasableMutexLock& operator=(const ReleasableMutexLock&) = delete; + + void Lock() { + GPR_DEBUG_ASSERT(released_); + g_core_codegen_interface->gpr_mu_lock(mu_); + released_ = false; + } + + void Unlock() { + GPR_DEBUG_ASSERT(!released_); + released_ = true; + g_core_codegen_interface->gpr_mu_unlock(mu_); + } + + private: + gpr_mu* const mu_; + bool released_ = false; +}; + +class CondVar { + public: + CondVar() { g_core_codegen_interface->gpr_cv_init(&cv_); } + ~CondVar() { g_core_codegen_interface->gpr_cv_destroy(&cv_); } + + CondVar(const CondVar&) = delete; + CondVar& operator=(const CondVar&) = delete; + + void Signal() { g_core_codegen_interface->gpr_cv_signal(&cv_); } + void Broadcast() { g_core_codegen_interface->gpr_cv_broadcast(&cv_); } + + int Wait(Mutex* mu) { + return Wait(mu, + g_core_codegen_interface->gpr_inf_future(GPR_CLOCK_REALTIME)); + } + int Wait(Mutex* mu, const gpr_timespec& deadline) { + return g_core_codegen_interface->gpr_cv_wait(&cv_, mu->get(), deadline); + } + + template + void WaitUntil(Mutex* mu, Predicate pred) { + while (!pred()) { + Wait(mu, g_core_codegen_interface->gpr_inf_future(GPR_CLOCK_REALTIME)); + } + } + + private: + gpr_cv cv_; +}; + +} // namespace internal +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_SYNC_H diff --git a/include/grpcpp/impl/codegen/sync_stream.h b/include/grpcpp/impl/codegen/sync_stream.h new file mode 100644 index 00000000..852fe667 --- /dev/null +++ b/include/grpcpp/impl/codegen/sync_stream.h @@ -0,0 +1,100 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_SYNC_STREAM_H +#define GRPCPP_IMPL_CODEGEN_SYNC_STREAM_H + +#include + +namespace grpc { + +namespace internal { + +typedef ::grpc_impl::internal::ClientStreamingInterface + ClientStreamingInterface; + +typedef ::grpc_impl::internal::ServerStreamingInterface + ServerStreamingInterface; + +template +using ReaderInterface = ::grpc_impl::internal::ReaderInterface; + +template +using WriterInterface = ::grpc_impl::internal::WriterInterface; + +template +using ClientReaderFactory = ::grpc_impl::internal::ClientReaderFactory; + +template +using ClientWriterFactory = ::grpc_impl::internal::ClientWriterFactory; + +template +using ClientReaderWriterFactory = + ::grpc_impl::internal::ClientReaderWriterFactory; + +} // namespace internal + +template +using ClientReaderInterface = ::grpc_impl::ClientReaderInterface; + +template +using ClientReader = ::grpc_impl::ClientReader; + +template +using ClientWriterInterface = ::grpc_impl::ClientWriterInterface; + +template +using ClientWriter = ::grpc_impl::ClientWriter; + +template +using ClientReaderWriterInterface = + ::grpc_impl::ClientReaderWriterInterface; + +template +using ClientReaderWriter = ::grpc_impl::ClientReaderWriter; + +template +using ServerReaderInterface = ::grpc_impl::ServerReaderInterface; + +template +using ServerReader = ::grpc_impl::ServerReader; + +template +using ServerWriterInterface = ::grpc_impl::ServerWriterInterface; + +template +using ServerWriter = ::grpc_impl::ServerWriter; + +template +using ServerReaderWriterInterface = + ::grpc_impl::ServerReaderWriterInterface; + +template +using ServerReaderWriter = ::grpc_impl::ServerReaderWriter; + +template +using ServerUnaryStreamer = + ::grpc_impl::ServerUnaryStreamer; + +template +using ServerSplitStreamer = + ::grpc_impl::ServerSplitStreamer; + +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_SYNC_STREAM_H diff --git a/include/grpcpp/impl/codegen/sync_stream_impl.h b/include/grpcpp/impl/codegen/sync_stream_impl.h new file mode 100644 index 00000000..1a67467e --- /dev/null +++ b/include/grpcpp/impl/codegen/sync_stream_impl.h @@ -0,0 +1,948 @@ +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef GRPCPP_IMPL_CODEGEN_SYNC_STREAM_IMPL_H +#define GRPCPP_IMPL_CODEGEN_SYNC_STREAM_IMPL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace grpc_impl { + +namespace internal { +/// Common interface for all synchronous client side streaming. +class ClientStreamingInterface { + public: + virtual ~ClientStreamingInterface() {} + + /// Block waiting until the stream finishes and a final status of the call is + /// available. + /// + /// It is appropriate to call this method exactly once when both: + /// * the calling code (client-side) has no more message to send + /// (this can be declared implicitly by calling this method, or + /// explicitly through an earlier call to WritesDone method of the + /// class in use, e.g. \a ClientWriterInterface::WritesDone or + /// \a ClientReaderWriterInterface::WritesDone). + /// * there are no more messages to be received from the server (which can + /// be known implicitly, or explicitly from an earlier call to \a + /// ReaderInterface::Read that returned "false"). + /// + /// This function will return either: + /// - when all incoming messages have been read and the server has + /// returned status. + /// - when the server has returned a non-OK status. + /// - OR when the call failed for some reason and the library generated a + /// status. + /// + /// Return values: + /// - \a Status contains the status code, message and details for the call + /// - the \a ClientContext associated with this call is updated with + /// possible trailing metadata sent from the server. + virtual ::grpc::Status Finish() = 0; +}; + +/// Common interface for all synchronous server side streaming. +class ServerStreamingInterface { + public: + virtual ~ServerStreamingInterface() {} + + /// Block to send initial metadata to client. + /// This call is optional, but if it is used, it cannot be used concurrently + /// with or after the \a Finish method. + /// + /// The initial metadata that will be sent to the client will be + /// taken from the \a ServerContext associated with the call. + virtual void SendInitialMetadata() = 0; +}; + +/// An interface that yields a sequence of messages of type \a R. +template +class ReaderInterface { + public: + virtual ~ReaderInterface() {} + + /// Get an upper bound on the next message size available for reading on this + /// stream. + virtual bool NextMessageSize(uint32_t* sz) = 0; + + /// Block to read a message and parse to \a msg. Returns \a true on success. + /// This is thread-safe with respect to \a Write or \WritesDone methods on + /// the same stream. It should not be called concurrently with another \a + /// Read on the same stream as the order of delivery will not be defined. + /// + /// \param[out] msg The read message. + /// + /// \return \a false when there will be no more incoming messages, either + /// because the other side has called \a WritesDone() or the stream has failed + /// (or been cancelled). + virtual bool Read(R* msg) = 0; +}; + +/// An interface that can be fed a sequence of messages of type \a W. +template +class WriterInterface { + public: + virtual ~WriterInterface() {} + + /// Block to write \a msg to the stream with WriteOptions \a options. + /// This is thread-safe with respect to \a ReaderInterface::Read + /// + /// \param msg The message to be written to the stream. + /// \param options The WriteOptions affecting the write operation. + /// + /// \return \a true on success, \a false when the stream has been closed. + virtual bool Write(const W& msg, ::grpc::WriteOptions options) = 0; + + /// Block to write \a msg to the stream with default write options. + /// This is thread-safe with respect to \a ReaderInterface::Read + /// + /// \param msg The message to be written to the stream. + /// + /// \return \a true on success, \a false when the stream has been closed. + inline bool Write(const W& msg) { return Write(msg, ::grpc::WriteOptions()); } + + /// Write \a msg and coalesce it with the writing of trailing metadata, using + /// WriteOptions \a options. + /// + /// For client, WriteLast is equivalent of performing Write and WritesDone in + /// a single step. \a msg and trailing metadata are coalesced and sent on wire + /// by calling this function. For server, WriteLast buffers the \a msg. + /// The writing of \a msg is held until the service handler returns, + /// where \a msg and trailing metadata are coalesced and sent on wire. + /// Note that WriteLast can only buffer \a msg up to the flow control window + /// size. If \a msg size is larger than the window size, it will be sent on + /// wire without buffering. + /// + /// \param[in] msg The message to be written to the stream. + /// \param[in] options The WriteOptions to be used to write this message. + void WriteLast(const W& msg, ::grpc::WriteOptions options) { + Write(msg, options.set_last_message()); + } +}; + +} // namespace internal + +/// Client-side interface for streaming reads of message of type \a R. +template +class ClientReaderInterface : public internal::ClientStreamingInterface, + public internal::ReaderInterface { + public: + /// Block to wait for initial metadata from server. The received metadata + /// can only be accessed after this call returns. Should only be called before + /// the first read. Calling this method is optional, and if it is not called + /// the metadata will be available in ClientContext after the first read. + virtual void WaitForInitialMetadata() = 0; +}; + +namespace internal { +template +class ClientReaderFactory { + public: + template + static ClientReader* Create(::grpc::ChannelInterface* channel, + const ::grpc::internal::RpcMethod& method, + ::grpc_impl::ClientContext* context, + const W& request) { + return new ClientReader(channel, method, context, request); + } +}; +} // namespace internal + +/// Synchronous (blocking) client-side API for doing server-streaming RPCs, +/// where the stream of messages coming from the server has messages +/// of type \a R. +template +class ClientReader final : public ClientReaderInterface { + public: + /// See the \a ClientStreamingInterface.WaitForInitialMetadata method for + /// semantics. + /// + // Side effect: + /// Once complete, the initial metadata read from + /// the server will be accessible through the \a ClientContext used to + /// construct this object. + void WaitForInitialMetadata() override { + GPR_CODEGEN_ASSERT(!context_->initial_metadata_received_); + + ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata> + ops; + ops.RecvInitialMetadata(context_); + call_.PerformOps(&ops); + cq_.Pluck(&ops); /// status ignored + } + + bool NextMessageSize(uint32_t* sz) override { + int result = call_.max_receive_message_size(); + *sz = (result > 0) ? result : UINT32_MAX; + return true; + } + + /// See the \a ReaderInterface.Read method for semantics. + /// Side effect: + /// This also receives initial metadata from the server, if not + /// already received (if initial metadata is received, it can be then + /// accessed through the \a ClientContext associated with this call). + bool Read(R* msg) override { + ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata, + ::grpc::internal::CallOpRecvMessage> + ops; + if (!context_->initial_metadata_received_) { + ops.RecvInitialMetadata(context_); + } + ops.RecvMessage(msg); + call_.PerformOps(&ops); + return cq_.Pluck(&ops) && ops.got_message; + } + + /// See the \a ClientStreamingInterface.Finish method for semantics. + /// + /// Side effect: + /// The \a ClientContext associated with this call is updated with + /// possible metadata received from the server. + ::grpc::Status Finish() override { + ::grpc::internal::CallOpSet<::grpc::internal::CallOpClientRecvStatus> ops; + ::grpc::Status status; + ops.ClientRecvStatus(context_, &status); + call_.PerformOps(&ops); + GPR_CODEGEN_ASSERT(cq_.Pluck(&ops)); + return status; + } + + private: + friend class internal::ClientReaderFactory; + ::grpc_impl::ClientContext* context_; + ::grpc_impl::CompletionQueue cq_; + ::grpc::internal::Call call_; + + /// Block to create a stream and write the initial metadata and \a request + /// out. Note that \a context will be used to fill in custom initial + /// metadata used to send to the server when starting the call. + template + ClientReader(::grpc::ChannelInterface* channel, + const ::grpc::internal::RpcMethod& method, + ::grpc_impl::ClientContext* context, const W& request) + : context_(context), + cq_(grpc_completion_queue_attributes{ + GRPC_CQ_CURRENT_VERSION, GRPC_CQ_PLUCK, GRPC_CQ_DEFAULT_POLLING, + nullptr}), // Pluckable cq + call_(channel->CreateCall(method, context, &cq_)) { + ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata, + ::grpc::internal::CallOpSendMessage, + ::grpc::internal::CallOpClientSendClose> + ops; + ops.SendInitialMetadata(&context->send_initial_metadata_, + context->initial_metadata_flags()); + // TODO(ctiller): don't assert + GPR_CODEGEN_ASSERT(ops.SendMessagePtr(&request).ok()); + ops.ClientSendClose(); + call_.PerformOps(&ops); + cq_.Pluck(&ops); + } +}; + +/// Client-side interface for streaming writes of message type \a W. +template +class ClientWriterInterface : public internal::ClientStreamingInterface, + public internal::WriterInterface { + public: + /// Half close writing from the client. (signal that the stream of messages + /// coming from the client is complete). + /// Blocks until currently-pending writes are completed. + /// Thread safe with respect to \a ReaderInterface::Read operations only + /// + /// \return Whether the writes were successful. + virtual bool WritesDone() = 0; +}; + +namespace internal { +template +class ClientWriterFactory { + public: + template + static ClientWriter* Create(::grpc::ChannelInterface* channel, + const ::grpc::internal::RpcMethod& method, + ::grpc_impl::ClientContext* context, + R* response) { + return new ClientWriter(channel, method, context, response); + } +}; +} // namespace internal + +/// Synchronous (blocking) client-side API for doing client-streaming RPCs, +/// where the outgoing message stream coming from the client has messages of +/// type \a W. +template +class ClientWriter : public ClientWriterInterface { + public: + /// See the \a ClientStreamingInterface.WaitForInitialMetadata method for + /// semantics. + /// + // Side effect: + /// Once complete, the initial metadata read from the server will be + /// accessible through the \a ClientContext used to construct this object. + void WaitForInitialMetadata() { + GPR_CODEGEN_ASSERT(!context_->initial_metadata_received_); + + ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata> + ops; + ops.RecvInitialMetadata(context_); + call_.PerformOps(&ops); + cq_.Pluck(&ops); // status ignored + } + + /// See the WriterInterface.Write(const W& msg, WriteOptions options) method + /// for semantics. + /// + /// Side effect: + /// Also sends initial metadata if not already sent (using the + /// \a ClientContext associated with this call). + using internal::WriterInterface::Write; + bool Write(const W& msg, ::grpc::WriteOptions options) override { + ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata, + ::grpc::internal::CallOpSendMessage, + ::grpc::internal::CallOpClientSendClose> + ops; + + if (options.is_last_message()) { + options.set_buffer_hint(); + ops.ClientSendClose(); + } + if (context_->initial_metadata_corked_) { + ops.SendInitialMetadata(&context_->send_initial_metadata_, + context_->initial_metadata_flags()); + context_->set_initial_metadata_corked(false); + } + if (!ops.SendMessagePtr(&msg, options).ok()) { + return false; + } + + call_.PerformOps(&ops); + return cq_.Pluck(&ops); + } + + bool WritesDone() override { + ::grpc::internal::CallOpSet<::grpc::internal::CallOpClientSendClose> ops; + ops.ClientSendClose(); + call_.PerformOps(&ops); + return cq_.Pluck(&ops); + } + + /// See the ClientStreamingInterface.Finish method for semantics. + /// Side effects: + /// - Also receives initial metadata if not already received. + /// - Attempts to fill in the \a response parameter passed + /// to the constructor of this instance with the response + /// message from the server. + ::grpc::Status Finish() override { + ::grpc::Status status; + if (!context_->initial_metadata_received_) { + finish_ops_.RecvInitialMetadata(context_); + } + finish_ops_.ClientRecvStatus(context_, &status); + call_.PerformOps(&finish_ops_); + GPR_CODEGEN_ASSERT(cq_.Pluck(&finish_ops_)); + return status; + } + + private: + friend class internal::ClientWriterFactory; + + /// Block to create a stream (i.e. send request headers and other initial + /// metadata to the server). Note that \a context will be used to fill + /// in custom initial metadata. \a response will be filled in with the + /// single expected response message from the server upon a successful + /// call to the \a Finish method of this instance. + template + ClientWriter(::grpc::ChannelInterface* channel, + const ::grpc::internal::RpcMethod& method, + ::grpc_impl::ClientContext* context, R* response) + : context_(context), + cq_(grpc_completion_queue_attributes{ + GRPC_CQ_CURRENT_VERSION, GRPC_CQ_PLUCK, GRPC_CQ_DEFAULT_POLLING, + nullptr}), // Pluckable cq + call_(channel->CreateCall(method, context, &cq_)) { + finish_ops_.RecvMessage(response); + finish_ops_.AllowNoMessage(); + + if (!context_->initial_metadata_corked_) { + ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata> + ops; + ops.SendInitialMetadata(&context->send_initial_metadata_, + context->initial_metadata_flags()); + call_.PerformOps(&ops); + cq_.Pluck(&ops); + } + } + + ::grpc_impl::ClientContext* context_; + ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata, + ::grpc::internal::CallOpGenericRecvMessage, + ::grpc::internal::CallOpClientRecvStatus> + finish_ops_; + ::grpc_impl::CompletionQueue cq_; + ::grpc::internal::Call call_; +}; + +/// Client-side interface for bi-directional streaming with +/// client-to-server stream messages of type \a W and +/// server-to-client stream messages of type \a R. +template +class ClientReaderWriterInterface : public internal::ClientStreamingInterface, + public internal::WriterInterface, + public internal::ReaderInterface { + public: + /// Block to wait for initial metadata from server. The received metadata + /// can only be accessed after this call returns. Should only be called before + /// the first read. Calling this method is optional, and if it is not called + /// the metadata will be available in ClientContext after the first read. + virtual void WaitForInitialMetadata() = 0; + + /// Half close writing from the client. (signal that the stream of messages + /// coming from the client is complete). + /// Blocks until currently-pending writes are completed. + /// Thread-safe with respect to \a ReaderInterface::Read + /// + /// \return Whether the writes were successful. + virtual bool WritesDone() = 0; +}; + +namespace internal { +template +class ClientReaderWriterFactory { + public: + static ClientReaderWriter* Create( + ::grpc::ChannelInterface* channel, + const ::grpc::internal::RpcMethod& method, + ::grpc_impl::ClientContext* context) { + return new ClientReaderWriter(channel, method, context); + } +}; +} // namespace internal + +/// Synchronous (blocking) client-side API for bi-directional streaming RPCs, +/// where the outgoing message stream coming from the client has messages of +/// type \a W, and the incoming messages stream coming from the server has +/// messages of type \a R. +template +class ClientReaderWriter final : public ClientReaderWriterInterface { + public: + /// Block waiting to read initial metadata from the server. + /// This call is optional, but if it is used, it cannot be used concurrently + /// with or after the \a Finish method. + /// + /// Once complete, the initial metadata read from the server will be + /// accessible through the \a ClientContext used to construct this object. + void WaitForInitialMetadata() override { + GPR_CODEGEN_ASSERT(!context_->initial_metadata_received_); + + ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata> + ops; + ops.RecvInitialMetadata(context_); + call_.PerformOps(&ops); + cq_.Pluck(&ops); // status ignored + } + + bool NextMessageSize(uint32_t* sz) override { + int result = call_.max_receive_message_size(); + *sz = (result > 0) ? result : UINT32_MAX; + return true; + } + + /// See the \a ReaderInterface.Read method for semantics. + /// Side effect: + /// Also receives initial metadata if not already received (updates the \a + /// ClientContext associated with this call in that case). + bool Read(R* msg) override { + ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata, + ::grpc::internal::CallOpRecvMessage> + ops; + if (!context_->initial_metadata_received_) { + ops.RecvInitialMetadata(context_); + } + ops.RecvMessage(msg); + call_.PerformOps(&ops); + return cq_.Pluck(&ops) && ops.got_message; + } + + /// See the \a WriterInterface.Write method for semantics. + /// + /// Side effect: + /// Also sends initial metadata if not already sent (using the + /// \a ClientContext associated with this call to fill in values). + using internal::WriterInterface::Write; + bool Write(const W& msg, ::grpc::WriteOptions options) override { + ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata, + ::grpc::internal::CallOpSendMessage, + ::grpc::internal::CallOpClientSendClose> + ops; + + if (options.is_last_message()) { + options.set_buffer_hint(); + ops.ClientSendClose(); + } + if (context_->initial_metadata_corked_) { + ops.SendInitialMetadata(&context_->send_initial_metadata_, + context_->initial_metadata_flags()); + context_->set_initial_metadata_corked(false); + } + if (!ops.SendMessagePtr(&msg, options).ok()) { + return false; + } + + call_.PerformOps(&ops); + return cq_.Pluck(&ops); + } + + bool WritesDone() override { + ::grpc::internal::CallOpSet<::grpc::internal::CallOpClientSendClose> ops; + ops.ClientSendClose(); + call_.PerformOps(&ops); + return cq_.Pluck(&ops); + } + + /// See the ClientStreamingInterface.Finish method for semantics. + /// + /// Side effect: + /// - the \a ClientContext associated with this call is updated with + /// possible trailing metadata sent from the server. + ::grpc::Status Finish() override { + ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata, + ::grpc::internal::CallOpClientRecvStatus> + ops; + if (!context_->initial_metadata_received_) { + ops.RecvInitialMetadata(context_); + } + ::grpc::Status status; + ops.ClientRecvStatus(context_, &status); + call_.PerformOps(&ops); + GPR_CODEGEN_ASSERT(cq_.Pluck(&ops)); + return status; + } + + private: + friend class internal::ClientReaderWriterFactory; + + ::grpc_impl::ClientContext* context_; + ::grpc_impl::CompletionQueue cq_; + ::grpc::internal::Call call_; + + /// Block to create a stream and write the initial metadata and \a request + /// out. Note that \a context will be used to fill in custom initial metadata + /// used to send to the server when starting the call. + ClientReaderWriter(::grpc::ChannelInterface* channel, + const ::grpc::internal::RpcMethod& method, + ::grpc_impl::ClientContext* context) + : context_(context), + cq_(grpc_completion_queue_attributes{ + GRPC_CQ_CURRENT_VERSION, GRPC_CQ_PLUCK, GRPC_CQ_DEFAULT_POLLING, + nullptr}), // Pluckable cq + call_(channel->CreateCall(method, context, &cq_)) { + if (!context_->initial_metadata_corked_) { + ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata> + ops; + ops.SendInitialMetadata(&context->send_initial_metadata_, + context->initial_metadata_flags()); + call_.PerformOps(&ops); + cq_.Pluck(&ops); + } + } +}; + +/// Server-side interface for streaming reads of message of type \a R. +template +class ServerReaderInterface : public internal::ServerStreamingInterface, + public internal::ReaderInterface {}; + +/// Synchronous (blocking) server-side API for doing client-streaming RPCs, +/// where the incoming message stream coming from the client has messages of +/// type \a R. +template +class ServerReader final : public ServerReaderInterface { + public: + /// See the \a ServerStreamingInterface.SendInitialMetadata method + /// for semantics. Note that initial metadata will be affected by the + /// \a ServerContext associated with this call. + void SendInitialMetadata() override { + GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); + + ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata> + ops; + ops.SendInitialMetadata(&ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); + if (ctx_->compression_level_set()) { + ops.set_compression_level(ctx_->compression_level()); + } + ctx_->sent_initial_metadata_ = true; + call_->PerformOps(&ops); + call_->cq()->Pluck(&ops); + } + + bool NextMessageSize(uint32_t* sz) override { + int result = call_->max_receive_message_size(); + *sz = (result > 0) ? result : UINT32_MAX; + return true; + } + + bool Read(R* msg) override { + ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvMessage> ops; + ops.RecvMessage(msg); + call_->PerformOps(&ops); + return call_->cq()->Pluck(&ops) && ops.got_message; + } + + private: + ::grpc::internal::Call* const call_; + ServerContext* const ctx_; + + template + friend class ::grpc_impl::internal::ClientStreamingHandler; + + ServerReader(::grpc::internal::Call* call, ::grpc_impl::ServerContext* ctx) + : call_(call), ctx_(ctx) {} +}; + +/// Server-side interface for streaming writes of message of type \a W. +template +class ServerWriterInterface : public internal::ServerStreamingInterface, + public internal::WriterInterface {}; + +/// Synchronous (blocking) server-side API for doing for doing a +/// server-streaming RPCs, where the outgoing message stream coming from the +/// server has messages of type \a W. +template +class ServerWriter final : public ServerWriterInterface { + public: + /// See the \a ServerStreamingInterface.SendInitialMetadata method + /// for semantics. + /// Note that initial metadata will be affected by the + /// \a ServerContext associated with this call. + void SendInitialMetadata() override { + GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); + + ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata> + ops; + ops.SendInitialMetadata(&ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); + if (ctx_->compression_level_set()) { + ops.set_compression_level(ctx_->compression_level()); + } + ctx_->sent_initial_metadata_ = true; + call_->PerformOps(&ops); + call_->cq()->Pluck(&ops); + } + + /// See the \a WriterInterface.Write method for semantics. + /// + /// Side effect: + /// Also sends initial metadata if not already sent (using the + /// \a ClientContext associated with this call to fill in values). + using internal::WriterInterface::Write; + bool Write(const W& msg, ::grpc::WriteOptions options) override { + if (options.is_last_message()) { + options.set_buffer_hint(); + } + + if (!ctx_->pending_ops_.SendMessagePtr(&msg, options).ok()) { + return false; + } + if (!ctx_->sent_initial_metadata_) { + ctx_->pending_ops_.SendInitialMetadata(&ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); + if (ctx_->compression_level_set()) { + ctx_->pending_ops_.set_compression_level(ctx_->compression_level()); + } + ctx_->sent_initial_metadata_ = true; + } + call_->PerformOps(&ctx_->pending_ops_); + // if this is the last message we defer the pluck until AFTER we start + // the trailing md op. This prevents hangs. See + // https://github.com/grpc/grpc/issues/11546 + if (options.is_last_message()) { + ctx_->has_pending_ops_ = true; + return true; + } + ctx_->has_pending_ops_ = false; + return call_->cq()->Pluck(&ctx_->pending_ops_); + } + + private: + ::grpc::internal::Call* const call_; + ::grpc_impl::ServerContext* const ctx_; + + template + friend class ::grpc_impl::internal::ServerStreamingHandler; + + ServerWriter(::grpc::internal::Call* call, ::grpc_impl::ServerContext* ctx) + : call_(call), ctx_(ctx) {} +}; + +/// Server-side interface for bi-directional streaming. +template +class ServerReaderWriterInterface : public internal::ServerStreamingInterface, + public internal::WriterInterface, + public internal::ReaderInterface {}; + +/// Actual implementation of bi-directional streaming +namespace internal { +template +class ServerReaderWriterBody final { + public: + ServerReaderWriterBody(grpc::internal::Call* call, + ::grpc_impl::ServerContext* ctx) + : call_(call), ctx_(ctx) {} + + void SendInitialMetadata() { + GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); + + grpc::internal::CallOpSet ops; + ops.SendInitialMetadata(&ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); + if (ctx_->compression_level_set()) { + ops.set_compression_level(ctx_->compression_level()); + } + ctx_->sent_initial_metadata_ = true; + call_->PerformOps(&ops); + call_->cq()->Pluck(&ops); + } + + bool NextMessageSize(uint32_t* sz) { + int result = call_->max_receive_message_size(); + *sz = (result > 0) ? result : UINT32_MAX; + return true; + } + + bool Read(R* msg) { + ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvMessage> ops; + ops.RecvMessage(msg); + call_->PerformOps(&ops); + return call_->cq()->Pluck(&ops) && ops.got_message; + } + + bool Write(const W& msg, ::grpc::WriteOptions options) { + if (options.is_last_message()) { + options.set_buffer_hint(); + } + if (!ctx_->pending_ops_.SendMessagePtr(&msg, options).ok()) { + return false; + } + if (!ctx_->sent_initial_metadata_) { + ctx_->pending_ops_.SendInitialMetadata(&ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); + if (ctx_->compression_level_set()) { + ctx_->pending_ops_.set_compression_level(ctx_->compression_level()); + } + ctx_->sent_initial_metadata_ = true; + } + call_->PerformOps(&ctx_->pending_ops_); + // if this is the last message we defer the pluck until AFTER we start + // the trailing md op. This prevents hangs. See + // https://github.com/grpc/grpc/issues/11546 + if (options.is_last_message()) { + ctx_->has_pending_ops_ = true; + return true; + } + ctx_->has_pending_ops_ = false; + return call_->cq()->Pluck(&ctx_->pending_ops_); + } + + private: + grpc::internal::Call* const call_; + ::grpc_impl::ServerContext* const ctx_; +}; + +} // namespace internal + +/// Synchronous (blocking) server-side API for a bidirectional +/// streaming call, where the incoming message stream coming from the client has +/// messages of type \a R, and the outgoing message streaming coming from +/// the server has messages of type \a W. +template +class ServerReaderWriter final : public ServerReaderWriterInterface { + public: + /// See the \a ServerStreamingInterface.SendInitialMetadata method + /// for semantics. Note that initial metadata will be affected by the + /// \a ServerContext associated with this call. + void SendInitialMetadata() override { body_.SendInitialMetadata(); } + + bool NextMessageSize(uint32_t* sz) override { + return body_.NextMessageSize(sz); + } + + bool Read(R* msg) override { return body_.Read(msg); } + + /// See the \a WriterInterface.Write(const W& msg, WriteOptions options) + /// method for semantics. + /// Side effect: + /// Also sends initial metadata if not already sent (using the \a + /// ServerContext associated with this call). + using internal::WriterInterface::Write; + bool Write(const W& msg, ::grpc::WriteOptions options) override { + return body_.Write(msg, options); + } + + private: + internal::ServerReaderWriterBody body_; + + friend class ::grpc_impl::internal::TemplatedBidiStreamingHandler< + ServerReaderWriter, false>; + ServerReaderWriter(::grpc::internal::Call* call, + ::grpc_impl::ServerContext* ctx) + : body_(call, ctx) {} +}; + +/// A class to represent a flow-controlled unary call. This is something +/// of a hybrid between conventional unary and streaming. This is invoked +/// through a unary call on the client side, but the server responds to it +/// as though it were a single-ping-pong streaming call. The server can use +/// the \a NextMessageSize method to determine an upper-bound on the size of +/// the message. A key difference relative to streaming: ServerUnaryStreamer +/// must have exactly 1 Read and exactly 1 Write, in that order, to function +/// correctly. Otherwise, the RPC is in error. +template +class ServerUnaryStreamer final + : public ServerReaderWriterInterface { + public: + /// Block to send initial metadata to client. + /// Implicit input parameter: + /// - the \a ServerContext associated with this call will be used for + /// sending initial metadata. + void SendInitialMetadata() override { body_.SendInitialMetadata(); } + + /// Get an upper bound on the request message size from the client. + bool NextMessageSize(uint32_t* sz) override { + return body_.NextMessageSize(sz); + } + + /// Read a message of type \a R into \a msg. Completion will be notified by \a + /// tag on the associated completion queue. + /// This is thread-safe with respect to \a Write or \a WritesDone methods. It + /// should not be called concurrently with other streaming APIs + /// on the same stream. It is not meaningful to call it concurrently + /// with another \a ReaderInterface::Read on the same stream since reads on + /// the same stream are delivered in order. + /// + /// \param[out] msg Where to eventually store the read message. + /// \param[in] tag The tag identifying the operation. + bool Read(RequestType* request) override { + if (read_done_) { + return false; + } + read_done_ = true; + return body_.Read(request); + } + + /// Block to write \a msg to the stream with WriteOptions \a options. + /// This is thread-safe with respect to \a ReaderInterface::Read + /// + /// \param msg The message to be written to the stream. + /// \param options The WriteOptions affecting the write operation. + /// + /// \return \a true on success, \a false when the stream has been closed. + using internal::WriterInterface::Write; + bool Write(const ResponseType& response, + ::grpc::WriteOptions options) override { + if (write_done_ || !read_done_) { + return false; + } + write_done_ = true; + return body_.Write(response, options); + } + + private: + internal::ServerReaderWriterBody body_; + bool read_done_; + bool write_done_; + + friend class ::grpc_impl::internal::TemplatedBidiStreamingHandler< + ServerUnaryStreamer, true>; + ServerUnaryStreamer(::grpc::internal::Call* call, + ::grpc_impl::ServerContext* ctx) + : body_(call, ctx), read_done_(false), write_done_(false) {} +}; + +/// A class to represent a flow-controlled server-side streaming call. +/// This is something of a hybrid between server-side and bidi streaming. +/// This is invoked through a server-side streaming call on the client side, +/// but the server responds to it as though it were a bidi streaming call that +/// must first have exactly 1 Read and then any number of Writes. +template +class ServerSplitStreamer final + : public ServerReaderWriterInterface { + public: + /// Block to send initial metadata to client. + /// Implicit input parameter: + /// - the \a ServerContext associated with this call will be used for + /// sending initial metadata. + void SendInitialMetadata() override { body_.SendInitialMetadata(); } + + /// Get an upper bound on the request message size from the client. + bool NextMessageSize(uint32_t* sz) override { + return body_.NextMessageSize(sz); + } + + /// Read a message of type \a R into \a msg. Completion will be notified by \a + /// tag on the associated completion queue. + /// This is thread-safe with respect to \a Write or \a WritesDone methods. It + /// should not be called concurrently with other streaming APIs + /// on the same stream. It is not meaningful to call it concurrently + /// with another \a ReaderInterface::Read on the same stream since reads on + /// the same stream are delivered in order. + /// + /// \param[out] msg Where to eventually store the read message. + /// \param[in] tag The tag identifying the operation. + bool Read(RequestType* request) override { + if (read_done_) { + return false; + } + read_done_ = true; + return body_.Read(request); + } + + /// Block to write \a msg to the stream with WriteOptions \a options. + /// This is thread-safe with respect to \a ReaderInterface::Read + /// + /// \param msg The message to be written to the stream. + /// \param options The WriteOptions affecting the write operation. + /// + /// \return \a true on success, \a false when the stream has been closed. + using internal::WriterInterface::Write; + bool Write(const ResponseType& response, + ::grpc::WriteOptions options) override { + return read_done_ && body_.Write(response, options); + } + + private: + internal::ServerReaderWriterBody body_; + bool read_done_; + + friend class ::grpc_impl::internal::TemplatedBidiStreamingHandler< + ServerSplitStreamer, false>; + ServerSplitStreamer(::grpc::internal::Call* call, + ::grpc_impl::ServerContext* ctx) + : body_(call, ctx), read_done_(false) {} +}; + +} // namespace grpc_impl + +#endif // GRPCPP_IMPL_CODEGEN_SYNC_STREAM_IMPL_H diff --git a/include/grpcpp/impl/codegen/time.h b/include/grpcpp/impl/codegen/time.h new file mode 100644 index 00000000..a08e9cbe --- /dev/null +++ b/include/grpcpp/impl/codegen/time.h @@ -0,0 +1,87 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_CODEGEN_TIME_H +#define GRPCPP_IMPL_CODEGEN_TIME_H + +#include + +#include +#include + +namespace grpc { + +/** If you are trying to use CompletionQueue::AsyncNext with a time class that + isn't either gpr_timespec or std::chrono::system_clock::time_point, you + will most likely be looking at this comment as your compiler will have + fired an error below. In order to fix this issue, you have two potential + solutions: + + 1. Use gpr_timespec or std::chrono::system_clock::time_point instead + 2. Specialize the TimePoint class with whichever time class that you + want to use here. See below for two examples of how to do this. + */ +template +class TimePoint { + public: + // If you see the error with methods below, you may need either + // i) using the existing types having a conversion class such as + // gpr_timespec and std::chrono::system_clock::time_point or + // ii) writing a new TimePoint to address your case. + TimePoint(const T& /*time*/) = delete; + gpr_timespec raw_time() = delete; +}; + +template <> +class TimePoint { + public: + TimePoint(const gpr_timespec& time) : time_(time) {} + gpr_timespec raw_time() { return time_; } + + private: + gpr_timespec time_; +}; + +} // namespace grpc + +namespace grpc { + +// from and to should be absolute time. +void Timepoint2Timespec(const std::chrono::system_clock::time_point& from, + gpr_timespec* to); +void TimepointHR2Timespec( + const std::chrono::high_resolution_clock::time_point& from, + gpr_timespec* to); + +std::chrono::system_clock::time_point Timespec2Timepoint(gpr_timespec t); + +template <> +class TimePoint { + public: + TimePoint(const std::chrono::system_clock::time_point& time) { + Timepoint2Timespec(time, &time_); + } + gpr_timespec raw_time() const { return time_; } + + private: + gpr_timespec time_; +}; + +} // namespace grpc + +#endif // GRPCPP_IMPL_CODEGEN_TIME_H diff --git a/include/grpcpp/impl/grpc_library.h b/include/grpcpp/impl/grpc_library.h new file mode 100644 index 00000000..3711c098 --- /dev/null +++ b/include/grpcpp/impl/grpc_library.h @@ -0,0 +1,60 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_GRPC_LIBRARY_H +#define GRPCPP_IMPL_GRPC_LIBRARY_H + +#include + +#include +#include +#include +#include + +namespace grpc { + +namespace internal { +class GrpcLibrary final : public GrpcLibraryInterface { + public: + void init() override { grpc_init(); } + void shutdown() override { grpc_shutdown(); } +}; + +/// Instantiating this class ensures the proper initialization of gRPC. +class GrpcLibraryInitializer final { + public: + GrpcLibraryInitializer() { + if (grpc::g_glip == nullptr) { + static auto* const g_gli = new GrpcLibrary(); + grpc::g_glip = g_gli; + } + if (grpc::g_core_codegen_interface == nullptr) { + static auto* const g_core_codegen = new CoreCodegen(); + grpc::g_core_codegen_interface = g_core_codegen; + } + } + + /// A no-op method to force the linker to reference this class, which will + /// take care of initializing and shutting down the gRPC runtime. + int summon() { return 0; } +}; + +} // namespace internal +} // namespace grpc + +#endif // GRPCPP_IMPL_GRPC_LIBRARY_H diff --git a/include/grpcpp/impl/method_handler_impl.h b/include/grpcpp/impl/method_handler_impl.h new file mode 100644 index 00000000..7f3be642 --- /dev/null +++ b/include/grpcpp/impl/method_handler_impl.h @@ -0,0 +1,24 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_METHOD_HANDLER_IMPL_H +#define GRPCPP_IMPL_METHOD_HANDLER_IMPL_H + +#include + +#endif // GRPCPP_IMPL_METHOD_HANDLER_IMPL_H diff --git a/include/grpcpp/impl/rpc_method.h b/include/grpcpp/impl/rpc_method.h new file mode 100644 index 00000000..5da70416 --- /dev/null +++ b/include/grpcpp/impl/rpc_method.h @@ -0,0 +1,24 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_RPC_METHOD_H +#define GRPCPP_IMPL_RPC_METHOD_H + +#include + +#endif // GRPCPP_IMPL_RPC_METHOD_H diff --git a/include/grpcpp/impl/rpc_service_method.h b/include/grpcpp/impl/rpc_service_method.h new file mode 100644 index 00000000..ef70a3a1 --- /dev/null +++ b/include/grpcpp/impl/rpc_service_method.h @@ -0,0 +1,24 @@ +/* + * + * Copyright 2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_RPC_SERVICE_METHOD_H +#define GRPCPP_IMPL_RPC_SERVICE_METHOD_H + +#include + +#endif // GRPCPP_IMPL_RPC_SERVICE_METHOD_H diff --git a/include/grpcpp/impl/serialization_traits.h b/include/grpcpp/impl/serialization_traits.h new file mode 100644 index 00000000..95194fbd --- /dev/null +++ b/include/grpcpp/impl/serialization_traits.h @@ -0,0 +1,24 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_SERIALIZATION_TRAITS_H +#define GRPCPP_IMPL_SERIALIZATION_TRAITS_H + +#include + +#endif // GRPCPP_IMPL_SERIALIZATION_TRAITS_H diff --git a/include/grpcpp/impl/server_builder_option.h b/include/grpcpp/impl/server_builder_option.h new file mode 100644 index 00000000..4b3d6b54 --- /dev/null +++ b/include/grpcpp/impl/server_builder_option.h @@ -0,0 +1,30 @@ +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_SERVER_BUILDER_OPTION_H +#define GRPCPP_IMPL_SERVER_BUILDER_OPTION_H + +#include + +namespace grpc { + +typedef ::grpc_impl::ServerBuilderOption ServerBuilderOption; + +} // namespace grpc + +#endif // GRPCPP_IMPL_SERVER_BUILDER_OPTION_H diff --git a/include/grpcpp/impl/server_builder_option_impl.h b/include/grpcpp/impl/server_builder_option_impl.h new file mode 100644 index 00000000..8271d0f5 --- /dev/null +++ b/include/grpcpp/impl/server_builder_option_impl.h @@ -0,0 +1,43 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_SERVER_BUILDER_OPTION_IMPL_H +#define GRPCPP_IMPL_SERVER_BUILDER_OPTION_IMPL_H + +#include +#include + +#include +#include + +namespace grpc_impl { + +/// Interface to pass an option to a \a ServerBuilder. +class ServerBuilderOption { + public: + virtual ~ServerBuilderOption() {} + /// Alter the \a ChannelArguments used to create the gRPC server. + virtual void UpdateArguments(grpc::ChannelArguments* args) = 0; + /// Alter the ServerBuilderPlugin map that will be added into ServerBuilder. + virtual void UpdatePlugins( + std::vector>* plugins) = 0; +}; + +} // namespace grpc_impl + +#endif // GRPCPP_IMPL_SERVER_BUILDER_OPTION_IMPL_H diff --git a/include/grpcpp/impl/server_builder_plugin.h b/include/grpcpp/impl/server_builder_plugin.h new file mode 100644 index 00000000..203e5465 --- /dev/null +++ b/include/grpcpp/impl/server_builder_plugin.h @@ -0,0 +1,68 @@ +/* + * + * Copyright 2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_SERVER_BUILDER_PLUGIN_H +#define GRPCPP_IMPL_SERVER_BUILDER_PLUGIN_H + +#include + +#include +#include + +namespace grpc_impl { + +class ServerBuilder; +class ServerInitializer; +} // namespace grpc_impl +namespace grpc { + +/// This interface is meant for internal usage only. Implementations of this +/// interface should add themselves to a \a ServerBuilder instance through the +/// \a InternalAddPluginFactory method. +class ServerBuilderPlugin { + public: + virtual ~ServerBuilderPlugin() {} + virtual grpc::string name() = 0; + + /// UpdateServerBuilder will be called at an early stage in + /// ServerBuilder::BuildAndStart(), right after the ServerBuilderOptions have + /// done their updates. + virtual void UpdateServerBuilder(grpc_impl::ServerBuilder* /*builder*/) {} + + /// InitServer will be called in ServerBuilder::BuildAndStart(), after the + /// Server instance is created. + virtual void InitServer(grpc_impl::ServerInitializer* si) = 0; + + /// Finish will be called at the end of ServerBuilder::BuildAndStart(). + virtual void Finish(grpc_impl::ServerInitializer* si) = 0; + + /// ChangeArguments is an interface that can be used in + /// ServerBuilderOption::UpdatePlugins + virtual void ChangeArguments(const grpc::string& name, void* value) = 0; + + /// UpdateChannelArguments will be called in ServerBuilder::BuildAndStart(), + /// before the Server instance is created. + virtual void UpdateChannelArguments(ChannelArguments* /*args*/) {} + + virtual bool has_sync_methods() const { return false; } + virtual bool has_async_methods() const { return false; } +}; + +} // namespace grpc + +#endif // GRPCPP_IMPL_SERVER_BUILDER_PLUGIN_H diff --git a/include/grpcpp/impl/server_initializer.h b/include/grpcpp/impl/server_initializer.h new file mode 100644 index 00000000..d40bb98f --- /dev/null +++ b/include/grpcpp/impl/server_initializer.h @@ -0,0 +1,30 @@ +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_SERVER_INITIALIZER_H +#define GRPCPP_IMPL_SERVER_INITIALIZER_H + +#include + +namespace grpc { + +typedef ::grpc_impl::ServerInitializer ServerInitializer; + +} // namespace grpc + +#endif // GRPCPP_IMPL_SERVER_INITIALIZER_H diff --git a/include/grpcpp/impl/server_initializer_impl.h b/include/grpcpp/impl/server_initializer_impl.h new file mode 100644 index 00000000..0e2c65f4 --- /dev/null +++ b/include/grpcpp/impl/server_initializer_impl.h @@ -0,0 +1,57 @@ +/* + * + * Copyright 2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_SERVER_INITIALIZER_IMPL_H +#define GRPCPP_IMPL_SERVER_INITIALIZER_IMPL_H + +#include +#include + +#include + +namespace grpc { + +class Service; +} // namespace grpc +namespace grpc_impl { +class Server; + +class ServerInitializer { + public: + ServerInitializer(grpc::Server* server) : server_(server) {} + + bool RegisterService(std::shared_ptr service) { + if (!server_->RegisterService(nullptr, service.get())) { + return false; + } + default_services_.push_back(service); + return true; + } + + const std::vector* GetServiceList() { + return &server_->services_; + } + + private: + grpc::Server* server_; + std::vector > default_services_; +}; + +} // namespace grpc_impl + +#endif // GRPCPP_IMPL_SERVER_INITIALIZER_IMPL_H diff --git a/include/grpcpp/impl/service_type.h b/include/grpcpp/impl/service_type.h new file mode 100644 index 00000000..250bc8cd --- /dev/null +++ b/include/grpcpp/impl/service_type.h @@ -0,0 +1,24 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_IMPL_SERVICE_TYPE_H +#define GRPCPP_IMPL_SERVICE_TYPE_H + +#include + +#endif // GRPCPP_IMPL_SERVICE_TYPE_H diff --git a/include/grpcpp/opencensus.h b/include/grpcpp/opencensus.h new file mode 100644 index 00000000..0d66c8d8 --- /dev/null +++ b/include/grpcpp/opencensus.h @@ -0,0 +1,51 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_OPENCENSUS_H +#define GRPCPP_OPENCENSUS_H + +#include "opencensus/trace/span.h" + +namespace grpc_impl { +class ServerContext; +} + +namespace grpc { +// These symbols in this file will not be included in the binary unless +// grpc_opencensus_plugin build target was added as a dependency. At the moment +// it is only setup to be built with Bazel. + +// Registers the OpenCensus plugin with gRPC, so that it will be used for future +// RPCs. This must be called before any views are created. +void RegisterOpenCensusPlugin(); + +// RPC stats definitions, defined by +// https://github.com/census-instrumentation/opencensus-specs/blob/master/stats/gRPC.md + +// Registers the cumulative gRPC views so that they will be exported by any +// registered stats exporter. For on-task stats, construct a View using the +// ViewDescriptors below. +void RegisterOpenCensusViewsForExport(); + +// Returns the tracing Span for the current RPC. +::opencensus::trace::Span GetSpanFromServerContext( + ::grpc_impl::ServerContext* context); + +} // namespace grpc + +#endif // GRPCPP_OPENCENSUS_H diff --git a/include/grpcpp/resource_quota.h b/include/grpcpp/resource_quota.h new file mode 100644 index 00000000..333767b9 --- /dev/null +++ b/include/grpcpp/resource_quota.h @@ -0,0 +1,29 @@ +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_RESOURCE_QUOTA_H +#define GRPCPP_RESOURCE_QUOTA_H + +#include + +namespace grpc { + +typedef ::grpc_impl::ResourceQuota ResourceQuota; +} // namespace grpc + +#endif // GRPCPP_RESOURCE_QUOTA_H diff --git a/include/grpcpp/resource_quota_impl.h b/include/grpcpp/resource_quota_impl.h new file mode 100644 index 00000000..16c0e353 --- /dev/null +++ b/include/grpcpp/resource_quota_impl.h @@ -0,0 +1,68 @@ +/* + * + * Copyright 2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_RESOURCE_QUOTA_IMPL_H +#define GRPCPP_RESOURCE_QUOTA_IMPL_H + +struct grpc_resource_quota; + +#include +#include + +namespace grpc_impl { + +/// ResourceQuota represents a bound on memory and thread usage by the gRPC +/// library. A ResourceQuota can be attached to a server (via \a ServerBuilder), +/// or a client channel (via \a ChannelArguments). +/// gRPC will attempt to keep memory and threads used by all attached entities +/// below the ResourceQuota bound. +class ResourceQuota final : private ::grpc::GrpcLibraryCodegen { + public: + /// \param name - a unique name for this ResourceQuota. + explicit ResourceQuota(const grpc::string& name); + ResourceQuota(); + ~ResourceQuota(); + + /// Resize this \a ResourceQuota to a new size. If \a new_size is smaller + /// than the current size of the pool, memory usage will be monotonically + /// decreased until it falls under \a new_size. + /// No time bound is given for this to occur however. + ResourceQuota& Resize(size_t new_size); + + /// Set the max number of threads that can be allocated from this + /// ResourceQuota object. + /// + /// If the new_max_threads value is smaller than the current value, no new + /// threads are allocated until the number of active threads fall below + /// new_max_threads. There is no time bound on when this may happen i.e none + /// of the current threads are forcefully destroyed and all threads run their + /// normal course. + ResourceQuota& SetMaxThreads(int new_max_threads); + + grpc_resource_quota* c_resource_quota() const { return impl_; } + + private: + ResourceQuota(const ResourceQuota& rhs); + ResourceQuota& operator=(const ResourceQuota& rhs); + + grpc_resource_quota* const impl_; +}; + +} // namespace grpc_impl + +#endif // GRPCPP_RESOURCE_QUOTA_IMPL_H diff --git a/include/grpcpp/security/alts_context.h b/include/grpcpp/security/alts_context.h new file mode 100644 index 00000000..9208730d --- /dev/null +++ b/include/grpcpp/security/alts_context.h @@ -0,0 +1,67 @@ +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SECURITY_ALTS_CONTEXT_H +#define GRPCPP_SECURITY_ALTS_CONTEXT_H + +#include +#include + +#include + +struct grpc_gcp_AltsContext; + +namespace grpc { +namespace experimental { + +// AltsContext is a wrapper class for grpc_gcp_AltsContext. +class AltsContext { + public: + struct RpcProtocolVersions { + struct Version { + int major_version; + int minor_version; + }; + Version max_rpc_version; + Version min_rpc_version; + }; + explicit AltsContext(const grpc_gcp_AltsContext* ctx); + AltsContext& operator=(const AltsContext&) = default; + AltsContext(const AltsContext&) = default; + + grpc::string application_protocol() const; + grpc::string record_protocol() const; + grpc::string peer_service_account() const; + grpc::string local_service_account() const; + grpc_security_level security_level() const; + RpcProtocolVersions peer_rpc_versions() const; + + private: + // TODO(ZhenLian): Also plumb field peer_attributes when it is in use + grpc::string application_protocol_; + grpc::string record_protocol_; + grpc::string peer_service_account_; + grpc::string local_service_account_; + grpc_security_level security_level_ = GRPC_SECURITY_NONE; + RpcProtocolVersions peer_rpc_versions_ = {{0, 0}, {0, 0}}; +}; + +} // namespace experimental +} // namespace grpc + +#endif // GRPCPP_SECURITY_ALTS_CONTEXT_H diff --git a/include/grpcpp/security/alts_util.h b/include/grpcpp/security/alts_util.h new file mode 100644 index 00000000..2b2b07e4 --- /dev/null +++ b/include/grpcpp/security/alts_util.h @@ -0,0 +1,50 @@ +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SECURITY_ALTS_UTIL_H +#define GRPCPP_SECURITY_ALTS_UTIL_H + +#include +#include +#include +#include + +#include + +struct grpc_gcp_AltsContext; + +namespace grpc { +namespace experimental { + +// GetAltsContextFromAuthContext helps to get the AltsContext from AuthContext. +// If ALTS is not the transport security protocol used to establish the +// connection, this function will return nullptr. +std::unique_ptr GetAltsContextFromAuthContext( + const std::shared_ptr& auth_context); + +// This utility function performs ALTS client authorization check on server +// side, i.e., checks if the client identity matches one of the expected service +// accounts. It returns OK if client is authorized and an error otherwise. +grpc::Status AltsClientAuthzCheck( + const std::shared_ptr& auth_context, + const std::vector& expected_service_accounts); + +} // namespace experimental +} // namespace grpc + +#endif // GRPCPP_SECURITY_ALTS_UTIL_H diff --git a/include/grpcpp/security/auth_context.h b/include/grpcpp/security/auth_context.h new file mode 100644 index 00000000..7a6f2cb7 --- /dev/null +++ b/include/grpcpp/security/auth_context.h @@ -0,0 +1,24 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SECURITY_AUTH_CONTEXT_H +#define GRPCPP_SECURITY_AUTH_CONTEXT_H + +#include + +#endif // GRPCPP_SECURITY_AUTH_CONTEXT_H diff --git a/include/grpcpp/security/auth_metadata_processor.h b/include/grpcpp/security/auth_metadata_processor.h new file mode 100644 index 00000000..1b66b72b --- /dev/null +++ b/include/grpcpp/security/auth_metadata_processor.h @@ -0,0 +1,30 @@ +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SECURITY_AUTH_METADATA_PROCESSOR_H +#define GRPCPP_SECURITY_AUTH_METADATA_PROCESSOR_H + +#include + +namespace grpc { + +typedef ::grpc_impl::AuthMetadataProcessor AuthMetadataProcessor; + +} // namespace grpc + +#endif // GRPCPP_SECURITY_AUTH_METADATA_PROCESSOR_H diff --git a/include/grpcpp/security/auth_metadata_processor_impl.h b/include/grpcpp/security/auth_metadata_processor_impl.h new file mode 100644 index 00000000..ae454200 --- /dev/null +++ b/include/grpcpp/security/auth_metadata_processor_impl.h @@ -0,0 +1,61 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SECURITY_AUTH_METADATA_PROCESSOR_IMPL_H +#define GRPCPP_SECURITY_AUTH_METADATA_PROCESSOR_IMPL_H + +#include + +#include +#include +#include + +namespace grpc_impl { + +/// Interface allowing custom server-side authorization based on credentials +/// encoded in metadata. Objects of this type can be passed to +/// \a ServerCredentials::SetAuthMetadataProcessor(). +class AuthMetadataProcessor { + public: + typedef std::multimap InputMetadata; + typedef std::multimap OutputMetadata; + + virtual ~AuthMetadataProcessor() {} + + /// If this method returns true, the \a Process function will be scheduled in + /// a different thread from the one processing the call. + virtual bool IsBlocking() const { return true; } + + /// context is read/write: it contains the properties of the channel peer and + /// it is the job of the Process method to augment it with properties derived + /// from the passed-in auth_metadata. + /// consumed_auth_metadata needs to be filled with metadata that has been + /// consumed by the processor and will be removed from the call. + /// response_metadata is the metadata that will be sent as part of the + /// response. + /// If the return value is not Status::OK, the rpc call will be aborted with + /// the error code and error message sent back to the client. + virtual grpc::Status Process(const InputMetadata& auth_metadata, + grpc::AuthContext* context, + OutputMetadata* consumed_auth_metadata, + OutputMetadata* response_metadata) = 0; +}; + +} // namespace grpc_impl + +#endif // GRPCPP_SECURITY_AUTH_METADATA_PROCESSOR_IMPL_H diff --git a/include/grpcpp/security/credentials.h b/include/grpcpp/security/credentials.h new file mode 100644 index 00000000..0449017e --- /dev/null +++ b/include/grpcpp/security/credentials.h @@ -0,0 +1,143 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SECURITY_CREDENTIALS_H +#define GRPCPP_SECURITY_CREDENTIALS_H + +#include + +namespace grpc { + +typedef ::grpc_impl::ChannelCredentials ChannelCredentials; +typedef ::grpc_impl::CallCredentials CallCredentials; +typedef ::grpc_impl::SslCredentialsOptions SslCredentialsOptions; +typedef ::grpc_impl::SecureCallCredentials SecureCallCredentials; +typedef ::grpc_impl::SecureChannelCredentials SecureChannelCredentials; +typedef ::grpc_impl::MetadataCredentialsPlugin MetadataCredentialsPlugin; + +static inline std::shared_ptr +GoogleDefaultCredentials() { + return ::grpc_impl::GoogleDefaultCredentials(); +} + +static inline std::shared_ptr SslCredentials( + const SslCredentialsOptions& options) { + return ::grpc_impl::SslCredentials(options); +} + +static inline std::shared_ptr +GoogleComputeEngineCredentials() { + return ::grpc_impl::GoogleComputeEngineCredentials(); +} + +/// Constant for maximum auth token lifetime. +constexpr long kMaxAuthTokenLifetimeSecs = + ::grpc_impl::kMaxAuthTokenLifetimeSecs; + +static inline std::shared_ptr +ServiceAccountJWTAccessCredentials( + const grpc::string& json_key, + long token_lifetime_seconds = grpc::kMaxAuthTokenLifetimeSecs) { + return ::grpc_impl::ServiceAccountJWTAccessCredentials( + json_key, token_lifetime_seconds); +} + +static inline std::shared_ptr +GoogleRefreshTokenCredentials(const grpc::string& json_refresh_token) { + return ::grpc_impl::GoogleRefreshTokenCredentials(json_refresh_token); +} + +static inline std::shared_ptr +AccessTokenCredentials(const grpc::string& access_token) { + return ::grpc_impl::AccessTokenCredentials(access_token); +} + +static inline std::shared_ptr GoogleIAMCredentials( + const grpc::string& authorization_token, + const grpc::string& authority_selector) { + return ::grpc_impl::GoogleIAMCredentials(authorization_token, + authority_selector); +} + +static inline std::shared_ptr CompositeChannelCredentials( + const std::shared_ptr& channel_creds, + const std::shared_ptr& call_creds) { + return ::grpc_impl::CompositeChannelCredentials(channel_creds, call_creds); +} + +static inline std::shared_ptr +CompositeCallCredentials(const std::shared_ptr& creds1, + const std::shared_ptr& creds2) { + return ::grpc_impl::CompositeCallCredentials(creds1, creds2); +} + +static inline std::shared_ptr +InsecureChannelCredentials() { + return ::grpc_impl::InsecureChannelCredentials(); +} + +typedef ::grpc_impl::MetadataCredentialsPlugin MetadataCredentialsPlugin; + +static inline std::shared_ptr +MetadataCredentialsFromPlugin( + std::unique_ptr plugin) { + return ::grpc_impl::MetadataCredentialsFromPlugin(std::move(plugin)); +} + +namespace experimental { + +typedef ::grpc_impl::experimental::StsCredentialsOptions StsCredentialsOptions; + +static inline grpc::Status StsCredentialsOptionsFromJson( + const grpc::string& json_string, StsCredentialsOptions* options) { + return ::grpc_impl::experimental::StsCredentialsOptionsFromJson(json_string, + options); +} + +static inline grpc::Status StsCredentialsOptionsFromEnv( + StsCredentialsOptions* options) { + return grpc_impl::experimental::StsCredentialsOptionsFromEnv(options); +} + +static inline std::shared_ptr StsCredentials( + const StsCredentialsOptions& options) { + return grpc_impl::experimental::StsCredentials(options); +} + +typedef ::grpc_impl::experimental::AltsCredentialsOptions + AltsCredentialsOptions; + +static inline std::shared_ptr AltsCredentials( + const AltsCredentialsOptions& options) { + return ::grpc_impl::experimental::AltsCredentials(options); +} + +static inline std::shared_ptr LocalCredentials( + grpc_local_connect_type type) { + return ::grpc_impl::experimental::LocalCredentials(type); +} + +static inline std::shared_ptr TlsCredentials( + const ::grpc_impl::experimental::TlsCredentialsOptions& options) { + return ::grpc_impl::experimental::TlsCredentials(options); +} + +} // namespace experimental +} // namespace grpc + +#endif // GRPCPP_SECURITY_CREDENTIALS_H diff --git a/include/grpcpp/security/credentials_impl.h b/include/grpcpp/security/credentials_impl.h new file mode 100644 index 00000000..aed58283 --- /dev/null +++ b/include/grpcpp/security/credentials_impl.h @@ -0,0 +1,358 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SECURITY_CREDENTIALS_IMPL_H +#define GRPCPP_SECURITY_CREDENTIALS_IMPL_H + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct grpc_call; + +namespace grpc_impl { + +class ChannelCredentials; +class CallCredentials; +class SecureCallCredentials; +class SecureChannelCredentials; + +std::shared_ptr CreateCustomChannelImpl( + const grpc::string& target, + const std::shared_ptr& creds, + const ChannelArguments& args); + +namespace experimental { +std::shared_ptr CreateCustomChannelWithInterceptors( + const grpc::string& target, + const std::shared_ptr& creds, + const ChannelArguments& args, + std::vector< + std::unique_ptr> + interceptor_creators); +} + +/// A channel credentials object encapsulates all the state needed by a client +/// to authenticate with a server for a given channel. +/// It can make various assertions, e.g., about the client’s identity, role +/// for all the calls on that channel. +/// +/// \see https://grpc.io/docs/guides/auth.html +class ChannelCredentials : private grpc::GrpcLibraryCodegen { + public: + ChannelCredentials(); + ~ChannelCredentials(); + + protected: + friend std::shared_ptr CompositeChannelCredentials( + const std::shared_ptr& channel_creds, + const std::shared_ptr& call_creds); + + virtual SecureChannelCredentials* AsSecureCredentials() = 0; + + private: + friend std::shared_ptr CreateCustomChannelImpl( + const grpc::string& target, + const std::shared_ptr& creds, + const ChannelArguments& args); + + friend std::shared_ptr + grpc_impl::experimental::CreateCustomChannelWithInterceptors( + const grpc::string& target, + const std::shared_ptr& creds, + const ChannelArguments& args, + std::vector> + interceptor_creators); + + virtual std::shared_ptr CreateChannelImpl( + const grpc::string& target, const ChannelArguments& args) = 0; + + // This function should have been a pure virtual function, but it is + // implemented as a virtual function so that it does not break API. + virtual std::shared_ptr CreateChannelWithInterceptors( + const grpc::string& /*target*/, const ChannelArguments& /*args*/, + std::vector> + /*interceptor_creators*/) { + return nullptr; + } +}; + +/// A call credentials object encapsulates the state needed by a client to +/// authenticate with a server for a given call on a channel. +/// +/// \see https://grpc.io/docs/guides/auth.html +class CallCredentials : private grpc::GrpcLibraryCodegen { + public: + CallCredentials(); + ~CallCredentials(); + + /// Apply this instance's credentials to \a call. + virtual bool ApplyToCall(grpc_call* call) = 0; + virtual grpc::string DebugString() { + return "CallCredentials did not provide a debug string"; + } + + protected: + friend std::shared_ptr CompositeChannelCredentials( + const std::shared_ptr& channel_creds, + const std::shared_ptr& call_creds); + + friend std::shared_ptr CompositeCallCredentials( + const std::shared_ptr& creds1, + const std::shared_ptr& creds2); + + virtual SecureCallCredentials* AsSecureCredentials() = 0; +}; + +/// Options used to build SslCredentials. +struct SslCredentialsOptions { + /// The buffer containing the PEM encoding of the server root certificates. If + /// this parameter is empty, the default roots will be used. The default + /// roots can be overridden using the \a GRPC_DEFAULT_SSL_ROOTS_FILE_PATH + /// environment variable pointing to a file on the file system containing the + /// roots. + grpc::string pem_root_certs; + + /// The buffer containing the PEM encoding of the client's private key. This + /// parameter can be empty if the client does not have a private key. + grpc::string pem_private_key; + + /// The buffer containing the PEM encoding of the client's certificate chain. + /// This parameter can be empty if the client does not have a certificate + /// chain. + grpc::string pem_cert_chain; +}; + +// Factories for building different types of Credentials The functions may +// return empty shared_ptr when credentials cannot be created. If a +// Credentials pointer is returned, it can still be invalid when used to create +// a channel. A lame channel will be created then and all rpcs will fail on it. + +/// Builds credentials with reasonable defaults. +/// +/// \warning Only use these credentials when connecting to a Google endpoint. +/// Using these credentials to connect to any other service may result in this +/// service being able to impersonate your client for requests to Google +/// services. +std::shared_ptr GoogleDefaultCredentials(); + +/// Builds SSL Credentials given SSL specific options +std::shared_ptr SslCredentials( + const SslCredentialsOptions& options); + +/// Builds credentials for use when running in GCE +/// +/// \warning Only use these credentials when connecting to a Google endpoint. +/// Using these credentials to connect to any other service may result in this +/// service being able to impersonate your client for requests to Google +/// services. +std::shared_ptr GoogleComputeEngineCredentials(); + +constexpr long kMaxAuthTokenLifetimeSecs = 3600; + +/// Builds Service Account JWT Access credentials. +/// json_key is the JSON key string containing the client's private key. +/// token_lifetime_seconds is the lifetime in seconds of each Json Web Token +/// (JWT) created with this credentials. It should not exceed +/// \a kMaxAuthTokenLifetimeSecs or will be cropped to this value. +std::shared_ptr ServiceAccountJWTAccessCredentials( + const grpc::string& json_key, + long token_lifetime_seconds = grpc_impl::kMaxAuthTokenLifetimeSecs); + +/// Builds refresh token credentials. +/// json_refresh_token is the JSON string containing the refresh token along +/// with a client_id and client_secret. +/// +/// \warning Only use these credentials when connecting to a Google endpoint. +/// Using these credentials to connect to any other service may result in this +/// service being able to impersonate your client for requests to Google +/// services. +std::shared_ptr GoogleRefreshTokenCredentials( + const grpc::string& json_refresh_token); + +/// Builds access token credentials. +/// access_token is an oauth2 access token that was fetched using an out of band +/// mechanism. +/// +/// \warning Only use these credentials when connecting to a Google endpoint. +/// Using these credentials to connect to any other service may result in this +/// service being able to impersonate your client for requests to Google +/// services. +std::shared_ptr AccessTokenCredentials( + const grpc::string& access_token); + +/// Builds IAM credentials. +/// +/// \warning Only use these credentials when connecting to a Google endpoint. +/// Using these credentials to connect to any other service may result in this +/// service being able to impersonate your client for requests to Google +/// services. +std::shared_ptr GoogleIAMCredentials( + const grpc::string& authorization_token, + const grpc::string& authority_selector); + +/// Combines a channel credentials and a call credentials into a composite +/// channel credentials. +std::shared_ptr CompositeChannelCredentials( + const std::shared_ptr& channel_creds, + const std::shared_ptr& call_creds); + +/// Combines two call credentials objects into a composite call credentials. +std::shared_ptr CompositeCallCredentials( + const std::shared_ptr& creds1, + const std::shared_ptr& creds2); + +/// Credentials for an unencrypted, unauthenticated channel +std::shared_ptr InsecureChannelCredentials(); + +/// User defined metadata credentials. +class MetadataCredentialsPlugin { + public: + virtual ~MetadataCredentialsPlugin() {} + + /// If this method returns true, the Process function will be scheduled in + /// a different thread from the one processing the call. + virtual bool IsBlocking() const { return true; } + + /// Type of credentials this plugin is implementing. + virtual const char* GetType() const { return ""; } + + /// Gets the auth metatada produced by this plugin. + /// The fully qualified method name is: + /// service_url + "/" + method_name. + /// The channel_auth_context contains (among other things), the identity of + /// the server. + virtual grpc::Status GetMetadata( + grpc::string_ref service_url, grpc::string_ref method_name, + const grpc::AuthContext& channel_auth_context, + std::multimap* metadata) = 0; + + virtual grpc::string DebugString() { + return "MetadataCredentialsPlugin did not provide a debug string"; + } +}; + +std::shared_ptr MetadataCredentialsFromPlugin( + std::unique_ptr plugin); + +namespace experimental { + +/// Options for creating STS Oauth Token Exchange credentials following the IETF +/// draft https://tools.ietf.org/html/draft-ietf-oauth-token-exchange-16. +/// Optional fields may be set to empty string. It is the responsibility of the +/// caller to ensure that the subject and actor tokens are refreshed on disk at +/// the specified paths. +struct StsCredentialsOptions { + grpc::string token_exchange_service_uri; // Required. + grpc::string resource; // Optional. + grpc::string audience; // Optional. + grpc::string scope; // Optional. + grpc::string requested_token_type; // Optional. + grpc::string subject_token_path; // Required. + grpc::string subject_token_type; // Required. + grpc::string actor_token_path; // Optional. + grpc::string actor_token_type; // Optional. +}; + +/// Creates STS Options from a JSON string. The JSON schema is as follows: +/// { +/// "title": "STS Credentials Config", +/// "type": "object", +/// "required": ["token_exchange_service_uri", "subject_token_path", +/// "subject_token_type"], +/// "properties": { +/// "token_exchange_service_uri": { +/// "type": "string" +/// }, +/// "resource": { +/// "type": "string" +/// }, +/// "audience": { +/// "type": "string" +/// }, +/// "scope": { +/// "type": "string" +/// }, +/// "requested_token_type": { +/// "type": "string" +/// }, +/// "subject_token_path": { +/// "type": "string" +/// }, +/// "subject_token_type": { +/// "type": "string" +/// }, +/// "actor_token_path" : { +/// "type": "string" +/// }, +/// "actor_token_type": { +/// "type": "string" +/// } +/// } +/// } +grpc::Status StsCredentialsOptionsFromJson(const grpc::string& json_string, + StsCredentialsOptions* options); + +/// Creates STS credentials options from the $STS_CREDENTIALS environment +/// variable. This environment variable points to the path of a JSON file +/// comforming to the schema described above. +grpc::Status StsCredentialsOptionsFromEnv(StsCredentialsOptions* options); + +std::shared_ptr StsCredentials( + const StsCredentialsOptions& options); + +std::shared_ptr MetadataCredentialsFromPlugin( + std::unique_ptr plugin, + grpc_security_level min_security_level); + +/// Options used to build AltsCredentials. +struct AltsCredentialsOptions { + /// service accounts of target endpoint that will be acceptable + /// by the client. If service accounts are provided and none of them matches + /// that of the server, authentication will fail. + std::vector target_service_accounts; +}; + +/// Builds ALTS Credentials given ALTS specific options +std::shared_ptr AltsCredentials( + const AltsCredentialsOptions& options); + +/// Builds Local Credentials. +std::shared_ptr LocalCredentials( + grpc_local_connect_type type); + +/// Builds TLS Credentials given TLS options. +std::shared_ptr TlsCredentials( + const TlsCredentialsOptions& options); + +} // namespace experimental +} // namespace grpc_impl + +#endif // GRPCPP_SECURITY_CREDENTIALS_IMPL_H diff --git a/include/grpcpp/security/cronet_credentials.h b/include/grpcpp/security/cronet_credentials.h new file mode 100644 index 00000000..008570b8 --- /dev/null +++ b/include/grpcpp/security/cronet_credentials.h @@ -0,0 +1,33 @@ +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SECURITY_CRONET_CREDENTIALS_H +#define GRPCPP_SECURITY_CRONET_CREDENTIALS_H + +#include + +namespace grpc { + +static inline std::shared_ptr +CronetChannelCredentials(void* engine) { + return ::grpc_impl::CronetChannelCredentials(engine); +} + +} // namespace grpc + +#endif // GRPCPP_SECURITY_CRONET_CREDENTIALS_H diff --git a/include/grpcpp/security/cronet_credentials_impl.h b/include/grpcpp/security/cronet_credentials_impl.h new file mode 100644 index 00000000..e9211581 --- /dev/null +++ b/include/grpcpp/security/cronet_credentials_impl.h @@ -0,0 +1,33 @@ +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SECURITY_CRONET_CREDENTIALS_IMPL_H +#define GRPCPP_SECURITY_CRONET_CREDENTIALS_IMPL_H + +#include + +namespace grpc_impl { + +class ChannelCredentials; + +/// Credentials for a channel using Cronet. +std::shared_ptr CronetChannelCredentials(void* engine); + +} // namespace grpc_impl + +#endif // GRPCPP_SECURITY_CRONET_CREDENTIALS_IMPL_H diff --git a/include/grpcpp/security/server_credentials.h b/include/grpcpp/security/server_credentials.h new file mode 100644 index 00000000..f41c05d5 --- /dev/null +++ b/include/grpcpp/security/server_credentials.h @@ -0,0 +1,91 @@ +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SECURITY_SERVER_CREDENTIALS_H +#define GRPCPP_SECURITY_SERVER_CREDENTIALS_H + +#include + +namespace grpc_impl { + +class Server; +} // namespace grpc_impl +namespace grpc { + +typedef ::grpc_impl::ServerCredentials ServerCredentials; + +/// Options to create ServerCredentials with SSL +struct SslServerCredentialsOptions { + /// \warning Deprecated + SslServerCredentialsOptions() + : force_client_auth(false), + client_certificate_request(GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE) {} + SslServerCredentialsOptions( + grpc_ssl_client_certificate_request_type request_type) + : force_client_auth(false), client_certificate_request(request_type) {} + + struct PemKeyCertPair { + grpc::string private_key; + grpc::string cert_chain; + }; + grpc::string pem_root_certs; + std::vector pem_key_cert_pairs; + /// \warning Deprecated + bool force_client_auth; + + /// If both \a force_client_auth and \a client_certificate_request + /// fields are set, \a force_client_auth takes effect, i.e. + /// \a REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY + /// will be enforced. + grpc_ssl_client_certificate_request_type client_certificate_request; +}; + +static inline std::shared_ptr SslServerCredentials( + const SslServerCredentialsOptions& options) { + return ::grpc_impl::SslServerCredentials(options); +} + +static inline std::shared_ptr InsecureServerCredentials() { + return ::grpc_impl::InsecureServerCredentials(); +} + +namespace experimental { + +typedef ::grpc_impl::experimental::AltsServerCredentialsOptions + AltsServerCredentialsOptions; + +static inline std::shared_ptr AltsServerCredentials( + const AltsServerCredentialsOptions& options) { + return ::grpc_impl::experimental::AltsServerCredentials(options); +} + +static inline std::shared_ptr LocalServerCredentials( + grpc_local_connect_type type) { + return ::grpc_impl::experimental::LocalServerCredentials(type); +} + +/// Builds TLS ServerCredentials given TLS options. +static inline std::shared_ptr TlsServerCredentials( + const ::grpc_impl::experimental::TlsCredentialsOptions& options) { + return ::grpc_impl::experimental::TlsServerCredentials(options); +} + +} // namespace experimental +} // namespace grpc + +#endif // GRPCPP_SECURITY_SERVER_CREDENTIALS_H diff --git a/include/grpcpp/security/server_credentials_impl.h b/include/grpcpp/security/server_credentials_impl.h new file mode 100644 index 00000000..efd7cf66 --- /dev/null +++ b/include/grpcpp/security/server_credentials_impl.h @@ -0,0 +1,90 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SECURITY_SERVER_CREDENTIALS_IMPL_H +#define GRPCPP_SECURITY_SERVER_CREDENTIALS_IMPL_H + +#include +#include + +#include +#include +#include +#include + +struct grpc_server; + +namespace grpc { + +struct SslServerCredentialsOptions; +} // namespace grpc +namespace grpc_impl { +class Server; + +/// Wrapper around \a grpc_server_credentials, a way to authenticate a server. +class ServerCredentials { + public: + virtual ~ServerCredentials(); + + /// This method is not thread-safe and has to be called before the server is + /// started. The last call to this function wins. + virtual void SetAuthMetadataProcessor( + const std::shared_ptr& processor) = 0; + + private: + friend class ::grpc_impl::Server; + + /// Tries to bind \a server to the given \a addr (eg, localhost:1234, + /// 192.168.1.1:31416, [::1]:27182, etc.) + /// + /// \return bound port number on success, 0 on failure. + // TODO(dgq): the "port" part seems to be a misnomer. + virtual int AddPortToServer(const grpc::string& addr, + grpc_server* server) = 0; +}; + +/// Builds SSL ServerCredentials given SSL specific options +std::shared_ptr SslServerCredentials( + const grpc::SslServerCredentialsOptions& options); + +/// Builds insecure server credentials. +std::shared_ptr InsecureServerCredentials(); + +namespace experimental { + +/// Options to create ServerCredentials with ALTS +struct AltsServerCredentialsOptions { + /// Add fields if needed. +}; + +/// Builds ALTS ServerCredentials given ALTS specific options +std::shared_ptr AltsServerCredentials( + const AltsServerCredentialsOptions& options); + +/// Builds Local ServerCredentials. +std::shared_ptr LocalServerCredentials( + grpc_local_connect_type type); + +/// Builds TLS ServerCredentials given TLS options. +std::shared_ptr TlsServerCredentials( + const TlsCredentialsOptions& options); + +} // namespace experimental +} // namespace grpc_impl + +#endif // GRPCPP_SECURITY_SERVER_CREDENTIALS_IMPL_H diff --git a/include/grpcpp/security/tls_credentials_options.h b/include/grpcpp/security/tls_credentials_options.h new file mode 100644 index 00000000..d29e56ee --- /dev/null +++ b/include/grpcpp/security/tls_credentials_options.h @@ -0,0 +1,345 @@ +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SECURITY_TLS_CREDENTIALS_OPTIONS_H +#define GRPCPP_SECURITY_TLS_CREDENTIALS_OPTIONS_H + +#include +#include +#include +#include + +#include +#include + +typedef struct grpc_tls_credential_reload_arg grpc_tls_credential_reload_arg; +typedef struct grpc_tls_credential_reload_config + grpc_tls_credential_reload_config; +typedef struct grpc_tls_server_authorization_check_arg + grpc_tls_server_authorization_check_arg; +typedef struct grpc_tls_server_authorization_check_config + grpc_tls_server_authorization_check_config; +typedef struct grpc_tls_credentials_options grpc_tls_credentials_options; + +namespace grpc_impl { +namespace experimental { + +/** TLS key materials config, wrapper for grpc_tls_key_materials_config. It is + * used for experimental purposes for now and subject to change. **/ +class TlsKeyMaterialsConfig { + public: + struct PemKeyCertPair { + grpc::string private_key; + grpc::string cert_chain; + }; + + /** Getters for member fields. **/ + const grpc::string pem_root_certs() const { return pem_root_certs_; } + const std::vector& pem_key_cert_pair_list() const { + return pem_key_cert_pair_list_; + } + int version() const { return version_; } + + /** Setter for key materials that will be called by the user. Ownership of the + * arguments will not be transferred. **/ + void set_pem_root_certs(const grpc::string& pem_root_certs); + void add_pem_key_cert_pair(const PemKeyCertPair& pem_key_cert_pair); + void set_key_materials( + const grpc::string& pem_root_certs, + const std::vector& pem_key_cert_pair_list); + void set_version(int version) { version_ = version; }; + + private: + int version_ = 0; + std::vector pem_key_cert_pair_list_; + grpc::string pem_root_certs_; +}; + +/** TLS credential reload arguments, wraps grpc_tls_credential_reload_arg. It is + * used for experimental purposes for now and it is subject to change. + * + * The credential reload arg contains all the info necessary to schedule/cancel + * a credential reload request. The callback function must be called after + * finishing the schedule operation. See the description of the + * grpc_tls_credential_reload_arg struct in grpc_security.h for more details. + * **/ +class TlsCredentialReloadArg { + public: + /** TlsCredentialReloadArg does not take ownership of the C arg that is passed + * to the constructor. One must remember to free any memory allocated to the + * C arg after using the setter functions below. **/ + TlsCredentialReloadArg(grpc_tls_credential_reload_arg* arg); + ~TlsCredentialReloadArg(); + + /** Getters for member fields. **/ + void* cb_user_data() const; + bool is_pem_key_cert_pair_list_empty() const; + grpc_ssl_certificate_config_reload_status status() const; + grpc::string error_details() const; + + /** Setters for member fields. Ownership of the arguments will not be + * transferred. **/ + void set_cb_user_data(void* cb_user_data); + void set_pem_root_certs(const grpc::string& pem_root_certs); + void add_pem_key_cert_pair( + const TlsKeyMaterialsConfig::PemKeyCertPair& pem_key_cert_pair); + void set_key_materials(const grpc::string& pem_root_certs, + std::vector + pem_key_cert_pair_list); + void set_key_materials_config( + const std::shared_ptr& key_materials_config); + void set_status(grpc_ssl_certificate_config_reload_status status); + void set_error_details(const grpc::string& error_details); + + /** Calls the C arg's callback function. **/ + void OnCredentialReloadDoneCallback(); + + private: + grpc_tls_credential_reload_arg* c_arg_; +}; + +/** An interface that the application derives and uses to instantiate a + * TlsCredentialReloadConfig instance. Refer to the definition of the + * grpc_tls_credential_reload_config in grpc_tls_credentials_options.h for more + * details on the expectations of the member functions of the interface. **/ +struct TlsCredentialReloadInterface { + virtual ~TlsCredentialReloadInterface() = default; + /** A callback that invokes the credential reload. **/ + virtual int Schedule(TlsCredentialReloadArg* arg) = 0; + /** A callback that cancels a credential reload request. **/ + virtual void Cancel(TlsCredentialReloadArg* /* arg */) {} +}; + +/** TLS credential reloag config, wraps grpc_tls_credential_reload_config. It is + * used for experimental purposes for now and it is subject to change. **/ +class TlsCredentialReloadConfig { + public: + TlsCredentialReloadConfig(std::shared_ptr + credential_reload_interface); + ~TlsCredentialReloadConfig(); + + int Schedule(TlsCredentialReloadArg* arg) const { + if (credential_reload_interface_ == nullptr) { + gpr_log(GPR_ERROR, "credential reload interface is nullptr"); + if (arg != nullptr) { + arg->set_status(GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_FAIL); + arg->set_error_details( + "the interface of the credential reload config is nullptr"); + } + return 1; + } + return credential_reload_interface_->Schedule(arg); + } + + void Cancel(TlsCredentialReloadArg* arg) const { + if (credential_reload_interface_ == nullptr) { + gpr_log(GPR_ERROR, "credential reload interface is nullptr"); + if (arg != nullptr) { + arg->set_status(GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_FAIL); + arg->set_error_details( + "the interface of the credential reload config is nullptr"); + } + return; + } + credential_reload_interface_->Cancel(arg); + } + + /** Returns a C struct for the credential reload config. **/ + grpc_tls_credential_reload_config* c_config() const { return c_config_; } + + private: + grpc_tls_credential_reload_config* c_config_; + std::shared_ptr credential_reload_interface_; +}; + +/** TLS server authorization check arguments, wraps + * grpc_tls_server_authorization_check_arg. It is used for experimental + * purposes for now and it is subject to change. + * + * The server authorization check arg contains all the info necessary to + * schedule/cancel a server authorization check request. The callback function + * must be called after finishing the schedule operation. See the description + * of the grpc_tls_server_authorization_check_arg struct in grpc_security.h for + * more details. **/ +class TlsServerAuthorizationCheckArg { + public: + /** TlsServerAuthorizationCheckArg does not take ownership of the C arg passed + * to the constructor. One must remember to free any memory allocated to the + * C arg after using the setter functions below. **/ + TlsServerAuthorizationCheckArg(grpc_tls_server_authorization_check_arg* arg); + ~TlsServerAuthorizationCheckArg(); + + /** Getters for member fields. **/ + void* cb_user_data() const; + int success() const; + grpc::string target_name() const; + grpc::string peer_cert() const; + grpc::string peer_cert_full_chain() const; + grpc_status_code status() const; + grpc::string error_details() const; + + /** Setters for member fields. **/ + void set_cb_user_data(void* cb_user_data); + void set_success(int success); + void set_target_name(const grpc::string& target_name); + void set_peer_cert(const grpc::string& peer_cert); + void set_peer_cert_full_chain(const grpc::string& peer_cert_full_chain); + void set_status(grpc_status_code status); + void set_error_details(const grpc::string& error_details); + + /** Calls the C arg's callback function. **/ + void OnServerAuthorizationCheckDoneCallback(); + + private: + grpc_tls_server_authorization_check_arg* c_arg_; +}; + +/** An interface that the application derives and uses to instantiate a + * TlsServerAuthorizationCheckConfig instance. Refer to the definition of the + * grpc_tls_server_authorization_check_config in grpc_tls_credentials_options.h + * for more details on the expectations of the member functions of the + * interface. + * **/ +struct TlsServerAuthorizationCheckInterface { + virtual ~TlsServerAuthorizationCheckInterface() = default; + /** A callback that invokes the server authorization check. **/ + virtual int Schedule(TlsServerAuthorizationCheckArg* arg) = 0; + /** A callback that cancels a server authorization check request. **/ + virtual void Cancel(TlsServerAuthorizationCheckArg* /* arg */) {} +}; + +/** TLS server authorization check config, wraps + * grps_tls_server_authorization_check_config. It is used for experimental + * purposes for now and it is subject to change. **/ +class TlsServerAuthorizationCheckConfig { + public: + TlsServerAuthorizationCheckConfig( + std::shared_ptr + server_authorization_check_interface); + ~TlsServerAuthorizationCheckConfig(); + + int Schedule(TlsServerAuthorizationCheckArg* arg) const { + if (server_authorization_check_interface_ == nullptr) { + gpr_log(GPR_ERROR, "server authorization check interface is nullptr"); + if (arg != nullptr) { + arg->set_status(GRPC_STATUS_NOT_FOUND); + arg->set_error_details( + "the interface of the server authorization check config is " + "nullptr"); + } + return 1; + } + return server_authorization_check_interface_->Schedule(arg); + } + + void Cancel(TlsServerAuthorizationCheckArg* arg) const { + if (server_authorization_check_interface_ == nullptr) { + gpr_log(GPR_ERROR, "server authorization check interface is nullptr"); + if (arg != nullptr) { + arg->set_status(GRPC_STATUS_NOT_FOUND); + arg->set_error_details( + "the interface of the server authorization check config is " + "nullptr"); + } + return; + } + server_authorization_check_interface_->Cancel(arg); + } + + /** Returns C struct for the server authorization check config. **/ + grpc_tls_server_authorization_check_config* c_config() const { + return c_config_; + } + + private: + grpc_tls_server_authorization_check_config* c_config_; + std::shared_ptr + server_authorization_check_interface_; +}; + +/** TLS credentials options, wrapper for grpc_tls_credentials_options. It is + * used for experimental purposes for now and it is subject to change. See the + * description of the grpc_tls_credentials_options struct in grpc_security.h for + * more details. **/ +class TlsCredentialsOptions { + public: + // Constructor for client. + explicit TlsCredentialsOptions( + grpc_tls_server_verification_option server_verification_option, + std::shared_ptr key_materials_config, + std::shared_ptr credential_reload_config, + std::shared_ptr + server_authorization_check_config); + + // Constructor for server. + explicit TlsCredentialsOptions( + grpc_ssl_client_certificate_request_type cert_request_type, + std::shared_ptr key_materials_config, + std::shared_ptr credential_reload_config); + + // This constructor will be deprecated. + TlsCredentialsOptions( + grpc_ssl_client_certificate_request_type cert_request_type, + grpc_tls_server_verification_option server_verification_option, + std::shared_ptr key_materials_config, + std::shared_ptr credential_reload_config, + std::shared_ptr + server_authorization_check_config); + ~TlsCredentialsOptions(); + + /** Getters for member fields. **/ + grpc_ssl_client_certificate_request_type cert_request_type() const { + return cert_request_type_; + } + grpc_tls_server_verification_option server_verification_option() const { + return server_verification_option_; + } + std::shared_ptr key_materials_config() const { + return key_materials_config_; + } + std::shared_ptr credential_reload_config() const { + return credential_reload_config_; + } + std::shared_ptr + server_authorization_check_config() const { + return server_authorization_check_config_; + } + grpc_tls_credentials_options* c_credentials_options() const { + return c_credentials_options_; + } + + private: + /** The cert_request_type_ flag is only relevant when the + * TlsCredentialsOptions are used to instantiate server credentials; the flag + * goes unused when creating channel credentials, and the user can set it to + * GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE. **/ + grpc_ssl_client_certificate_request_type cert_request_type_; + /** The server_verification_option_ flag is only relevant when the + * TlsCredentialsOptions are used to instantiate client credentials; **/ + grpc_tls_server_verification_option server_verification_option_; + std::shared_ptr key_materials_config_; + std::shared_ptr credential_reload_config_; + std::shared_ptr + server_authorization_check_config_; + grpc_tls_credentials_options* c_credentials_options_; +}; + +} // namespace experimental +} // namespace grpc_impl + +#endif // GRPCPP_SECURITY_TLS_CREDENTIALS_OPTIONS_H diff --git a/include/grpcpp/server.h b/include/grpcpp/server.h new file mode 100644 index 00000000..3de2aba0 --- /dev/null +++ b/include/grpcpp/server.h @@ -0,0 +1,30 @@ +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SERVER_H +#define GRPCPP_SERVER_H + +#include + +namespace grpc { + +typedef ::grpc_impl::Server Server; + +} // namespace grpc + +#endif // GRPCPP_SERVER_H diff --git a/include/grpcpp/server_builder.h b/include/grpcpp/server_builder.h new file mode 100644 index 00000000..d9ec7c42 --- /dev/null +++ b/include/grpcpp/server_builder.h @@ -0,0 +1,30 @@ +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SERVER_BUILDER_H +#define GRPCPP_SERVER_BUILDER_H + +#include + +namespace grpc { + +typedef ::grpc_impl::ServerBuilder ServerBuilder; + +} // namespace grpc + +#endif // GRPCPP_SERVER_BUILDER_H diff --git a/include/grpcpp/server_builder_impl.h b/include/grpcpp/server_builder_impl.h new file mode 100644 index 00000000..171f1ac6 --- /dev/null +++ b/include/grpcpp/server_builder_impl.h @@ -0,0 +1,418 @@ +/* + * + * Copyright 2015-2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SERVER_BUILDER_IMPL_H +#define GRPCPP_SERVER_BUILDER_IMPL_H + +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct grpc_resource_quota; + +namespace grpc_impl { + +class CompletionQueue; +class ResourceQuota; +class Server; +class ServerCompletionQueue; +class ServerCredentials; +} // namespace grpc_impl + +namespace grpc { + +class AsyncGenericService; +class Service; +namespace testing { +class ServerBuilderPluginTest; +} // namespace testing + +namespace internal { +class ExternalConnectionAcceptorImpl; +} // namespace internal + +#ifndef GRPC_CALLBACK_API_NONEXPERIMENTAL +namespace experimental { +#endif +class CallbackGenericService; +#ifndef GRPC_CALLBACK_API_NONEXPERIMENTAL +} // namespace experimental +#endif + +namespace experimental { +// EXPERIMENTAL API: +// Interface for a grpc server to build transports with connections created out +// of band. +// See ServerBuilder's AddExternalConnectionAcceptor API. +class ExternalConnectionAcceptor { + public: + struct NewConnectionParameters { + int listener_fd = -1; + int fd = -1; + ByteBuffer read_buffer; // data intended for the grpc server + }; + virtual ~ExternalConnectionAcceptor() {} + // If called before grpc::Server is started or after it is shut down, the new + // connection will be closed. + virtual void HandleNewConnection(NewConnectionParameters* p) = 0; +}; + +} // namespace experimental +} // namespace grpc + +namespace grpc_impl { + +/// A builder class for the creation and startup of \a grpc::Server instances. +class ServerBuilder { + public: + ServerBuilder(); + virtual ~ServerBuilder(); + + ////////////////////////////////////////////////////////////////////////////// + // Primary API's + + /// Return a running server which is ready for processing calls. + /// Before calling, one typically needs to ensure that: + /// 1. a service is registered - so that the server knows what to serve + /// (via RegisterService, or RegisterAsyncGenericService) + /// 2. a listening port has been added - so the server knows where to receive + /// traffic (via AddListeningPort) + /// 3. [for async api only] completion queues have been added via + /// AddCompletionQueue + /// + /// Will return a nullptr on errors. + virtual std::unique_ptr BuildAndStart(); + + /// Register a service. This call does not take ownership of the service. + /// The service must exist for the lifetime of the \a Server instance returned + /// by \a BuildAndStart(). + /// Matches requests with any :authority + ServerBuilder& RegisterService(grpc::Service* service); + + /// Enlists an endpoint \a addr (port with an optional IP address) to + /// bind the \a grpc::Server object to be created to. + /// + /// It can be invoked multiple times. + /// + /// \param addr_uri The address to try to bind to the server in URI form. If + /// the scheme name is omitted, "dns:///" is assumed. To bind to any address, + /// please use IPv6 any, i.e., [::]:, which also accepts IPv4 + /// connections. Valid values include dns:///localhost:1234, / + /// 192.168.1.1:31416, dns:///[::1]:27182, etc.). + /// \param creds The credentials associated with the server. + /// \param selected_port[out] If not `nullptr`, gets populated with the port + /// number bound to the \a grpc::Server for the corresponding endpoint after + /// it is successfully bound by BuildAndStart(), 0 otherwise. AddListeningPort + /// does not modify this pointer. + ServerBuilder& AddListeningPort( + const grpc::string& addr_uri, + std::shared_ptr creds, + int* selected_port = nullptr); + + /// Add a completion queue for handling asynchronous services. + /// + /// Best performance is typically obtained by using one thread per polling + /// completion queue. + /// + /// Caller is required to shutdown the server prior to shutting down the + /// returned completion queue. Caller is also required to drain the + /// completion queue after shutting it down. A typical usage scenario: + /// + /// // While building the server: + /// ServerBuilder builder; + /// ... + /// cq_ = builder.AddCompletionQueue(); + /// server_ = builder.BuildAndStart(); + /// + /// // While shutting down the server; + /// server_->Shutdown(); + /// cq_->Shutdown(); // Always *after* the associated server's Shutdown()! + /// // Drain the cq_ that was created + /// void* ignored_tag; + /// bool ignored_ok; + /// while (cq_->Next(&ignored_tag, &ignored_ok)) { } + /// + /// \param is_frequently_polled This is an optional parameter to inform gRPC + /// library about whether this completion queue would be frequently polled + /// (i.e. by calling \a Next() or \a AsyncNext()). The default value is + /// 'true' and is the recommended setting. Setting this to 'false' (i.e. + /// not polling the completion queue frequently) will have a significantly + /// negative performance impact and hence should not be used in production + /// use cases. + std::unique_ptr AddCompletionQueue( + bool is_frequently_polled = true); + + ////////////////////////////////////////////////////////////////////////////// + // Less commonly used RegisterService variants + + /// Register a service. This call does not take ownership of the service. + /// The service must exist for the lifetime of the \a Server instance + /// returned by \a BuildAndStart(). Only matches requests with :authority \a + /// host + ServerBuilder& RegisterService(const grpc::string& host, + grpc::Service* service); + + /// Register a generic service. + /// Matches requests with any :authority + /// This is mostly useful for writing generic gRPC Proxies where the exact + /// serialization format is unknown + ServerBuilder& RegisterAsyncGenericService( + grpc::AsyncGenericService* service); + + ////////////////////////////////////////////////////////////////////////////// + // Fine control knobs + + /// Set max receive message size in bytes. + /// The default is GRPC_DEFAULT_MAX_RECV_MESSAGE_LENGTH. + ServerBuilder& SetMaxReceiveMessageSize(int max_receive_message_size) { + max_receive_message_size_ = max_receive_message_size; + return *this; + } + + /// Set max send message size in bytes. + /// The default is GRPC_DEFAULT_MAX_SEND_MESSAGE_LENGTH. + ServerBuilder& SetMaxSendMessageSize(int max_send_message_size) { + max_send_message_size_ = max_send_message_size; + return *this; + } + + /// \deprecated For backward compatibility. + ServerBuilder& SetMaxMessageSize(int max_message_size) { + return SetMaxReceiveMessageSize(max_message_size); + } + + /// Set the support status for compression algorithms. All algorithms are + /// enabled by default. + /// + /// Incoming calls compressed with an unsupported algorithm will fail with + /// \a GRPC_STATUS_UNIMPLEMENTED. + ServerBuilder& SetCompressionAlgorithmSupportStatus( + grpc_compression_algorithm algorithm, bool enabled); + + /// The default compression level to use for all channel calls in the + /// absence of a call-specific level. + ServerBuilder& SetDefaultCompressionLevel(grpc_compression_level level); + + /// The default compression algorithm to use for all channel calls in the + /// absence of a call-specific level. Note that it overrides any compression + /// level set by \a SetDefaultCompressionLevel. + ServerBuilder& SetDefaultCompressionAlgorithm( + grpc_compression_algorithm algorithm); + + /// Set the attached buffer pool for this server + ServerBuilder& SetResourceQuota( + const grpc_impl::ResourceQuota& resource_quota); + + ServerBuilder& SetOption(std::unique_ptr option); + + /// Options for synchronous servers. + enum SyncServerOption { + NUM_CQS, ///< Number of completion queues. + MIN_POLLERS, ///< Minimum number of polling threads. + MAX_POLLERS, ///< Maximum number of polling threads. + CQ_TIMEOUT_MSEC ///< Completion queue timeout in milliseconds. + }; + + /// Only useful if this is a Synchronous server. + ServerBuilder& SetSyncServerOption(SyncServerOption option, int value); + + /// Add a channel argument (an escape hatch to tuning core library parameters + /// directly) + template + ServerBuilder& AddChannelArgument(const grpc::string& arg, const T& value) { + return SetOption(grpc::MakeChannelArgumentOption(arg, value)); + } + + /// For internal use only: Register a ServerBuilderPlugin factory function. + static void InternalAddPluginFactory( + std::unique_ptr (*CreatePlugin)()); + + /// Enable a server workaround. Do not use unless you know what the workaround + /// does. For explanation and detailed descriptions of workarounds, see + /// doc/workarounds.md. + ServerBuilder& EnableWorkaround(grpc_workaround_list id); + + /// NOTE: class experimental_type is not part of the public API of this class. + /// TODO(yashykt): Integrate into public API when this is no longer + /// experimental. + class experimental_type { + public: + explicit experimental_type(grpc_impl::ServerBuilder* builder) + : builder_(builder) {} + + void SetInterceptorCreators( + std::vector> + interceptor_creators) { + builder_->interceptor_creators_ = std::move(interceptor_creators); + } + +#ifndef GRPC_CALLBACK_API_NONEXPERIMENTAL + /// Register a generic service that uses the callback API. + /// Matches requests with any :authority + /// This is mostly useful for writing generic gRPC Proxies where the exact + /// serialization format is unknown + ServerBuilder& RegisterCallbackGenericService( + grpc::experimental::CallbackGenericService* service); +#endif + + enum class ExternalConnectionType { + FROM_FD = 0 // in the form of a file descriptor + }; + + /// Register an acceptor to handle the externally accepted connection in + /// grpc server. The returned acceptor can be used to pass the connection + /// to grpc server, where a channel will be created with the provided + /// server credentials. + std::unique_ptr + AddExternalConnectionAcceptor(ExternalConnectionType type, + std::shared_ptr creds); + + private: + ServerBuilder* builder_; + }; + +#ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL + /// Register a generic service that uses the callback API. + /// Matches requests with any :authority + /// This is mostly useful for writing generic gRPC Proxies where the exact + /// serialization format is unknown + ServerBuilder& RegisterCallbackGenericService( + grpc::CallbackGenericService* service); +#endif + + /// NOTE: The function experimental() is not stable public API. It is a view + /// to the experimental components of this class. It may be changed or removed + /// at any time. + experimental_type experimental() { return experimental_type(this); } + + protected: + /// Experimental, to be deprecated + struct Port { + grpc::string addr; + std::shared_ptr creds; + int* selected_port; + }; + + /// Experimental, to be deprecated + typedef std::unique_ptr HostString; + struct NamedService { + explicit NamedService(grpc::Service* s) : service(s) {} + NamedService(const grpc::string& h, grpc::Service* s) + : host(new grpc::string(h)), service(s) {} + HostString host; + grpc::Service* service; + }; + + /// Experimental, to be deprecated + std::vector ports() { return ports_; } + + /// Experimental, to be deprecated + std::vector services() { + std::vector service_refs; + for (auto& ptr : services_) { + service_refs.push_back(ptr.get()); + } + return service_refs; + } + + /// Experimental, to be deprecated + std::vector options() { + std::vector option_refs; + for (auto& ptr : options_) { + option_refs.push_back(ptr.get()); + } + return option_refs; + } + + private: + friend class ::grpc::testing::ServerBuilderPluginTest; + + struct SyncServerSettings { + SyncServerSettings() + : num_cqs(1), min_pollers(1), max_pollers(2), cq_timeout_msec(10000) {} + + /// Number of server completion queues to create to listen to incoming RPCs. + int num_cqs; + + /// Minimum number of threads per completion queue that should be listening + /// to incoming RPCs. + int min_pollers; + + /// Maximum number of threads per completion queue that can be listening to + /// incoming RPCs. + int max_pollers; + + /// The timeout for server completion queue's AsyncNext call. + int cq_timeout_msec; + }; + + int max_receive_message_size_; + int max_send_message_size_; + std::vector> options_; + std::vector> services_; + std::vector ports_; + + SyncServerSettings sync_server_settings_; + + /// List of completion queues added via \a AddCompletionQueue method. + std::vector cqs_; + + std::shared_ptr creds_; + std::vector> plugins_; + grpc_resource_quota* resource_quota_; + grpc::AsyncGenericService* generic_service_{nullptr}; +#ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL + grpc::CallbackGenericService* callback_generic_service_{nullptr}; +#else + grpc::experimental::CallbackGenericService* callback_generic_service_{ + nullptr}; +#endif + + struct { + bool is_set; + grpc_compression_level level; + } maybe_default_compression_level_; + struct { + bool is_set; + grpc_compression_algorithm algorithm; + } maybe_default_compression_algorithm_; + uint32_t enabled_compression_algorithms_bitset_; + std::vector< + std::unique_ptr> + interceptor_creators_; + std::vector> + acceptors_; +}; + +} // namespace grpc_impl + +#endif // GRPCPP_SERVER_BUILDER_IMPL_H diff --git a/include/grpcpp/server_context.h b/include/grpcpp/server_context.h new file mode 100644 index 00000000..45f26149 --- /dev/null +++ b/include/grpcpp/server_context.h @@ -0,0 +1,24 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SERVER_CONTEXT_H +#define GRPCPP_SERVER_CONTEXT_H + +#include + +#endif // GRPCPP_SERVER_CONTEXT_H diff --git a/include/grpcpp/server_impl.h b/include/grpcpp/server_impl.h new file mode 100644 index 00000000..5cbfee43 --- /dev/null +++ b/include/grpcpp/server_impl.h @@ -0,0 +1,386 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SERVER_IMPL_H +#define GRPCPP_SERVER_IMPL_H + +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct grpc_server; + +namespace grpc { +class AsyncGenericService; + +namespace internal { +class ExternalConnectionAcceptorImpl; +} // namespace internal + +} // namespace grpc + +namespace grpc_impl { +class HealthCheckServiceInterface; +class ServerContext; +class ServerInitializer; + +/// Represents a gRPC server. +/// +/// Use a \a grpc::ServerBuilder to create, configure, and start +/// \a Server instances. +class Server : public grpc::ServerInterface, private grpc::GrpcLibraryCodegen { + public: + ~Server(); + + /// Block until the server shuts down. + /// + /// \warning The server must be either shutting down or some other thread must + /// call \a Shutdown for this function to ever return. + void Wait() override; + + /// Global callbacks are a set of hooks that are called when server + /// events occur. \a SetGlobalCallbacks method is used to register + /// the hooks with gRPC. Note that + /// the \a GlobalCallbacks instance will be shared among all + /// \a Server instances in an application and can be set exactly + /// once per application. + class GlobalCallbacks { + public: + virtual ~GlobalCallbacks() {} + /// Called before server is created. + virtual void UpdateArguments(ChannelArguments* /*args*/) {} + /// Called before application callback for each synchronous server request + virtual void PreSynchronousRequest(grpc_impl::ServerContext* context) = 0; + /// Called after application callback for each synchronous server request + virtual void PostSynchronousRequest(grpc_impl::ServerContext* context) = 0; + /// Called before server is started. + virtual void PreServerStart(Server* /*server*/) {} + /// Called after a server port is added. + virtual void AddPort(Server* /*server*/, const grpc::string& /*addr*/, + grpc::ServerCredentials* /*creds*/, int /*port*/) {} + }; + /// Set the global callback object. Can only be called once per application. + /// Does not take ownership of callbacks, and expects the pointed to object + /// to be alive until all server objects in the process have been destroyed. + /// The same \a GlobalCallbacks object will be used throughout the + /// application and is shared among all \a Server objects. + static void SetGlobalCallbacks(GlobalCallbacks* callbacks); + + /// Returns a \em raw pointer to the underlying \a grpc_server instance. + /// EXPERIMENTAL: for internal/test use only + grpc_server* c_server(); + + /// Returns the health check service. + grpc::HealthCheckServiceInterface* GetHealthCheckService() const { + return health_check_service_.get(); + } + + /// Establish a channel for in-process communication + std::shared_ptr InProcessChannel(const ChannelArguments& args); + + /// NOTE: class experimental_type is not part of the public API of this class. + /// TODO(yashykt): Integrate into public API when this is no longer + /// experimental. + class experimental_type { + public: + explicit experimental_type(Server* server) : server_(server) {} + + /// Establish a channel for in-process communication with client + /// interceptors + std::shared_ptr InProcessChannelWithInterceptors( + const ChannelArguments& args, + std::vector> + interceptor_creators); + + private: + Server* server_; + }; + + /// NOTE: The function experimental() is not stable public API. It is a view + /// to the experimental components of this class. It may be changed or removed + /// at any time. + experimental_type experimental() { return experimental_type(this); } + + protected: + /// Register a service. This call does not take ownership of the service. + /// The service must exist for the lifetime of the Server instance. + bool RegisterService(const grpc::string* host, + grpc::Service* service) override; + + /// Try binding the server to the given \a addr endpoint + /// (port, and optionally including IP address to bind to). + /// + /// It can be invoked multiple times. Should be used before + /// starting the server. + /// + /// \param addr The address to try to bind to the server (eg, localhost:1234, + /// 192.168.1.1:31416, [::1]:27182, etc.). + /// \param creds The credentials associated with the server. + /// + /// \return bound port number on success, 0 on failure. + /// + /// \warning It is an error to call this method on an already started server. + int AddListeningPort(const grpc::string& addr, + grpc::ServerCredentials* creds) override; + + /// NOTE: This is *NOT* a public API. The server constructors are supposed to + /// be used by \a ServerBuilder class only. The constructor will be made + /// 'private' very soon. + /// + /// Server constructors. To be used by \a ServerBuilder only. + /// + /// \param args The channel args + /// + /// \param sync_server_cqs The completion queues to use if the server is a + /// synchronous server (or a hybrid server). The server polls for new RPCs on + /// these queues + /// + /// \param min_pollers The minimum number of polling threads per server + /// completion queue (in param sync_server_cqs) to use for listening to + /// incoming requests (used only in case of sync server) + /// + /// \param max_pollers The maximum number of polling threads per server + /// completion queue (in param sync_server_cqs) to use for listening to + /// incoming requests (used only in case of sync server) + /// + /// \param sync_cq_timeout_msec The timeout to use when calling AsyncNext() on + /// server completion queues passed via sync_server_cqs param. + Server(ChannelArguments* args, + std::shared_ptr>> + sync_server_cqs, + int min_pollers, int max_pollers, int sync_cq_timeout_msec, + std::vector< + std::shared_ptr> + acceptors, + grpc_resource_quota* server_rq = nullptr, + std::vector> + interceptor_creators = std::vector>()); + + /// Start the server. + /// + /// \param cqs Completion queues for handling asynchronous services. The + /// caller is required to keep all completion queues live until the server is + /// destroyed. + /// \param num_cqs How many completion queues does \a cqs hold. + void Start(ServerCompletionQueue** cqs, size_t num_cqs) override; + + grpc_server* server() override { return server_; } + + protected: + /// NOTE: This method is not part of the public API for this class. + void set_health_check_service( + std::unique_ptr service) { + health_check_service_ = std::move(service); + } + + /// NOTE: This method is not part of the public API for this class. + bool health_check_service_disabled() const { + return health_check_service_disabled_; + } + + private: + std::vector< + std::unique_ptr>* + interceptor_creators() override { + return &interceptor_creators_; + } + + friend class grpc::AsyncGenericService; + friend class grpc_impl::ServerBuilder; + friend class grpc_impl::ServerInitializer; + + class SyncRequest; + class CallbackRequestBase; + template + class CallbackRequest; + class UnimplementedAsyncRequest; + class UnimplementedAsyncResponse; + + /// SyncRequestThreadManager is an implementation of ThreadManager. This class + /// is responsible for polling for incoming RPCs and calling the RPC handlers. + /// This is only used in case of a Sync server (i.e a server exposing a sync + /// interface) + class SyncRequestThreadManager; + + /// Register a generic service. This call does not take ownership of the + /// service. The service must exist for the lifetime of the Server instance. + void RegisterAsyncGenericService(grpc::AsyncGenericService* service) override; + +#ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL + /// Register a callback-based generic service. This call does not take + /// ownership of theservice. The service must exist for the lifetime of the + /// Server instance. + void RegisterCallbackGenericService( + grpc::CallbackGenericService* service) override; +#else + /// NOTE: class experimental_registration_type is not part of the public API + /// of this class + /// TODO(vjpai): Move these contents to the public API of Server when + /// they are no longer experimental + class experimental_registration_type final + : public experimental_registration_interface { + public: + explicit experimental_registration_type(Server* server) : server_(server) {} + void RegisterCallbackGenericService( + grpc::experimental::CallbackGenericService* service) override { + server_->RegisterCallbackGenericService(service); + } + + private: + Server* server_; + }; + + /// TODO(vjpai): Mark this override when experimental type above is deleted + void RegisterCallbackGenericService( + grpc::experimental::CallbackGenericService* service); + + /// NOTE: The function experimental_registration() is not stable public API. + /// It is a view to the experimental components of this class. It may be + /// changed or removed at any time. + experimental_registration_interface* experimental_registration() override { + return &experimental_registration_; + } +#endif + + void PerformOpsOnCall(grpc::internal::CallOpSetInterface* ops, + grpc::internal::Call* call) override; + + void ShutdownInternal(gpr_timespec deadline) override; + + int max_receive_message_size() const override { + return max_receive_message_size_; + } + + CompletionQueue* CallbackCQ() override; + + grpc_impl::ServerInitializer* initializer(); + + // Functions to manage the server shutdown ref count. Things that increase + // the ref count are the running state of the server (take a ref at start and + // drop it at shutdown) and each running callback RPC. + void Ref(); + void UnrefWithPossibleNotify() /* LOCKS_EXCLUDED(mu_) */; + void UnrefAndWaitLocked() /* EXCLUSIVE_LOCKS_REQUIRED(mu_) */; + + std::vector> + acceptors_; + + // A vector of interceptor factory objects. + // This should be destroyed after health_check_service_ and this requirement + // is satisfied by declaring interceptor_creators_ before + // health_check_service_. (C++ mandates that member objects be destroyed in + // the reverse order of initialization.) + std::vector< + std::unique_ptr> + interceptor_creators_; + + int max_receive_message_size_; + + /// The following completion queues are ONLY used in case of Sync API + /// i.e. if the server has any services with sync methods. The server uses + /// these completion queues to poll for new RPCs + std::shared_ptr>> + sync_server_cqs_; + + /// List of \a ThreadManager instances (one for each cq in + /// the \a sync_server_cqs) + std::vector> sync_req_mgrs_; + +#ifndef GRPC_CALLBACK_API_NONEXPERIMENTAL + // For registering experimental callback generic service; remove when that + // method longer experimental + experimental_registration_type experimental_registration_{this}; +#endif + + // Server status + grpc::internal::Mutex mu_; + bool started_; + bool shutdown_; + bool shutdown_notified_; // Was notify called on the shutdown_cv_ + grpc::internal::CondVar shutdown_done_cv_; + bool shutdown_done_ = false; + std::atomic_int shutdown_refs_outstanding_{1}; + + grpc::internal::CondVar shutdown_cv_; + + std::shared_ptr global_callbacks_; + + std::vector services_; + bool has_async_generic_service_ = false; + bool has_callback_generic_service_ = false; + bool has_callback_methods_ = false; + + // Pointer to the wrapped grpc_server. + grpc_server* server_; + + std::unique_ptr server_initializer_; + + std::unique_ptr health_check_service_; + bool health_check_service_disabled_; + + // When appropriate, use a default callback generic service to handle + // unimplemented methods +#ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL + std::unique_ptr unimplemented_service_; +#else + std::unique_ptr + unimplemented_service_; +#endif + + // A special handler for resource exhausted in sync case + std::unique_ptr resource_exhausted_handler_; + + // Handler for callback generic service, if any + std::unique_ptr generic_handler_; + + // callback_cq_ references the callbackable completion queue associated + // with this server (if any). It is set on the first call to CallbackCQ(). + // It is _not owned_ by the server; ownership belongs with its internal + // shutdown callback tag (invoked when the CQ is fully shutdown). + CompletionQueue* callback_cq_ /* GUARDED_BY(mu_) */ = nullptr; + + // List of CQs passed in by user that must be Shutdown only after Server is + // Shutdown. Even though this is only used with NDEBUG, instantiate it in all + // cases since otherwise the size will be inconsistent. + std::vector cq_list_; +}; + +} // namespace grpc_impl + +#endif // GRPCPP_SERVER_IMPL_H diff --git a/include/grpcpp/server_posix.h b/include/grpcpp/server_posix.h new file mode 100644 index 00000000..3d209cbc --- /dev/null +++ b/include/grpcpp/server_posix.h @@ -0,0 +1,36 @@ +/* + * + * Copyright 2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SERVER_POSIX_H +#define GRPCPP_SERVER_POSIX_H + +#include + +namespace grpc { + +#ifdef GPR_SUPPORT_CHANNELS_FROM_FD + +static inline void AddInsecureChannelFromFd(Server* server, int fd) { + ::grpc_impl::AddInsecureChannelFromFd(server, fd); +} + +#endif // GPR_SUPPORT_CHANNELS_FROM_FD + +} // namespace grpc + +#endif // GRPCPP_SERVER_POSIX_H diff --git a/include/grpcpp/server_posix_impl.h b/include/grpcpp/server_posix_impl.h new file mode 100644 index 00000000..645dd600 --- /dev/null +++ b/include/grpcpp/server_posix_impl.h @@ -0,0 +1,42 @@ +/* + * + * Copyright 2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SERVER_POSIX_IMPL_H +#define GRPCPP_SERVER_POSIX_IMPL_H + +#include + +#include +#include + +namespace grpc_impl { + +#ifdef GPR_SUPPORT_CHANNELS_FROM_FD + +/// Add a new client to a \a Server communicating over the given +/// file descriptor. +/// +/// \param server The server to add the client to. +/// \param fd The file descriptor representing a socket. +void AddInsecureChannelFromFd(grpc::Server* server, int fd); + +#endif // GPR_SUPPORT_CHANNELS_FROM_FD + +} // namespace grpc_impl + +#endif // GRPCPP_SERVER_POSIX_IMPL_H diff --git a/include/grpcpp/support/async_stream.h b/include/grpcpp/support/async_stream.h new file mode 100644 index 00000000..ff9e4556 --- /dev/null +++ b/include/grpcpp/support/async_stream.h @@ -0,0 +1,24 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SUPPORT_ASYNC_STREAM_H +#define GRPCPP_SUPPORT_ASYNC_STREAM_H + +#include + +#endif // GRPCPP_SUPPORT_ASYNC_STREAM_H diff --git a/include/grpcpp/support/async_stream_impl.h b/include/grpcpp/support/async_stream_impl.h new file mode 100644 index 00000000..cff700d3 --- /dev/null +++ b/include/grpcpp/support/async_stream_impl.h @@ -0,0 +1,24 @@ +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SUPPORT_ASYNC_STREAM_IMPL_H +#define GRPCPP_SUPPORT_ASYNC_STREAM_IMPL_H + +#include + +#endif // GRPCPP_SUPPORT_ASYNC_STREAM_IMPL_H diff --git a/include/grpcpp/support/async_unary_call.h b/include/grpcpp/support/async_unary_call.h new file mode 100644 index 00000000..2e5181c5 --- /dev/null +++ b/include/grpcpp/support/async_unary_call.h @@ -0,0 +1,24 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SUPPORT_ASYNC_UNARY_CALL_H +#define GRPCPP_SUPPORT_ASYNC_UNARY_CALL_H + +#include + +#endif // GRPCPP_SUPPORT_ASYNC_UNARY_CALL_H diff --git a/include/grpcpp/support/async_unary_call_impl.h b/include/grpcpp/support/async_unary_call_impl.h new file mode 100644 index 00000000..488fe875 --- /dev/null +++ b/include/grpcpp/support/async_unary_call_impl.h @@ -0,0 +1,24 @@ +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SUPPORT_ASYNC_UNARY_CALL_IMPL_H +#define GRPCPP_SUPPORT_ASYNC_UNARY_CALL_IMPL_H + +#include + +#endif // GRPCPP_SUPPORT_ASYNC_UNARY_CALL_IMPL_H diff --git a/include/grpcpp/support/byte_buffer.h b/include/grpcpp/support/byte_buffer.h new file mode 100644 index 00000000..53aeff19 --- /dev/null +++ b/include/grpcpp/support/byte_buffer.h @@ -0,0 +1,31 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SUPPORT_BYTE_BUFFER_H +#define GRPCPP_SUPPORT_BYTE_BUFFER_H + +#include +#include +#include +#include +#include +#include +#include +#include + +#endif // GRPCPP_SUPPORT_BYTE_BUFFER_H diff --git a/include/grpcpp/support/channel_arguments.h b/include/grpcpp/support/channel_arguments.h new file mode 100644 index 00000000..593aaec7 --- /dev/null +++ b/include/grpcpp/support/channel_arguments.h @@ -0,0 +1,36 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SUPPORT_CHANNEL_ARGUMENTS_H +#define GRPCPP_SUPPORT_CHANNEL_ARGUMENTS_H + +#include + +namespace grpc_impl { + +class SecureChannelCredentials; +class ResourceQuota; +} // namespace grpc_impl + +namespace grpc { + +typedef ::grpc_impl::ChannelArguments ChannelArguments; + +} // namespace grpc + +#endif // GRPCPP_SUPPORT_CHANNEL_ARGUMENTS_H diff --git a/include/grpcpp/support/channel_arguments_impl.h b/include/grpcpp/support/channel_arguments_impl.h new file mode 100644 index 00000000..ca3188a9 --- /dev/null +++ b/include/grpcpp/support/channel_arguments_impl.h @@ -0,0 +1,152 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SUPPORT_CHANNEL_ARGUMENTS_IMPL_H +#define GRPCPP_SUPPORT_CHANNEL_ARGUMENTS_IMPL_H + +#include +#include + +#include +#include +#include +#include + +namespace grpc { +namespace testing { +class ChannelArgumentsTest; +} // namespace testing +} // namespace grpc + +namespace grpc_impl { + +class SecureChannelCredentials; + +/// Options for channel creation. The user can use generic setters to pass +/// key value pairs down to C channel creation code. For gRPC related options, +/// concrete setters are provided. +class ChannelArguments { + public: + ChannelArguments(); + ~ChannelArguments(); + + ChannelArguments(const ChannelArguments& other); + ChannelArguments& operator=(ChannelArguments other) { + Swap(other); + return *this; + } + + void Swap(ChannelArguments& other); + + /// Dump arguments in this instance to \a channel_args. Does not take + /// ownership of \a channel_args. + /// + /// Note that the underlying arguments are shared. Changes made to either \a + /// channel_args or this instance would be reflected on both. + void SetChannelArgs(grpc_channel_args* channel_args) const; + + // gRPC specific channel argument setters + /// Set target name override for SSL host name checking. This option should + /// be used with caution in production. + void SetSslTargetNameOverride(const grpc::string& name); + // TODO(yangg) add flow control options + /// Set the compression algorithm for the channel. + void SetCompressionAlgorithm(grpc_compression_algorithm algorithm); + + /// Set the grpclb fallback timeout (in ms) for the channel. If this amount + /// of time has passed but we have not gotten any non-empty \a serverlist from + /// the balancer, we will fall back to use the backend address(es) returned by + /// the resolver. + void SetGrpclbFallbackTimeout(int fallback_timeout); + + /// For client channel's, the socket mutator operates on + /// "channel" sockets. For server's, the socket mutator operates + /// only on "listen" sockets. + /// TODO(apolcyn): allow socket mutators to also operate + /// on server "channel" sockets, and adjust the socket mutator + /// object to be more speficic about which type of socket + /// it should operate on. + void SetSocketMutator(grpc_socket_mutator* mutator); + + /// Set the string to prepend to the user agent. + void SetUserAgentPrefix(const grpc::string& user_agent_prefix); + + /// Set the buffer pool to be attached to the constructed channel. + void SetResourceQuota(const grpc::ResourceQuota& resource_quota); + + /// Set the max receive and send message sizes. + void SetMaxReceiveMessageSize(int size); + void SetMaxSendMessageSize(int size); + + /// Set LB policy name. + /// Note that if the name resolver returns only balancer addresses, the + /// grpclb LB policy will be used, regardless of what is specified here. + void SetLoadBalancingPolicyName(const grpc::string& lb_policy_name); + + /// Set service config in JSON form. + /// Primarily meant for use in unit tests. + void SetServiceConfigJSON(const grpc::string& service_config_json); + + // Generic channel argument setters. Only for advanced use cases. + /// Set an integer argument \a value under \a key. + void SetInt(const grpc::string& key, int value); + + // Generic channel argument setter. Only for advanced use cases. + /// Set a pointer argument \a value under \a key. Owership is not transferred. + void SetPointer(const grpc::string& key, void* value); + + void SetPointerWithVtable(const grpc::string& key, void* value, + const grpc_arg_pointer_vtable* vtable); + + /// Set a textual argument \a value under \a key. + void SetString(const grpc::string& key, const grpc::string& value); + + /// Return (by value) a C \a grpc_channel_args structure which points to + /// arguments owned by this \a ChannelArguments instance + grpc_channel_args c_channel_args() const { + grpc_channel_args out; + out.num_args = args_.size(); + out.args = args_.empty() ? NULL : const_cast(&args_[0]); + return out; + } + + private: + friend class grpc_impl::SecureChannelCredentials; + friend class grpc::testing::ChannelArgumentsTest; + + /// Default pointer argument operations. + struct PointerVtableMembers { + static void* Copy(void* in) { return in; } + static void Destroy(void* /*in*/) {} + static int Compare(void* a, void* b) { + if (a < b) return -1; + if (a > b) return 1; + return 0; + } + }; + + // Returns empty string when it is not set. + grpc::string GetSslTargetNameOverride() const; + + std::vector args_; + std::list strings_; +}; + +} // namespace grpc_impl + +#endif // GRPCPP_SUPPORT_CHANNEL_ARGUMENTS_IMPL_H diff --git a/include/grpcpp/support/client_callback.h b/include/grpcpp/support/client_callback.h new file mode 100644 index 00000000..063fdc4f --- /dev/null +++ b/include/grpcpp/support/client_callback.h @@ -0,0 +1,24 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SUPPORT_CLIENT_CALLBACK_H +#define GRPCPP_SUPPORT_CLIENT_CALLBACK_H + +#include + +#endif // GRPCPP_SUPPORT_CLIENT_CALLBACK_H diff --git a/include/grpcpp/support/client_callback_impl.h b/include/grpcpp/support/client_callback_impl.h new file mode 100644 index 00000000..ed8df412 --- /dev/null +++ b/include/grpcpp/support/client_callback_impl.h @@ -0,0 +1,24 @@ +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SUPPORT_CLIENT_CALLBACK_IMPL_H +#define GRPCPP_SUPPORT_CLIENT_CALLBACK_IMPL_H + +#include + +#endif // GRPCPP_SUPPORT_CLIENT_CALLBACK_IMPL_H diff --git a/include/grpcpp/support/client_interceptor.h b/include/grpcpp/support/client_interceptor.h new file mode 100644 index 00000000..50810e3f --- /dev/null +++ b/include/grpcpp/support/client_interceptor.h @@ -0,0 +1,24 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SUPPORT_CLIENT_INTERCEPTOR_H +#define GRPCPP_SUPPORT_CLIENT_INTERCEPTOR_H + +#include + +#endif // GRPCPP_SUPPORT_CLIENT_INTERCEPTOR_H diff --git a/include/grpcpp/support/config.h b/include/grpcpp/support/config.h new file mode 100644 index 00000000..16bdab64 --- /dev/null +++ b/include/grpcpp/support/config.h @@ -0,0 +1,24 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SUPPORT_CONFIG_H +#define GRPCPP_SUPPORT_CONFIG_H + +#include + +#endif // GRPCPP_SUPPORT_CONFIG_H diff --git a/include/grpcpp/support/error_details.h b/include/grpcpp/support/error_details.h new file mode 100644 index 00000000..07bc750d --- /dev/null +++ b/include/grpcpp/support/error_details.h @@ -0,0 +1,44 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SUPPORT_ERROR_DETAILS_H +#define GRPCPP_SUPPORT_ERROR_DETAILS_H + +#include + +namespace google { +namespace rpc { +class Status; +} // namespace rpc +} // namespace google + +namespace grpc { + +static inline Status ExtractErrorDetails(const Status& from, + ::google::rpc::Status* to) { + return ::grpc_impl::ExtractErrorDetails(from, to); +} + +static inline Status SetErrorDetails(const ::google::rpc::Status& from, + Status* to) { + return ::grpc_impl::SetErrorDetails(from, to); +} + +} // namespace grpc + +#endif // GRPCPP_SUPPORT_ERROR_DETAILS_H diff --git a/include/grpcpp/support/error_details_impl.h b/include/grpcpp/support/error_details_impl.h new file mode 100644 index 00000000..ae5f04ce --- /dev/null +++ b/include/grpcpp/support/error_details_impl.h @@ -0,0 +1,48 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SUPPORT_ERROR_DETAILS_IMPL_H +#define GRPCPP_SUPPORT_ERROR_DETAILS_IMPL_H + +#include + +namespace google { +namespace rpc { +class Status; +} // namespace rpc +} // namespace google + +namespace grpc_impl { + +/// Map a \a grpc::Status to a \a google::rpc::Status. +/// The given \a to object will be cleared. +/// On success, returns status with OK. +/// Returns status with \a INVALID_ARGUMENT, if failed to deserialize. +/// Returns status with \a FAILED_PRECONDITION, if \a to is nullptr. +grpc::Status ExtractErrorDetails(const grpc::Status& from, + ::google::rpc::Status* to); + +/// Map \a google::rpc::Status to a \a grpc::Status. +/// Returns OK on success. +/// Returns status with \a FAILED_PRECONDITION if \a to is nullptr. +grpc::Status SetErrorDetails(const ::google::rpc::Status& from, + grpc::Status* to); + +} // namespace grpc_impl + +#endif // GRPCPP_SUPPORT_ERROR_DETAILS_IMPL_H diff --git a/include/grpcpp/support/interceptor.h b/include/grpcpp/support/interceptor.h new file mode 100644 index 00000000..7ff79516 --- /dev/null +++ b/include/grpcpp/support/interceptor.h @@ -0,0 +1,24 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SUPPORT_INTERCEPTOR_H +#define GRPCPP_SUPPORT_INTERCEPTOR_H + +#include + +#endif // GRPCPP_SUPPORT_INTERCEPTOR_H diff --git a/include/grpcpp/support/message_allocator.h b/include/grpcpp/support/message_allocator.h new file mode 100644 index 00000000..20ce072b --- /dev/null +++ b/include/grpcpp/support/message_allocator.h @@ -0,0 +1,24 @@ +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SUPPORT_MESSAGE_ALLOCATOR_H +#define GRPCPP_SUPPORT_MESSAGE_ALLOCATOR_H + +#include + +#endif // GRPCPP_SUPPORT_MESSAGE_ALLOCATOR_H diff --git a/include/grpcpp/support/method_handler.h b/include/grpcpp/support/method_handler.h new file mode 100644 index 00000000..038e76c8 --- /dev/null +++ b/include/grpcpp/support/method_handler.h @@ -0,0 +1,24 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SUPPORT_METHOD_HANDLER_H +#define GRPCPP_SUPPORT_METHOD_HANDLER_H + +#include + +#endif // GRPCPP_SUPPORT_METHOD_HANDLER_H diff --git a/include/grpcpp/support/proto_buffer_reader.h b/include/grpcpp/support/proto_buffer_reader.h new file mode 100644 index 00000000..4cdb65d5 --- /dev/null +++ b/include/grpcpp/support/proto_buffer_reader.h @@ -0,0 +1,24 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SUPPORT_PROTO_BUFFER_READER_H +#define GRPCPP_SUPPORT_PROTO_BUFFER_READER_H + +#include + +#endif // GRPCPP_SUPPORT_PROTO_BUFFER_READER_H diff --git a/include/grpcpp/support/proto_buffer_writer.h b/include/grpcpp/support/proto_buffer_writer.h new file mode 100644 index 00000000..01cf29c4 --- /dev/null +++ b/include/grpcpp/support/proto_buffer_writer.h @@ -0,0 +1,24 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SUPPORT_PROTO_BUFFER_WRITER_H +#define GRPCPP_SUPPORT_PROTO_BUFFER_WRITER_H + +#include + +#endif // GRPCPP_SUPPORT_PROTO_BUFFER_WRITER_H diff --git a/include/grpcpp/support/server_callback.h b/include/grpcpp/support/server_callback.h new file mode 100644 index 00000000..b0aeeb53 --- /dev/null +++ b/include/grpcpp/support/server_callback.h @@ -0,0 +1,24 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SUPPORT_SERVER_CALLBACK_H +#define GRPCPP_SUPPORT_SERVER_CALLBACK_H + +#include + +#endif // GRPCPP_SUPPORT_SERVER_CALLBACK_H diff --git a/include/grpcpp/support/server_callback_impl.h b/include/grpcpp/support/server_callback_impl.h new file mode 100644 index 00000000..a91c8141 --- /dev/null +++ b/include/grpcpp/support/server_callback_impl.h @@ -0,0 +1,24 @@ +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SUPPORT_SERVER_CALLBACK_IMPL_H +#define GRPCPP_SUPPORT_SERVER_CALLBACK_IMPL_H + +#include + +#endif // GRPCPP_SUPPORT_SERVER_CALLBACK_IMPL_H diff --git a/include/grpcpp/support/server_interceptor.h b/include/grpcpp/support/server_interceptor.h new file mode 100644 index 00000000..b0a6229b --- /dev/null +++ b/include/grpcpp/support/server_interceptor.h @@ -0,0 +1,24 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SUPPORT_SERVER_INTERCEPTOR_H +#define GRPCPP_SUPPORT_SERVER_INTERCEPTOR_H + +#include + +#endif // GRPCPP_SUPPORT_SERVER_INTERCEPTOR_H diff --git a/include/grpcpp/support/slice.h b/include/grpcpp/support/slice.h new file mode 100644 index 00000000..eaeb29a4 --- /dev/null +++ b/include/grpcpp/support/slice.h @@ -0,0 +1,26 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SUPPORT_SLICE_H +#define GRPCPP_SUPPORT_SLICE_H + +#include +#include +#include + +#endif // GRPCPP_SUPPORT_SLICE_H diff --git a/include/grpcpp/support/status.h b/include/grpcpp/support/status.h new file mode 100644 index 00000000..91b629f1 --- /dev/null +++ b/include/grpcpp/support/status.h @@ -0,0 +1,24 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SUPPORT_STATUS_H +#define GRPCPP_SUPPORT_STATUS_H + +#include + +#endif // GRPCPP_SUPPORT_STATUS_H diff --git a/include/grpcpp/support/status_code_enum.h b/include/grpcpp/support/status_code_enum.h new file mode 100644 index 00000000..bfb47f39 --- /dev/null +++ b/include/grpcpp/support/status_code_enum.h @@ -0,0 +1,24 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SUPPORT_STATUS_CODE_ENUM_H +#define GRPCPP_SUPPORT_STATUS_CODE_ENUM_H + +#include + +#endif // GRPCPP_SUPPORT_STATUS_CODE_ENUM_H diff --git a/include/grpcpp/support/string_ref.h b/include/grpcpp/support/string_ref.h new file mode 100644 index 00000000..0e0d3d43 --- /dev/null +++ b/include/grpcpp/support/string_ref.h @@ -0,0 +1,24 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SUPPORT_STRING_REF_H +#define GRPCPP_SUPPORT_STRING_REF_H + +#include + +#endif // GRPCPP_SUPPORT_STRING_REF_H diff --git a/include/grpcpp/support/stub_options.h b/include/grpcpp/support/stub_options.h new file mode 100644 index 00000000..e9700ea4 --- /dev/null +++ b/include/grpcpp/support/stub_options.h @@ -0,0 +1,24 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SUPPORT_STUB_OPTIONS_H +#define GRPCPP_SUPPORT_STUB_OPTIONS_H + +#include + +#endif // GRPCPP_SUPPORT_STUB_OPTIONS_H diff --git a/include/grpcpp/support/sync_stream.h b/include/grpcpp/support/sync_stream.h new file mode 100644 index 00000000..ea60b6da --- /dev/null +++ b/include/grpcpp/support/sync_stream.h @@ -0,0 +1,24 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SUPPORT_SYNC_STREAM_H +#define GRPCPP_SUPPORT_SYNC_STREAM_H + +#include + +#endif // GRPCPP_SUPPORT_SYNC_STREAM_H diff --git a/include/grpcpp/support/sync_stream_impl.h b/include/grpcpp/support/sync_stream_impl.h new file mode 100644 index 00000000..a00e425a --- /dev/null +++ b/include/grpcpp/support/sync_stream_impl.h @@ -0,0 +1,24 @@ +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SUPPORT_SYNC_STREAM_IMPL_H +#define GRPCPP_SUPPORT_SYNC_STREAM_IMPL_H + +#include + +#endif // GRPCPP_SUPPORT_SYNC_STREAM_IMPL_H diff --git a/include/grpcpp/support/time.h b/include/grpcpp/support/time.h new file mode 100644 index 00000000..c7408ff2 --- /dev/null +++ b/include/grpcpp/support/time.h @@ -0,0 +1,24 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SUPPORT_TIME_H +#define GRPCPP_SUPPORT_TIME_H + +#include + +#endif // GRPCPP_SUPPORT_TIME_H diff --git a/include/grpcpp/support/validate_service_config.h b/include/grpcpp/support/validate_service_config.h new file mode 100644 index 00000000..41f2c636 --- /dev/null +++ b/include/grpcpp/support/validate_service_config.h @@ -0,0 +1,36 @@ +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_SUPPORT_VALIDATE_SERVICE_CONFIG_H +#define GRPCPP_SUPPORT_VALIDATE_SERVICE_CONFIG_H + +#include + +namespace grpc { + +namespace experimental { +/// Validates \a service_config_json. If valid, returns an empty string. +/// Otherwise, returns the validation error. +/// TODO(yashykt): Promote it to out of experimental once it is proved useful +/// and gRFC is accepted. +grpc::string ValidateServiceConfigJSON(const grpc::string& service_config_json); +} // namespace experimental + +} // namespace grpc + +#endif // GRPCPP_SUPPORT_VALIDATE_SERVICE_CONFIG_H diff --git a/include/grpcpp/test/channel_test_peer.h b/include/grpcpp/test/channel_test_peer.h new file mode 100644 index 00000000..e41bbfa4 --- /dev/null +++ b/include/grpcpp/test/channel_test_peer.h @@ -0,0 +1,44 @@ +/* + * + * Copyright 2020 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_TEST_CHANNEL_TEST_PEER_H +#define GRPCPP_TEST_CHANNEL_TEST_PEER_H + +#include + +namespace grpc { +namespace testing { + +/// A test-only class to access private members of Channel. +class ChannelTestPeer { + public: + explicit ChannelTestPeer(Channel* channel) : channel_(channel) {} + + /// Provide the gRPC Core channel + grpc_channel* channel() const { return channel_->c_channel_; } + int registered_calls() const; + int registration_attempts() const; + + private: + Channel* channel_; // not owned +}; + +} // namespace testing +} // namespace grpc + +#endif // GRPCPP_TEST_CHANNEL_TEST_PEER_H diff --git a/include/grpcpp/test/default_reactor_test_peer.h b/include/grpcpp/test/default_reactor_test_peer.h new file mode 100644 index 00000000..a792e6f9 --- /dev/null +++ b/include/grpcpp/test/default_reactor_test_peer.h @@ -0,0 +1,58 @@ +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_TEST_DEFAULT_REACTOR_TEST_PEER_H +#define GRPCPP_TEST_DEFAULT_REACTOR_TEST_PEER_H + +#include +#include + +namespace grpc { +namespace testing { + +/// A test-only class to monitor the behavior of the ServerContext's +/// DefaultReactor. It is intended for allow unit-testing of a callback API +/// service via direct invocation of the service methods rather than through +/// RPCs. It is only applicable for unary RPC methods that use the +/// DefaultReactor rather than any user-defined reactor. If it is used, it must +/// be created before the RPC is invoked so that it can bind the reactor into a +/// test mode rather than letting it follow the normal paths. +class DefaultReactorTestPeer { + public: + explicit DefaultReactorTestPeer(experimental::CallbackServerContext* ctx) + : DefaultReactorTestPeer(ctx, [](::grpc::Status) {}) {} + DefaultReactorTestPeer(experimental::CallbackServerContext* ctx, + std::function finish_func) + : ctx_(ctx) { + ctx->SetupTestDefaultReactor(std::move(finish_func)); + } + ::grpc::experimental::ServerUnaryReactor* reactor() const { + return reinterpret_cast( + &ctx_->default_reactor_); + } + bool test_status_set() const { return ctx_->test_status_set(); } + Status test_status() const { return ctx_->test_status(); } + + private: + experimental::CallbackServerContext* const ctx_; // not owned +}; + +} // namespace testing +} // namespace grpc + +#endif // GRPCPP_TEST_DEFAULT_REACTOR_TEST_PEER_H diff --git a/include/grpcpp/test/mock_stream.h b/include/grpcpp/test/mock_stream.h new file mode 100644 index 00000000..55e76f6f --- /dev/null +++ b/include/grpcpp/test/mock_stream.h @@ -0,0 +1,150 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_TEST_MOCK_STREAM_H +#define GRPCPP_TEST_MOCK_STREAM_H + +#include + +#include +#include +#include +#include +#include + +namespace grpc { +namespace testing { + +template +class MockClientReader : public ::grpc_impl::ClientReaderInterface { + public: + MockClientReader() = default; + + /// ClientStreamingInterface + MOCK_METHOD0_T(Finish, Status()); + + /// ReaderInterface + MOCK_METHOD1_T(NextMessageSize, bool(uint32_t*)); + MOCK_METHOD1_T(Read, bool(R*)); + + /// ClientReaderInterface + MOCK_METHOD0_T(WaitForInitialMetadata, void()); +}; + +template +class MockClientWriter : public ::grpc_impl::ClientWriterInterface { + public: + MockClientWriter() = default; + + /// ClientStreamingInterface + MOCK_METHOD0_T(Finish, Status()); + + /// WriterInterface + MOCK_METHOD2_T(Write, bool(const W&, const WriteOptions)); + + /// ClientWriterInterface + MOCK_METHOD0_T(WritesDone, bool()); +}; + +template +class MockClientReaderWriter + : public ::grpc_impl::ClientReaderWriterInterface { + public: + MockClientReaderWriter() = default; + + /// ClientStreamingInterface + MOCK_METHOD0_T(Finish, Status()); + + /// ReaderInterface + MOCK_METHOD1_T(NextMessageSize, bool(uint32_t*)); + MOCK_METHOD1_T(Read, bool(R*)); + + /// WriterInterface + MOCK_METHOD2_T(Write, bool(const W&, const WriteOptions)); + + /// ClientReaderWriterInterface + MOCK_METHOD0_T(WaitForInitialMetadata, void()); + MOCK_METHOD0_T(WritesDone, bool()); +}; + +/// TODO: We do not support mocking an async RPC for now. + +template +class MockClientAsyncResponseReader + : public ::grpc_impl::ClientAsyncResponseReaderInterface { + public: + MockClientAsyncResponseReader() = default; + + MOCK_METHOD1_T(ReadInitialMetadata, void(void*)); + MOCK_METHOD3_T(Finish, void(R*, Status*, void*)); +}; + +template +class MockClientAsyncReader : public ClientAsyncReaderInterface { + public: + MockClientAsyncReader() = default; + + /// ClientAsyncStreamingInterface + MOCK_METHOD1_T(ReadInitialMetadata, void(void*)); + MOCK_METHOD2_T(Finish, void(Status*, void*)); + + /// AsyncReaderInterface + MOCK_METHOD2_T(Read, void(R*, void*)); +}; + +template +class MockClientAsyncWriter + : public ::grpc_impl::ClientAsyncWriterInterface { + public: + MockClientAsyncWriter() = default; + + /// ClientAsyncStreamingInterface + MOCK_METHOD1_T(ReadInitialMetadata, void(void*)); + MOCK_METHOD2_T(Finish, void(Status*, void*)); + + /// AsyncWriterInterface + MOCK_METHOD2_T(Write, void(const W&, void*)); + + /// ClientAsyncWriterInterface + MOCK_METHOD1_T(WritesDone, void(void*)); +}; + +template +class MockClientAsyncReaderWriter + : public ClientAsyncReaderWriterInterface { + public: + MockClientAsyncReaderWriter() = default; + + /// ClientAsyncStreamingInterface + MOCK_METHOD1_T(ReadInitialMetadata, void(void*)); + MOCK_METHOD2_T(Finish, void(Status*, void*)); + + /// AsyncWriterInterface + MOCK_METHOD2_T(Write, void(const W&, void*)); + + /// AsyncReaderInterface + MOCK_METHOD2_T(Read, void(R*, void*)); + + /// ClientAsyncReaderWriterInterface + MOCK_METHOD1_T(WritesDone, void(void*)); +}; + +} // namespace testing +} // namespace grpc + +#endif // GRPCPP_TEST_MOCK_STREAM_H diff --git a/include/grpcpp/test/server_context_test_spouse.h b/include/grpcpp/test/server_context_test_spouse.h new file mode 100644 index 00000000..75a41ef3 --- /dev/null +++ b/include/grpcpp/test/server_context_test_spouse.h @@ -0,0 +1,64 @@ +/* + * + * Copyright 2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPCPP_TEST_SERVER_CONTEXT_TEST_SPOUSE_H +#define GRPCPP_TEST_SERVER_CONTEXT_TEST_SPOUSE_H + +#include + +#include + +namespace grpc { +namespace testing { + +/// A test-only class to access private members and methods of ServerContext. +class ServerContextTestSpouse { + public: + explicit ServerContextTestSpouse(ServerContext* ctx) : ctx_(ctx) {} + + /// Inject client metadata to the ServerContext for the test. The test spouse + /// must be alive when \a ServerContext::client_metadata is called. + void AddClientMetadata(const grpc::string& key, const grpc::string& value) { + client_metadata_storage_.insert( + std::pair(key, value)); + ctx_->client_metadata_.map()->clear(); + for (const auto& item : client_metadata_storage_) { + ctx_->client_metadata_.map()->insert( + std::pair( + item.first.c_str(), + grpc::string_ref(item.second.data(), item.second.size()))); + } + } + + std::multimap GetInitialMetadata() const { + return ctx_->initial_metadata_; + } + + std::multimap GetTrailingMetadata() const { + return ctx_->trailing_metadata_; + } + + private: + ServerContext* ctx_; // not owned + std::multimap client_metadata_storage_; +}; + +} // namespace testing +} // namespace grpc + +#endif // GRPCPP_TEST_SERVER_CONTEXT_TEST_SPOUSE_H diff --git a/package.xml b/package.xml new file mode 100644 index 00000000..ba097d9c --- /dev/null +++ b/package.xml @@ -0,0 +1,1953 @@ + + + grpc + pecl.php.net + A high performance, open source, general RPC framework that puts mobile and HTTP/2 first. + Remote Procedure Calls (RPCs) provide a useful abstraction for building distributed applications and services. The libraries in this repository provide a concrete implementation of the gRPC protocol, layered over HTTP/2. These libraries enable communication between clients and servers using any combination of the supported languages. + + Stanley Cheung + stanleycheung + grpc-packages@google.com + yes + + 2019-09-24 + + + 1.30.2 + 1.30.2 + + + stable + stable + + Apache 2.0 + +- gRPC Core 1.30.2 update + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5.5.0 + + + 1.4.0 + + + + grpc + + + + + 0.5.0 + 0.5.0 + + + alpha + alpha + + 2015-06-16 + BSD + +First alpha release + + + + + 0.5.1 + 0.5.1 + + + alpha + alpha + + 2015-07-09 + BSD + +Update to wrap gRPC C Core version 0.10.0 + + + + + 0.6.0 + 0.6.0 + + + beta + beta + + 2015-09-24 + BSD + +- support per message compression disable +- expose per-call host override option +- expose connectivity API +- expose channel target and call peer +- add user-agent +- update to wrap gRPC C core library beta version 0.11.0 + + + + + 0.6.1 + 0.6.0 + + + beta + beta + + 2015-10-21 + BSD + +- fixed undefined constant fatal error when run with apache/nginx #2275 + + + + + 0.7.0 + 0.7.0 + + + beta + beta + + 2016-01-13 + BSD + +- Breaking change to Credentials class (removed) #3765 +- Replaced by ChannelCredentials and CallCredentials class #3765 +- New plugin based metadata auth API #4394 +- Explicit ChannelCredentials::createInsecure() call + + + + + 0.8.0 + 0.8.0 + + + beta + beta + + 2016-02-24 + BSD + +- Simplify gRPC PHP installation #4517 +- Wrap gRPC core library version 0.13 + + + + + 0.8.1 + 0.8.1 + + + beta + beta + + 2016-03-01 + BSD + +- Increase unit test code coverage #5225 + + + + + 0.14.0 + 0.14.0 + + + beta + beta + + 2016-04-19 + BSD + +- wrap grpc C core version 0.14.0 +- destroy grpc_byte_buffer after startBatch #6096 + + + + + 0.15.0 + 0.15.0 + + + beta + beta + + 2016-05-18 + BSD + +- Updated functions with TSRM macros for ZTS support #6607 +- Load default roots.pem via grpc_set_ssl_roots_override_callback #6848 + + + + + 1.0.0RC1 + 1.0.0RC1 + + + stable + stable + + 2016-07-13 + BSD + +- GA release +- Fix shutdown hang problem #4017 + + + + + 1.0.0RC2 + 1.0.0RC2 + + + stable + stable + + 2016-07-21 + BSD + +- PHP7 Support #7464 + + + + + 1.0.0RC3 + 1.0.0RC3 + + + stable + stable + + 2016-07-28 + BSD + +- PHP7 Support continued, reduce code duplication #7543 + + + + + 1.0.0RC4 + 1.0.0RC4 + + + stable + stable + + 2016-08-09 + BSD + +- Fixed Ubuntu compile error #7571, #7642 + + + + + 1.0.0 + 1.0.0 + + + stable + stable + + 2016-08-18 + BSD + +- gRPC 1.0.0 release + + + + + 1.0.1RC1 + 1.0.1RC1 + + + beta + beta + + 2016-10-06 + BSD + +- Reject metadata keys which are not legal #7881 + + + + + 1.0.1 + 1.0.1 + + + stable + stable + + 2016-10-27 + BSD + +- Reject metadata keys which are not legal #7881 + + + + + 1.1.0RC1 + 1.1.0RC1 + + + beta + beta + + 2017-01-13 + BSD + +- PHP Proto3 adoption #8179 +- Various bug fixes + + + + + 1.1.0 + 1.1.0 + + + stable + stable + + 2017-01-31 + BSD + +- PHP Proto3 adoption #8179 +- Various bug fixes + + + + + 1.2.0RC1 + 1.2.0RC1 + + + beta + beta + + 2017-03-01 + BSD + +- Added arg info macros #9751 +- Updated codegen to be consistent with protobuf #9492 + + + + + 1.2.0 + 1.2.0 + + + stable + stable + + 2017-03-20 + BSD + +- Added arg info macros #9751 +- Updated codegen to be consistent with protobuf #9492 + + + + diff --git a/requirements.bazel.txt b/requirements.bazel.txt new file mode 100644 index 00000000..10b47550 --- /dev/null +++ b/requirements.bazel.txt @@ -0,0 +1,16 @@ +# GRPC Python setup requirements +coverage>=4.0 +cython>=0.29.8 +enum34>=1.0.4 +protobuf>=3.5.0.post1 +six>=1.10 +wheel>=0.29 +futures>=2.2.0 +google-auth>=1.17.2 +oauth2client==4.1.0 +requests>=2.14.2 +urllib3>=1.23 +chardet==3.0.4 +certifi==2017.4.17 +idna==2.7 +googleapis-common-protos==1.5.5 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 00000000..27dd7d9f --- /dev/null +++ b/requirements.txt @@ -0,0 +1,7 @@ +# GRPC Python setup requirements +coverage>=4.0 +cython>=0.29.8 +enum34>=1.0.4 +protobuf>=3.5.0.post1 +six>=1.10 +wheel>=0.29 diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 00000000..d54017af --- /dev/null +++ b/setup.cfg @@ -0,0 +1,30 @@ +# Setup settings for GRPC Python + +[coverage:run] +plugins = Cython.Coverage + +[build] +build_base=python_build + +[build_ext] +inplace=1 + +[build_package_protos] +exclude=.*protoc_plugin/protoc_plugin_test\.proto$ + +# Style settings +[yapf] +based_on_style = google + +[metadata] +license_files = LICENSE + +[pytype] +inputs = + src/python/grpcio/grpc/experimental + src/python/grpcio_tests/tests_aio + +# NOTE(lidiz) +# import-error: C extension triggers import-error. +# module-attr: pytype cannot understand the namespace packages by Google. +disable = "import-error,module-attr" diff --git a/setup.py b/setup.py new file mode 100644 index 00000000..2379703e --- /dev/null +++ b/setup.py @@ -0,0 +1,422 @@ +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""A setup module for the GRPC Python package.""" +from distutils import cygwinccompiler +from distutils import extension as _extension +from distutils import util +import os +import os.path +import pkg_resources +import platform +import re +import shlex +import shutil +import sys +import sysconfig + +import setuptools +from setuptools.command import egg_info + +import subprocess +from subprocess import PIPE + +# Redirect the manifest template from MANIFEST.in to PYTHON-MANIFEST.in. +egg_info.manifest_maker.template = 'PYTHON-MANIFEST.in' + +PY3 = sys.version_info.major == 3 +PYTHON_STEM = os.path.join('src', 'python', 'grpcio') +CORE_INCLUDE = ( + 'include', + '.', +) +ABSL_INCLUDE = (os.path.join('third_party', 'abseil-cpp'),) +ADDRESS_SORTING_INCLUDE = (os.path.join('third_party', 'address_sorting', + 'include'),) +CARES_INCLUDE = ( + os.path.join('third_party', 'cares'), + os.path.join('third_party', 'cares', 'cares'), +) +if 'darwin' in sys.platform: + CARES_INCLUDE += (os.path.join('third_party', 'cares', 'config_darwin'),) +if 'freebsd' in sys.platform: + CARES_INCLUDE += (os.path.join('third_party', 'cares', 'config_freebsd'),) +if 'linux' in sys.platform: + CARES_INCLUDE += (os.path.join('third_party', 'cares', 'config_linux'),) +if 'openbsd' in sys.platform: + CARES_INCLUDE += (os.path.join('third_party', 'cares', 'config_openbsd'),) +SSL_INCLUDE = (os.path.join('third_party', 'boringssl-with-bazel', 'src', + 'include'),) +UPB_INCLUDE = (os.path.join('third_party', 'upb'),) +UPB_GRPC_GENERATED_INCLUDE = (os.path.join('src', 'core', 'ext', + 'upb-generated'),) +ZLIB_INCLUDE = (os.path.join('third_party', 'zlib'),) +README = os.path.join(PYTHON_STEM, 'README.rst') + +# Ensure we're in the proper directory whether or not we're being used by pip. +os.chdir(os.path.dirname(os.path.abspath(__file__))) +sys.path.insert(0, os.path.abspath(PYTHON_STEM)) + +# Break import-style to ensure we can actually find our in-repo dependencies. +import _parallel_compile_patch +import _spawn_patch +import commands +import grpc_core_dependencies +import grpc_version + +_parallel_compile_patch.monkeypatch_compile_maybe() +_spawn_patch.monkeypatch_spawn() + +LICENSE = 'Apache License 2.0' + +CLASSIFIERS = [ + 'Development Status :: 5 - Production/Stable', + 'Programming Language :: Python', + 'Programming Language :: Python :: 2', + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: 3.8', + 'License :: OSI Approved :: Apache Software License', +] + +# Environment variable to determine whether or not the Cython extension should +# *use* Cython or use the generated C files. Note that this requires the C files +# to have been generated by building first *with* Cython support. Even if this +# is set to false, if the script detects that the generated `.c` file isn't +# present, then it will still attempt to use Cython. +BUILD_WITH_CYTHON = os.environ.get('GRPC_PYTHON_BUILD_WITH_CYTHON', False) + +# Export this variable to use the system installation of openssl. You need to +# have the header files installed (in /usr/include/openssl) and during +# runtime, the shared library must be installed +BUILD_WITH_SYSTEM_OPENSSL = os.environ.get('GRPC_PYTHON_BUILD_SYSTEM_OPENSSL', + False) + +# Export this variable to use the system installation of zlib. You need to +# have the header files installed (in /usr/include/) and during +# runtime, the shared library must be installed +BUILD_WITH_SYSTEM_ZLIB = os.environ.get('GRPC_PYTHON_BUILD_SYSTEM_ZLIB', False) + +# Export this variable to use the system installation of cares. You need to +# have the header files installed (in /usr/include/) and during +# runtime, the shared library must be installed +BUILD_WITH_SYSTEM_CARES = os.environ.get('GRPC_PYTHON_BUILD_SYSTEM_CARES', + False) + +# For local development use only: This skips building gRPC Core and its +# dependencies, including protobuf and boringssl. This allows "incremental" +# compilation by first building gRPC Core using make, then building only the +# Python/Cython layers here. +# +# Note that this requires libboringssl.a in the libs/{dbg,opt}/ directory, which +# may require configuring make to not use the system openssl implementation: +# +# make HAS_SYSTEM_OPENSSL_ALPN=0 +# +# TODO(ericgribkoff) Respect the BUILD_WITH_SYSTEM_* flags alongside this option +USE_PREBUILT_GRPC_CORE = os.environ.get('GRPC_PYTHON_USE_PREBUILT_GRPC_CORE', + False) + +# If this environmental variable is set, GRPC will not try to be compatible with +# libc versions old than the one it was compiled against. +DISABLE_LIBC_COMPATIBILITY = os.environ.get( + 'GRPC_PYTHON_DISABLE_LIBC_COMPATIBILITY', False) + +# Environment variable to determine whether or not to enable coverage analysis +# in Cython modules. +ENABLE_CYTHON_TRACING = os.environ.get('GRPC_PYTHON_ENABLE_CYTHON_TRACING', + False) + +# Environment variable specifying whether or not there's interest in setting up +# documentation building. +ENABLE_DOCUMENTATION_BUILD = os.environ.get( + 'GRPC_PYTHON_ENABLE_DOCUMENTATION_BUILD', False) + + +def check_linker_need_libatomic(): + """Test if linker on system needs libatomic.""" + code_test = (b'#include \n' + + b'int main() { return std::atomic{}; }') + cc_test = subprocess.Popen(['cc', '-x', 'c++', '-std=c++11', '-'], + stdin=PIPE, + stdout=PIPE, + stderr=PIPE) + cc_test.communicate(input=code_test) + return cc_test.returncode != 0 + + +# There are some situations (like on Windows) where CC, CFLAGS, and LDFLAGS are +# entirely ignored/dropped/forgotten by distutils and its Cygwin/MinGW support. +# We use these environment variables to thus get around that without locking +# ourselves in w.r.t. the multitude of operating systems this ought to build on. +# We can also use these variables as a way to inject environment-specific +# compiler/linker flags. We assume GCC-like compilers and/or MinGW as a +# reasonable default. +EXTRA_ENV_COMPILE_ARGS = os.environ.get('GRPC_PYTHON_CFLAGS', None) +EXTRA_ENV_LINK_ARGS = os.environ.get('GRPC_PYTHON_LDFLAGS', None) +if EXTRA_ENV_COMPILE_ARGS is None: + EXTRA_ENV_COMPILE_ARGS = ' -std=c++11' + if 'win32' in sys.platform: + if sys.version_info < (3, 5): + EXTRA_ENV_COMPILE_ARGS += ' -D_hypot=hypot' + # We use define flags here and don't directly add to DEFINE_MACROS below to + # ensure that the expert user/builder has a way of turning it off (via the + # envvars) without adding yet more GRPC-specific envvars. + # See https://sourceforge.net/p/mingw-w64/bugs/363/ + if '32' in platform.architecture()[0]: + EXTRA_ENV_COMPILE_ARGS += ' -D_ftime=_ftime32 -D_timeb=__timeb32 -D_ftime_s=_ftime32_s' + else: + EXTRA_ENV_COMPILE_ARGS += ' -D_ftime=_ftime64 -D_timeb=__timeb64' + else: + # We need to statically link the C++ Runtime, only the C runtime is + # available dynamically + EXTRA_ENV_COMPILE_ARGS += ' /MT' + elif "linux" in sys.platform: + EXTRA_ENV_COMPILE_ARGS += ' -std=gnu99 -fvisibility=hidden -fno-wrapv -fno-exceptions' + elif "darwin" in sys.platform: + EXTRA_ENV_COMPILE_ARGS += ' -stdlib=libc++ -fvisibility=hidden -fno-wrapv -fno-exceptions' + +if EXTRA_ENV_LINK_ARGS is None: + EXTRA_ENV_LINK_ARGS = '' + if "linux" in sys.platform or "darwin" in sys.platform: + EXTRA_ENV_LINK_ARGS += ' -lpthread' + if check_linker_need_libatomic(): + EXTRA_ENV_LINK_ARGS += ' -latomic' + elif "win32" in sys.platform and sys.version_info < (3, 5): + msvcr = cygwinccompiler.get_msvcr()[0] + EXTRA_ENV_LINK_ARGS += ( + ' -static-libgcc -static-libstdc++ -mcrtdll={msvcr}' + ' -static -lshlwapi'.format(msvcr=msvcr)) + if "linux" in sys.platform: + EXTRA_ENV_LINK_ARGS += ' -Wl,-wrap,memcpy -static-libgcc' + +EXTRA_COMPILE_ARGS = shlex.split(EXTRA_ENV_COMPILE_ARGS) +EXTRA_LINK_ARGS = shlex.split(EXTRA_ENV_LINK_ARGS) + +CYTHON_EXTENSION_PACKAGE_NAMES = () + +CYTHON_EXTENSION_MODULE_NAMES = ('grpc._cython.cygrpc',) + +CYTHON_HELPER_C_FILES = () + +CORE_C_FILES = tuple(grpc_core_dependencies.CORE_SOURCE_FILES) +if "win32" in sys.platform: + CORE_C_FILES = filter(lambda x: 'third_party/cares' not in x, CORE_C_FILES) + +if BUILD_WITH_SYSTEM_OPENSSL: + CORE_C_FILES = filter(lambda x: 'third_party/boringssl' not in x, + CORE_C_FILES) + CORE_C_FILES = filter(lambda x: 'src/boringssl' not in x, CORE_C_FILES) + SSL_INCLUDE = (os.path.join('/usr', 'include', 'openssl'),) + +if BUILD_WITH_SYSTEM_ZLIB: + CORE_C_FILES = filter(lambda x: 'third_party/zlib' not in x, CORE_C_FILES) + ZLIB_INCLUDE = (os.path.join('/usr', 'include'),) + +if BUILD_WITH_SYSTEM_CARES: + CORE_C_FILES = filter(lambda x: 'third_party/cares' not in x, CORE_C_FILES) + CARES_INCLUDE = (os.path.join('/usr', 'include'),) + +EXTENSION_INCLUDE_DIRECTORIES = ((PYTHON_STEM,) + CORE_INCLUDE + ABSL_INCLUDE + + ADDRESS_SORTING_INCLUDE + CARES_INCLUDE + + SSL_INCLUDE + UPB_INCLUDE + + UPB_GRPC_GENERATED_INCLUDE + ZLIB_INCLUDE) + +EXTENSION_LIBRARIES = () +if "linux" in sys.platform: + EXTENSION_LIBRARIES += ('rt',) +if not "win32" in sys.platform: + EXTENSION_LIBRARIES += ('m',) +if "win32" in sys.platform: + EXTENSION_LIBRARIES += ( + 'advapi32', + 'ws2_32', + 'dbghelp', + ) +if BUILD_WITH_SYSTEM_OPENSSL: + EXTENSION_LIBRARIES += ( + 'ssl', + 'crypto', + ) +if BUILD_WITH_SYSTEM_ZLIB: + EXTENSION_LIBRARIES += ('z',) +if BUILD_WITH_SYSTEM_CARES: + EXTENSION_LIBRARIES += ('cares',) + +DEFINE_MACROS = (('OPENSSL_NO_ASM', 1), ('_WIN32_WINNT', 0x600)) +if not DISABLE_LIBC_COMPATIBILITY: + DEFINE_MACROS += (('GPR_BACKWARDS_COMPATIBILITY_MODE', 1),) +if "win32" in sys.platform: + # TODO(zyc): Re-enable c-ares on x64 and x86 windows after fixing the + # ares_library_init compilation issue + DEFINE_MACROS += ( + ('WIN32_LEAN_AND_MEAN', 1), + ('CARES_STATICLIB', 1), + ('GRPC_ARES', 0), + ('NTDDI_VERSION', 0x06000000), + ('NOMINMAX', 1), + ) + if '64bit' in platform.architecture()[0]: + DEFINE_MACROS += (('MS_WIN64', 1),) + elif sys.version_info >= (3, 5): + # For some reason, this is needed to get access to inet_pton/inet_ntop + # on msvc, but only for 32 bits + DEFINE_MACROS += (('NTDDI_VERSION', 0x06000000),) +else: + DEFINE_MACROS += ( + ('HAVE_CONFIG_H', 1), + ('GRPC_ENABLE_FORK_SUPPORT', 1), + ) + +LDFLAGS = tuple(EXTRA_LINK_ARGS) +CFLAGS = tuple(EXTRA_COMPILE_ARGS) +if "linux" in sys.platform or "darwin" in sys.platform: + pymodinit_type = 'PyObject*' if PY3 else 'void' + pymodinit = 'extern "C" __attribute__((visibility ("default"))) {}'.format( + pymodinit_type) + DEFINE_MACROS += (('PyMODINIT_FUNC', pymodinit),) + DEFINE_MACROS += (('GRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK', 1),) + +# By default, Python3 distutils enforces compatibility of +# c plugins (.so files) with the OSX version Python3 was built with. +# For Python3.4, this is OSX 10.6, but we need Thread Local Support (__thread) +if 'darwin' in sys.platform and PY3: + mac_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') + if mac_target and (pkg_resources.parse_version(mac_target) < + pkg_resources.parse_version('10.7.0')): + os.environ['MACOSX_DEPLOYMENT_TARGET'] = '10.7' + os.environ['_PYTHON_HOST_PLATFORM'] = re.sub( + r'macosx-[0-9]+\.[0-9]+-(.+)', r'macosx-10.7-\1', + util.get_platform()) + + +def cython_extensions_and_necessity(): + cython_module_files = [ + os.path.join(PYTHON_STEM, + name.replace('.', '/') + '.pyx') + for name in CYTHON_EXTENSION_MODULE_NAMES + ] + config = os.environ.get('CONFIG', 'opt') + prefix = 'libs/' + config + '/' + if USE_PREBUILT_GRPC_CORE: + extra_objects = [ + prefix + 'libares.a', prefix + 'libboringssl.a', + prefix + 'libgpr.a', prefix + 'libgrpc.a' + ] + core_c_files = [] + else: + core_c_files = list(CORE_C_FILES) + extra_objects = [] + extensions = [ + _extension.Extension( + name=module_name, + sources=[module_file] + list(CYTHON_HELPER_C_FILES) + core_c_files, + include_dirs=list(EXTENSION_INCLUDE_DIRECTORIES), + libraries=list(EXTENSION_LIBRARIES), + define_macros=list(DEFINE_MACROS), + extra_objects=extra_objects, + extra_compile_args=list(CFLAGS), + extra_link_args=list(LDFLAGS), + ) for (module_name, module_file + ) in zip(list(CYTHON_EXTENSION_MODULE_NAMES), cython_module_files) + ] + need_cython = BUILD_WITH_CYTHON + if not BUILD_WITH_CYTHON: + need_cython = need_cython or not commands.check_and_update_cythonization( + extensions) + # TODO: the strategy for conditional compiling and exposing the aio Cython + # dependencies will be revisited by https://github.com/grpc/grpc/issues/19728 + return commands.try_cythonize(extensions, + linetracing=ENABLE_CYTHON_TRACING, + mandatory=BUILD_WITH_CYTHON), need_cython + + +CYTHON_EXTENSION_MODULES, need_cython = cython_extensions_and_necessity() + +PACKAGE_DIRECTORIES = { + '': PYTHON_STEM, +} + +INSTALL_REQUIRES = ( + "six>=1.5.2", + "futures>=2.2.0; python_version<'3.2'", + "enum34>=1.0.4; python_version<'3.4'", +) + +SETUP_REQUIRES = INSTALL_REQUIRES + ( + 'Sphinx~=1.8.1', + 'six>=1.10', +) if ENABLE_DOCUMENTATION_BUILD else () + +try: + import Cython +except ImportError: + if BUILD_WITH_CYTHON: + sys.stderr.write( + "You requested a Cython build via GRPC_PYTHON_BUILD_WITH_CYTHON, " + "but do not have Cython installed. We won't stop you from using " + "other commands, but the extension files will fail to build.\n") + elif need_cython: + sys.stderr.write( + 'We could not find Cython. Setup may take 10-20 minutes.\n') + SETUP_REQUIRES += ('cython>=0.23',) + +COMMAND_CLASS = { + 'doc': commands.SphinxDocumentation, + 'build_project_metadata': commands.BuildProjectMetadata, + 'build_py': commands.BuildPy, + 'build_ext': commands.BuildExt, + 'gather': commands.Gather, +} + +# Ensure that package data is copied over before any commands have been run: +credentials_dir = os.path.join(PYTHON_STEM, 'grpc', '_cython', '_credentials') +try: + os.mkdir(credentials_dir) +except OSError: + pass +shutil.copyfile(os.path.join('etc', 'roots.pem'), + os.path.join(credentials_dir, 'roots.pem')) + +PACKAGE_DATA = { + # Binaries that may or may not be present in the final installation, but are + # mentioned here for completeness. + 'grpc._cython': [ + '_credentials/roots.pem', + '_windows/grpc_c.32.python', + '_windows/grpc_c.64.python', + ], +} +PACKAGES = setuptools.find_packages(PYTHON_STEM) + +setuptools.setup( + name='grpcio', + version=grpc_version.VERSION, + description='HTTP/2-based RPC framework', + author='The gRPC Authors', + author_email='grpc-io@googlegroups.com', + url='https://grpc.io', + license=LICENSE, + classifiers=CLASSIFIERS, + long_description=open(README).read(), + ext_modules=CYTHON_EXTENSION_MODULES, + packages=list(PACKAGES), + package_dir=PACKAGE_DIRECTORIES, + package_data=PACKAGE_DATA, + install_requires=INSTALL_REQUIRES, + setup_requires=SETUP_REQUIRES, + cmdclass=COMMAND_CLASS, +) diff --git a/src/abseil-cpp/gen_build_yaml.py b/src/abseil-cpp/gen_build_yaml.py new file mode 100755 index 00000000..2f32a3e2 --- /dev/null +++ b/src/abseil-cpp/gen_build_yaml.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python2.7 + +# Copyright 2019 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +import yaml + +BUILDS_YAML_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), + 'preprocessed_builds.yaml') +with open(BUILDS_YAML_PATH) as f: + builds = yaml.load(f) + +for build in builds: + build['build'] = 'private' + build['build_system'] = [] + build['language'] = 'c' + build['secure'] = False +print(yaml.dump({'libs': builds})) diff --git a/src/abseil-cpp/preprocessed_builds.yaml b/src/abseil-cpp/preprocessed_builds.yaml new file mode 100644 index 00000000..a6a35f2f --- /dev/null +++ b/src/abseil-cpp/preprocessed_builds.yaml @@ -0,0 +1,1410 @@ +- cmake_target: absl::algorithm + deps: + - absl/base:config + headers: + - third_party/abseil-cpp/absl/algorithm/algorithm.h + name: absl/algorithm:algorithm + src: [] +- cmake_target: absl::algorithm_container + deps: + - absl/algorithm:algorithm + - absl/base:core_headers + - absl/meta:type_traits + headers: + - third_party/abseil-cpp/absl/algorithm/container.h + name: absl/algorithm:container + src: [] +- cmake_target: absl::atomic_hook + deps: + - absl/base:config + - absl/base:core_headers + headers: + - third_party/abseil-cpp/absl/base/internal/atomic_hook.h + name: absl/base:atomic_hook + src: [] +- cmake_target: absl::base + deps: + - absl/base:atomic_hook + - absl/base:base_internal + - absl/base:config + - absl/base:core_headers + - absl/base:dynamic_annotations + - absl/base:log_severity + - absl/base:raw_logging_internal + - absl/base:spinlock_wait + - absl/meta:type_traits + headers: + - third_party/abseil-cpp/absl/base/call_once.h + - third_party/abseil-cpp/absl/base/casts.h + - third_party/abseil-cpp/absl/base/internal/cycleclock.h + - third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h + - third_party/abseil-cpp/absl/base/internal/per_thread_tls.h + - third_party/abseil-cpp/absl/base/internal/spinlock.h + - third_party/abseil-cpp/absl/base/internal/sysinfo.h + - third_party/abseil-cpp/absl/base/internal/thread_identity.h + - third_party/abseil-cpp/absl/base/internal/tsan_mutex_interface.h + - third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h + name: absl/base:base + src: + - third_party/abseil-cpp/absl/base/internal/cycleclock.cc + - third_party/abseil-cpp/absl/base/internal/spinlock.cc + - third_party/abseil-cpp/absl/base/internal/sysinfo.cc + - third_party/abseil-cpp/absl/base/internal/thread_identity.cc + - third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +- cmake_target: absl::base_internal + deps: + - absl/base:config + - absl/meta:type_traits + headers: + - third_party/abseil-cpp/absl/base/internal/hide_ptr.h + - third_party/abseil-cpp/absl/base/internal/identity.h + - third_party/abseil-cpp/absl/base/internal/inline_variable.h + - third_party/abseil-cpp/absl/base/internal/invoke.h + - third_party/abseil-cpp/absl/base/internal/scheduling_mode.h + name: absl/base:base_internal + src: [] +- cmake_target: absl::bits + deps: + - absl/base:config + - absl/base:core_headers + headers: + - third_party/abseil-cpp/absl/base/internal/bits.h + name: absl/base:bits + src: [] +- cmake_target: absl::config + deps: [] + headers: + - third_party/abseil-cpp/absl/base/config.h + - third_party/abseil-cpp/absl/base/options.h + - third_party/abseil-cpp/absl/base/policy_checks.h + name: absl/base:config + src: [] +- cmake_target: absl::core_headers + deps: + - absl/base:config + headers: + - third_party/abseil-cpp/absl/base/attributes.h + - third_party/abseil-cpp/absl/base/const_init.h + - third_party/abseil-cpp/absl/base/internal/thread_annotations.h + - third_party/abseil-cpp/absl/base/macros.h + - third_party/abseil-cpp/absl/base/optimization.h + - third_party/abseil-cpp/absl/base/port.h + - third_party/abseil-cpp/absl/base/thread_annotations.h + name: absl/base:core_headers + src: [] +- cmake_target: absl::dynamic_annotations + deps: [] + headers: + - third_party/abseil-cpp/absl/base/dynamic_annotations.h + name: absl/base:dynamic_annotations + src: + - third_party/abseil-cpp/absl/base/dynamic_annotations.cc +- cmake_target: absl::endian + deps: + - absl/base:config + - absl/base:core_headers + headers: + - third_party/abseil-cpp/absl/base/internal/endian.h + - third_party/abseil-cpp/absl/base/internal/unaligned_access.h + name: absl/base:endian + src: [] +- cmake_target: absl::errno_saver + deps: + - absl/base:config + headers: + - third_party/abseil-cpp/absl/base/internal/errno_saver.h + name: absl/base:errno_saver + src: [] +- cmake_target: absl::exponential_biased + deps: + - absl/base:config + - absl/base:core_headers + headers: + - third_party/abseil-cpp/absl/base/internal/exponential_biased.h + name: absl/base:exponential_biased + src: + - third_party/abseil-cpp/absl/base/internal/exponential_biased.cc +- cmake_target: absl::log_severity + deps: + - absl/base:config + - absl/base:core_headers + headers: + - third_party/abseil-cpp/absl/base/log_severity.h + name: absl/base:log_severity + src: + - third_party/abseil-cpp/absl/base/log_severity.cc +- cmake_target: absl::malloc_internal + deps: + - absl/base:base + - absl/base:base_internal + - absl/base:config + - absl/base:core_headers + - absl/base:dynamic_annotations + - absl/base:raw_logging_internal + headers: + - third_party/abseil-cpp/absl/base/internal/direct_mmap.h + - third_party/abseil-cpp/absl/base/internal/low_level_alloc.h + name: absl/base:malloc_internal + src: + - third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +- cmake_target: absl::periodic_sampler + deps: + - absl/base:core_headers + - absl/base:exponential_biased + headers: + - third_party/abseil-cpp/absl/base/internal/periodic_sampler.h + name: absl/base:periodic_sampler + src: + - third_party/abseil-cpp/absl/base/internal/periodic_sampler.cc +- cmake_target: absl::pretty_function + deps: [] + headers: + - third_party/abseil-cpp/absl/base/internal/pretty_function.h + name: absl/base:pretty_function + src: [] +- cmake_target: absl::raw_logging_internal + deps: + - absl/base:atomic_hook + - absl/base:config + - absl/base:core_headers + - absl/base:log_severity + headers: + - third_party/abseil-cpp/absl/base/internal/raw_logging.h + name: absl/base:raw_logging_internal + src: + - third_party/abseil-cpp/absl/base/internal/raw_logging.cc +- cmake_target: absl::spinlock_wait + deps: + - absl/base:base_internal + - absl/base:core_headers + - absl/base:errno_saver + headers: + - third_party/abseil-cpp/absl/base/internal/spinlock_akaros.inc + - third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc + - third_party/abseil-cpp/absl/base/internal/spinlock_posix.inc + - third_party/abseil-cpp/absl/base/internal/spinlock_wait.h + - third_party/abseil-cpp/absl/base/internal/spinlock_win32.inc + name: absl/base:spinlock_wait + src: + - third_party/abseil-cpp/absl/base/internal/spinlock_wait.cc +- cmake_target: absl::throw_delegate + deps: + - absl/base:config + - absl/base:raw_logging_internal + headers: + - third_party/abseil-cpp/absl/base/internal/throw_delegate.h + name: absl/base:throw_delegate + src: + - third_party/abseil-cpp/absl/base/internal/throw_delegate.cc +- cmake_target: absl::btree + deps: + - absl/base:core_headers + - absl/base:throw_delegate + - absl/container:common + - absl/container:compressed_tuple + - absl/container:container_memory + - absl/container:layout + - absl/memory:memory + - absl/meta:type_traits + - absl/strings:strings + - absl/types:compare + - absl/utility:utility + headers: + - third_party/abseil-cpp/absl/container/btree_map.h + - third_party/abseil-cpp/absl/container/btree_set.h + - third_party/abseil-cpp/absl/container/internal/btree.h + - third_party/abseil-cpp/absl/container/internal/btree_container.h + name: absl/container:btree + src: [] +- cmake_target: absl::container_common + deps: + - absl/meta:type_traits + - absl/types:optional + headers: + - third_party/abseil-cpp/absl/container/internal/common.h + name: absl/container:common + src: [] +- cmake_target: absl::compressed_tuple + deps: + - absl/utility:utility + headers: + - third_party/abseil-cpp/absl/container/internal/compressed_tuple.h + name: absl/container:compressed_tuple + src: [] +- cmake_target: absl::container_memory + deps: + - absl/memory:memory + - absl/utility:utility + headers: + - third_party/abseil-cpp/absl/container/internal/container_memory.h + name: absl/container:container_memory + src: [] +- cmake_target: absl::fixed_array + deps: + - absl/algorithm:algorithm + - absl/base:core_headers + - absl/base:dynamic_annotations + - absl/base:throw_delegate + - absl/container:compressed_tuple + - absl/memory:memory + headers: + - third_party/abseil-cpp/absl/container/fixed_array.h + name: absl/container:fixed_array + src: [] +- cmake_target: absl::flat_hash_map + deps: + - absl/algorithm:container + - absl/container:container_memory + - absl/container:hash_function_defaults + - absl/container:raw_hash_map + - absl/memory:memory + headers: + - third_party/abseil-cpp/absl/container/flat_hash_map.h + name: absl/container:flat_hash_map + src: [] +- cmake_target: absl::flat_hash_set + deps: + - absl/algorithm:container + - absl/base:core_headers + - absl/container:container_memory + - absl/container:hash_function_defaults + - absl/container:raw_hash_set + - absl/memory:memory + headers: + - third_party/abseil-cpp/absl/container/flat_hash_set.h + name: absl/container:flat_hash_set + src: [] +- cmake_target: absl::hash_function_defaults + deps: + - absl/base:config + - absl/hash:hash + - absl/strings:strings + headers: + - third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h + name: absl/container:hash_function_defaults + src: [] +- cmake_target: absl::hash_policy_traits + deps: + - absl/meta:type_traits + headers: + - third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h + name: absl/container:hash_policy_traits + src: [] +- cmake_target: absl::hashtable_debug + deps: + - absl/container:hashtable_debug_hooks + headers: + - third_party/abseil-cpp/absl/container/internal/hashtable_debug.h + name: absl/container:hashtable_debug + src: [] +- cmake_target: absl::hashtable_debug_hooks + deps: + - absl/base:config + headers: + - third_party/abseil-cpp/absl/container/internal/hashtable_debug_hooks.h + name: absl/container:hashtable_debug_hooks + src: [] +- cmake_target: absl::hashtablez_sampler + deps: + - absl/base:base + - absl/base:core_headers + - absl/base:exponential_biased + - absl/container:have_sse + - absl/debugging:stacktrace + - absl/memory:memory + - absl/synchronization:synchronization + - absl/utility:utility + headers: + - third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h + name: absl/container:hashtablez_sampler + src: + - third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc + - third_party/abseil-cpp/absl/container/internal/hashtablez_sampler_force_weak_definition.cc +- cmake_target: absl::have_sse + deps: [] + headers: + - third_party/abseil-cpp/absl/container/internal/have_sse.h + name: absl/container:have_sse + src: [] +- cmake_target: absl::inlined_vector + deps: + - absl/algorithm:algorithm + - absl/base:core_headers + - absl/base:throw_delegate + - absl/container:inlined_vector_internal + - absl/memory:memory + headers: + - third_party/abseil-cpp/absl/container/inlined_vector.h + name: absl/container:inlined_vector + src: [] +- cmake_target: absl::inlined_vector_internal + deps: + - absl/base:core_headers + - absl/container:compressed_tuple + - absl/memory:memory + - absl/meta:type_traits + - absl/types:span + headers: + - third_party/abseil-cpp/absl/container/internal/inlined_vector.h + name: absl/container:inlined_vector_internal + src: [] +- cmake_target: absl::layout + deps: + - absl/base:core_headers + - absl/meta:type_traits + - absl/strings:strings + - absl/types:span + - absl/utility:utility + headers: + - third_party/abseil-cpp/absl/container/internal/layout.h + name: absl/container:layout + src: [] +- cmake_target: absl::node_hash_map + deps: + - absl/algorithm:container + - absl/container:container_memory + - absl/container:hash_function_defaults + - absl/container:node_hash_policy + - absl/container:raw_hash_map + - absl/memory:memory + headers: + - third_party/abseil-cpp/absl/container/node_hash_map.h + name: absl/container:node_hash_map + src: [] +- cmake_target: absl::node_hash_policy + deps: + - absl/base:config + headers: + - third_party/abseil-cpp/absl/container/internal/node_hash_policy.h + name: absl/container:node_hash_policy + src: [] +- cmake_target: absl::node_hash_set + deps: + - absl/algorithm:container + - absl/container:hash_function_defaults + - absl/container:node_hash_policy + - absl/container:raw_hash_set + - absl/memory:memory + headers: + - third_party/abseil-cpp/absl/container/node_hash_set.h + name: absl/container:node_hash_set + src: [] +- cmake_target: absl::raw_hash_map + deps: + - absl/base:throw_delegate + - absl/container:container_memory + - absl/container:raw_hash_set + headers: + - third_party/abseil-cpp/absl/container/internal/raw_hash_map.h + name: absl/container:raw_hash_map + src: [] +- cmake_target: absl::raw_hash_set + deps: + - absl/base:bits + - absl/base:config + - absl/base:core_headers + - absl/base:endian + - absl/container:common + - absl/container:compressed_tuple + - absl/container:container_memory + - absl/container:hash_policy_traits + - absl/container:hashtable_debug_hooks + - absl/container:hashtablez_sampler + - absl/container:have_sse + - absl/container:layout + - absl/memory:memory + - absl/meta:type_traits + - absl/utility:utility + headers: + - third_party/abseil-cpp/absl/container/internal/raw_hash_set.h + name: absl/container:raw_hash_set + src: + - third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +- cmake_target: absl::debugging_internal + deps: + - absl/base:config + - absl/base:core_headers + - absl/base:dynamic_annotations + - absl/base:errno_saver + - absl/base:raw_logging_internal + headers: + - third_party/abseil-cpp/absl/debugging/internal/address_is_readable.h + - third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h + - third_party/abseil-cpp/absl/debugging/internal/vdso_support.h + name: absl/debugging:debugging_internal + src: + - third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc + - third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc + - third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +- cmake_target: absl::demangle_internal + deps: + - absl/base:base + - absl/base:config + - absl/base:core_headers + headers: + - third_party/abseil-cpp/absl/debugging/internal/demangle.h + name: absl/debugging:demangle_internal + src: + - third_party/abseil-cpp/absl/debugging/internal/demangle.cc +- cmake_target: absl::examine_stack + deps: + - absl/base:config + - absl/base:core_headers + - absl/base:raw_logging_internal + - absl/debugging:stacktrace + - absl/debugging:symbolize + headers: + - third_party/abseil-cpp/absl/debugging/internal/examine_stack.h + name: absl/debugging:examine_stack + src: + - third_party/abseil-cpp/absl/debugging/internal/examine_stack.cc +- cmake_target: absl::failure_signal_handler + deps: + - absl/base:base + - absl/base:config + - absl/base:core_headers + - absl/base:errno_saver + - absl/base:raw_logging_internal + - absl/debugging:examine_stack + - absl/debugging:stacktrace + headers: + - third_party/abseil-cpp/absl/debugging/failure_signal_handler.h + name: absl/debugging:failure_signal_handler + src: + - third_party/abseil-cpp/absl/debugging/failure_signal_handler.cc +- cmake_target: absl::leak_check + deps: + - absl/base:config + - absl/base:core_headers + headers: + - third_party/abseil-cpp/absl/debugging/leak_check.h + name: absl/debugging:leak_check + src: + - third_party/abseil-cpp/absl/debugging/leak_check.cc +- cmake_target: absl::leak_check_disable + deps: + - absl/base:config + headers: [] + name: absl/debugging:leak_check_disable + src: + - third_party/abseil-cpp/absl/debugging/leak_check_disable.cc +- cmake_target: absl::stacktrace + deps: + - absl/base:config + - absl/base:core_headers + - absl/debugging:debugging_internal + headers: + - third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc + - third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc + - third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h + - third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc + - third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc + - third_party/abseil-cpp/absl/debugging/internal/stacktrace_unimplemented-inl.inc + - third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc + - third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc + - third_party/abseil-cpp/absl/debugging/stacktrace.h + name: absl/debugging:stacktrace + src: + - third_party/abseil-cpp/absl/debugging/stacktrace.cc +- cmake_target: absl::symbolize + deps: + - absl/base:base + - absl/base:config + - absl/base:core_headers + - absl/base:dynamic_annotations + - absl/base:malloc_internal + - absl/base:raw_logging_internal + - absl/debugging:debugging_internal + - absl/debugging:demangle_internal + headers: + - third_party/abseil-cpp/absl/debugging/internal/symbolize.h + - third_party/abseil-cpp/absl/debugging/symbolize.h + - third_party/abseil-cpp/absl/debugging/symbolize_elf.inc + - third_party/abseil-cpp/absl/debugging/symbolize_unimplemented.inc + - third_party/abseil-cpp/absl/debugging/symbolize_win32.inc + name: absl/debugging:symbolize + src: + - third_party/abseil-cpp/absl/debugging/symbolize.cc +- cmake_target: absl::flags_config + deps: + - absl/base:config + - absl/base:core_headers + - absl/flags:path_util + - absl/flags:program_name + - absl/strings:strings + - absl/synchronization:synchronization + headers: + - third_party/abseil-cpp/absl/flags/config.h + - third_party/abseil-cpp/absl/flags/usage_config.h + name: absl/flags:config + src: + - third_party/abseil-cpp/absl/flags/usage_config.cc +- cmake_target: absl::flags + deps: + - absl/base:base + - absl/base:config + - absl/base:core_headers + - absl/flags:config + - absl/flags:flag_internal + - absl/flags:handle + - absl/flags:marshalling + - absl/flags:registry + - absl/strings:strings + headers: + - third_party/abseil-cpp/absl/flags/declare.h + - third_party/abseil-cpp/absl/flags/flag.h + name: absl/flags:flag + src: + - third_party/abseil-cpp/absl/flags/flag.cc +- cmake_target: absl::flags_internal + deps: + - absl/base:base + - absl/base:config + - absl/base:core_headers + - absl/flags:config + - absl/flags:handle + - absl/flags:registry + - absl/memory:memory + - absl/strings:strings + - absl/synchronization:synchronization + headers: + - third_party/abseil-cpp/absl/flags/internal/flag.h + name: absl/flags:flag_internal + src: + - third_party/abseil-cpp/absl/flags/internal/flag.cc +- cmake_target: absl::flags_handle + deps: + - absl/base:config + - absl/base:core_headers + - absl/flags:config + - absl/flags:marshalling + - absl/strings:strings + - absl/types:optional + headers: + - third_party/abseil-cpp/absl/flags/internal/commandlineflag.h + name: absl/flags:handle + src: [] +- cmake_target: absl::flags_marshalling + deps: + - absl/base:config + - absl/base:core_headers + - absl/base:log_severity + - absl/strings:str_format + - absl/strings:strings + headers: + - third_party/abseil-cpp/absl/flags/marshalling.h + name: absl/flags:marshalling + src: + - third_party/abseil-cpp/absl/flags/marshalling.cc +- cmake_target: absl::flags_parse + deps: + - absl/base:config + - absl/base:core_headers + - absl/flags:config + - absl/flags:flag + - absl/flags:flag_internal + - absl/flags:handle + - absl/flags:program_name + - absl/flags:registry + - absl/flags:usage + - absl/flags:usage_internal + - absl/strings:strings + - absl/synchronization:synchronization + headers: + - third_party/abseil-cpp/absl/flags/internal/parse.h + - third_party/abseil-cpp/absl/flags/parse.h + name: absl/flags:parse + src: + - third_party/abseil-cpp/absl/flags/parse.cc +- cmake_target: absl::flags_path_util + deps: + - absl/base:config + - absl/strings:strings + headers: + - third_party/abseil-cpp/absl/flags/internal/path_util.h + name: absl/flags:path_util + src: [] +- cmake_target: absl::flags_program_name + deps: + - absl/base:config + - absl/base:core_headers + - absl/flags:path_util + - absl/strings:strings + - absl/synchronization:synchronization + headers: + - third_party/abseil-cpp/absl/flags/internal/program_name.h + name: absl/flags:program_name + src: + - third_party/abseil-cpp/absl/flags/internal/program_name.cc +- cmake_target: absl::flags_registry + deps: + - absl/base:config + - absl/base:core_headers + - absl/base:raw_logging_internal + - absl/flags:config + - absl/flags:handle + - absl/strings:strings + - absl/synchronization:synchronization + headers: + - third_party/abseil-cpp/absl/flags/internal/registry.h + - third_party/abseil-cpp/absl/flags/internal/type_erased.h + name: absl/flags:registry + src: + - third_party/abseil-cpp/absl/flags/internal/registry.cc + - third_party/abseil-cpp/absl/flags/internal/type_erased.cc +- cmake_target: absl::flags_usage + deps: + - absl/base:config + - absl/base:core_headers + - absl/flags:usage_internal + - absl/strings:strings + - absl/synchronization:synchronization + headers: + - third_party/abseil-cpp/absl/flags/usage.h + name: absl/flags:usage + src: + - third_party/abseil-cpp/absl/flags/usage.cc +- cmake_target: absl::flags_usage_internal + deps: + - absl/base:config + - absl/base:core_headers + - absl/flags:config + - absl/flags:flag + - absl/flags:flag_internal + - absl/flags:handle + - absl/flags:path_util + - absl/flags:program_name + - absl/flags:registry + - absl/strings:strings + headers: + - third_party/abseil-cpp/absl/flags/internal/usage.h + name: absl/flags:usage_internal + src: + - third_party/abseil-cpp/absl/flags/internal/usage.cc +- cmake_target: absl::bind_front + deps: + - absl/base:base_internal + - absl/container:compressed_tuple + - absl/meta:type_traits + - absl/utility:utility + headers: + - third_party/abseil-cpp/absl/functional/bind_front.h + - third_party/abseil-cpp/absl/functional/internal/front_binder.h + name: absl/functional:bind_front + src: [] +- cmake_target: absl::function_ref + deps: + - absl/base:base_internal + - absl/meta:type_traits + headers: + - third_party/abseil-cpp/absl/functional/function_ref.h + - third_party/abseil-cpp/absl/functional/internal/function_ref.h + name: absl/functional:function_ref + src: [] +- cmake_target: absl::city + deps: + - absl/base:config + - absl/base:core_headers + - absl/base:endian + headers: + - third_party/abseil-cpp/absl/hash/internal/city.h + name: absl/hash:city + src: + - third_party/abseil-cpp/absl/hash/internal/city.cc +- cmake_target: absl::hash + deps: + - absl/base:core_headers + - absl/base:endian + - absl/container:fixed_array + - absl/hash:city + - absl/meta:type_traits + - absl/numeric:int128 + - absl/strings:strings + - absl/types:optional + - absl/types:variant + - absl/utility:utility + headers: + - third_party/abseil-cpp/absl/hash/hash.h + - third_party/abseil-cpp/absl/hash/internal/hash.h + name: absl/hash:hash + src: + - third_party/abseil-cpp/absl/hash/internal/hash.cc +- cmake_target: absl::memory + deps: + - absl/base:core_headers + - absl/meta:type_traits + headers: + - third_party/abseil-cpp/absl/memory/memory.h + name: absl/memory:memory + src: [] +- cmake_target: absl::type_traits + deps: + - absl/base:config + headers: + - third_party/abseil-cpp/absl/meta/type_traits.h + name: absl/meta:type_traits + src: [] +- cmake_target: absl::int128 + deps: + - absl/base:config + - absl/base:core_headers + headers: + - third_party/abseil-cpp/absl/numeric/int128.h + - third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc + - third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc + name: absl/numeric:int128 + src: + - third_party/abseil-cpp/absl/numeric/int128.cc +- cmake_target: absl::random_internal_distribution_caller + deps: + - absl/base:config + headers: + - third_party/abseil-cpp/absl/random/internal/distribution_caller.h + name: absl/random/internal:distribution_caller + src: [] +- cmake_target: absl::random_internal_distributions + deps: + - absl/base:base + - absl/meta:type_traits + - absl/random/internal:distribution_caller + - absl/random/internal:traits + - absl/random/internal:uniform_helper + - absl/strings:strings + headers: + - third_party/abseil-cpp/absl/random/internal/distributions.h + name: absl/random/internal:distributions + src: [] +- cmake_target: absl::random_internal_fast_uniform_bits + deps: + - absl/base:config + headers: + - third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h + name: absl/random/internal:fast_uniform_bits + src: [] +- cmake_target: absl::random_internal_fastmath + deps: + - absl/base:bits + headers: + - third_party/abseil-cpp/absl/random/internal/fastmath.h + name: absl/random/internal:fastmath + src: [] +- cmake_target: absl::random_internal_generate_real + deps: + - absl/base:bits + - absl/meta:type_traits + - absl/random/internal:fastmath + - absl/random/internal:traits + headers: + - third_party/abseil-cpp/absl/random/internal/generate_real.h + name: absl/random/internal:generate_real + src: [] +- cmake_target: absl::random_internal_iostream_state_saver + deps: + - absl/meta:type_traits + - absl/numeric:int128 + headers: + - third_party/abseil-cpp/absl/random/internal/iostream_state_saver.h + name: absl/random/internal:iostream_state_saver + src: [] +- cmake_target: absl::random_internal_mocking_bit_gen_base + deps: + - absl/random:random + - absl/strings:strings + headers: + - third_party/abseil-cpp/absl/random/internal/mocking_bit_gen_base.h + name: absl/random/internal:mocking_bit_gen_base + src: [] +- cmake_target: '' + deps: + - absl/base:core_headers + - absl/base:raw_logging_internal + - absl/random/internal:platform + - absl/random/internal:randen_engine + headers: + - third_party/abseil-cpp/absl/random/internal/nanobenchmark.h + name: absl/random/internal:nanobenchmark + src: + - third_party/abseil-cpp/absl/random/internal/nanobenchmark.cc +- cmake_target: absl::random_internal_nonsecure_base + deps: + - absl/base:core_headers + - absl/meta:type_traits + - absl/random/internal:pool_urbg + - absl/random/internal:salted_seed_seq + - absl/random/internal:seed_material + - absl/strings:strings + - absl/types:optional + - absl/types:span + headers: + - third_party/abseil-cpp/absl/random/internal/nonsecure_base.h + name: absl/random/internal:nonsecure_base + src: [] +- cmake_target: absl::random_internal_pcg_engine + deps: + - absl/base:config + - absl/meta:type_traits + - absl/numeric:int128 + - absl/random/internal:fastmath + - absl/random/internal:iostream_state_saver + headers: + - third_party/abseil-cpp/absl/random/internal/pcg_engine.h + name: absl/random/internal:pcg_engine + src: [] +- cmake_target: absl::random_internal_platform + deps: + - absl/base:config + headers: + - third_party/abseil-cpp/absl/random/internal/platform.h + - third_party/abseil-cpp/absl/random/internal/randen-keys.inc + - third_party/abseil-cpp/absl/random/internal/randen_traits.h + name: absl/random/internal:platform + src: [] +- cmake_target: absl::random_internal_pool_urbg + deps: + - absl/base:base + - absl/base:config + - absl/base:core_headers + - absl/base:endian + - absl/base:raw_logging_internal + - absl/random/internal:randen + - absl/random/internal:seed_material + - absl/random/internal:traits + - absl/random:seed_gen_exception + - absl/types:span + headers: + - third_party/abseil-cpp/absl/random/internal/pool_urbg.h + name: absl/random/internal:pool_urbg + src: + - third_party/abseil-cpp/absl/random/internal/pool_urbg.cc +- cmake_target: absl::random_internal_randen + deps: + - absl/base:raw_logging_internal + - absl/random/internal:platform + - absl/random/internal:randen_hwaes + - absl/random/internal:randen_slow + headers: + - third_party/abseil-cpp/absl/random/internal/randen.h + name: absl/random/internal:randen + src: + - third_party/abseil-cpp/absl/random/internal/randen.cc +- cmake_target: absl::random_internal_randen_engine + deps: + - absl/meta:type_traits + - absl/random/internal:iostream_state_saver + - absl/random/internal:randen + headers: + - third_party/abseil-cpp/absl/random/internal/randen_engine.h + name: absl/random/internal:randen_engine + src: [] +- cmake_target: absl::random_internal_randen_hwaes + deps: + - absl/base:config + - absl/random/internal:platform + - absl/random/internal:randen_hwaes_impl + headers: + - third_party/abseil-cpp/absl/random/internal/randen_detect.h + - third_party/abseil-cpp/absl/random/internal/randen_hwaes.h + name: absl/random/internal:randen_hwaes + src: + - third_party/abseil-cpp/absl/random/internal/randen_detect.cc +- cmake_target: absl::random_internal_randen_hwaes_impl + deps: + - absl/base:config + - absl/base:core_headers + - absl/random/internal:platform + headers: + - third_party/abseil-cpp/absl/random/internal/randen_hwaes.h + name: absl/random/internal:randen_hwaes_impl + src: + - third_party/abseil-cpp/absl/random/internal/randen_hwaes.cc +- cmake_target: absl::random_internal_randen_slow + deps: + - absl/base:config + - absl/base:core_headers + - absl/random/internal:platform + headers: + - third_party/abseil-cpp/absl/random/internal/randen_slow.h + name: absl/random/internal:randen_slow + src: + - third_party/abseil-cpp/absl/random/internal/randen_slow.cc +- cmake_target: absl::random_internal_salted_seed_seq + deps: + - absl/container:inlined_vector + - absl/meta:type_traits + - absl/random/internal:seed_material + - absl/types:optional + - absl/types:span + headers: + - third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h + name: absl/random/internal:salted_seed_seq + src: [] +- cmake_target: absl::random_internal_seed_material + deps: + - absl/base:core_headers + - absl/base:raw_logging_internal + - absl/random/internal:fast_uniform_bits + - absl/strings:strings + - absl/types:optional + - absl/types:span + headers: + - third_party/abseil-cpp/absl/random/internal/seed_material.h + name: absl/random/internal:seed_material + src: + - third_party/abseil-cpp/absl/random/internal/seed_material.cc +- cmake_target: absl::random_internal_traits + deps: + - absl/base:config + headers: + - third_party/abseil-cpp/absl/random/internal/traits.h + name: absl/random/internal:traits + src: [] +- cmake_target: absl::random_internal_uniform_helper + deps: + - absl/meta:type_traits + headers: + - third_party/abseil-cpp/absl/random/internal/uniform_helper.h + name: absl/random/internal:uniform_helper + src: [] +- cmake_target: absl::random_internal_wide_multiply + deps: + - absl/base:bits + - absl/base:config + - absl/numeric:int128 + - absl/random/internal:traits + headers: + - third_party/abseil-cpp/absl/random/internal/wide_multiply.h + name: absl/random/internal:wide_multiply + src: [] +- cmake_target: absl::random_bit_gen_ref + deps: + - absl/base:core_headers + - absl/meta:type_traits + - absl/random/internal:distribution_caller + - absl/random/internal:fast_uniform_bits + - absl/random/internal:mocking_bit_gen_base + headers: + - third_party/abseil-cpp/absl/random/bit_gen_ref.h + name: absl/random:bit_gen_ref + src: [] +- cmake_target: absl::random_distributions + deps: + - absl/base:base_internal + - absl/base:config + - absl/base:core_headers + - absl/meta:type_traits + - absl/random/internal:distributions + - absl/random/internal:fast_uniform_bits + - absl/random/internal:fastmath + - absl/random/internal:generate_real + - absl/random/internal:iostream_state_saver + - absl/random/internal:traits + - absl/random/internal:uniform_helper + - absl/random/internal:wide_multiply + - absl/strings:strings + - absl/types:span + headers: + - third_party/abseil-cpp/absl/random/bernoulli_distribution.h + - third_party/abseil-cpp/absl/random/beta_distribution.h + - third_party/abseil-cpp/absl/random/discrete_distribution.h + - third_party/abseil-cpp/absl/random/distribution_format_traits.h + - third_party/abseil-cpp/absl/random/distributions.h + - third_party/abseil-cpp/absl/random/exponential_distribution.h + - third_party/abseil-cpp/absl/random/gaussian_distribution.h + - third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h + - third_party/abseil-cpp/absl/random/poisson_distribution.h + - third_party/abseil-cpp/absl/random/uniform_int_distribution.h + - third_party/abseil-cpp/absl/random/uniform_real_distribution.h + - third_party/abseil-cpp/absl/random/zipf_distribution.h + name: absl/random:distributions + src: + - third_party/abseil-cpp/absl/random/discrete_distribution.cc + - third_party/abseil-cpp/absl/random/gaussian_distribution.cc +- cmake_target: absl::random_random + deps: + - absl/random/internal:nonsecure_base + - absl/random/internal:pcg_engine + - absl/random/internal:pool_urbg + - absl/random/internal:randen_engine + - absl/random:distributions + - absl/random:seed_sequences + headers: + - third_party/abseil-cpp/absl/random/random.h + name: absl/random:random + src: [] +- cmake_target: absl::random_seed_gen_exception + deps: + - absl/base:config + headers: + - third_party/abseil-cpp/absl/random/seed_gen_exception.h + name: absl/random:seed_gen_exception + src: + - third_party/abseil-cpp/absl/random/seed_gen_exception.cc +- cmake_target: absl::random_seed_sequences + deps: + - absl/container:inlined_vector + - absl/random/internal:nonsecure_base + - absl/random/internal:pool_urbg + - absl/random/internal:salted_seed_seq + - absl/random/internal:seed_material + - absl/random:seed_gen_exception + - absl/types:span + headers: + - third_party/abseil-cpp/absl/random/seed_sequences.h + name: absl/random:seed_sequences + src: + - third_party/abseil-cpp/absl/random/seed_sequences.cc +- cmake_target: absl::status + deps: + - absl/base:config + - absl/base:core_headers + - absl/base:raw_logging_internal + - absl/container:inlined_vector + - absl/debugging:stacktrace + - absl/debugging:symbolize + - absl/strings:cord + - absl/strings:str_format + - absl/strings:strings + - absl/types:optional + headers: + - third_party/abseil-cpp/absl/status/status.h + - third_party/abseil-cpp/absl/status/status_payload_printer.h + name: absl/status:status + src: + - third_party/abseil-cpp/absl/status/status.cc + - third_party/abseil-cpp/absl/status/status_payload_printer.cc +- cmake_target: absl::cord + deps: + - absl/base:base + - absl/base:base_internal + - absl/base:core_headers + - absl/base:endian + - absl/base:raw_logging_internal + - absl/container:fixed_array + - absl/container:inlined_vector + - absl/functional:function_ref + - absl/meta:type_traits + - absl/strings:cord_internal + - absl/strings:internal + - absl/strings:str_format + - absl/strings:strings + headers: + - third_party/abseil-cpp/absl/strings/cord.h + name: absl/strings:cord + src: + - third_party/abseil-cpp/absl/strings/cord.cc +- cmake_target: absl::cord + deps: + - absl/meta:type_traits + - absl/strings:strings + headers: + - third_party/abseil-cpp/absl/strings/internal/cord_internal.h + name: absl/strings:cord_internal + src: [] +- cmake_target: absl::strings_internal + deps: + - absl/base:config + - absl/base:core_headers + - absl/base:endian + - absl/base:raw_logging_internal + - absl/meta:type_traits + headers: + - third_party/abseil-cpp/absl/strings/internal/char_map.h + - third_party/abseil-cpp/absl/strings/internal/escaping.h + - third_party/abseil-cpp/absl/strings/internal/ostringstream.h + - third_party/abseil-cpp/absl/strings/internal/resize_uninitialized.h + - third_party/abseil-cpp/absl/strings/internal/utf8.h + name: absl/strings:internal + src: + - third_party/abseil-cpp/absl/strings/internal/escaping.cc + - third_party/abseil-cpp/absl/strings/internal/ostringstream.cc + - third_party/abseil-cpp/absl/strings/internal/utf8.cc +- cmake_target: absl::str_format + deps: + - absl/strings:str_format_internal + headers: + - third_party/abseil-cpp/absl/strings/str_format.h + name: absl/strings:str_format + src: [] +- cmake_target: absl::str_format_internal + deps: + - absl/base:config + - absl/base:core_headers + - absl/meta:type_traits + - absl/numeric:int128 + - absl/strings:strings + - absl/types:span + headers: + - third_party/abseil-cpp/absl/strings/internal/str_format/arg.h + - third_party/abseil-cpp/absl/strings/internal/str_format/bind.h + - third_party/abseil-cpp/absl/strings/internal/str_format/checker.h + - third_party/abseil-cpp/absl/strings/internal/str_format/extension.h + - third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.h + - third_party/abseil-cpp/absl/strings/internal/str_format/output.h + - third_party/abseil-cpp/absl/strings/internal/str_format/parser.h + name: absl/strings:str_format_internal + src: + - third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc + - third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc + - third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc + - third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc + - third_party/abseil-cpp/absl/strings/internal/str_format/output.cc + - third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +- cmake_target: absl::strings + deps: + - absl/base:base + - absl/base:bits + - absl/base:config + - absl/base:core_headers + - absl/base:endian + - absl/base:raw_logging_internal + - absl/base:throw_delegate + - absl/memory:memory + - absl/meta:type_traits + - absl/numeric:int128 + - absl/strings:internal + headers: + - third_party/abseil-cpp/absl/strings/ascii.h + - third_party/abseil-cpp/absl/strings/charconv.h + - third_party/abseil-cpp/absl/strings/escaping.h + - third_party/abseil-cpp/absl/strings/internal/charconv_bigint.h + - third_party/abseil-cpp/absl/strings/internal/charconv_parse.h + - third_party/abseil-cpp/absl/strings/internal/memutil.h + - third_party/abseil-cpp/absl/strings/internal/stl_type_traits.h + - third_party/abseil-cpp/absl/strings/internal/str_join_internal.h + - third_party/abseil-cpp/absl/strings/internal/str_split_internal.h + - third_party/abseil-cpp/absl/strings/match.h + - third_party/abseil-cpp/absl/strings/numbers.h + - third_party/abseil-cpp/absl/strings/str_cat.h + - third_party/abseil-cpp/absl/strings/str_join.h + - third_party/abseil-cpp/absl/strings/str_replace.h + - third_party/abseil-cpp/absl/strings/str_split.h + - third_party/abseil-cpp/absl/strings/string_view.h + - third_party/abseil-cpp/absl/strings/strip.h + - third_party/abseil-cpp/absl/strings/substitute.h + name: absl/strings:strings + src: + - third_party/abseil-cpp/absl/strings/ascii.cc + - third_party/abseil-cpp/absl/strings/charconv.cc + - third_party/abseil-cpp/absl/strings/escaping.cc + - third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc + - third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc + - third_party/abseil-cpp/absl/strings/internal/memutil.cc + - third_party/abseil-cpp/absl/strings/match.cc + - third_party/abseil-cpp/absl/strings/numbers.cc + - third_party/abseil-cpp/absl/strings/str_cat.cc + - third_party/abseil-cpp/absl/strings/str_replace.cc + - third_party/abseil-cpp/absl/strings/str_split.cc + - third_party/abseil-cpp/absl/strings/string_view.cc + - third_party/abseil-cpp/absl/strings/substitute.cc +- cmake_target: absl::graphcycles_internal + deps: + - absl/base:base + - absl/base:base_internal + - absl/base:config + - absl/base:core_headers + - absl/base:malloc_internal + - absl/base:raw_logging_internal + headers: + - third_party/abseil-cpp/absl/synchronization/internal/graphcycles.h + name: absl/synchronization:graphcycles_internal + src: + - third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +- cmake_target: absl::kernel_timeout_internal + deps: + - absl/base:core_headers + - absl/base:raw_logging_internal + - absl/time:time + headers: + - third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h + name: absl/synchronization:kernel_timeout_internal + src: [] +- cmake_target: absl::synchronization + deps: + - absl/base:atomic_hook + - absl/base:base + - absl/base:base_internal + - absl/base:config + - absl/base:core_headers + - absl/base:dynamic_annotations + - absl/base:malloc_internal + - absl/base:raw_logging_internal + - absl/debugging:stacktrace + - absl/debugging:symbolize + - absl/synchronization:graphcycles_internal + - absl/synchronization:kernel_timeout_internal + - absl/time:time + headers: + - third_party/abseil-cpp/absl/synchronization/barrier.h + - third_party/abseil-cpp/absl/synchronization/blocking_counter.h + - third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.h + - third_party/abseil-cpp/absl/synchronization/internal/mutex_nonprod.inc + - third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h + - third_party/abseil-cpp/absl/synchronization/internal/waiter.h + - third_party/abseil-cpp/absl/synchronization/mutex.h + - third_party/abseil-cpp/absl/synchronization/notification.h + name: absl/synchronization:synchronization + src: + - third_party/abseil-cpp/absl/synchronization/barrier.cc + - third_party/abseil-cpp/absl/synchronization/blocking_counter.cc + - third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc + - third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc + - third_party/abseil-cpp/absl/synchronization/internal/waiter.cc + - third_party/abseil-cpp/absl/synchronization/mutex.cc + - third_party/abseil-cpp/absl/synchronization/notification.cc +- cmake_target: absl::civil_time + deps: + - absl/base:config + headers: + - third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time.h + - third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h + name: absl/time/internal/cctz:civil_time + src: + - third_party/abseil-cpp/absl/time/internal/cctz/src/civil_time_detail.cc +- cmake_target: absl::time_zone + deps: + - absl/base:config + - absl/time/internal/cctz:civil_time + headers: + - third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h + - third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/zone_info_source.h + - third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.h + - third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h + - third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.h + - third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.h + - third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.h + - third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.h + - third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h + name: absl/time/internal/cctz:time_zone + src: + - third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc + - third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc + - third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.cc + - third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc + - third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc + - third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc + - third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc + - third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.cc + - third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +- cmake_target: absl::time + deps: + - absl/base:base + - absl/base:core_headers + - absl/base:raw_logging_internal + - absl/numeric:int128 + - absl/strings:strings + - absl/time/internal/cctz:civil_time + - absl/time/internal/cctz:time_zone + headers: + - third_party/abseil-cpp/absl/time/civil_time.h + - third_party/abseil-cpp/absl/time/clock.h + - third_party/abseil-cpp/absl/time/internal/get_current_time_chrono.inc + - third_party/abseil-cpp/absl/time/internal/get_current_time_posix.inc + - third_party/abseil-cpp/absl/time/time.h + name: absl/time:time + src: + - third_party/abseil-cpp/absl/time/civil_time.cc + - third_party/abseil-cpp/absl/time/clock.cc + - third_party/abseil-cpp/absl/time/duration.cc + - third_party/abseil-cpp/absl/time/format.cc + - third_party/abseil-cpp/absl/time/time.cc +- cmake_target: absl::any + deps: + - absl/base:config + - absl/base:core_headers + - absl/meta:type_traits + - absl/types:bad_any_cast + - absl/utility:utility + headers: + - third_party/abseil-cpp/absl/types/any.h + name: absl/types:any + src: [] +- cmake_target: absl::bad_any_cast + deps: + - absl/base:config + - absl/types:bad_any_cast_impl + headers: + - third_party/abseil-cpp/absl/types/bad_any_cast.h + name: absl/types:bad_any_cast + src: [] +- cmake_target: absl::bad_any_cast_impl + deps: + - absl/base:config + - absl/base:raw_logging_internal + headers: + - third_party/abseil-cpp/absl/types/bad_any_cast.h + name: absl/types:bad_any_cast_impl + src: + - third_party/abseil-cpp/absl/types/bad_any_cast.cc +- cmake_target: absl::bad_optional_access + deps: + - absl/base:config + - absl/base:raw_logging_internal + headers: + - third_party/abseil-cpp/absl/types/bad_optional_access.h + name: absl/types:bad_optional_access + src: + - third_party/abseil-cpp/absl/types/bad_optional_access.cc +- cmake_target: absl::bad_variant_access + deps: + - absl/base:config + - absl/base:raw_logging_internal + headers: + - third_party/abseil-cpp/absl/types/bad_variant_access.h + name: absl/types:bad_variant_access + src: + - third_party/abseil-cpp/absl/types/bad_variant_access.cc +- cmake_target: absl::compare + deps: + - absl/base:core_headers + - absl/meta:type_traits + headers: + - third_party/abseil-cpp/absl/types/compare.h + name: absl/types:compare + src: [] +- cmake_target: absl::optional + deps: + - absl/base:base_internal + - absl/base:config + - absl/base:core_headers + - absl/memory:memory + - absl/meta:type_traits + - absl/types:bad_optional_access + - absl/utility:utility + headers: + - third_party/abseil-cpp/absl/types/internal/optional.h + - third_party/abseil-cpp/absl/types/optional.h + name: absl/types:optional + src: [] +- cmake_target: absl::span + deps: + - absl/algorithm:algorithm + - absl/base:core_headers + - absl/base:throw_delegate + - absl/meta:type_traits + headers: + - third_party/abseil-cpp/absl/types/internal/span.h + - third_party/abseil-cpp/absl/types/span.h + name: absl/types:span + src: [] +- cmake_target: absl::variant + deps: + - absl/base:base_internal + - absl/base:config + - absl/base:core_headers + - absl/meta:type_traits + - absl/types:bad_variant_access + - absl/utility:utility + headers: + - third_party/abseil-cpp/absl/types/internal/variant.h + - third_party/abseil-cpp/absl/types/variant.h + name: absl/types:variant + src: [] +- cmake_target: absl::utility + deps: + - absl/base:base_internal + - absl/base:config + - absl/meta:type_traits + headers: + - third_party/abseil-cpp/absl/utility/utility.h + name: absl/utility:utility + src: [] diff --git a/src/abseil-cpp/preprocessed_builds.yaml.gen.py b/src/abseil-cpp/preprocessed_builds.yaml.gen.py new file mode 100755 index 00000000..82bb15ef --- /dev/null +++ b/src/abseil-cpp/preprocessed_builds.yaml.gen.py @@ -0,0 +1,210 @@ +#!/usr/bin/env python3 + +# Copyright 2019 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import collections +import os +import re +import subprocess +import xml.etree.ElementTree as ET +import yaml + +ABSEIL_PATH = "third_party/abseil-cpp" +OUTPUT_PATH = "src/abseil-cpp/preprocessed_builds.yaml" +CAPITAL_WORD = re.compile("[A-Z]+") +ABSEIL_CMAKE_RULE_BEGIN = re.compile("^absl_cc_.*\(", re.MULTILINE) +ABSEIL_CMAKE_RULE_END = re.compile("^\)", re.MULTILINE) + +# Rule object representing the rule of Bazel BUILD. +Rule = collections.namedtuple( + "Rule", "type name package srcs hdrs textual_hdrs deps visibility testonly") + + +def get_elem_value(elem, name): + """Returns the value of XML element with the given name.""" + for child in elem: + if child.attrib.get("name") == name: + if child.tag == "string": + return child.attrib.get("value") + elif child.tag == "boolean": + return child.attrib.get("value") == "true" + elif child.tag == "list": + return [nested_child.attrib.get("value") for nested_child in child] + else: + raise "Cannot recognize tag: " + child.tag + return None + + +def normalize_paths(paths): + """Returns the list of normalized path.""" + # e.g. ["//absl/strings:dir/header.h"] -> ["absl/strings/dir/header.h"] + return [path.lstrip("/").replace(":", "/") for path in paths] + + +def parse_bazel_rule(elem, package): + """Returns a rule from bazel XML rule.""" + return Rule( + type=elem.attrib["class"], + name=get_elem_value(elem, "name"), + package=package, + srcs=normalize_paths(get_elem_value(elem, "srcs") or []), + hdrs=normalize_paths(get_elem_value(elem, "hdrs") or []), + textual_hdrs=normalize_paths(get_elem_value(elem, "textual_hdrs") or []), + deps=get_elem_value(elem, "deps") or [], + visibility=get_elem_value(elem, "visibility") or [], + testonly=get_elem_value(elem, "testonly") or False) + + +def read_bazel_build(package): + """Runs bazel query on given package file and returns all cc rules.""" + result = subprocess.check_output( + ["bazel", "query", package + ":all", "--output", "xml"]) + root = ET.fromstring(result) + return [ + parse_bazel_rule(elem, package) + for elem in root + if elem.tag == "rule" and elem.attrib["class"].startswith("cc_") + ] + + +def collect_bazel_rules(root_path): + """Collects and returns all bazel rules from root path recursively.""" + rules = [] + for cur, _, _ in os.walk(root_path): + build_path = os.path.join(cur, "BUILD.bazel") + if os.path.exists(build_path): + rules.extend(read_bazel_build("//" + cur)) + return rules + + +def parse_cmake_rule(rule, package): + """Returns a rule from absl cmake rule. + Reference: https://github.com/abseil/abseil-cpp/blob/master/CMake/AbseilHelpers.cmake + """ + kv = {} + bucket = None + lines = rule.splitlines() + for line in lines[1:-1]: + if CAPITAL_WORD.match(line.strip()): + bucket = kv.setdefault(line.strip(), []) + else: + if bucket is not None: + bucket.append(line.strip()) + else: + raise ValueError("Illegal syntax: {}".format(rule)) + return Rule( + type=lines[0].rstrip("("), + name="absl::" + kv["NAME"][0], + package=package, + srcs=[package + "/" + f.strip('"') for f in kv.get("SRCS", [])], + hdrs=[package + "/" + f.strip('"') for f in kv.get("HDRS", [])], + textual_hdrs=[], + deps=kv.get("DEPS", []), + visibility="PUBLIC" in kv, + testonly="TESTONLY" in kv, + ) + + +def read_cmake_build(build_path, package): + """Parses given CMakeLists.txt file and returns all cc rules.""" + rules = [] + with open(build_path, "r") as f: + src = f.read() + for begin_mo in ABSEIL_CMAKE_RULE_BEGIN.finditer(src): + end_mo = ABSEIL_CMAKE_RULE_END.search(src[begin_mo.start(0):]) + expr = src[begin_mo.start(0):begin_mo.start(0) + end_mo.start(0) + 1] + rules.append(parse_cmake_rule(expr, package)) + return rules + + +def collect_cmake_rules(root_path): + """Collects and returns all cmake rules from root path recursively.""" + rules = [] + for cur, _, _ in os.walk(root_path): + build_path = os.path.join(cur, "CMakeLists.txt") + if os.path.exists(build_path): + rules.extend(read_cmake_build(build_path, cur)) + return rules + + +def pairing_bazel_and_cmake_rules(bazel_rules, cmake_rules): + """Returns a pair map between bazel rules and cmake rules based on + the similarity of the file list in the rule. This is because + cmake build and bazel build of abseil are not identical. + """ + pair_map = {} + for rule in bazel_rules: + best_crule, best_similarity = None, 0 + for crule in cmake_rules: + similarity = len( + set(rule.srcs + rule.hdrs + rule.textual_hdrs).intersection( + set(crule.srcs + crule.hdrs + crule.textual_hdrs))) + if similarity > best_similarity: + best_crule, best_similarity = crule, similarity + if best_crule: + pair_map[(rule.package, rule.name)] = best_crule.name + return pair_map + + +def resolve_hdrs(files): + return [ABSEIL_PATH + "/" + f for f in files if f.endswith((".h", ".inc"))] + + +def resolve_srcs(files): + return [ABSEIL_PATH + "/" + f for f in files if f.endswith(".cc")] + + +def resolve_deps(targets): + return [(t[2:] if t.startswith("//") else t) for t in targets] + + +def generate_builds(root_path): + """Generates builds from all BUILD files under absl directory.""" + bazel_rules = list( + filter(lambda r: r.type == "cc_library" and not r.testonly, + collect_bazel_rules(root_path))) + cmake_rules = list( + filter(lambda r: r.type == "absl_cc_library" and not r.testonly, + collect_cmake_rules(root_path))) + pair_map = pairing_bazel_and_cmake_rules(bazel_rules, cmake_rules) + builds = [] + for rule in sorted(bazel_rules, key=lambda r: r.package[2:] + ":" + r.name): + p = { + "name": + rule.package[2:] + ":" + rule.name, + "cmake_target": + pair_map.get((rule.package, rule.name)) or "", + "headers": + sorted(resolve_hdrs(rule.srcs + rule.hdrs + rule.textual_hdrs)), + "src": + sorted(resolve_srcs(rule.srcs + rule.hdrs + rule.textual_hdrs)), + "deps": + sorted(resolve_deps(rule.deps)), + } + builds.append(p) + return builds + + +def main(): + previous_dir = os.getcwd() + os.chdir(ABSEIL_PATH) + builds = generate_builds("absl") + os.chdir(previous_dir) + with open(OUTPUT_PATH, 'w') as outfile: + outfile.write(yaml.dump(builds, indent=2, sort_keys=True)) + + +if __name__ == "__main__": + main() diff --git a/src/android/test/interop/.gitignore b/src/android/test/interop/.gitignore new file mode 100644 index 00000000..39fb081a --- /dev/null +++ b/src/android/test/interop/.gitignore @@ -0,0 +1,9 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures +.externalNativeBuild diff --git a/src/android/test/interop/README.md b/src/android/test/interop/README.md new file mode 100644 index 00000000..95262307 --- /dev/null +++ b/src/android/test/interop/README.md @@ -0,0 +1,37 @@ +gRPC on Android +============== + +Note: Building the protobuf dependency for Android requires +https://github.com/google/protobuf/pull/3878. This fix will be in the next +protobuf release, but until then must be manually patched in to +`third_party/protobuf` to build gRPC for Android. + +PREREQUISITES +------------- + +- Android SDK +- Android NDK +- `protoc` and `grpc_cpp_plugin` binaries on the host system + +INSTALL +------- + +The example application can be built via Android Studio or on the command line +using `gradle`: + + ```sh + $ ./gradlew installDebug + ``` + +INSTRUMENTATION TESTS +--------------------- + +The instrumentation tests can be run via the following `gradle` command. This +requires an emulator already running on your computer. + +``` +$ ./gradlew connectedAndroidTest \ + -Pandroid.testInstrumentationRunnerArguments.server_host=grpc-test.sandbox.googleapis.com \ + -Pandroid.testInstrumentationRunnerArguments.server_port=443 \ + -Pandroid.testInstrumentationRunnerArguments.use_tls=true +``` diff --git a/src/android/test/interop/app/.gitignore b/src/android/test/interop/app/.gitignore new file mode 100644 index 00000000..796b96d1 --- /dev/null +++ b/src/android/test/interop/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/src/android/test/interop/app/CMakeLists.txt b/src/android/test/interop/app/CMakeLists.txt new file mode 100644 index 00000000..e288dd63 --- /dev/null +++ b/src/android/test/interop/app/CMakeLists.txt @@ -0,0 +1,122 @@ +cmake_minimum_required(VERSION 3.4.1) + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") + +set(PROTOBUF_PROTOC_EXECUTABLE "/usr/local/bin/protoc" CACHE STRING "Protoc binary on host") +set(gRPC_CPP_PLUGIN_EXECUTABLE "/usr/local/bin/grpc_cpp_plugin" CACHE STRING "gRPC CPP plugin binary on host") + +set(GRPC_SRC_DIR ../../../../../) + +set(GRPC_BUILD_DIR ../grpc/outputs/${ANDROID_ABI}) +file(MAKE_DIRECTORY ${GRPC_BUILD_DIR}) + +add_subdirectory(${GRPC_SRC_DIR} ${GRPC_BUILD_DIR}) + +#include_directories(${GRPC_SRC_DIR}/include) +include_directories(${GRPC_SRC_DIR}) +include_directories(${_gRPC_ABSL_INCLUDE_DIR}) + +set(GRPC_PROTO_GENS_DIR ${CMAKE_BINARY_DIR}/gens) +file(MAKE_DIRECTORY ${GRPC_PROTO_GENS_DIR}) +include_directories(${GRPC_PROTO_GENS_DIR}) + +function(android_protobuf_grpc_generate_cpp SRC_FILES HDR_FILES INCLUDE_ROOT) + if(NOT ARGN) + message(SEND_ERROR "Error: android_protobuf_grpc_generate_cpp() called without any proto files") + return() + endif() + + set(${SRC_FILES}) + set(${HDR_FILES}) + set(PROTOBUF_INCLUDE_PATH -I ${INCLUDE_ROOT}) + foreach(FIL ${ARGN}) + get_filename_component(ABS_FIL ${FIL} ABSOLUTE) + get_filename_component(FIL_WE ${FIL} NAME_WE) + file(RELATIVE_PATH REL_FIL ${CMAKE_CURRENT_SOURCE_DIR}/${INCLUDE_ROOT} ${ABS_FIL}) + get_filename_component(REL_DIR ${REL_FIL} DIRECTORY) + set(RELFIL_WE "${REL_DIR}/${FIL_WE}") + + list(APPEND ${SRC_FILES} "${GRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.cc") + list(APPEND ${HDR_FILES} "${GRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.h") + list(APPEND ${SRC_FILES} "${GRPC_PROTO_GENS_DIR}/${RELFIL_WE}.grpc.pb.cc") + list(APPEND ${HDR_FILES} "${GRPC_PROTO_GENS_DIR}/${RELFIL_WE}.grpc.pb.h") + + add_custom_command( + OUTPUT "${GRPC_PROTO_GENS_DIR}/${RELFIL_WE}.grpc.pb.cc" + "${GRPC_PROTO_GENS_DIR}/${RELFIL_WE}.grpc.pb.h" + "${GRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.cc" + "${GRPC_PROTO_GENS_DIR}/${RELFIL_WE}.pb.h" + COMMAND ${PROTOBUF_PROTOC_EXECUTABLE} + ARGS --grpc_out=${GRPC_PROTO_GENS_DIR} + --cpp_out=${GRPC_PROTO_GENS_DIR} + --plugin=protoc-gen-grpc=${gRPC_CPP_PLUGIN_EXECUTABLE} + ${PROTOBUF_INCLUDE_PATH} + ${REL_FIL} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + DEPENDS ${PROTOBUF_PROTOC_EXECUTABLE} ${gRPC_CPP_PLUGIN_EXECUTABLE} ${ABS_FIL} ) + endforeach() + + set_source_files_properties(${${SRC_FILES}} ${${HDR_FILES}} PROPERTIES GENERATED TRUE) + set(${SRC_FILES} ${${SRC_FILES}} PARENT_SCOPE) + set(${HDR_FILES} ${${HDR_FILES}} PARENT_SCOPE) +endfunction() + +set(PROTO_BASE_DIR ${GRPC_SRC_DIR}/examples/protos) + +android_protobuf_grpc_generate_cpp( + MESSAGES_PROTO_SRCS MESSAGES_PROTO_HDRS + ${GRPC_SRC_DIR} ${GRPC_SRC_DIR}/src/proto/grpc/testing/messages.proto) + +add_library(messages_proto_lib + SHARED ${MESSAGES_PROTO_SRCS} ${MESSAGES_PROTO_HDRS}) + +target_link_libraries(messages_proto_lib + libprotobuf + grpc++ + android + log) + +android_protobuf_grpc_generate_cpp( + EMPTY_PROTO_SRCS EMPTY_PROTO_HDRS + ${GRPC_SRC_DIR} ${GRPC_SRC_DIR}/src/proto/grpc/testing/empty.proto) + +add_library(empty_proto_lib + SHARED ${EMPTY_PROTO_SRCS} ${EMPTY_PROTO_HDRS}) + +target_link_libraries(empty_proto_lib + libprotobuf + grpc++ + android + log) + +android_protobuf_grpc_generate_cpp( + TEST_PROTO_SRCS TEST_PROTO_HDRS ${GRPC_SRC_DIR} ${GRPC_SRC_DIR}/src/proto/grpc/testing/test.proto) + +add_library(test_proto_lib + SHARED ${TEST_PROTO_SRCS} ${TEST_PROTO_HDRS}) + +target_link_libraries(test_proto_lib + libprotobuf + grpc++ + empty_proto_lib + messages_proto_lib + android + log) + +find_library(log-lib + log) + +add_library(grpc-interop + SHARED + src/main/cpp/grpc-interop.cc + ${GRPC_SRC_DIR}/test/cpp/interop/interop_client.h + ${GRPC_SRC_DIR}/test/cpp/interop/interop_client.cc + ${GRPC_SRC_DIR}/test/core/util/histogram.h + ${GRPC_SRC_DIR}/test/core/util/histogram.cc) + +target_link_libraries(grpc-interop + messages_proto_lib + empty_proto_lib + test_proto_lib + android + ${log-lib}) diff --git a/src/android/test/interop/app/build.gradle b/src/android/test/interop/app/build.gradle new file mode 100644 index 00000000..fb500a71 --- /dev/null +++ b/src/android/test/interop/app/build.gradle @@ -0,0 +1,55 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 26 + defaultConfig { + applicationId "io.grpc.android.interop.cpp" + minSdkVersion 14 + targetSdkVersion 26 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + externalNativeBuild { + cmake { + // The paths to the protoc and grpc_cpp_plugin binaries on the host system (codegen + // is not cross-compiled to Android) + def protoc = project.hasProperty('protoc') ? + project.property('protoc') : '/usr/local/bin/protoc' + def grpc_cpp_plugin = project.hasProperty('grpc_cpp_plugin') ? + project.property('grpc_cpp_plugin') : '/usr/local/bin/grpc_cpp_plugin' + + cppFlags "-std=c++14 -frtti -fexceptions" + arguments '-DANDROID_STL=c++_shared' + arguments '-DRUN_HAVE_POSIX_REGEX=0' + arguments '-DRUN_HAVE_STD_REGEX=0' + arguments '-DRUN_HAVE_STEADY_CLOCK=0' + arguments '-Dprotobuf_BUILD_PROTOC_BINARIES=off' + arguments '-DgRPC_BUILD_CODEGEN=off' + arguments '-DPROTOBUF_PROTOC_EXECUTABLE=' + protoc + arguments '-DgRPC_CPP_PLUGIN_EXECUTABLE=' + grpc_cpp_plugin + } + } + } + buildTypes { + debug { + minifyEnabled false + } + release { + minifyEnabled true + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + externalNativeBuild { + cmake { + path "CMakeLists.txt" + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation 'com.android.support:appcompat-v7:26.1.0' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'com.android.support.test:runner:1.0.1' + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' +} diff --git a/src/android/test/interop/app/proguard-rules.pro b/src/android/test/interop/app/proguard-rules.pro new file mode 100644 index 00000000..f1b42451 --- /dev/null +++ b/src/android/test/interop/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/src/android/test/interop/app/src/androidTest/java/io/grpc/interop/cpp/InteropTest.java b/src/android/test/interop/app/src/androidTest/java/io/grpc/interop/cpp/InteropTest.java new file mode 100644 index 00000000..8673354a --- /dev/null +++ b/src/android/test/interop/app/src/androidTest/java/io/grpc/interop/cpp/InteropTest.java @@ -0,0 +1,77 @@ +/* + * Copyright 2018, gRPC Authors All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.grpc.interop.cpp; + +import static junit.framework.Assert.assertTrue; + +import android.content.Context; +import android.support.test.InstrumentationRegistry; +import android.support.test.runner.AndroidJUnit4; +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.io.OutputStream; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(AndroidJUnit4.class) +public class InteropTest { + private String host; + private int port; + private boolean useTls; + + @Before + public void setUp() throws Exception { + host = + InstrumentationRegistry.getArguments() + .getString("server_host", "grpc-test.sandbox.googleapis.com"); + port = Integer.parseInt(InstrumentationRegistry.getArguments().getString("server_port", "443")); + useTls = + Boolean.parseBoolean(InstrumentationRegistry.getArguments().getString("use_tls", "true")); + } + + @Test + public void emptyUnary() { + assertTrue(InteropActivity.doEmpty(host, port, useTls)); + } + + @Test + public void largeUnary() { + assertTrue(InteropActivity.doLargeUnary(host, port, useTls)); + } + + @Test + public void emptyStream() { + assertTrue(InteropActivity.doEmptyStream(host, port, useTls)); + } + + @Test + public void requestStreaming() { + assertTrue(InteropActivity.doRequestStreaming(host, port, useTls)); + } + + @Test + public void responseStreaming() { + assertTrue(InteropActivity.doResponseStreaming(host, port, useTls)); + } + + @Test + public void pingPong() { + assertTrue(InteropActivity.doPingPong(host, port, useTls)); + } +} diff --git a/src/android/test/interop/app/src/main/AndroidManifest.xml b/src/android/test/interop/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..009112aa --- /dev/null +++ b/src/android/test/interop/app/src/main/AndroidManifest.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + diff --git a/src/android/test/interop/app/src/main/cpp/grpc-interop.cc b/src/android/test/interop/app/src/main/cpp/grpc-interop.cc new file mode 100644 index 00000000..f3a74c13 --- /dev/null +++ b/src/android/test/interop/app/src/main/cpp/grpc-interop.cc @@ -0,0 +1,116 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include + +#include "src/core/lib/security/security_connector/ssl_utils_config.h" +#include "test/cpp/interop/interop_client.h" + +std::shared_ptr GetClient(const char* host, + int port, + bool use_tls) { + const int host_port_buf_size = 1024; + char host_port[host_port_buf_size]; + snprintf(host_port, host_port_buf_size, "%s:%d", host, port); + + std::shared_ptr credentials; + if (use_tls) { + credentials = grpc::SslCredentials(grpc::SslCredentialsOptions()); + } else { + credentials = grpc::InsecureChannelCredentials(); + } + + grpc::testing::ChannelCreationFunc channel_creation_func = + std::bind(grpc::CreateChannel, host_port, credentials); + return std::shared_ptr( + new grpc::testing::InteropClient(channel_creation_func, true, false)); +} + +extern "C" JNIEXPORT jboolean JNICALL +Java_io_grpc_interop_cpp_InteropActivity_doEmpty(JNIEnv* env, jobject obj_this, + jstring host_raw, + jint port_raw, + jboolean use_tls_raw) { + const char* host = env->GetStringUTFChars(host_raw, (jboolean*)0); + int port = static_cast(port_raw); + bool use_tls = static_cast(use_tls_raw); + + return GetClient(host, port, use_tls)->DoEmpty(); +} + +extern "C" JNIEXPORT jboolean JNICALL +Java_io_grpc_interop_cpp_InteropActivity_doLargeUnary(JNIEnv* env, + jobject obj_this, + jstring host_raw, + jint port_raw, + jboolean use_tls_raw) { + const char* host = env->GetStringUTFChars(host_raw, (jboolean*)0); + int port = static_cast(port_raw); + bool use_tls = static_cast(use_tls_raw); + + return GetClient(host, port, use_tls)->DoLargeUnary(); +} + +extern "C" JNIEXPORT jboolean JNICALL +Java_io_grpc_interop_cpp_InteropActivity_doEmptyStream(JNIEnv* env, + jobject obj_this, + jstring host_raw, + jint port_raw, + jboolean use_tls_raw) { + const char* host = env->GetStringUTFChars(host_raw, (jboolean*)0); + int port = static_cast(port_raw); + bool use_tls = static_cast(use_tls_raw); + + return GetClient(host, port, use_tls)->DoEmptyStream(); +} + +extern "C" JNIEXPORT jboolean JNICALL +Java_io_grpc_interop_cpp_InteropActivity_doRequestStreaming( + JNIEnv* env, jobject obj_this, jstring host_raw, jint port_raw, + jboolean use_tls_raw) { + const char* host = env->GetStringUTFChars(host_raw, (jboolean*)0); + int port = static_cast(port_raw); + bool use_tls = static_cast(use_tls_raw); + + return GetClient(host, port, use_tls)->DoRequestStreaming(); +} + +extern "C" JNIEXPORT jboolean JNICALL +Java_io_grpc_interop_cpp_InteropActivity_doResponseStreaming( + JNIEnv* env, jobject obj_this, jstring host_raw, jint port_raw, + jboolean use_tls_raw) { + const char* host = env->GetStringUTFChars(host_raw, (jboolean*)0); + int port = static_cast(port_raw); + bool use_tls = static_cast(use_tls_raw); + + return GetClient(host, port, use_tls)->DoResponseStreaming(); +} + +extern "C" JNIEXPORT jboolean JNICALL +Java_io_grpc_interop_cpp_InteropActivity_doPingPong(JNIEnv* env, + jobject obj_this, + jstring host_raw, + jint port_raw, + jboolean use_tls_raw) { + const char* host = env->GetStringUTFChars(host_raw, (jboolean*)0); + int port = static_cast(port_raw); + bool use_tls = static_cast(use_tls_raw); + + return GetClient(host, port, use_tls)->DoPingPong(); +} diff --git a/src/android/test/interop/app/src/main/java/io/grpc/interop/cpp/InteropActivity.java b/src/android/test/interop/app/src/main/java/io/grpc/interop/cpp/InteropActivity.java new file mode 100644 index 00000000..05e736fe --- /dev/null +++ b/src/android/test/interop/app/src/main/java/io/grpc/interop/cpp/InteropActivity.java @@ -0,0 +1,120 @@ +/* + * Copyright 2018, gRPC Authors All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.grpc.interop.cpp; + +import android.content.Context; +import android.os.AsyncTask; +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.text.TextUtils; +import android.text.method.ScrollingMovementMethod; +import android.view.View; +import android.view.inputmethod.InputMethodManager; +import android.widget.Button; +import android.widget.EditText; +import android.widget.TextView; +import java.lang.ref.WeakReference; + +public class InteropActivity extends AppCompatActivity { + + static { + System.loadLibrary("grpc-interop"); + } + + private Button sendButton; + private EditText hostEdit; + private EditText portEdit; + private TextView resultText; + private GrpcTask grpcTask; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_interop); + sendButton = (Button) findViewById(R.id.ping_pong_button); + hostEdit = (EditText) findViewById(R.id.host_edit_text); + portEdit = (EditText) findViewById(R.id.port_edit_text); + resultText = (TextView) findViewById(R.id.grpc_result_text); + resultText.setMovementMethod(new ScrollingMovementMethod()); + } + + @Override + protected void onPause() { + super.onPause(); + if (grpcTask != null) { + grpcTask.cancel(true); + grpcTask = null; + } + } + + public void doPingPong(View view) { + ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)) + .hideSoftInputFromWindow(hostEdit.getWindowToken(), 0); + sendButton.setEnabled(false); + resultText.setText(""); + grpcTask = new GrpcTask(this); + grpcTask.executeOnExecutor( + AsyncTask.THREAD_POOL_EXECUTOR, + hostEdit.getText().toString(), + portEdit.getText().toString()); + } + + private static class GrpcTask extends AsyncTask { + private final WeakReference activityReference; + + private GrpcTask(InteropActivity activity) { + this.activityReference = new WeakReference(activity); + } + + @Override + protected String doInBackground(String... params) { + String host = params[0]; + String portStr = params[1]; + int port = TextUtils.isEmpty(portStr) ? 50051 : Integer.valueOf(portStr); + // TODO(ericgribkoff) Support other test cases in the app UI + if (doPingPong(host, port, false)) { + return "Success"; + } else { + return "Failure"; + } + } + + @Override + protected void onPostExecute(String result) { + InteropActivity activity = activityReference.get(); + if (activity == null || isCancelled()) { + return; + } + TextView resultText = (TextView) activity.findViewById(R.id.grpc_result_text); + Button sendButton = (Button) activity.findViewById(R.id.ping_pong_button); + resultText.setText(result); + sendButton.setEnabled(true); + } + } + + public static native boolean doEmpty(String host, int port, boolean useTls); + + public static native boolean doLargeUnary(String host, int port, boolean useTls); + + public static native boolean doEmptyStream(String host, int port, boolean useTls); + + public static native boolean doRequestStreaming(String host, int port, boolean useTls); + + public static native boolean doResponseStreaming(String host, int port, boolean useTls); + + public static native boolean doPingPong(String host, int port, boolean useTls); +} diff --git a/src/android/test/interop/app/src/main/res/layout/activity_interop.xml b/src/android/test/interop/app/src/main/res/layout/activity_interop.xml new file mode 100644 index 00000000..81ec342a --- /dev/null +++ b/src/android/test/interop/app/src/main/res/layout/activity_interop.xml @@ -0,0 +1,48 @@ + + + + + + + +

I2#LFsz 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 Nc~_6KH0NN_e*jnh;79-f literal 0 HcmV?d00001 diff --git a/doc/images/grpc-cq.png b/doc/images/grpc-cq.png new file mode 100644 index 0000000000000000000000000000000000000000..2d9e0958623c8aa4080f6c799b5bc1d2cf0d5923 GIT binary patch literal 41659 zcmdpe_ghn26Rziog=0amAYG{VH0)!+$NODon`Odk|bN_rdhg^oFaI$Ym-K zU4c%$R>Je@ftZ2u=y@Ht48!Hu%mLr-0F#ARJ`{X-U5}$GA!oq2DFlI(&Y1F1%`P#W zqR}TqHX13dh-@M?)1Qn#dI<6VyPt+Xl&98|16wTnRY$QwT8CF?1veS&is zN$v{n%U0^@Hz-+g#!9siU7zFxLlU!cTUY61oKm<*Ij#yFL{O3&2Fu|?=qsrk*xvo= zRr2sw60{f)iwelP#y9MlwP7xTS%o=qjfSCG9x=EmUw}I!=}oW+vX!DH&sT?{5MpQ@ zVuKEb#m*~_VIhPn2g+T<-CtyrFYEM-#TV^BNhRT)qUkFwiM-e%#s)BJ(9>ih61^7O z?Gx6zFwTp$(0}gQREWvaW82ymoQs>8X}o3}cV`t`%-d^3+Gz4*ublxYCZD?hMb%U# zk=L{puR}k8*(lTdGwW~hrF>qq3JjqM z)%YSh1E1v)3k-SGT*G@&r+?vF|3m!o%Dw#n7%2aOQbgs{E>7Fm5fUDt`)nP2#&`2w zB^;P@RYwf7q&)~WrO2XoHdbTa_X))J-Mo&U+pgySN~Z7FaYUG@q(k&N(}(OfOsn?? zLX-wfF=UPt9Cau(%*)V=^-=?g%mkWh~uC054YV(!Kbr><@{ zEW-w@FRcx{*ajLy0QYkWkpA{fK`D?Fta17+A?$Q^Y_oOvIE?%W*DF^$z)CpBF>Rs9 zGQDI`{|p(m(BM={9KDSr&36QsL9r;yj3AoXYZd;DefO^SaBEfG%-g;a9bxOT&cf|n zCGt2=B}bMj)HcQkUc-Z|=r_Z}7EV|g!=5=}!$zh7RG!g|!Apw>Y%I%9j%MMX`5y|m zWk!)@rj~7Y2J-3^SLG)_-npXhSE~F$_In?4G9>$;$?^+VCz@VJ=}q>@3!v_s6n%5k zOEflac=x%aBLA6)C|GjHHo=Uy`dZmggF$CaSz0B^%#*aGy`E6E1Rx;gk%fwYE(O#6 zdU!TJVkLM~gWv8QH6C*(URw8@DVR@c#tCa`v-4r#PajGQxAjKWkmu-9M@ULpo}y0H z$kHWQ%RCDn=CHG^PV+Ad;jk6LV=j`f-fXy%W)lhncPVkMtI}$eDl!~&zd8Bh5m4C- zspfiNgy4e|#>*%9-bqO_wzw+-`#&u2iJt)d&(8+iPQ9~V#&3_AVK?0IR|l>3w}z0m$u1xPDl4Z z&C?YE)Qn6rDoJCk6%)npapvgiO~r7y0u%h6TP``=Z9;Dgab!4IEfqo4BY1 z)c)n2`YB8yoc`Y`+uJ)Tq#7TL^a^zNV~=$`DV=%d1n6AoeV7}^y3Uz)HmI4 z<4>u;?4(fKvO7=*wsno*vZ24sJu(jq_~C4rJnW!`2rR4FkLpV_7J_Q-feU3 zvW2cUX4EqgiA*ak)`BKovsm)HRn)cCpk!`wa>%3a-QTme%bMJ&gHpRTS(Y@MMq=U&?Ymh)Z~4+Bm*KgJ&L2%ae;F#+gpk zG=#XeZGV*TZ$8_O+<0y+;p_oKpt%fnpWvZ)$oSty}41dN~r$++U zZ;N+kid4G=Wp&S`=%uPEN4_7oXiF=O9eFv&<^&`rK2CVY9bxC8FIV@2ZObm$?vjCw zH2m8f$mvg5RDU<@-gEv{{7pHW=nt-3^`I-Em$sCr+>pbpFZc%Cw;qUg3qSCs`#m8% z1&5h%?KbwEPh32?T!yCl8qJ4EVhn)&Y|5dNa(|dfcQ#&fgf(lq)Ehia#yaBK6i>bt zSQK8zb|`51)f+uX${l*8Q^bEvsp7}-onnD}$#!QgEg9!26uK-(yiBVrR?EV*Ce%{I zV}i1lyZrP6#V{x4$Iilz1HtTCZo^{OTc|N?TIC(0lK@g7l298 zeBBA5=IM3cke@*Q0qqy!=5HfU>L{90Pd(>=p6h+hC zE5i*FM!ei3{as<(9gE%Esu0$|LX~vZ^(hl31A1HLwkb}p!%_DQr6|@_(9^O0SJq=Z zo%7ed-brKPx2iXIS!1+!Ku>rRsXMr(sG@b3#xn^xaXJf&qNyNl^y}i5mij1vU)Gt~ zVoW%OA0xaSzcBeCpkjO`w_J2y6${#HIyaMHE$t?v=V^%25<~=7_(j$N=fp3f`{wsg zYjQ;^s{ZDwP=So@@SD=u)xR3u_)>r89oQbX~ zw%$M=aHCTA%i(=<<~-Mh`g7m-16}W3#R(%+t4ua#$HO-GTU#oE_QH%3yp<5zo)kqG zwaWh8S_jr_zLsTAw#B%Gp)EigS5$m#QrdJhZ#;0K>S3G-;ln%M&vL@!*qZgS%3FSX zmJXWs=Go%83LZ)&N1d*;$_;=j8sw5s@SL6^O7p6|y;zi+8+#|DU1?~}AA6d=H_HSp zU4i@**hjU|c=^X6f3xsU+*EACRX$w^Ih_`De?B;&UDjDb3%R{Jca?*yDqyJcVNBNP z>xJRM9N*5Lm)LKAV9QE7b@lx&hDkk{oGx?^NV(vcFnslHj~`gBFx=*rx2WP#Gm&h4 zZP9jiOtR?BR3AgH#W-U1nU*jyVKdI=vi)oJaA_GIh0fq;CZDEu$)z2VxDs0)0BBsR zD%_}>bIF+SNv_K9rSc<-lON#c6LdQi(_Z0@>%xWGMELvsNs%;8{X2D5hUZcoYgBrCYJzaYst+>kB{9oaHUr3~BzEg=G%-kZk(0Gw+6*ftS3NY?W|s_f!?d8rpw zD^YCv7p%4ZJr`{{gS9D(qsdCqHNNht(5Wg&geHehfA2;B!BhpH@S*xFLfOE-o3FKV z2n^o)P%x4%4i}d&gFD)ez$cEsspY<$WWht?MxR~u8XJ=~)*l(QfRySfF2VDkZr{|M zqQWIs=5dYDL#tK3dO8y~jU@)vZDX~2Y3rMGIHe=l9Udf;-yD4QadtoLN$R@l1l-Kn zpP3(E1alu7%o$MKvL-gRoF09ulmc|e8WG3WX$o_pjmmGWDoOxIx#{|<$>G@+od50B zUGkUx;h(A=dCE1M(a$Mds4q6%pIGDlE8u^=xS2(1!EqU7DeoZZP4=f*6*?T(N#N=?BXV+KGj@AYh@!f%lk*c~_VPS{;p?1?_J~m?b9;W%QKrx2)je%y=78i~Hq>Ua+P_G>PYAeuRaC*zWf; zJ}Ke_u!Vd;$^Ce3TZC(Y&0pOCZBy5rC6W`0(SKyEWNkY`?3TRtK9a1eh4nJZ3qhUe z8>-x0su6iqzx%!Sf%?!hdXI5A$wX;Z_+nmdhM|MeGm-6^#x_F*iaewmq1U1P^Cnlo z%muyoW&VU(zq-AO1)W)N4s*DUAtf#CcQ%H>>D&2MLq&&6Uw1-^=&EuYV*u{}lUXN4 zF6NEs-0%=~{$-ExSJ%F*eWBW2$C*xSSG5!#>XsGK`{m0QgVb+@K@Q0Kb37*nog6?|86`xu&CG9PHGvJGnYZ*qCNR$d2g zHaZ*hF@V=RL>4<dCP7-vlwj8>=3Zd9rW6BF}eLiWm zHs?j;a%!#heu;)-X+gi4TD>=|1#;GbX1)Kzx0xbQuGwRS+K#HrhT>iSRSd+qgmsVZO7mr{NRHMn7xN0JM$g86N%sP9$|8h#fCfrF#^{bDOsZ+3`Pjg5`d z-sR0qbsWVq5&GN9gYCV5;vNtpQIYFZ>DJdsb>XXZ+OX~)R~|3(k5SOD=CaPq4$PQ) zQ3w6WP`x6%Z<6X$kIPD#t>UM&k4ZZBf6 zyQ-P$t(?(G z_kc;D;#s{P11s~c)kSBKKI_4{0JDOtA-WWs*w;bX;wY!ViWH~d;+qDISMv(f=ZmBK z_jK z`a{};c2#w@%)Wuy1k+FVrVy)`W0jpP2AhmuF3roM-aG+a_eOH7aj$e$WyHbx=HG%P zre(7)cmnJcE46shM1559U#*Xf4O42A+s4S(d>kr@i0bNGLGjj(H{ELt>kacI6sPv5 zM_dr6zX$V~wiWLeVqg&F~mE8dmthtzK~xxJb* zXw}B0 zDm)Gr)R2|9*>wMUB>u0uVco8eM>iWRiidv9p0zv zJK|+KA=&}TiDinJ;;Eu#x>)>j?;{`7!w9-xl(;-89#alB$9~~BQt(&4yvT~mj|97Z z~Fb;9)m+#oK)%o5v8W%`Frg1NKUP5Hf`@*`EP2D42yrJxc@0G z@k;%F5;x`LDK6}@uWElYa7151_0*0Z+pL!RnZKcWWI^bA$1d9Zjj|w(-Qn2}X^j^b z&;0xBU+Ev)EHLK8|Hevm{tR7R=uXgbXZ~lRB^-`0>h(SE?(f>e=Mmx|+U((H5C1ne zr^K5?rd?%;zww$HvCWPit_0M7=lBWcM8uze&j7f~Hk+RyVx+3B_qWPs^D_5fs-zK9 z*ng3W60yQj$vA4*0&h(3m zD{U8g0#Z<+D~}lrT6c%NqtSnEF}=PM{O_*?$QFW#AxVuA#o%TBW%fHSMH5#fvuQm( zBzD!!Pb$Wi|4LUByJ;>%!K*~=8^0j1>3`CPD3Cru$&e*IE~F3muet#DXq~| z4Y0_E+%64qvY2r^0F_Mf18F+^0!Z|o(QAcRaQ8+)M*OCnvME1LjWJ;i9E zQ(>XFnM(ZCLU~vyio&R@+Zzo~)y`m`1PD#5U`SYSE@Li)oop8Jw^HaUZBPX5g#I1D zHnrQ-dEo>?7^9cQz(W|H=;#@1>xq8;PzkosWgkAQup?+4N%fzJ&DdaNrhCqil!`TNirlM_Ve#gYAt8Hk` zM#i#;8k!-Z7V^h$+coeA?iwNXYz_QmFFnh6a_#2+5Q?_{eO|Z|N}fiNg6J=3Jk(LSbo>KeSk8iC0es$Esc2ai zRL@Ztd@?gZj-l zW3PKYG{bHLL}LnKjnS{kD!MO$2Tkx=zEOMX$nKAA?vkTggi*P9?h?1?23}LzPFQC1 zlI*3mqm1=E$gAIOsNc-w`DYPWb%UbY_3*HebpQ+@@G&}lZr-)%seNJ-&jw5QzAPJm zPKEMT9<0ZJwvxHlrF9~hmRT5aO5#0b*`Na+g3aZ4pH>HV3l(Hak@ z5ohQrK^Ylk%9^cGijN+1Ez*JDW$96K0571}^NQk=5xFMv9MJcy5Wxciutf*i<$^Mw z+$MhlzNk~(Y)mrv{f0fn2;F|78xN8#E{zOGuA#o2R2RINr(b=6P3Ti%;<9gds=6Ii z&qGi&|9$u~-3tDD#o3@3ILBajK~b?}{4E_*j#i6XW-!xR!5Ig#LRODqNFnE|-%GUA z;{^6EcZqG8yl&2TCN{0sJ-%+TIhs6p_o*zKc-$DZ_hiw6CBNt&ttQMC*pj2OKp7u5 z0M_INR`(qsINC$4&bkr8Q%|?3Z3tz|>`@8uu8a13DQC+)HM{I15v!6DV~9BrXpudv zhVgSwImRYG;y%rx~#z0C|Z?U-Hdx+rAoW7y3PW3`B3{ zUwLy{{dT&5F2;g^3t|S{Pl?B*QLtSRQepF1%L!)l2t0~&0!|`x!O!H z&6gL?0M6@N%#TRnxs;&$v=$(`m;bCpz-jWPmSQKo@2I`ZB0Y(}{MIu3mRGA`@!-6m zRkdAY;054hB6Uv$cJP=XkiBdDoB7$m_}NVUL;%~6u*KErNVa5?vBdRr6-$?=<(QL0 z;rUK$w77lDg}QUsc~Z#c$?xukGvNi>bO{oaQE^O`;<28234sM;{`?@bX3Z1#Y|R`p zk68+|v1XdLH%*-NjjpQwp2sG>$2|&ox|Hu;CuuUZP*Dijl@d&UUHx#3uQk zcPbXR^QB_mY)XJfjqJZPpS=QEt?B)nOZ=5KY2n-askxD_@1DP)qpB4FNdM-*!Ys*< zjGE>%nYbXUfi@hG#)11HrjdV!?dL!WFfJ4oE31?OgZ5taHw;SUTE|xUwmhKBE z^~}d#uIn2saxxo%Pa-SoF6$vsrhQ4Od_3GrI+d&E=A+Foych#kxP>-mvxIJbrJ=$W z>;H-RcVC)6HYxGzobq)tzn`I{^NGJc9=ayf#_9~vJVCiAT9wP+HXrLg6tMhG(X+bL z7+;^TW5nM!SmB&TAVo6O=N~g_QXeeRej2@qh-VwzfcL#}5xl*cOG~PGQ4iF;C1iyT z&$C3wVk*i!?Rqf-?2tuIT7n1;;3xjK#pL2<-$Uj0B6SjP4Vd0zm0?_;Y6L`=IoSTy zLwY|8mRPB~`lf{1;9CmlOZFzq2f@VJxI5{kA&eq^QesQfRw)Gn=G_ zMiQKpAJ{5rHOF>d&>hPrn)JThSmtu+#$sBdF~KhsCXB}528Xocymigh&4dzI?Z-UL zrFeY&<#ICi z^>OR#BEre~liv&|d)jf}HV^KhS$m7ZFnmFAHFw^7;4BYGl5)87_>j(4R`rD%nj>4M z^$j^-#2pppky8%N;w_I&GLoYCF$yn1IR9R}G6ioBX$i2Q#p8Lp9}rd8SR(Yw6q-@! zFA~msAe~BHDT)Ad)XAlyIxksaGZ+@<^ccupRep~0%>Ja6{+Cg?PBWk+)DpS&tk;cL zr~6bP#8-W$F54=ySQ%lm{J7ky)siZD%($y$*{ekoqpsF__GPtR2?|%+>6*e3db{73e_%eZn94 z_V+3}S;5wV?P~)e^8YjX<|fTq3UxZ>-)!+>5|lA4Wpnp;#`gZX+(D&W)q$x_W! zsY!Y?O7_0azZqu%GIS}5Q3BZ)$X5UN(fhrHs#Fw}kGA0YkBT4eHL8rAq_!>5LY?BNiR|7x<6!V1JO(g8n zfAV=LK1QKq?aP0GjvS(A=rb0xsn`FDNpR)?s*d`t?4{-Yr>4<~Al(1Yz8w-T{zth=p>gWmnXPZD; zJnxF4sF90N|M3FaA|GTQXYl%8!=&!#n7QSv|3`+jc%P51&X93zdiP%)el9a`eYSs< zHFb0dCER12a-{M62VKpt4HaV!Mi-%i58c_I-}hfo)#cZ=sdLn@FTx!l!j}^sSO3n~ ze|oI$@W&Z64EeTU>(%Q=_u2|Je)3Gt)nJsj|y2Ug)W~K0^V|xUwDGSKGNS|AY!v-M5#w z|C@{Fw&HERru2$=wIRml7yss*micf7%-*uF)ePybK+o1)TsVa)%qAcH1aT z-)_ei8YQ%w1ciKLP#I+QK#jP(b+{rvf8Stu3qqPK^jVhvpCiXdFd5Od{-;>{8zzCa ze~cgfSNI+@31*Ofagv z1iO{$K~J5wZ*||@fCh%G9(GcBs|M9tPG!fEPBO0kakyJNj6%hHT~MZ(hgrd2>GHe; z^O{EO&{Fy=!Gmm}Q-m&MjMTTl)7}#3POTfSbOJ1~Ss_i9nc7{7U67x>BzIoMJzVWN z)J{H5&74o!z}c*CroGNj)L9ROQ#M`e&H@Qz1-n_b=o9tt|&&)8dxE z%2v#L>p;grOS2$B#w%;+4u?ps)ai6O8b2{3 zF-sdlq&&Dl1|WQ|^Xu{4F)nh;li}%R#*5p+%uBOYWVMf!@Vo*=l|o7|PfGR%kRZ8e zR@~#P61aoyALBB58t3c5M)mlvDRIz|h zRHY8&8bc1b`4!}Up|=sVx`{m}tCOO>p6PS2k6!W7$r(x{)eH7B-DoWcGptS*lvBT< zLNSrZSlK$)^5~Cg2&{W%t(ns3#jCqm9o8h6l~C6C%q9Z#t*CWuEyWRQ{T&{A*iccU zh73DMSMrGfTd!7WJ+XhDa_=Veu)XeGlV?bBto=#1Wa6ai{OV2sjQAl>5!0u{zV91) zzl*-FM5wy3Q|l7~D5;ONUztTr#avD)*RBFy*ik&O=kv1>^OyVi9cXXLe!S+AUSzH7 z6K}7fnsgT6WGfUd{5jM0p5H0=u;S#l!|J&ZApVQ?nK7!(LWuOVj9rT0I~gk9`w`vB zI!Kath#D1l@}zkeY{BYGPxx6v`}r>X^7)w8N906uwu{!&)D2#) zxwo<#_(gqNo+V8Y@0+X=P{jiZ8jTt+<#qSSZp36QsFBqZv`JO3NoH(OfM^O^=Q)j0 z0TralU*Oo=Gr`b&fY_N}YM|wIpdu=<_y_B!I=8YI0sv+zF|DBl>S}v4=46@JAT3j? z0aL-Ox&P2o777*MpZsa)f4RDn3W&7%=B9AfLcx1n@V1V(va5`uSdwMj;mi4a0rnmx zAPkpqdP$5P$vk==sB=?g+|l)s_ISeNl6GxQwK=k?Tv1}8>qNHqx8-DYxk7Oqm??5x zle4;WD)}Ys)`lD3`C-jW!QB#5RkCL0t!Z?Ze7*LjABQY?XSw{nn@^OfWH0f6{b$+r zf3FTmds81+AZjgbA^*B>2n1j&R1TAE|Gpq4K;g3Ac=4$Suml3Yb9;P=SAt&0Hfs3STkihmV^Atyc~esZ34G zgh(^ZWS6czna>MfHRGvP%n#f&+b9P;uE0H-5)mZO251(g1H4mEA2>3ur8- zvuZ#CZ@x7>riS9p*{69jEUuE^wd@A%=?uWTFuRN4>;H4eHQ1nawc-<%bdhOU|5pJ!h zQp+oy>XRN_I!P!ZK_#k{T&AY0fS5uJGarh!C7#Mc^gg82n&3-v|?>d!LuXMosY*{R|U9jUrqL0|PRq&gm! zhDcHeld!|(;mXfQZWfwBXyN~?%fWlmxHWk0L!PhhYhz=8Cz@4s;in$;nM{mk!hSl9 zjsRnOAoPM%Iw5SWo&=%3Ku$Bt>lt?>dI}jE!-ob5wbk8ZY+2HE8S`rUfBs&kDpQ24 z{5SvzDvEd8I$bP(Qs za6*%w-rd2T=AB6_XMg6`erm5y*9XtggS?s-p3E?~P>uH(DL?XxXmoYUC$=svPZt0mq!VOEhDtxv%ltcY#ZeXvYp3oWZ>IFwIu zuNgvHymy*XJpd*VxBk#ae+Jkhasm;?=ZPVTDo} zYvZlIz_I>E=pgA-ZTp#3Y0j-5X6evKwxjDB%wx|qniU|MfO1wbolP`-A$x_9f+aiM36+2E|)xJQrF6SeHoV+FG7(G3AQw2?f|Xwb-F-@yTJ1fWT{0eMPtI zQlwC;0oY?j)2S`bLvcA_$;EPkgZY$Yh1QvntEh#ncyLg|LHW`(f9i=5wY(E$>{`?h z#RJJI4*MTPWo=aw$A*(sL!DW^S2>U>!GE~%>BcPsvy5RD8!Dw)Vrt`oRhL>VZDK#q zG?%bE3?5wN(@C9v8d^Y9->F_1uPt~ujUzh|dCUDll8`%1I4nJQVJE4?2MY(~%@q$~ zf{59vknyEPn@5M?JO#2z6Aw`31HA2Ur;B~N?3l!|V)k<;#IY3uP+M6-9{5qM&Y3h0j z?lB2-kUi+Y4)S0TQeP-!_41+o;L6(>p8{wi+j{}|DUo3YR)dC=@M-b)a1E>O&``}a3FT`9T>)lF7CuQ$YYkZOG4{0>bkgsjNrQeH|rcnXp+ zNJCW$1{ke;u<_X$mK$pAHjb!pI4@7zLuhvuYUgO2$6J|eofqVRU{Yc~;X9{eWdKq> z^@^OZLHbUXGPgcXvkP<#pYlW)Bjtlsw3%cdV5xHrv(L;*M}x=qbV-r}#S#%on2Jd) z(RX{(1ApF&3JlYHha=z7!c~PrT;c;YDF|oVMSNhk8COzqO&GYpOT`l*tOQ+srra8Q zb%v{u+J0L~LurK4=%grBCeiui#4_;#LapAIqSJg9Pe&+D>61qHF@QLC;+r`K`Rwpc zTGdody1aNI8nHnmwmxk_`!vF7O*5BMHeex3+eDR!0}xZNJvQ0#_2%2BwmPWdn7NG3 z#vLbB&glfTX0k%lL+o&n(f(;)Tmw5jLXb7_0(_^bOs{Xp`G@1%^u4d1D@PP3YWAY? zsDZ6=lBcQhhK_=PaVva@5+4vMbH%uTDz_Qy41;Ir`Nu>vyt#@ua8s(VEky&^4RRJ7 zvQ|dV_YO)<&h>U6LJv-%Bqz-nmrop0tHuH@wguha60(Ra1AiY{tK;)YS=`N${evt= zWNBAe>+s}I`@uL#tx|n-3GZ>A8WRw;i^Dl4mx?R0)W`Gf#S(6Bu`s?kE<;E!!o}0D z$(XWb*kP$bHzvJ9E?LLqx~mM0gLyiHlrUbPm&cIdQ?OPeQ?i~-@`lVnk-1^|s5R+U zUS>q_8k48W2837-jae@n!dc(HB-nw|_-?F8 zpD&(_3ss==Q5iEe*7`%OTCBdMruz7|E!27S- zZ^{kHqfI}?RG@lO8dF9Zi30@FGKAtKB(BM>=OeJCeo|of@<0?@^u2Q_bE<+H&0ftN z88<+VhF}9g+5W9|b&8P%WKF%2SSje<1E^$7hk8Yt2v_yJh>nTCz$U$8n=&KzF*IvM z@2T?_DViw)e|~_y3h+t6h!5P)s28`IGJO?t&+}{kVYdpMZ4Ny-4%azScJX%)QJ5@6J!;)2jrI?;Rf`SY_x_aJ8 zvxUwJHHh~#oD`*Js!{MXwOxUr)8Gom?3%-slA9-+QX0v;T(pJif*~z+JEIz5t zLFQVk+twU@v!Wf0GSOt{Umu>gKAmudJW+sEZ*i=H#JIbsPM-x zxEIs7-{?_puAWQzYz4Q*eV(;C9w*BaGAX9vV(nj+$A@-j{xVAtOwrMN%l}xl)7S1} z9!IyVf*3#KYA^84XNfIpyUPRlg#id zJr5_#PAx~ATiDK$3v$Twzj0R(^@>Lfn0F&;KJHx2CvDHz*A?;t8JFTlRU8Gr*o;*P zZG!>|Jx2(RR6vdw+xWW-mpJZ#Tw>El{c}(lJ@pdH zsh+-DrQmJ1b7fa9l_^{xG4rTjmYWFPHXAu<{IP2EmElM3s{`3@wzH=ACp&QMCdE2Y z(?^XTQs*#|9*S{|LA{`JDJrrL8}Yrcw5aM2bE1Eg@7heJ4zb6d^0l4;GW=A&U+^Ie z+Hj7Bj34}2&C(PF%YRbX)TuU_i8ykk!Wcx@=9;bQZfkwwH5i9BYj$u0? z`(lNMHC_+`!{yseDB5v7Oyn1KeKMHp`^PI#HE#vABOweH+9#L1UBBzNgXSM}vyBh4 z)P>i`AcZ9PnRkRTc*MsZu90`O@QCQb2=C;1+K!D1@B9te5~M=MuxWyCOO5fMMh2Vj zBq=y}bI$9UWnTMIhz#ncZIqLH>_t*vb&LhGE=9-}I-hx5iX~$A?0FAanc*~w#u;C` zVhyG4NB6S^@FQVack4$_KYXnpT-X*mSfI6fx;?`%q_IKXwkB{#5i`?qx?RD~K@U?M zo*)L^y&F0B@hLj^B`i~5J2(7jE%;Jz>_@zOC|R0G8eXUHv}L2tbLT9(G_A z?LmvytK84-Q>6dW(;#em?KyBUWn;cEiYsI>feY)X{-P?#_xeb)&GY+zqPlJdN1pin zdI+nxIB2$H(s<)BeCZ-|sl{Ht8ts`mTWVi@?69U4H_PQXP1`V~xo#lU_}g%HFMA1Z z%FP^foC6at6m~gWcYvL(TT?~cE_`>Ep3>|#S}o^Y&0{pEQe%J^V$8rp61rdgg(XNG zC-u%Jrw^J%9M%`BE@cM@WG&vBIl9+?X;bN!51Qupy$02iU(emB31oX&mGF2`zp+m9 z!q#ANNM+->qOp;2W{WRw)7Zry-sZ?;aFoLmRfg|th;+M1C(B_kR^c%;CAeyeUzYBn zsABgTp0+a4QQ0!K94cxj`Meb1kGmyvf)l;jk(u1?(JUD%zHXDAC!5>YAL7oJ^USSX zwpuX}@W3u;TH5#N0`AL3k}SNbX(Z#_btu$_eGI_!@Vuk~<{+b~9i@p)ysL^*9lxf? za@;zX_wva6S8I-?zx3r=3 z?sy_LnhLb2jBWGgpiMUyrR&T!Y_6|6!cu+R*1PpcIN@b?ix%;O;14n?N2dXD+)vZRyJoJ2tQ!~cw1DGc zkfQ<@mGbGm_9kxx6HFeN;iahtex`Eq%21Ag--=9Ed2rfJ2}_=uDMi`FD6-YH%@vvj zz<2kv_q^5c1%6uLFG1G6?Rs-7q;@-GyKjWVj(N(m2^vvxQID2-t2|$4unxq4Fp-c% z`c*r))VT6fx}C)8UiM-nk}pqsaAqN z(y0wIN$1;4AG5T3nl7KWCfRPZ8?zQG8vCn8G!w?AJV#x;YZS~Y)WHC%2X-SH999M; z@Aaw*uH5Tuuscwjc1w>EW>3Et&O!%|ngB~-EK`!<|FL?G$HlQIi<8s;uQLW4M2hU;`BHF7fccVvK zRid^YD~MVkEY?+h1)@IbP+ep&czn%RbSN}g%D}`Tk3~K?EwZ~J4NEdi@86zQDm=|1 zym9^J5qRj$x|Fm(%6vVQLPUBSe;6K5*r|g90V;|J^K8>8s$9;zs?6TvWM>om0NaK? zz8&XWoDonq?PKS(Crez!-6Ef#Z|Y^9o|Kn_u722z&8id2yggQ9i*|BOQ#>`=wa^7_ zgk+)4yq*&Ia^0jw;+!!08$PhDqDm8^v~ChGSl7SfQj?w^b-nXjJIH!pW%|5Yx@bGu zYU2#(nca2mbu~)XS;&@6n(ss|?&xSZVIwcmy;XJAe zaJh?oUXT82^7JewIwl5SlUX}smXm3tR=Wx|$t*i@_z6n6)7{9d>lG&BcR>V;rbpL_ z0{l0m<$R_cgD9ixCw_+Yhk^}@RGe(F^7?%-O)w*I(NmsZMKMSj>JVFXz`%0PHIP&8>={`VoxCew_uPv)K1Fa;IGnUH|2Z$#e(q2nTrEL+zmF-aRn zk6HCbZ}rAxG*qYhHCuLn?ZjY>^1&Blx`&E<%y3^D_NTW)I>hVP)2#oH{9M{k0t3pI zJ8xRXz*YT)*4C%(n8_a>aGWG2?tZY(Y`)(R%>INPUNh&eqE`>Pbj$XASh)2z`2h+y zufXG6nfJ%!*btS|NF{WvYaO01=NV1l;3IlEZF{TRzkm3%r1?^0cR=yhCnm??^}$u~ z*a(3nImH!qi>v*Xl2gGvL#&IlXA&Nkn<_t2Bzt$Jq;U*}VY`Yjv!SpRv^t;3iGFSIe`RjEYzx`!b^VeD1XW%D= z(I$zyr$y^kwH>!!d+Xj`GkKl>N0`9Sj{01hLKt@MWRh(#}ALt zjN>dF*Paq}(OOY;``cfZso^e*BPL8$$Fs_NExyqk>OS~mEo{q1-yX6w0zIryA8H*a z5pN@*n%V9$J%&s#wm3X&GJ4Z8;cvrIjs{!9q`P(QB`?;m+9vuHD6XLZugg{oRi;ZN zcLQ-E_EyT5s#3gkni4_WYcD(eBg6Is(Zcqn25i|5NUwVyU1s)?`?|O4G&8eMYey_> zuR?^2$p{Z=pWG0KF4@5QnC@r2EjUGP48j#piFG_)QoJICORyJaQFTXW$zi))Yi3udOUap3rG=E zn)D8$)KFBUSLr1br9%ik^rBekAT4xIdJR25XaXutIwX(~P+EWxA~kew^nCC8edGSQ zFD;4ZX&gmTuDcUi&ljaHg2Gh`*NX@rXYu{8wb& z#^YT(vCWDgLfUWXr_qFL`beKO{4TVA-qWm&Z)R0bFC94Gx(5)gcUp41o*6@F2YtxQ zjPA+;tQajn^$nc!k*#h;XKb2P8V{6mmL#7VEW6d0a`%7rqxs_JBhl{Tbw3H)b~{j{ zPc@P8_@((l|4A0yJjUp$?@C-Vpn;Lfb{%_l?63R}khlkPwF4dp_kk%7P=kuVO5k{ptTCcb#X`AAr zex_-^HAW6hBm*bPL=0vtb(tO_*!J_EM5JqVGtX~%1~n99)>);%r{Sqy1Qc?-tv12+sc|d>nyYQ&*ba7775m_2IV740Y${)z_esV^ynMM?P`DsRYu-VqdEa76Lbb}hApOM26|-d|f$yo9VUxdm;fvo9DjsPjUrs7ASfr0^Y zmovT^EQPO<;!l@LE`w@46euVs&EO5NysY8CtpY1f=8Do;8g!G6DF!gc5^tX33>O^nsuCTwMNs;;jvTy&?* zZdO(W2+6bm-dIpEOjs#S1od0<_@{j+22mYgWziXHR|94<=p8j9N)}QeE|2eR`h~EAI_NmYle3REj zr)lB|GZ`K9?39AXZL{H8_;iSqZ(6 zhS<>O|NZ;@|LC7)zy{D7$kPol9qg&Ih6pG~F-O?U^J3CmUF$83`*V;k#$bQ!v>z*L@L4X&GCrVk_z$ecI`)H2tTNYs%ycHV zKq}q+fadE$GJNR~c6Ytb;p}XWT)XRY0_fS_U7s(FD&po}{t-}fQlv7cog;UhWAxyd z3@ZuJO-z4id!mlX;2tbNDPk*iGXjdiYWDkPHM?=k>IKPz?FH}jNC^MOWcH?#W6gO@ z{RW(41#WZO8uyF)@}0h*-(V4OjbJk65W0qK5yeCt+>vq|)Xmeg1>e0+%R{GW#kT@{PlIx&c?fEW>p9E2KvqF^CV+HBS3+QR zs#HPm(jAtRw>u-ji#crB>x#hq$rh-ATr;G_?2Jqqm9iF9r6J+&T2GF=+qA`!|~xOMl{9_-+|z zp1E}!&dL%x=xnC$dEOCR!O$ZdrvY=UcqSX)3@}wy;)CVS6Zdz)uy0G4$7%W_R0nM(cJ7Ts&z^DSE7u=oaopA7v@ZEo(aB-Qn?a|j5~0vzPIjMf zhP_(Y9Om!&%J3J+0}Nbfe-)hZ)Uv6VkbBqhcajx04jJMX1Qccsmr+?e8C*-bPFc7q z%nxl~U(a+=8nChX*8Zn6{%gdOy0W?vjc4^fMu^}T4=OV7^pCqL(TE^pe|;kzYIc)V z_^mE;8dQ}zwtp*lub~}75Kix5NK%U(5j+N{GWvhmd#5gYu(oC(Qlx^02h zk?$bBMFtP=^bz&A@e$sf5^+Dbh^aR-h9E>M%II#l_VtcsQXs_<9QF{W?+yw0ayI8WU`lRnklYa!hLIRk}3 zKoAht3{TWL*3G>pi$z#813)>j(t9}m00=ixny}FKGbj}9Tdj=KV9AH^c+|W}Nf>VO zku+3bVCAF>8M^;#8$T}lDOnE85Xv62$F6TR#1Q^pk6NSUNv9FL`r#5It>PKmxHfwi zz-j3b^P^RS`fQOIMAIX0*?FE#Pf1@hRYimE!`(#m@R7ZdPtpWP3H9ND-mLZHxpv<5 z?Sz3u`TBM{-%*2iXJ*e1cq$ZsPEb|q4b4n{0x$RPhsbWH{3=_{nSKNoLJt{??tU?* z`6lzTz;5xCLV5y+-iWaR%R{0|S0ZsLA<$bK%oY1m*$lIBr+!|l!CUd5`-nwoVPEn= z##ohnsVlDjk=@uonqNmJSXgh7%f`BbMKPzUXOQ9Y$*HO2CIL%I8H_XbitwVM^ z^GW=FV(AN-pZc?D*n8_S8nw0$OTG5nGwo!u?LO8V$#WlFTTgibWu=$C#&q`8iI?#o0J@t|f;3%!2 zMe_m-)j<7BV+ktqJdwJ$C_|N0;zn;GfNtycRwMK+1iGAT$3ZQlZR5Pyu;y^g-b(cPDy`-qmDu}qqV9kP!83mtFf zYLnbQF-dlhVJBtVU3>R%WhF_CO}4+8OwRbEo7>J4oZ~32wY#rM?;wdvi+2F~1)rof zu-jahf|J{t6__3c5(Se^p(qnmAH^L5Be~IKg>{*&N)V92q^;rVxQkk*T)Y^=s_>rQL+c z=6hW)`P!-Cne<|4*y)gT)mG=cM8023uExVXMwKgF__j`b{GS%x&CsN2w=OmfV+MWw znsyUU(m*>Sn6%4eZr-6W4C?tC)3%*?tosn*^L2fq(o2+v_tN@^eCtWZpRr)M_MkCq^ zMtzNm2*s@N*{>KBLgC}F^MONj&ITR+=Y|IchFsf6B&Hn9Ssw)qLNW?jd98Fc_Qy}a za-!*3X%>BtW~{CAO>wiFXOE`!t^Rh9Fv7C~v-c_{dqGF8!`KbqFqqHSh>D_Gr5|e= zhygUb0`+TbDr=%{vhrUKwHry{o^1{mN4`(MHM-ZM3atwPVz~@NeYxe#IzrCse!h(h z@LU5$wC)$a)S}P*R~~6^hUq1k(syKOA?yqK9QwM1v;!`UG*3LsQL-*m(}<6?ML7V_*-`aq@zv0a4sy{! zx+xo8xp*QktkLZEos}JT{dGP{%6Fcp!|UdZ7hb+7R3-QbQV%;`^$9{*jVB;~+WrPv zo{^409SQ!}Vp4qDKaDg^kpR<0`J-0F3Xrh>sxNiqGLHJg2>sEvtEfRWPv`j4aX(RC zt7N*H%|fJw@QccnQ<&E8-sR?V&OdGG!N6DKJhe6TDU~rJ;*5q{qvd%&xdigkn4&2- zpGt-CyGnZ0%IoJmF5XGrukUD@9uV9#Ewx`w!nx2+N-4^kv}+m@nLH?+?dyNlFHHIk z0UWo>9Yb$o`_!%#mI_Mu-NT$4u;N3_ry74_d^w{WvKkI(PZBBjUjV0lQsNedALgpe zkB&dp*#1b(NQL#%t}13MC9EBC-D3gg@HATparGQ4BuFk#H8;4^p10@vBrmLKyJ!u# zYnj5=0_gnZn2;O>xsSS~sYWpk2@#9;Sg=n&$hmKvIc#^Bv1fZs%K44lgr$(#(mJEm z@ga>?{<8R&7abvXp9$(kN@^TDzX^~IBxED-Nspr~=~65*ABk~w#JJuT)D zeaw5$VU;gq7m7~al9Pd)2H$jI44DtlafM;SjSf`X+yd~8TX&$=czzip`EZwH>c92c z6sx2@n9(#9YE&09u#1k`6#;+@3aqiEhBZ@!jJFL8qqHXqcg7b>UV!9Qid!&h5je0{VQouXFSzIa*;b&%1KEY-831XayS1)TR1 z#xisgwN)kZZ+r>e*W-qj6xj`CQ3dvfhS*2{EC3$x%N?P?(ZFJCOCC)2|uAmBL*PEntQTC0&if_MfNc}9* zVWidBZ}b{;0qWPt@HXWqw7RPmdug%xe7T62p2Vo2V*MFd_!FFT`fT8)l#Q^;hXi0f zE5W&ZUvvfe`lUXQ*)Y`0GRVJf0a96LqvjPlyPvu&S89X@d@tXv$WD~DhS{*AtP-H3 zH?OyC)cZu<_$*;iqQtb4?tGUlnwf@x!Sx)flu%`VvM1e9MP8Kk9Gx_I5lio$mh>WPP>9*! zCjFH8v&5wKJKjG=P?F5tv3$d_bT{?OELZl`8WMbH>Zc1w{S`L@(Ri-;m!Ww1Ky#A3 z-RqxzB|NvYQk}^H%TScR4A9crw00{mB?BeBLw5GR@a|>Zzt)ys>-GInZu;QLr*C1@ zjq)=TL(YF`3*}uq!*FpQ+Wd!C?15yQ=KnmNJX%SDc==e7^8Zjj_-_9uVt6jtU~TQS zZ57u?CSOQWbKz;Rom)qQg@UC`+5iA=(BRTKO!wieq&1-jywoe zSRC>dGk3R8`QA{|(pBlj_14S{@7B|Kaz!Gt-K~;EA^}$dFNcD2%8{1O*%3$$y-=#2 zYJE;HUAq=v%2dw%WUcfc#h|3`8gEC@1E%vWJG)2)8`1K>+Yo_!|Uc)kgdU{vs{NUGKsVNcyyS5X$vd78bQeIuR{%mD2G8fivjIAW8m`slG9m=&S zpOxUyJHG@;IFshHoWeKV1Ph`3%^vKBG_Zk_Uk))zy_FM_&M0)U*!~npt;vs`H*~K_ zr3P|NaF$JL0=dol%#k7+puWau_PTx26{22wYAX5Jkg-6w;Es_}0@aVHfm2CU+ zEw50CVySskccJDK74P&RKpa5L0a%{WZBqOEs-~9H^M=qNyigu$^zg>=v^AoXL8A#& zb<3PkNeBW(;p;_$U5DPFA7=0#0IWs8vM#~u2%gfVkxvQDfuSd)o~n9*EL12=jnug& z(_puY?{FK{KY6+Sn@Z$K#80R#zKKtK96?H|x0s{wI6U6c;?Q0v`XI#N%%_>Ip)%M< z9rNy|gri+QE)Rp`Fg>E-GJlb_fm2eEH3ZFRuOe7n9ACoh3huME1C9FIhl(i68 zfca#ki?$b$2?O{}Gw{3eq7g3o8;#*w*?I&J%CII#ep$O-g4<`k-QKGnT(c3-bRlCc zw@Rj|CP=F#5l)5I6~eakFyf8_?anxW!d6eSd*V^uGG#05)A8vj>f}KZ-qJ|!sCBHV zb5_1{u4MhrDPkL6z)o;Q<(AH4nvi&w?OLgvN&r{054i=Tp))_; z`6Q$R<8+XN@_M8wBrfr>JVFud5Gzmu`KN?ZK2b zZQ!R=^o(WEgI*~5S-rJh5Y_Vu7ZN#JAA{6zeIbzh3d=ft=2u5ujB zqP9#+tMcyO)#BNQBdkTz7ugo+^mn5Cf*bupKd=GzP8^lnnl7SZHag5_+WejLD@-;B zD~(&jx2nC$8y%)*!yhXIjC^tSJE<#{+K&npsi*4@{_OPrTT?}$@(zHr!mY;tCwo*F zWQ3zOFV|DWFOy|i*-2mUb0wIYm^3XZ>+%~NMH6wyXVY;THSa_nQ*@j%LLLF zTp(%4nUva+xVp^mJ@e*aOmY?C z7`J=3Sv4&^B@1Y^R1lrZU z=IcPHQnZQe(eoj=i58Wo?CiBnu&y$Xtf5hD0!sx%>cBCq|D)cpf3){QKQ%;GB9C2BI+t(o`_tQEx{q^G<=c5s-Fync@vduV}v!X*MYw~7TyJ+*!ePgM&<4#m?2Dezv zr_5_kW;#` zy7q!C1?Vd=RnKsFqrCfUCqO=;^)AH2FZsq$k%}8m!NFg&puj;*EA$+QHX>xoS-m$L zg18lO<{u&I5^^1wW+ubjN2il;ELcS>Zv~^V4p>gpKAV-nYhG!SIl}yLO(;@eFAz$i zhd3D){$26~KrsP%l-a|TOVFR(MI7u8z0ztWQ`RCGfvAH zl~8&xwLIm9=|pf1mgj4}xhcTT5q-6Rf@$0$F-y%JQKe>mkFPWtO8+vgennvQ>OT*w z`t5MVAAT74dfSVs)t$8fxe6VoWb#bc53R z%5nVldUPm+wpljC$;?s{D^CXpYB+jf<1Ql9()-c=EP&=C>)c;7G(z%)`vjz%&YJqc0_I;2dxC^*lkc)$M@UGNG_`yZg-e%$6EsaB z<^YRpnHm~ssQb6j?|98P!>Lg(%uec@&Okg)6v`1@ecGbk#2+-8W&(N&SA#OxUDH|iv4VU~L*RVF z#N99YSiW8H#;7WlhN~%qHzAy5yQ;aAfj3S*%&0|17l-5UJKnxB0q}1tEij!ZL*~X2 z{;j2|tE?hN_xKeHozUNs)gsM~X2ohqr?dCs&JFP^S2v#6D{Nd0>Y;a zW*OOdEO*SIqX{6s^!iT(=Pq8TY{g?6mfpD^X#9Mx++UmbWK7vS^44d+MPUM&>4tOM zJF-wUCXMv~z%9%i$1OUUkn`!1H{x?)I(bocMsf*whC2R0@#xf2B{Arb=gm=17)TAJ zqnnsGlHPJoXcE!7GTmTWwr$qu5dXttU};^T3xYR^WHP;=xCO z2l-cHsp|~EcF}}g*a&6*cIepbgQyl9=s``Id`sRx3(U>lXYOR(CKD(eP>BA6)4ba< zzFh18SKIjQY{_N9e_CED1Ik4Heq?J~hS%|l5czYNe7pO#q%8~-5L8$@P;FsQ|J$wn zzWvX)OD$5#zsShE{rWXJdGkxao}oc8af7lP`^CqJm^ zLSC6fxO}qIbmDXCu(7c%ZngYQcwf^I{LN`JFCOCOab=(GX-BBPGgYoP7*na(Nj`1_ z1Y|z)E456nYL%ZAX{C-`sfJG*4+&VUB&)9+ktAzzGAHC`7=HH;C;2ZVDU(3tbyBl4 zM}}bL?_w29PyU*X&7pTyTV<1mNAV$6Gvwx6TE+umz5B>khg`clsFz}XuG%D#3FZ(C zS9PyJBhtK^gCC1cKeM=KhHBd|9h$trGmIK(Rp+DTJLP<-$%IG{ky3&?@+7l7PY7i} zmd7gr2O~}2gSLDB+Wxi0VK6XVT%spUK=22vF#<0 zoUBNWUMJ7rrnqXca>})vD0(2h^nfbDTp^u%cV*9q%YJ3u8Yh0zW}54#ZxuGqH?+eOxYRugshWuTb{c}XchDb^UKf*2}r4KdSp2;MV5PBOO=ZNcQD4TS& zCPoHXDXMa@9*HqgW z+Z%IlDQb=C*6jOP8in#a;|PWycyjRi*%3J_*YemgE}&B1&BC|SXifqjch7}2x$)kr z)c1540A>P#P8=R@O)`Gf!in0e3*gbvA~l?%@^{QnH)ZZ;W~c2ecw4-C0Y zKpP_AQF-DgmwsSIng#D`L+at0xQPUz4ij55cyJM_^5)r$Y5P2Ad{rM6qEj}4Py_=L zE6+kPkkTQzPb&JweV6rndW6;d6v;Ms`G<;gs?(crAA8nE)5VL&b8$Qf`RTJp_Q_03 zo621dj|H+F6xQQ|tXQ-{pdvn>7nu8Q=gSf;>&YYu&}UU=Eqj471R^lO$RB?=CYg+` zaGPAk855Z+@)P)M?3mEV#e;)|ej-ucP%U*=GH?XnV(#x&Zdcv@ZIZYIct@Vj7fgkz zYup`Os1H9RE&hS=Azad*+)!3mDqud$Nib6-`tF*?#uVuD-jIz*=X(973(~+Y-F0j= zI=yrv@z0E*l?VY+g2?gkB{xl>9R5<5zF6N6>ka4qf-X?e5Y$=R@AREyIq~yqc^(^~ zrA!$+boNf4psy-^RuZJ}7}X)S0pPCJKzlE1c`K-ongHMJX}EH}YbslUqGu^)i|p^C z%-7J9mJO%IYFESk^P=FQv*o%N94-fj~4yIq4F!MR;sa%1Ly|QKy>c9e+YJfw?tGVLK!j+Y;;)(!8gbJMw zu9t=<-}Pr*n@-zTsb33YdB;>r-)SAY5GgQI;?O?hu9|VUXij?Jo2QVwv*pRKhP5xX z+xV|ejkgZDxJI_U<0KF2E<&vyy^*RET`6m{io~xpDQ%GVFh8@EX3`B;jd?0;d!?Tt z_l8)Cvpv)&s@!v)o%=Re&jsXxmHk2byOa}2uX7w;H)({r34<67z`dHuQ~WWfYo#7O zO$n!~1C2;LL7LNz&B`*0bW`m@yI>^FIkEa7z<4mkrwae10B}|QVW+GSX)284(Y(v^ z=F){3pxP_7DU*AB9cG$CALM~Wo*ypHr7pf61G1_j%U5!Q1c72*jN|PAqUf-ezj?q7 zYyJF*AWwGy)AV_7?p4{#b7h#IqV0r~N|x!-T#oSpeN8>}4<1fh;00%3+rb7xb*f=I z@Il>P*BMK$d!s1_rWX=JeMuufzhR{%0Rs>cPHQ$**wp`3yjIqK_x2kofLCPFqUa9eeL;w@ivvtP!mT7FwEF~9jssKG zJ7pkH;DqC>s&GKXA_O|tUhUlm(e%;1n-?Ed2N_#qDfXF0T*xc`3~30BNhtjUKd{Ri z9VH`PaZOg6&7sz&*(m3R-GZ?8wI4Cm)t}tb76V5uTgSW;Xm)RsPZ_9H+fH56N&m6% zQRPR_L~3Ua3>`Xqy>V%~ijt%)n9RAcubOuq}LQ z(XaCP)l*IWPof)~>Y~S-Oc4FwUn{$3XR>Fc0>AXy?{UxR`wHUE+_wIKZ(6p_I;?SAdF z)&uqR?#RG-Wl(>ka3c+?Z4Zc+`94C$`mrC?{1waI+|E1+Uau6V-85Nz_|IS{e&BU& zkCn$2!4NYedU{?)!+ytHQ`WaJ#V* z`VIOhW5p(boIlxVBb1k}-PE(DI5}32opS9Nnv3x$dY*QFD%P7aaepq+*ZCFa8{s<~)GiM8VP_$O}NaXrbdPqRz>G51vzyewcs4$VydG;WYK zAIz5UH(PBp7Wc&U%)@r;>)JG5BwHB+g%MXqRg9{9q(Ch;c*csxs*1eTtqo|`?PeB4 zvGipFaNC-+&=DaJ?+0R9F=;m`m=VFO~Do)&W>8~lTekR6yWf=8Xig=UFojGd&Mc}hW*%s*h>Vw2dZ8K+(G*M=Kfa;ir2vGiyKlX@UXWF z*S>z0hKI-wZ4_wSsts&)U@hs=IIhFO|H0HpWn~~bS=g}UCJ_|(jRIvMO~n&iXP&2b z1hr#q$A2>e;_P)v?Z>;ajB|ph6#u7RzvrGNphX9Lg6EYZ11VEelV&1eb7xc!nqT?b zwV(LMg#RR`{R!ghbn!wGAq+)YjWrASszic?F};)M`G)gQ)5^nwPV0@g<~~v=wN<2S z^_Y-Y*Sb^%6XsY&rfOK|+(2~Pn2L^G+8g8MzE+H}_MN=P|5wshzjeA6Hfw5C^D%qt zgVBW)86>}lIfF&87m>or?Wo=%f@{O9EvDqeGu5ux<7vZ_=hor=BrCnwACQ%9AbJHK z>%~Vhrr7XVB=4SP+f>BQ=b5X@Iey!AoS@mlonw1tkDbqNgs`!cy)~vvr;f1DrV~@3 zS(E;!VT0NDnhf=R^^sIE6I-mWsf&Kc9Gc05&Nb28%JxqIOpsb>|m zVtz;xq!_8Q%r|Z84eLSsk~BR2dSp3yQ?Do=`3)WrMEADz3w1RavzdP_<_Ll!pyz1aaV|VyqsYEtgzpl^n-Q$q+Rmoa& zU^`g{@*uSBWlYNph|@Q3K#vjHoJo1zd)ZxQdIpr?M45}=6+8>yLN@N;Fq-Mn^v2r#^@P>hDQ!zcx z%urXF7cy+l_}n@|A~_yk`u8?NjtC#IpK7^GCzM2-HSF3gW8z;o`cx?NY$`}LzgM!q z9}@MWR4_uUD`@c%n#<2cO2Ox-a#CzBA&tmLI1ozlK)^GVsuU|`NOKT5Gh&nhSf@{lVEDQe;^r&8NrT2{_`H%@J|uVRWNasGcgJGd6v(nd zJkBGN%o_6Q@S9!qg<^UUY<#ac5aKOs@ehSIDArn!^!#>`vo-6oABo_`4AgRw)pS>;MLr#3QGZVBk)0wv|>W~=#ykL<0r8dAj4AI^~!Y==SzaSTCr z!Q0UK`7}^%vlA_}7oOK}C1Iq_kBAPkNugXhQJwR*DM0OrIDm(iad3xZV5^N>C|`m{ zCAgB9EvO|Y{t@2fQ$^DZ!iO$*6u^x;3T`r9U8=g>={HY5xB8n<|M$dG(UN2SyR-lT zg$b>U%HgbaBi)y}bEL}ro+B;D)ZkR3vDg@CmDNV1dm>;0iGOQvp*<`p3p&s?dw1&* zsF+xDe1G)%^_30=UpjJ&Swj}1ekN3{&EG=Vsurt*ucvBE)?2OYh~>G1Yl_^kp&Eg# zSjB!r11dr!%zvzSY@xPh1wq%o8eBB&D|EOI=b>dOcC1BUR?E7g-vtVF6zye0yg#1L z&kdYqR%@^9I%kG(7T*4j6kQ3n`0TU8$;UTUBJdsSirv&aY<3XrY0eI)J@3-LPU1YQ zK@lv|f3KG>(Q1fbe395kPrMt3!y=0R)Suh^x9o1PE2TBkFjUMf&GMSclfDX8)>J~xp- zDj`)?J7L%VYQ+ehC^c|`>aTxa4PreNiU^uje!_xbnF>}IvPl7_Baelj#fMwg+Axtti^=KYoKEhT{g${wQnfqjlIaFY4vGs&ASH>NKlCZWc&&RzNzjvTs zQSv6K>*-KL@_70f-5=_at(|IZ12tFz#Upzv0nPMP-tjOb>3v$@0>z6J-A$-U!z&na z0C{KvU63IetT2X#^N&riN?)U6Qlbbi;tb$FUKSPRV1U80o1Vn< zf2VoKpZwPJAN?KYu3UA^pXI0CB5oo9_D60aaX)o)ln{&!j5z{T13v{ryXZ>s0=l8O zp8i%*a0RBQGrU22@euLT0VUqS%4sD@3GSf}Z>sy95t# zvMT5)TV{XMj*vPM!&ZErb{cT`Qr3T)YHY+b2*D71X45Zw#tbXaMOe&rZ^e@j~7 z*lRb7HSwbXp~f5z~7)0ZWyimE?dl>41@u^kX(@?WE z{ZS#qmIuvB5(OSL2k5pud47lCe)PPQ=#OWcu<5_1T)VA-+j?#;K`-W?FS|It`Z1rTRIGj$9k=T{Vp9R9nx(8DM- zk7*$1Y*EkV@(_GAr|I*5#vCo6^pkd2s5y{<+PHsRufLHfx$QM@pvx9zbpp1R6a78r zzfs3gxcm1nm&n>g4nlu+iT_^_TO8TT(00CY!d`tbuNJi6e?erQJdb+u=PAk$*4KHd<|n3k-y1UEPiSCg$7oU#(_U#m|Lm7EHDlOnsg7^S2jk@DNDsQ~t^?r3 zj~~*a7g<#1R$_mJ8qv0&+RVFNsowbz1+7KO4mLB+h41K{MIVIi2MT2HBwrwFLWaUp zE+IQm=cuk?8`}R$I)pZ4hp$xO`bOdfE{4jEYC5j{^qtt5%L&-oC3I!arcVCh@ou4V z?Pas|lddD;MLpB3IU}~~Ksvncj8K|?QQk^Qkr`R=id6m2q-rGcL|lBsm(rZU7JRiM z4rx%Zk=t2;o5ZuiM{0E4^=lh#6g4nbp%jY!=-2OB{az#Me0xSC=fzynFTgI`D2FpYPRlx;sBlu^xl0?W26>i8dA(`w6P`QPS0sqG z`@b`}ULO79`%)RFOv+`Cfr-lfK7pv)6k2^dVO_t5yWEcAi@&qe#{E}6*|aDUsru2Z z7Edeoj@Uc5vCnVV(uH>`k028jvENQ_kUjrNRb~U^1ktAGIB}tl)71c0;vHIBWHH=9GI&ZP zdHEkJ;!))iT2LeSuhKObu~gyhu6(N=-Xcv>rHvx^S|Ao^;&6QXzluJ5yPK||^=eHr zavgbDCgn>RTy${Po)!A5s=6N+b`tE^ou=ipMXDqs;3H}UlDkO`W=cWMtjNIqtd~>{ z)e3ADkr(GR7py~tj0;72>6D!hLDn7QWRkR6HEU>*rQ^{lo1GJczW630qHQfkvUxnw zIvRe?Z0a!K27hOpt~;^4WwX2U=TYgmvu=$KW2fK3~(hg(3%2 zKMm!lMq72KFL&BbH=;*{hqD@X6ViggxRzH53*p;7Hb@^OEwc4oc|UxJxeik6nR^tVfDw(W-BhQtk&8Y31!R@;;2V0NLe!v**%cA_NiAlGUUtHk&=Fjxibt|eR3+{Cu z1ZDhWx)Yxw=Gp{j7Pk`in*R>Q1w0|E)v$i|3|dg6Kmysg#XJZCJ3}P2?2Q@I^cEb- z$@A&0QG_GXJ#Kn2im$3lyFVf8(K!~(}K%q5uQORrRI6pm#iovcc{p?PN~; zKJV%c^Xpnzy%iYd`3hx)i>d*yu;#N*Ej`<3ZYvqCnXB9~rEhImO{f~^1#w>N?ojq` zOE!jN-EM7s$E&?jSK9s_Y3Gr$#exN*SicVD;4B_LF1XkbS7fO~n9BX51srbEQ`n-8 z|LLryA4z zwIZ)wfci!hft_PRi=`lky9e!Ak{2EAEkdKosa+Q)ilxsLLa>Ao0kM3sfoTl>W4-QH znzs#mWfz6I>_u2!&90Gj$6j{r1Jw42!`ueqL8y>Q>2!6f>_(uC(nmV);HDqt)xNHJ zm3l59e=QFwg8+6>JK873+VyeA9Tm}kMW1rI4j*syZB2z%D{h~d9l;6K<9S?5_Pr-n z=BB_kKy*PxF1#>z{@|PxeIvV;e^CpEggP>PhT<&Zx^o+sfnmjS;4mpw%S#sKT5J_+ z*YK|?tp^l6`b@Q#mCdEvS=&ck^b`ErCp|C^^M+<5Xb}$rO;N{p_?M)=ZI=Cz05zkn zNE!1@=gd((Fq#sN**kG{6~U`5wRW=}M=WV|SY6LDZHGDe3T-LbrKK06JJMp;bS{~< z!5rslfakYH14yUor#nZZ@K~t{nYpTT31x+?U>jH4;e0!?wk!V<*R` zL%?|tVFmUzEqZgO2ivBr^z!BL*%o5wGCQ=!AkT;HpWU}MF{E1y(mXj6oH-8Fn1|J_ zbT^vt>mP59Oh;&eKkZ~2E6xSdG(l)N>`Yvl-lR3vQ)c<{rT?hejd@6HCRiU!ysP46 zv$WI|jhk0Xq37w!dlESj-`kKW=$ss>T28e_XPOJcRger^Z?6h znXg6<-l}LuYa}M?p|(`2j5!~FIe030z~)O>Tk)%t4XtD>m71@*5m{a8YPxTVKl)K{ z_+)hKkmB1<@jQA;-eoN^0i(NTS#Smr^+7J7I;B9FO1y;^Ewaof?H0aOzwPT_ z7yfIfqI8wfRTr@C(|bzJSgf9c#uEo~P_u=9tDo0K&!;wj2L;RT_@Kopn{(6Ejzf|a z)Yz$+r33@!W56!D>{C^m*KDq^Sz$MQK%vy8)4A}f;;sEAjyWcrIo>$Dt8e*cgFCq& z$|^MfR%v#iaCMCFnd(;yi>6@kOGeZ{MYMTCf`4DVo*nj}xba#Lu#NJjKateYr5hIf z;HUSG6#7{rISa1f^hAGi27a+uvWg5+@Yba;>x5I!fBUM74HxvGM2TR9crW>ZtAohY zqTd^GvW5a$kybG9*-rNiI*5qdGLKSh(T|_TqOYKb#w^3lGPzeLu^8e)5R)&yUPxSl zVcE6!{86b!rn{}f=@F^{tyAQ3>U5qMltA92`n~jDFOPlU&+I4Ua#0*`oZR85)`vuC(Vt|@Dcczq(B4`=_2ME^NQQyqi*^O}W8K)MqLL^hyumZL2 zE?zusxg>_Zw>aURE9Wb%|A66iOA$j=RZE>3C&HIMWnk~CsBI_2KfFAPam{hSZstJ-1GzVm)xHvbAuEz*3W z7jpK)GjN$#!ItV^K5e`jtaf_U5O>yeI8rcDBDx-e}xmmd>3HYu8o`s|qI? zFKvXiiMGWp1=)TM&$c!?$xxAp?K@oGGI$(!_oKMz%ef$`@8*mz=X>AD}ff zAaS(%(1q`=g^<+(;7&w%pm2-9wURs)*|(F06yeu$ETTpmYTwraiByg{z8QBOy$*32 z^AidT6Zz6`)^js3^g$lm+o;F+u+gUJIuL0>kt; zx~NBICD&Gl?~V7ViS5y**XKKE*4Ivz&f z@^&{u=lk6I7u@HrANDV6 z?{}@ep0(FnpU?Z*@7p&c0aUm4(ZYMb& zTPT}?J7AbUUh}3=BGJj?kJ^eYxuiLVxvU)-)|R#>!(q!z3a^9S!5_iVR<23S-$6Sb zWi9>IB{VWy;vYYNN#dM9=-79()I|kOtP@=xpA;9c-#xP2tE!|ENc%1Kgn(f0xoN;l zR50EI+Z{@j2y95bMb@-jYY!$YNCcv$M|#NVd^i0?xMLpH}ps{2;CGr;1t8q|RU7Vb{o*LsQTKnEkL#3oLz3SMf zNzcXt>(WmK1@X-#>NyQ-RZu~L74;VTP&gHJrpv)CwFJqd z4TE<6bSTn0$En0$BRy!ym~e6o`htPiooR;=L-un7Qu$z`QyrJkb$-2BQ+s z1{BuQns&bPeimFRLx=t7qBEUeI75uLONP;75c#R-r?-gMY8(cEcy$-f=uiBS7NXXl zobWI$uOAZ;8R#NIaM$hd0d^Vp+9ywSD%zT9qiH)bts|XY#~GpwSw)rhRJ%si(1E6o zAa28B{mv7pKL_@Btv$9q##i>+ok=R=%kd*DSGaYt#~i+&SM@Kv*O%R+8J^#5TK&6x z{(^FR`7`K$RF(;)V;s`qn@lGi!r^tWF``p67{4b*{~v_Fe^UCw|BY67d_b`-U>-7K zw!qBR7u9osRJZ-8Z6(BOy}nnu*UBFE`9wca_R8~1>5nyGbT ze=pY$HUM*2uM%e=gv$$P;)mqVp3tbyd=sFoy}j$H$2EU)z5E`&Y^YINqJV?hbP)xZ zN*pd{BAY{EmEyjIW>Qv=Ae!lt(+{Nc}$a7b!RbuRF9Hp?~2`jOE<4P;t z`HjbB8Yjbtjid72xXoRdrLt~JMmECyU&tXjuSTX%>~8Hf5#5tmq0-7bP~=&7U7m}( z(VDo~aYX=k2ZMve0_Rq@QwDX9lC>>ORX+lRBW+oc$ns_f9))1<#yDYW z{i-)YVsew`e0t5Of`pVVo;_cad@Gd?dSLJ=yQakA#w9hgiR(z;;M#Pdk9m(*PM_uZ z(*CcMlTS3g`c_cY-Hk3z-Uv0l%Q4KeG&No}1tk`&Y=yMs+Vj%^w+H`=9}t?fQRHb( z%nGAXBYeHh>pBXd)@MO3XoB)S<}%oIx*8|i>SM=8-^kari^!0{ZM6T1#`~(dhAw51qTC7WOz*vnClP1m=|6p#S|RG068t z?Gq@$e7sJB2d(8=tP`jyZHWn#KXEW`jU0)5+SFR>_Bj_=M7 zoZtPW#eJ0gD7r<)k?#Dv=hb%1_hr(4hxM@CLt{PHmDRY4 z8;6rSM%G>(WjlCfF3#3x)sDg@Y=z`{47r1iAp;9PRR0*8idPqH#!elz`Da`Q$Nr6f!A)bNb}6?2y@k8mMqzMUYd{&uew5= zu)gYmwbo;ay!XDp;t)}O%4fNB+o|z-Owdz9)|@W>-K0Jz{m}Lq2DtNqn~l3ACo3l3 z{ewV7?K?zDqYH}em^W@GHFL?T_$}IFowuAt;30Gg#j18$?ot z<5XW2SF64YyL3}9O+?R7DKqUuY+S^44(sL1t%$+!0aGzljnWj9Mh`v~%FCv`drhZ9 z&|RA$$52w4EdAyH*!y0J?#v&6sSWN=^-p>%xTQB5Ak(GoTY{;&GMiZM++>@axQ$6t zEjEAlO}$>slcRqB`wEkRZdUDaupM6ORc};&9u!LDDJd{ua<%6N@<6_nSZqXLTgD1D zVP@wiWwnvBJ9}Kb$TPHv{3jdsy%8GcuW+y@rVkYToajbf;B6YAc`9+iAXSfCb>v5L z^#gCg6v5VEkZtuD&2gI_Y!bm|_ZagyOQk&a#g4)~XFB|n>uLD2p7jbcGBt2DwuZGH zkmth5GH0H3bM}BkYnccgl=B76=>WiCE{Cz>j_7k3c@KFuYTOy^e3N6_@px`{BN1Kc zq1%?w^_mW0O6Bo6R#w_{+%pg9iga1A2ls)RrcvU8=fKsHn-j-ZF9vA3K{bibf}Nf_ zZZ$l5&YhuvzTlKT?fgMo^ngCdlz%7u2D^i4^k-EMOEry)Qi9z&HDY8z;{xL}`Sb!;X+en%qys5`~{bVT4T_Cbhvy*K68$Kf2+PNXU;Xdst0rt zlsT8(+97aFXy)v;g_9`Lr=ayyJ3hzK#H2K96qri5R;&6cXk39hix?`wImlEm6-8_H z)ECR@wM}eptQM?e4O3%)U*(FV_4mm>AJsM4$C0H0HxY%t8*E+Yd0PB{yxyo2M|G`U z@$+rPzH=pEXoW*=Hth;GT1(!Zv&)JpZzAJ~=k>!lMV_2~^`Q~Za}xbCF>X^HyRPuQ zP;7)i-GNBW_VTuf>aL8MRq>5yhLo+XMgesqPUetSnCSMk6d0A_NBI(r$yby zdw*hUxjqp$cQ0Poy}e7S=T5uSj2&2qIz6b5y;Q{R__=eZKZ3Xb{}{xWd4?V=$3POc zB|zfmHqZOnUy@WT%1O-&m>jc<#Vf;|a>uepGQs@@0b8lD3YVfh)_PJUu z0)ZrMwZISeP@2+$zGtWxQ7?ZnP*R~k94+djYqRo6{f77Q;K3WhAi?2d%$Fbctkcub*E%`u-xA< z%+|R!Q!f8@GC7R9B$VwjE|RG^=cNXuM-*Sx3rj!o`yT7U_j!0qwS_z$+`pXl9Q1+z ze3sX>NK@m1J_E7_oc5q)zz1R}YOUp(GpWPIa zCp}sUge%%w7C5Y%xIX{>=~#oR@u{6bd6A(GdB2q)X)8MTEvC0~$}uVR{JDTKth~21T+UH%$!U%rgsKyut`GH4Z)zBW~fe zN+;(H7(lBJA;Bw0?_Qf1Qzj_Y|cF&eHTto8#bvoeGgbXiS0cq^vdW`Zv$^d6v%=$XD z@Ysho-#UFRy?!m!ENt}phjFJwrjq}?)_m?Z4a`?oaES;NX-UeCsV^K7dVF8Yy}J7D zHLLQL<@J*?bGXXSPN8F>U>83i2BQ-xxtql2WVbO5Xr`qSKyDxuPkx>$#f_%P_eH zM&lS7o#fF6GN~KM_s~w5FKi)w=~FGnN*nG2#D60j89*hIo9t`S9V6du5idxLmP<6e z!?(I}7BKB;p+gWrE?a$3q`G1;4ZLjrzF+tyrM$XF;kiQPgp)5sbGpcTK4E9tz_HmO z_@t4PUYABsvzNqX9d!S=vkhc8`&y-idfWJTz*v|?NE>~%uhR5MWJ#+4+!5jTzA<10 zB#vk56A(JU9?{C6vQrPRle0cW5;Is;@_{EJHpC;PjL3=l<}L5P?_DhT<73_0@}2Sh z7&g-AVjQfq1i_ZLsEqExNYz2c{bjavm-4$Xuj%S6LUC=$Eln?XHy?i&@XvLu=oG*= zs=FTvz_eFEh_8_s>g*aqiWiJZg&(XIHlqsCy_=AJoI8Jo(7(%G_lI8%f#+aE`*YUG z-UVoC6B|S(xEbG`u+0+Ea=--Z!;Hr$m1H5TO1Nr1#Nj3q?)Ty#?$y~;OpraxIA#G7 z5hbgNJ>@j%-ix9?`Cw1>@Mq>USECSFDW$lq<9a)uO@c&P5%euNoqr+x6Ub8 zW@8Z-H}+3Vypet2<8i3qvxB`%CzqTU?^Ze;2N^&wXM`d@_##>!(m&9a!Vp8PRPXK0 z#_gBiVtHgiMLL3g+q%3wIftZL=D&6|^2Cszr}X|{=gHuYU4*kr{JPou3KnwitTYO> zF$YYiIjs~0OJAwiU)htaNb~UU%PPEer18!9hbZo~9kacu$H%AJF&%&42|ceidtKbR zqsQm4jPdq>C?D7QOVmkZ@4*L8x_^!=U%C-G5jyadRy+_|xDmvJfH0g;n1i`?QVZ_sLN1^W#HA!?=QM2Vw~df;ZmL2mKV+{k-{q zUz%T305c`z7o}%MdC+#+UV|)ySmUbC9(2m+5kt{b`(Asg?y2)O8VlI0;&14}ZM>QWU5AF{ z9l?Lhw08T`xM%slg#lVw^hF+qu6=`N>M}j!Sz*r;tUr-TqcYi>Y(=zjG<3QyiUO~Tp)AcVuhOvTjV|W<=h69RY_PlCDkqY ztE1^j366klu3sEusteS6T$!fA z&i!$Huw#M~H18*w{^^1?HW;YZ)Spi5^4+j8nOWum&V1*WS;hTNzNr*z0w=)1dTpzO z73oF<)%R7#5CKHbp>REc9?G3Jiz7I$pE&NW@WoGOQX$obAqQ&_{H@GCb!WI=G>x#&fqRsALnu#tx;(aoG09+ z=#3#0djd=i=!_Rb7*Z*vvF2W~I}_5jUV+(jyAt@D#5mLq z(8UXpzb3Kt4L;O2x@F+7j=hnC(AcC>OO*QUB|oT)qa8HMSsFD`y!oYe|7Bh zxrjHQkmn;Oe=B@?HZ!9flS|pG7Yn0sx3dl)OI)(#Y5G zocZ7(YCSccLOq!?u&zxHU_nKe>z>#p#2}e%ZpUl}dI{l_v+Dw_>_^qy3 zx~rc?%gL#s`)*k)Sk*Mkz2befT^1JiI{$Uy^pRt%W%F;CQs=r)e ze6Prvmkew&B8YU1o3B kc=qerU$y@aui@0q-Sc0EEpH*0V)tI(6l7t9HMkZ3U(J$b`~Uy| literal 0 HcmV?d00001 diff --git a/doc/images/grpc-epoll1.png b/doc/images/grpc-epoll1.png new file mode 100644 index 0000000000000000000000000000000000000000..3ab9a4c7d11b03eb137d173d841e94d16109d551 GIT binary patch literal 36205 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 PaQ6m!#=7|151##BP3-R2 literal 0 HcmV?d00001 diff --git a/doc/images/grpc-epollex.png b/doc/images/grpc-epollex.png new file mode 100644 index 0000000000000000000000000000000000000000..86dc0005b3e76a4c0edeeb04354e8328b39e568b GIT binary patch literal 52651 zcmdSA_dDF-w>FwYbV4H0y9p63h~A>t5K{CJJ$fBwv_$V+bfObwg6M|mCFB_t zWfPsA%tWl|zqqFc9ak*caF=-j%61HEcKCzVVvhhThJ4`?gL-`l*(xwze#Pbur+vqP*e+Z4{uOn}a=q zXi{$?siah)FkB@lAu&Inb>s(g&_~w%z`(#*F*5S|vLynUO9ffB+c7<(*OQrvk+#>P znD57pb6IYvCQOdos2Ik-J$LkM=$Fsv+*TG8GjHvOG4R=mBno6E`2XQgIIHa2H)vOj z@IDL<1ALU0^`8=V%&#s^{SXMmQ>evKtM{d|hP-^2{)mgi$g%=$rfR#)uS}MoQoHT# z-a~=7#O!A&A^kKWg_XG+SaUP&`jvkn1W1DyeLP>_E8}`{!z>P@Xj( zgLM!SVMU8=)9C!iK1kAf-#Ph*i(|Zg7cn&SSzlcI5{=#7(n{$I^1HI+3byaTV1^*u zBJ&~pYAGlHy87~&7ft0mpYN6e2G&Dq<7{P&I|8gf9Mb#Q+xQ;99e9OcNcz`oeZp3v zR`v9POYnv_dsK;Qs&>F- zg?X{cnB3ryGPMUEkM{RNu91_=UL}x6Z=$TiOCs2*m6ugJhyDb?$JaBGtd{?O=@YF9}05H*g(s1fyNi=JI;(yYa(D03!G)lo%m{XmnW5#+ zSKZp^f>GZabV*u^KIh?@wekkt7a0S1Gg}{c$NL3jpw-M$181O-3G?YuVak#cIeF8j z!5j$i$O~|$`z77cGmR=4g=t$d;gQ>>PQwWbwsH%vrO7bNa%X98<=nx8TbfbmKyK1R zl=}zd(^KEivRN;6W+ljA<=?6FTbo-#R4@22^bqTW_2L1i zsoT3In5Jg>h$p?3##YIZe+b!^ZAoCn(56XPQawFniru0)mmkl5e4zA&zoIq10fmDx z(EJ6!myUUrhw_&hSYz??G41CuH+F`#fVj@wT{$@^Xo+y zHq4_WqzFyH(;NN`8!BnvF-~86bDrdKc#+rSQF_za-fvP`$9$S!c$!<{<$d>%*^3u` z#8wq5GDpI)>yXqEuY$T86x={CUjE#l$;RtP9p;_SfT0`!dM2LKlUc#>t$m|A~zvH0k0eER{(qVZyB6Q3Yx)Mdhb~Z zOHLS@CIV0WDkeuA+1!276v;iQ=kn_`2ouov65X~2>%MOp`ZR{o9GPUoPmi`pW?-X* zUA+>m$MZresBgD0CN`lzx4ul|Bs^wMh)TrXrtTK+9?RxS(>NvpkD-J;^JwCqM=%Ph zP_=uwKE720A?SP!jXROLhJ@pr8Nk0VV=xpQNU!;G&xa|qaBf2_ZAlZ^R$?)@#Empv z?tiGX<0kVG*jwVV$Z{-bJqTbBfj@E@;Z=PX_Qg%zICJRedQDasV;D80ZmK)b+87*I(`lgI&I1YE~GBKsmB_vM@>A}J&I zE?aUl3loe>!KU#(uVf!y|uf~<$}s%q9@-Tc-K@@>gN{BbZb&- zoigv+^EK=ig~@)kM#ej{eDPqgBLijA3wHht%E$xG$87CdPG0jCT(v~|lnEmo>!k?E zgVD4}>^_ex1lVcc;WlFQUAK$G9*jQ~l=(!yWT20l=fj#^vD(NMQAI8%(v-|-0%-MW zn6Y@nvX0+Nx-*rsjt5rw^fAkkzfZH`NN6-^eI;TkFRlx9c4hg}mC0>8h2Q1T^0&Xq zA{iH+V!?^*p0%aIaY%(WTHl7<8oUd|qx>{IpR`Ijt$A{yE)1Wnd!k zwfK&Gs~ljVV%_y+>jns-Uda>1PQBWzc9jd4{ne^KvEED4_r~DJY>?6o$)I|-t_vmJ z>taolbm!?Gu-^IwJD1BWeT%>44#bbtr=`S5)k!Aky_Rq+(lpqBtp8QcQcdYZ>@$MW z2?|ABPsEPr5czey6ckJk1B)z)7aL5^dmzp`ekV&Ehl=`tho5(P7N_cm@7*((v^zYw zQgi(1vEFEJ?!?uVNqFO2DkRV3Q7L754|LvU;5{IyPz~JA+gKp7&boAuV|o)A~9UfQKtXkB)jm(3i)8Lv2y1Huz`D&4_9L^X>-!BdrfbacF@NjD%9y9n5EI2F~;(d`qv* z+HM@_=kiZLeEYz-!8*t2^Bo5%bD20hk`z0Vy(c9B#h@OgCa6@E!_48V{pw<`hvI9Z zahpHf?BBMldl(nc`%OxU1n^9@g&@*>Iyy^%F$NR+OH#Xwcvn0)|2Q9;)ZpZL`mfiy zxB5uG_ho(S{g-kG0{cNaIKX2{H`f;gQmq2DcOEXrDAzJE1~P=m$`Jrw2cv;fVZ&2H z=xlltg_dM)*m9u2|ZMlt01=|Z)X%#r3E6U=q)%b$@+9}4m+We713{K}Yq_d6+ z&&^pDA}_zZ=?g5J!o7hF56{f#)>I^{KwZ2(vWh+LOMVG^(d$p_e{}fa!IsZJJoj!J zzet=CP|17K1LiXim6!erqq2KwDZz)3)=qi(?dH@6y>j)B&SlGDaaGHSZz72RSMcdm z@Z{S!B#~e3w>FG>3}T^vVKwZq8OOVVF?q}# zK7ESEtno8J%*(r`K8mdV_Cid!2e*Y`HB&M|FaCS;4O9<*2K>qs%MH3hJ+hjMdGrXH z?W!wQQ<;~aFJsqo@}BP7V)%!?|CdBh&_(mLRrzL=z$)$Jxb(HsLH1cZdl6Q`e+GHj z7YLaCYmneTn){*JEZV&!p|^X9{^#?5_-6-RiJL3MH8(d8hK7bFMo5-HAnoqhwz!3% zjJGf=gqZ4{O4p(I=-g)b0~_M?&NQDnT29@!zDJ}p+%7PgAc zK4^GG@=W@#4ZmXr`HDX4xQL9Lzq>d()Oese1tFkXi&K)KpEqZK#estO zNx|(xKGIR*z=#Oqt(+~uCv^Vqfmj^#1F|93^$1COuF1B@+WjSVcuwj8J8BVi*La)&$0`o2S3-a^B4$bVk zqg@sFwoOOW-FWT9-xWmMI0h^IKgSTI1XS}9*ksZOf<*x~9FqAX%k0YUHe|oA7*}`< zQX?l=jnBsbA7 zOU&f1T`UvvOLZRj)E+i;C1{qncCeRuNY4x$=4Xj{QJw>{*1_U489aRsLDq{^5*otP zAYHqe+X!`k`Nc}R4!P+7tOYj>TR?g8^ zJcSigPaw1#bV;~82itEoY1lSqL3pzCPceI;@$Zc6NOK-3%$Bxz6zmoch_OYVF>qOU z1QW1xG`Gr)6SF|&yzZ|_QzhMTUGzvoulZL|~Hz4ntXF{&sU@q*|z25Apx>VQdUNLHcv%4WF2VLk?JTZ>uPm*x{f*nZO>AmK+ihQ0N4sBf5QzW($CXCq7%yaD{Yuxv^6`g8qad5#g4-5;3Ylr79@kk>xUzTqZv!i(UF5EA)Z(81L$;pei^b z5j*buWQNu#dB+`%*9d7pETm%j^BQg4v&E-fJ{mV|dvJ&J zPTOl0*OXu~lw9wMs0xIj$WgZEUdQa1IPKBQ{!8 zYcn##=4~GPJXsX8MkB;vDM`1_he}1Ol4#l7!?Q==99_C#KdI>3`iP>Z zq+6!;!`4GFYmyL;pB_M1@5y&4-FEe}Ki+$tVq5iC91zV{oG#K!K>x3UkS%fcpv$OUq8<=3)amWtu$Jeh=_CWT({oULu$E z(hCoZH6YL-WGm#Yu9Iq)w|QTz-KhH#^pLSat;>59=+mWtbiRYRUWIrAi`|%kGY8@j zt8N0J{fXR>(^lr0E9Jv<_}u{e2&)HHUgM;a1eeHNL(HuVeV-m8<$WY3_v_D)|B3kfY` zcXYK$O9m=5+Wf-tfk|Nat+>kNN!RP3xF<5+yD7P4pO@Wt9&^pK7bdzd1zeu!=4|m8 z9~nIzF>Le&^&SFGbC*ljB;6IVa&dbuSl9X%QESH+GboS3SL7sa>a}A|-hhh`4UudxiSl^H zCGg%uwZx4h1_^yKdmN&L7zf3?ZviR6A0H;6A1K^y+^+cgTTnKx1JX%LhNm#@o23=GSLXJ+Yt;bp$_dT)4si%89|1Up8n#(>wvT_Fg)>}>o zyQx>#iumj>&`~)v9k)S>qR-CGdQT6xxOjklqRS05ecwYsJ2x<=hgT@H*mYRKciP8DKvU9aCUm!vm zOh-$5wobi;5d&c71P_TqepQZqXDHnB`XTW5Ff_U+WWf_csH{d>jUSju`{%P>s;_{&yF# zTLz8Js~?S!R2!mOnhJ{ppjTl9(OZ?t;tP2J7&dfBB5>WH+0lCKiaTy!zn9-h6s8JO z&-={@X`d>42RwP?S@{aEftrO^$)1^B3QT(%ISk$0BEgLN!Y(;$cH$@>) z@X)D5KXdmKD|1FI+B&Imz*B<3#&a-Zr~ld3wZjvUB+u!qk<)-+wia147nzY$w(RSY z0Vuj=x2OXNd@=SSct@z3-G#!eQJ!G&AfyZ7eV=w1(x@$UMj4PKM%KxQ60OJxa8qQLrmy2 z@(H~wJRs1Tlfm6t5M}rABz>Uvm9AG6J)&L>VfiN30rtsJ>Yl(u!yMn$My{OjWEIypw8>|yHt{N7 zYDU{~hs&j|z6H9Y`4Lky{vB6IvMa$Eua_HbZ_0rjE3`IPLHN_yskcB-JW#@ZUQ(J4 zo&wM~k<3>qY#6?GsrUgRij>grFUf4S@W8gp6vWhUv z1rjO)BcBaR27O4XdkgcWfLtGWx>!K*j~&G%~m+I4!`6nCR8(^;<4G zqa9#T&OrSJ`ZV+);3Lc~lXx#bXzZ(o50UzlLwaP(F@YqMd5TAWWal~3WZE4CfEPKB zf$$c$n7}HRHs{CDuzKe_uDRHsy7gK)74LGq^3U2U4T*V)`Ot-lOUxjK)ZYtusud_# zTjVnkM{K=jkmGMbO7PSaHXXOH46C5!ja3`|-aMF_;B~5q^nNSXw%~pOFc=-UO*@eP z&O3okHSoKV5ALu=?`>6-aPX^jgTz*wFfY+^QV44eo@d8I^!kh7VNl&W{Y*6UeVhST zA@yA!=8;qZ&n-D{$VHHsqrlHzL1Z(L3iv#H#v_S+>$w`c zuUu*(x%UFVhq$H{RFcxs$98-eBQw%N9g%Hf8=S{v?8L9Z>;k6j7I)%}_#FuF%xvNe}2|3$EZ~$lt!m&LoBl)jVxCof_s%x{IIv<{3)a zBJizeGcew$T$8}B(nTW^)OMgx22K5Q)Ev4sXD>fFN}DuEH#1*3b1C2>7!u@2X?|$! z`74i6@?@po>if0zuF+BVO2^mQCb98QZ%(@7kow!IPLd7`A-nNtM=}TQ=SU*eaz^QO z`>Iu*+s3hH*?JY#%p}H2u&<%=_liQ6rJ=YF$E`DaTP>>eYH^EwmQx_&M;j%U` z;_q-|r>7jC3-w?m>Y5w)@ThE@xR6rtd zcS3#O=dAB#apvR#*E@x?&U+HvNrerK4liJICWcgOh3SPN?bTydT%pfXLwTvzv-P5H zea^8904$pZQ|CldiCaZwD#yjzS3Z#I{7mm%c$Q#Jo`~*k;N>3@ z{<8ljtDZOXuXQZB6%2<_i-s@74>b^qgCOrA%ha-s+-u+bX;dgbE0w1k>6G2E9&nRi*B_JBYj=2DPw$Ty56fY-OX}}Kh0D${EY8W zmvp2sGd!lPGO9=d09_zvBnBDsG$EcM6z4%rrezu4+trA?PdIGe9KB+czrX%uZjH+h zNC5xdcAGq&_MDaJj6be25O^5K3@_?_pCxlyrqvV*e1p7eh-y}^lQ~d%iuGUq?ScfDkW*%yqtc5k=4v9*MNbS zeDI#n!gKWxS&xHfrezewRrxURBCjglW~h_N(d1-V0<^T+^L_PXTi?ypj>VljD>0@@cE;5#6+4P4?~S1oVdjn{zDiF8I4gu{i z`3EP1!5zGl5p2e>?&32HIUK6Gn}v8-FCSpG<5(<2Xo~XJ>{(SrES&ywGcut5`)RX)M4ro zdO(8~*~I`1ju>>z$u(O3_2$dmswLkun^E%scxx%DZ52;wclmlTWxqhVC07+3GAv(~V(Wk8|BQ8Ob1aSQkCkcjh!)~GO(%cavxr`!B_Y<%3eeb4ZG4kA<<{!ZX zZ8P151Xl#gR;r6Db9Pdl)h)<-dCSC9yua84Zs(5k!b1NDN*o*klh8U3EVCpQRT#i~ z9f&Tbi!WSK#|xvE_d)^w*9C_Ume;8Bo;@cM-+M9Tc6~WD7ldE#hRsIVt{3~e`v7PM zg7zrtYyvwDS1=BMXSp3S*Ft2j8pSvJ*%q6ncDgC1#$Ic^6&kUoM~Se=u1o7XkY1jA zobXSLa+K{Go3_sJJz&J!gP3@AOtD>rwu_SWt$2}dxiUkUA9(qry(g!%mFdSXY1U)K z#P(A7d^;{l`|_%oMHww0>fnR33V^RtgJKu9{1C5wq8F$$k0c(h3!kxHt({n-+GSo{ zuQk4eAs_8>-7V^34+GwPqY?+RlgEPePe$Uui}4BvP9+rO{5h0m!LrR8;;BS%+i!B8 zWDCXjTFB9wd^#BsXf?6D54xYW2f%@q0l@?lI#rz#%--~3AoVXu#4)7R4O zA22R^1gkA|WRl->X>6t|eN`Z0c{nIO_gme%m{WY~5%;+BDtzxT;Ocd{gb1WA(V(xC zstBV=;`2)>VA9W{GmU?7Sso%Ad(`N_*gha8t#TbHmnt}g`}nj_*GJfa4?=YtcN}-s zrES3~c)?@tE){^{_Y=gP)&7&+Z~X|(pTs+Gnj<#oo*a=_MNMa z1OjZ>Hc%lDB2qxQL32)RL6dV3!4B{7O9L#QIwrySDIZ97vm#nn{X|eW!D8BZ!{*p5 zC+4@g!(b;|@BEF^T((iCizUn>jOURWxDG?O94CR2Jo;kpRnKkk+h0kA1rtL$>IHLE zKrJD<*JF`aBweaZGjqST>pM`nexJ|L#if;Dq>L52bDqo4dD0zQCFK>taAPqD91G9M zrC18(Rgdm|GWm|vnV!eh6e_fpZ;s8yP>KTD1{v^nbyZp)3(?p3t4H;`*5$-%;wny* zcbW|)eH{+2g?Bbm_JEc?aCd_5*}uwO!MO68DOTYR0~gE~k#)toKB5jfC}r^D=d^?^ zR)f$F@bB{8QMg`jdjuu4C2M%t_fyUs1#umc*x);Cg`R=hWGzF&$u)MD)7o@PzvneT z97(LARfPBN^klu*!^PIS7dh!?QgvsM`?w(@3x!mI6DR(#KI!5diEH1P^}DQiP7tXm zY#DCczuRd?t3?nY@7HzSfX#od3m=cNtLoco0s=t8_|o5IFyfLkS0sGTR8bQ?l||hc z@opNsm3^AuGhA!8^>zUrjkdFex^k8+fP^IVVnDYjIlN9j{!+yWZ|$Ao2Uz*DTWd~9 zy8D{CnQL`I+Vu+WYOFjnCpTz=pBlDrse|pH)5Jf!6-z2E8L$m~gmHY#{Z)1Bwo2>w z{mbnLim8?dBhg18UU~AoZom~jVc|q{=zGbIG39L5)rhNmpz@g*<2|@mc}l~Q8Z5J> zzE^xZ4ufpaZ4_XS)o>zDeA_V*Ro{!z(^*OVQT9uPuk#`gUwnw}C{Vn!It?Hf$n4gH zTO-8QDwccHiZb{qj17-N&1kb3!Xw^7Pqh-y4HG8v?V5K#ehR{uQo99l4kYDyPU>9bddI@Xy# zGlSBTysTKRn|a78|8$xMZlSxUa%Nc#fFB9x#8(i2NI#8NQDA2AWTd+aaJ$s#PRW*C z@Kv26r_uSwAj7UC;y7vdK8=yWnem_#mLUd*n8V1FM^dWTc997b(#}kJvb&V&IL}3d z3&QdHff^&@Zuy~i#8wj96d=^&&k-u+$aY7TTT3Qv1&e`dEPvmujV@A9IX~us>YB{%o;V?D-GQ_tG%aA z$+}q7o+MOiEQ}ppR7+W96Z#eVye}EG1d^%|DFALUUtJZJXVMqnL2wJIswi2;Pcl5DIJ=Oq)x!ng> zE&wHGUdlFPu)>P~(mu7EUiw|g6C{b?MA}A<&g*qXVzxGF;Ia-2)XKQ)eIG!sxYFiD z_%%&Y~k=>E}#H{c zZ2HU&;><4~$`OL@#EEV0RM6tZ#Hl>W%0>M)taph8%fd2|jSgV{t?k-4@#DQNF~=ly zFH!J*M$TL*Gvk`S?C#^}qgvUjRMOLU%X58=QLntQ98XB)XN!FE)X|LhBCRy-mgPzI zAZxGVb3i^0R$ykNW7}H?$9Y;r29SqKOH#Yek{__T6Veb;C~_VAB)!`nN5X|DrsQ}1 zQDrPJYq3OY=_n3#I5uoTWy8TtQg+w&=+LmRo&?1;!5v;g=A8^T}eaDrf8R z>YSN-J>6%^M7e(0A=sf{&dOX+pSlm;I3C^C@)nAS^oZ9g;G~7=W$^=*w~OVv)9d8< zc0O(ib##O--(tUIQRvUzfqvt-O>Ra65oKS_Y2Ow&su|V$tcn&@hCUhgG^_4)sK5xZ ziLcyOVhmNs%qjbA$umVNreXyRDNI$tovRe?EU~s0t#VgIrSY5N@p+vLOmBW}5baN{ zwl}!UH!wQYJ~}hZ&P!VI2>Zjz_7u1Y=Aj_D6|QN88<)(miyIgX&`6(_OhAK)NdllA zB*>1D?FC&w>t(;i(LMAPY&PiOwYh^(r$qIxNa{BUTFiL;QGZ;3(W3j0+n;78&4-20 z!bYwl?}`>*F}r(S{26yN3_#7>$&>nM62qsEh1$xcT-hhYxlB+b?~LL3x7SYB9N>@Q za&sp9Z_JoNrhA8!fx zLc~Q3VqJZrCx}l&RR7q^WwpQ?I<_kN9oks@<74oCIF(=xDUwP^pme^F(r$kxVlw@$ z>}OT*GS$!-WTd8uD4Z)+_7c(Dw$qF}9y}qIeZWo5Y#;Nfu8sKz06Or&?)z#D(*-lq zW$b?N7NTCsXU)jx4$cl4L$}in+ROuAtg}O@1D@TpWILdCa?Vnv{_=X$n;B9m#~MFH z6HHBkJGZ-feMgfT>s=VlXop`OOQ~lJACCFZ%77>ZlTfdi9aDsB@l9$Rg&qhBm9)7` zHM*?h#ecnj(+J<0Yd+fY_5pW2gk}?5C88;HzdhDWqp`R7#nDh{Y7~|}#_b5BE55jz zvo;RAJu2FnlW<#t0A2)4{@i+SkeTNV?xIBZmDcR}9F1y#WK}WJf2oVrFLVdQQ1hv; zSu=wP=uob?`CB<5g+AAV+K_|sY>o8ytB*oTM22`?sYRd>10oe+q4=cW`^jiL8!iOy zazaS#YH^9kw%_iY%)c&QhqA`Br`8s@Q!!@pXLiJV4qs-LL0AQ5=)2DOnvQv!!cNX) zn9YqRrsTtdIMd=jg*}hQ@k+-oxZ|0WVv!O!LC@&`3v=y2ZY)sQe+}f?CMc6)Tm*D& zaCQV~xqPsS8MCaI;tS>V`RnV<*y2}~Ots1L?x>Hxyw})O^$#D~gik-8)(7(rb@$i1 z;6f4KeOnxIAV9ODSrAN;I5*vd&?JxJOZ@qI4)kuLW z%RyLEhov?AP~DF?vP!WubW%7WO-lfaD-LSVEP4S5l4XHE4uA80D2<=3WV97(KHN)r zPdM4J>>O=9$&-?j&^l()zKU0e#Z#>Cm~k(Gggx zh5vf`$8)rfB>v(VmecPd)71*Vv{XNafBc9x+cDKswNL?LD1)Dy@8nmxsU${_&)lZ` zT&iIm(lh;5kD`BXbLgNi)#M%KXs5jD>(@1lS2RD75*}Z%r2D4hauUE;DY5Qbf%`ww z;~&eVdh|tNv*ssjK;AWktO>U8EKLqZ7crU?8MU7T4 z$N!Bc`gI7fqcZ5HHS@GlWZv|w&%YG08oA!E$tgx<nxt!kbV&z zqRKFm);FG^504R+Djvbfik}Nb#2j9%OV8Ky7T>Uad>^=*-SUtWt}zLh82(;+fKUEZjt@+ z$h32|_1?rr;<}q&jpO)(qsfb~#cO^y#vUPNPmSChJ(%4L=wZ#ll`;+k)jK*sb(?xq z<>kD?PN!u8rt-;rb6WGh#o|F$ET09pg7Mpc)1Q-3I%6BENvx<$(^y<>#KGsynOQ6f zC1h=)7PJ~#!6lQKoBwq{iBF@}@Vv@b$(oEiGRqy7g!mHV4;i^0dILgz!vA`Gak0e) zT}t9>)$suNP3wbfuP?7FMnug`d)IF!_IVAmiHMdr3-gdgP3cn?(8+518Ws;19*BiKu`XX>aV&x=s!V^>LeE$2rfxUPBvb5UA|46nT zWKry#JzqMej`rw>we;4xPnGMhK7Yv5r^#Fp;mzAd@av&{cnKsUPOD#89~;Yd*&(drORx7kUXidcRyS*~^hr0!;qM8+NJr9M|vR zbfnX`f`fX~@VZc1{|Ex^XbjrNUw_5lCx@V3j*z|UM{)T) zbzfrS>XD_fb1rrz6)TA%m4&TBuabo$N%@fS%%y&|Gfd_e)rF~)_~cCQ^-G7vj^>fK z?}V=Pvwi26Tc9nuG64;?SL3+{w&v5;;-HC~H)jVM0Z4YQnU|M#`ZJ@gMX08v7o~A* zXIHO>O|F3U<}9FSRClS0Q`RNd*Jft;P{#dQKU(KIh}tr#bCH)MGCaZ(OO%+;Qq9JW<7D(tZY6Op?u| zJ;SuJ2j$Zemzn!=guVo?Z<}aO;$lbhHvyEG^tgQ4jSv;aRbNJPPVz?A3#UA{=ZR3X1~|Cs(AlWMc%;X&?Hne~NK^^zlk`mq}9 z=anKhEG^@(n=H{;(uc>fLUe|rv#*E}OM10Pq>_p9h6!94p{Rz*?#R*dPaIcMk3B0; zP^5~_p7iWB(^u0TpF9(5(D2sq!XxS=`{ejgU2AJ2Z=3wA?nLHb36R1BkZD9 z;>>iM0`=IHyD)Y?o4Tk(1bby6elM^OSI}IMh9-Zr*eT3p^~sY)cVCyG=tbp>b@q8u zf3XCo0+)GHe+7R3fO?y3_hlSAGVvQ1%9>q%{cve}!jZ4_m;_Si;0LhSO#dBTIoYPvkmI&WBHroh~#@G6Dc&`$W)kM zPov1m#>Q$9Aoq0S%y{uUa!qXg*fG=LhjhB;;(k>A*dDL zD^)+M*dMS!N8!VI#(xrQq$R|5b zx_W5RcHt-Iy*SyHZ-GOxyF2+ni6E`Vt$>I~<2oNshQ4N2lX$AqmrA$6R7MmYthFFPM zc%|h22nYz+Ny!#lS=evtsc>$1nsFuq5y9<$Gb_C4)p0z}Fr+MOR8-)7F_oh^`32&&i@B`H4gY2gM;!p_}-KAQ6Z>mL=p!9{VlwlJrC zQ*3WPIcNt3;1ilxN}W^vTRD2dGW1(X-+uy1JQcZ0b=OeF!cw-kdASkVrv9#d2FiZl zb?#As`eIIg)A!qtFLy$DqBSKqm==HHed|e>QP6Ay8nrK1 zs@`j(q3U??cR45pFBif4OP9y5^E9ryr`q%D$!>P9W{LkNF`O4nmDsS~XS=$ptnm4f z>q4CW#x7slsC{)d!yHhi9IAg>RW=pcp1MVp!_SaU*tvI9ew`616k*!%*8pwhAcAX| z25hG4V!G5_R_gcXwS+$*QIPn9qLkXt5l8&NB#l1?EfhY%7E8U;Hi~`V7{zyB;D@5` zv8&n(_&28T3dG{|d~$oq_T5cG3I;~d`Va=%_N;34D1-`LsC8k^ha*WvhTvz;E*pQ4DzLHc$UKm$Z%_@15JMo2APm}WCqu=;=#ZOdl+0YVm4j}QxyS;P$jwg9q zYfC9^^txGL)0-Y{G?o(bH~T}AEUVyyo?URhp8XMUSGakLFTja!{TheKYxzr9-`80h zrwJHdvU@$9-084|eevD>V^-QbeY-7?`KXf-!!t(g=3RY74_|lF7z4p5N18tdm!Q!gLB)qMZCqkao{k{fUX~^M-oquOQY!yF$0b7GbGA)E`2b8hfz+p(=ao=0ACg$+vQ(-Y&HeVI%dgi&_DG$oFuG zPX+;EYM^b*IoNq5{rd+R^b@nQvlA?DQpMY~LNVIcvF6&bvPvbZPIxHBk=*E-SH$ZW|CwQodm@X(#Lbz01kxHD9?-wpkyo=_E)C?KwIM%|}D$#+gEX4Sw{%@d3s z{QaWVs0&i54RLd6*9prOU8)i+OBIWKJ|HIX3MF>jVEn|eLF_DyeN9QG1LR@oAobK0 z7WF?0^#8-vdxtgk1>M3ZDj-T#Kzc`|ccgB@4fGRzJK#1IVXG1nLV>+t(C4mfIi!}9ZME#FjUBr5p()H;K~z% z3yeb?X^-w?a-J*Sh26HnM1oz!YJiam^ zm8&1e3r(8c|4Yo8O@Q3x1PD{i9;!c!pxJu-X|!80@y+z)%6>Irb@r@K224};+WZpd zYJwr>IlYn*qnD-}t2DgH%sr)@yJF;&4R|M-(i|B$X^8Cpg=I@SfAEFB_XO7^oUunL zR_bys8x?(Z$?ZK|nET!2)HQbZ@+bkQ_?s7;apeI^@wJ=XaW$h6%uOiyWt`ZJ=Cz{d z5lmI;!UbWbhheGvceH*_d)F6JeM*ijGhD~A5 z)R%^<+d>HfvM)&8kR)+Oe|U502$0h*o8IMnTy~LF($CdpaU@A>ji1a*mI`u#M_?l1 z3x#m66XeSE+ZvO}QU0+UW=6G~?SfM>Sf?99Gn zZ)2nY=0Ge7%RT0V-$#Afyo{?avdIXLqSCMcH9n%YR@6wVUGa9nw0(j!bUL_q0Bk89 zDiR4PZ(q(pf@PhGud#u4@k#h7$CII8@*c~KZ1WH{xw(vf! zea3OfQ@rTWIsMrQTOj)Sr82=|@gFM1ml2sEV;>yn4AOLA1IAl-kpvr+lvAO9S)qm# zMNJf@Qi6B1_a)1@Nm#Hyjg~4VKsF}gt;1`rF7N!o!a%r}!?5-JU0os&Xnf70byE4& zUQ$sdaC#vLT}JE=E>~7FP>=;G@Bsgoc?qM`rE%SM%I&sZo%|HrHI*_cQYj5y{|l3o zqsV*d8o)B@_^u|&mA7+4>cQw7I)|MS;Er|)bk!&T;0blJD-BF0gsF`+b=P7RhNN%zsnD{<7S94D?#DlP z^k*u2bs$%4NWa}7UC-TYd{$c=$y>;z^z2iwAk_ms>Zwqr_+=9cu%uCIas`+!1CX`E z&lz|?P5b|}E{vp?KX+F6`W0@s)+Q2_>|v+=X+;yfZ*^{7l%)0uzB{(k{CDnH`VE%e ze}u%O<}QUawe6O|o=>05aH>{8?!H~gXLdHgd_JsokWj5BOqH_ru!+p7DT2>o`_2j%xl2=L2bgK{+(CBL=|1urrf6@uthe*da=?vWjKUv-jrYP^mED@Cjxte zWjMvXpGpcW#TCD)?&9${fDYDIBa)u+b-4bJ!fB#oJKfPK(F$Tc6h%^#Gt@kRQ=Bp1 zPuz{`d6`iY#-rWG5m2MhVV@tEyd{cc1^qG6lk-H2884QkQ4p_K1TG$4*OYxRq+wQ8 z#py4+1M?T&-%)M8=Z?~P_XWF=f}83Y93?KQ`0j+9YEr~1Oj-M7dVK`zNKdFMg*xZ; zJPFLo>SRnu>N(kWS5qZVXSY?S|G;luEGJ zQP#778lk#}-n`j`;<>>(LxR#sNd*}I6+&wAbyt~kd>j;3U6?uA#XYEMMF8%Eph8zyGaO)u~*@4QzhTNz4mhI@hml6@vY|GpIv45 z-@a#up&L(@<{zW6Ex zidoxiZnZ4;)ojxUIzz}-q8G2=Q}$YNzmFQfM7yG7D`6i9m~T8+;P+Y-A0T{lrcEo} zik$}tS+G;aPO^5fZ#NR1@ujo&Y$o&MsN=_{r}8v#HB(-QrIHXbH8WjUVv*-bSd=E- z5t5*QL9rCehB-iU^Yf@Sd_3VdCxBsd@lG$0znMHC0YeE9wynJaz!t?v0CjDm=|2Ky zsm8Ee(85xLILsyLBMp-#sfIo&!@KXOK7p)z*7*GJg0E{Dosal8sGs+x5{0rx>K@h+ z%UZk&U3wtx`>L>EyBiyL9TpyHZpA*_^(41TW36)CPLl#uX&~50?wgI)1dCNzL>ad zla2>2BmW32ciyMdZVvh6O-z4tdRx(<7rJvP4QJ$ob}BL6ZV zC@+_UC58en7rZ4JaJ*se^_XXZSnu88&&ks<7VL5@iNfgNLX&+Cf)V>AdgO_5L?!g1 zHAXV*VEjZ`{2j0LqeKudB6srZeh3)e(A*yCDz8FDTaM+$*iQixPimMHveDZ7(NR&& z)Zk28YbN?l2EG^LvLn4z-R4a=2Z@5}{&w7Q{+{$Y^YL6kocmyFH_NYZt#7*5&2>KF zm*V;V#rQLXQekk^D_~MJgUb?`h+b!`?kF+xbQWKaV(AtS4a+ z-XqP%!VP{&zD1d0)b~x1BbbpGOUxongYM zOYdym{tEdWJdN;N+7GGziv_aV!J`)uFrEg7S%7`$qD>RSLc?q~H~%_9_l+!RoUslifK+|oFEn=P>k-6*T9kVvfR8uDHu!{2h@({ zTcnz&JAzcq@8}15q`KQwG=|=MR0)X-P+~g$J7UKQZRC@l7yI44{;K%h$HIodYH{K! zeYGYg8+xC@@um`nKKY$@?Lh}E^phXj{bhY;c%#2om-Km?x=YV-0)&ZsF>zG|DrFeF zZEWrD*q=N!O#*zc%R9flw|YZ+a5fVBAv9*SJJw|H4Fsv&Bw*?siaUuaIF%sjS`vHp zkw#WP;^LksgJT-q(*i~vOhRtYK zJolrLnxcSr>SqngpbmelNBntqNB40U+HO)1Wm>JqkD*iISE(w99+PWjy?23ec;E!y zy$r7&_ATIq`pgQaQvL~m*!X0qLULZ$KW{vgt?qr0xcnD@B^(N2%wNBN3Soa|#8lM4 zU#y+fz-r(pL`gtluTpP2o?n2qvtTQ^@1y@Gr3%J2cT4#D3KrAC4?g#H3LUeLs{aGTmoeF4n53r&%QcHLuVq|X~kdnMgMLza7?Q? zs}5h&XewJ+5`PDDrMz&wGoHR9)$6P2* z*H8F7LJSm~lT{%Gs~;$|o~m0901M_he7c>5W7e7|>)%OUi`9*8|J&r6P4p6coEaPs z2dF>GM#LkMYP=GsXc@2Kc$cy71mlUIi1)`Hs#Ba{=d>*K44gkGIzE%ZMM>V7Aur&_ zK03}rqidPD1@B{rzTguf@OOyRoN5+1FA?{ z&q>37!$e?w&-pYVg;&yia^z1bQITawtbi)ya(G#`pTBiZY?fSd>meVNNb93zK~9(z zYnh_ADwjd%$ZS-O5K@PxkUD5qJ%X&5DGbe;B-|Fkw?VrcWB)>^-1(H$ZI`W=@sXMk za8ycCn9Sku`e#}d{~Tis+b?PEAiI?waE7-IkSK!lMnU^SfP=s`vyTp;8P~rhV$qk9 zH?4zF+fb~}u-7uG{YXasc=)DaGT}pU#4IP2c?1)%bwp3rEv>rm>X&tlyL)I+D$}ay z!9~076(4^{1duwXqBSqV)3s`(p%(MoyhPQK*+TYrIG`iG28td83+%I_Yg!K?|9>;J zDeEoELVy4ZRZ0R0mzABoS>czK5OA~%Y7`Tih^~u0(+t3Ow+ORbYX%ik=kVYdVgmgl zt$v-k5GU~xkyfsWnq6((yiZQcyrB&CZe+tWr;#8F-vOk2^Uf(2#7(d7ib5*(6D;vw z3fq(xExjjQddTu#MQL9a zwAex>C`o>+X2dAKV7KrUbDN}@kZLi*$i3?Oq}Ms?P@@?nVD*}jn8JzD{7@D$_yIlQ zZIiWO%gCNY_`FYt4G-W1r+*ZMnu%RX2(7IhM-?pbl!VjlYz~Qn`UD;vQ1_H)Yur*A zH*Y9`?I{dd>*icC-uVcE-4;y3ysgG#y9MjEG^YbS<)0{fp7)Mtpu38$LNo+pP8ch` zKYp(%?8EI&f{l*tZ)(!9#BW}C(EY{yM0GhO{G0}>deJ(73CxsWFKvA|VuoLL6hRW5VR}Ms*~(gYDDalRqcBLW~B#KmIr@U z10g&$XAB@78s5jfB*?Ho((O(QJuO_loxES?C+|R#>vg*?D<#7`YDrek-`$6djRtZ|N~l<kcp-Eso*bzDXdWx$dn) zK|r9X)*awJcNj} zjui03IU}6F;bS9Jim|>xJ=2r9R;8c@(HgSl+-3z37s0+V2u_h#5<}xlSMc*o9Dt*! z%UmA5^tDu{oj#0Qx+5Y#VfDWASI}X;=af|3a!0T^yTaS;=PLB2!P(Z2OW@Zl&V?Lq z08kD8M=)cu7Zy6C)v5tTE-dvj6xwQkix{fKsJfhfsCk5s`KbOa^j2J#)STe9sTu4u zY@K3v2U6almUtg-6(nZj6rP3>us*!G-{qefX6+&roCNn(<$Q~4iqm4W4TR;@n5|_N z6By?B$C^`mPpm3{7i=vm+tN}t!`{DRuo>ACk|muY`ptgiSrTZuovdrmNyi5KMCHWm ziD%6-wlYuJ#4{a$+x4q>bF_Ra&)kR`B3VNA_b9f z`dHC8@_qM;G=z?AkXwDaNuKT1YE)+AOV+XkJ3}WjBehCV70&xF&iwpNDLl8?`b#ZB zw-S8Pkp@)P(#nsm0&Z1Vrf4O2NInvzeRTFN+l67*ZFcx1f^l53R6{oM!e+hbFq(tuewZ7^- z7~oM%sCOxVxtYw`e{2+q!-2ZK|M5aFy6h{FJJ}k(aQEm}&$~%SU5}$j7|UIyHfieC z5AEk*`Zn*cf;Ud5^Fv7sdmH*DQdDM4WkzJcqhCZ$)Wgs|596VYQvg7>4P=x;*j=-n zH4=l1}mU72`X1Ql!`gZTHimg6x zE3X&o9^P8_#)=mF9YD06eH@*b*O`K$I#_p%2Hg9<0*O6|C-s7Ww zSkt%tuYmx%vmLP3=vwKmFhRF_O)UlRoV&@qbRp$bjKNBOVn)JgnUZ?$8x^#>+x62; zP?JhoXjU}6-!6OmexC#AfK{@+76l!Tzi!`r)XM&Aynj&L)v%W#pb*nPu-^g_wSjcc zC{5K(j5qm;59#MJUI=<$O+oIQRBld^epUz;{&JhfNcP=Dm7_~!m`oagp8#rKrOHSrPR zM{v04xe)xX`z`>%%&)b=p?GwpP>Ojq{8)CmEN!n?$+^)a1H*knLa^nn>_W- z_MgVy{Z>23{yS|%OQYDWs|6h67C6Nr8ZL9^8BG0Kbg(U|xpw=`Y24vzgRCys*(K0K zqdHYi-(5u{Q~RUYxe^A*9ss+vfy1iSI`T>YBs{N6JW?wjF!s1! zz@nWmal=M|YBGPLZj|;0V@u0k+dGh*F`?nw0UU?!qtS&&-^icDdrpmwN*TYyqN%Dd zb;1w`QR6`0%Ee(Cf2gFV3yvNSHMnC90?-x+8cc~%h*;b%_5=P@h1OgriCmXaoWQ5o zJMUY~))^kC0{tL>mb}-~Yz}tZ0*HZfi1uuEKVcsIEBr_t1~e~Nx>me;BRqI# zflV$x#k~S4LWRhAyble&a}M_FwZT~wl{YRi1r3cj(x4~$Of{W33!Ct7jHrbL;jB{5 zdQHYhAk7IU%Slcsc$F}Rb@J$T=N#v~CSY)6OwF2!2K)DEYSYCE67g{o^#me$PO)Zz ziQ87rg8k!=uZJ5;_h5$;qBbu}VmVZ{#^MgO4zg^1OW`LeZ`yG7cm~F`xo?XWECwGi zZIKYApuq|I%$Tt4d+q~0k_#FcDS~-++wwGtnq2?0IM;kM#g4C4ZNA$xxe<moT?}1 zcYcLR2XyCnt6(eJ-biD?z*~Z-7_;H$H06mydn@>@~RI~ffq@SlRFFQ*D=hlDp+gJUW+pg{nLU$+6#(IK_ zsonVssTs{&T07o;@O?>lHa9T&DHKNA4zzXmQYKg2jUmyaC$!c9!_2DB_LB1KHk{rU zKokjjYy@Z(w4nJ!LTbQ@d?&mRr7Qz14fF}${)h)nW^Jb-2#!PHD+wWPp4nNyO4xo) z+yXF7ARW-yHMSdFg~k4nsFh*8DPYK^f{&3<6~_Et#6L0W<%~q%nXex4=USQVCQ%?! zzp6&wI=&{+T~D3ndk`gVWy&f{1=sB4JX)r$9RD{x)&~ucaY>>_`0FOr?` zmMT{te~h=wpY1R?p!i;<4~*y%J*Rm%UlScK;kSJt9$9sBpL~Q3$!m#kPC2U4Bhade z(3c>=-L)F2-#V6Y@|P!@AZCq>V)0yRQUljDsB7P{BDy&+`G)KLU^rUQ(j|LD9Ho#1 z(zu&`YA+kWIT2k|$okylnWnJ-(VtHR+VmB{H1BKmVTmQ4V?`P(J7f4uY4WauvetUH zOr~9M>EJg-rCQ9$pi%oD@#le7+Vyr50HS*e@JNAj0JVP1AoX1I?C|e2QF%Pk-=cS& zGHU#>HQge24klo^R$ZaY?;m%nir){kU<`)65R9Rt`IFv%y6}{N2^5fo1@Ng7!yavz}s&Tds zN)X)4<_<&OA#$r%tEa+dcrkqZwT+#m2t%U;*(h21x!4!fVc)F}QRbXbKQ& z?1K*b>|rTjkY?o%-mUsowy3eP6vM~*Z;S4BlZT1B0qQPVq-ag=sx7YA_5rXy5-;co z1ct0;9TUsG+;{2vBQfOVRB+Z{LJ_jA2p+CWY>HoI4;QzFFBi9L&%vUVz{lVT=7bw! z=gNH?9p?&$30-$ENu)?oHNYakd(#dg%#VeA;+Tzeo4;TfdkT8qTA^*@+WzX_DOp|wbTF0URG)sw)rD<}DfpSlxw)_b zG8xQn5mFgklVbE3d3?k=`*H51umY)!t!zEu-q}`Wg=V^MCKW}ZsStq{c7YxzbTi;aD*ALXceTQA3RP!`ih!EEM`%Ufh=jh#~ z4eKjQ^pl!)c8&ng_%8qO$h7}T5+$DhX#7Pw{y+D118m=o^!_0rA3nKxqHbf`wywFK z%!HhVsoq6SFVNZw)jx7HWW=Ib=Wis*1!K{ULZ5?)Ka7J|q6#(E7TxYUho^WAM59sn zHpN(OKbs0Lwobg$i_n;;_kER{i=5A(FxjB<$RI}6-5!nCBp`oLS#z3M-Q&<;iD7Rq zsN^u(s-zd4n&yH8fuUZVBTQB&_8OPw+w>tLzX`k{UsUGoUcEnO{7V6e#{xhD+`bZ= z?4o_3*sTr#V?)at*X;7Cf%)zBvU-tr!=HzF4VVwhTk2ml%`=Og4%RhHeP|#z z`~HjV9@`^Ov7D({(gh~rQK{A6jhyB;C;m&?ySE$<7_lx4VQ?~vQb-&TcYus^Wy0?K z{Oi-iK(6;>)u>}>(AxVa3NyOfQO_U;NB0Xx4dhZ?V*Y+9{kHtTa%=2rH}aEnvsD}M z&gDhlnEv!`uI$|OeMBU6Mvv5Q2)rFt)6QGDRziu9#i8Gp9ATNtPsup@4i=N7ebflm zTfKk=2m9~I3BS``rNVg+3~Ow=ke+@soS2sR3-SIi!6hrRQFR}%MRHt?sq)l?=?BbekoF@CSM0gT>t z8{||rHf+1_{~H{>4ZI~HFHm#8qlKlH=Z6DDwhVeEy-$q{|5ljq@xwLXI^XdHl&abu zkmJp<-oCKePN8mA>@aP7&yH}PZV)P87&e0CG-DP}89(3!%Uy+@Z!Os=y7X?eAGbJA z1@Opk9bILtP`>DX5LU&iYg|u;I4vhT`qo?z_`6l=xUEh;)8Mnp zcK{PoDraC6=-q5wrhgtUoGhunain z6bP$gOM}KWQIB$WBVH3lR(d!Gme?0s`uj?sBbIkx=~GI{!9WmFcG;xK)tU!Gesc3TQ2MS zD{m;O6%XYEGu)4lyibFY_g9_7pPc%LAD{;tFyE>^{s%1l&ph|#XS5g~5+YsZV6(hf z{er5UWYp`7(B^Kkx9(Co)B7wL9|s6}^s@v1u2o(pV`^rMUg^NTdw#$uG$CRw0dVD- z?+bu%l5=NWN3M}IX*WJ9wCZH|ZsGEh^}m0W`^z=pAJP(%Z!ofonqUEEc{HN+_u*VdhXC$ii;*s(xp&h{T~1#uNv@@aKsI@0QKR6mnKQeDkHKgE~djnwHtg^$Dw*- z3@9aclcr0Ke4d%h;8wUR=<sr*Dsawg=8UJN$^_#QXsP6E%M0Bw{ zqtq4aaVN&MocJYsb5e5Ed%ztC$f(!;lnd`Enj>rh-zGKioMEyM7xbD@c#U;Ts1qrG z(i@Cj+=3#m12^&KEg}AjCHV<6rE4=#{UyU>Kdi#5W=i|3yJdXWLDfg6Q>q5j-VOX4 zZUhK*C^RD*ZFMg?c%${wA8d3$+%?@^_9!B#xl#bX`iX3b-kVzKKt-Um^Pk2BpqeKu zv!=SiFR1O@igi@MLAJqhj2dSzh$@(pKkn%O9nf{$>Iv!Xx26oPJhSrqg?A2!p{!f< zAG1SkrKt2iPm;b=@coZv4Par9Oe}<1s;dQ`e@*^rstM+AEo@bFOPqgC@pIT`M`LI? zeM1qfyA{nX_Y#-Cw=w~SXNmdIm;ssn)0SIS6C;lBp1{biB*Ocu?YW&C16uCf5C;ZFa0Kme| zubiB7%G zu^*4_d93D$|5D(CRvTuXUlknvm{9k{ccJ65Rt|VDS<1hNHTmC&wdDbHQ@W!3!C!#~ zTwcu~OE5tA|5-R76xBZPNbSa`$^cqaB=E(U`Iy2qjB=E=?`->ZPyh=Rmi(P{fR~6C z8`8H#6;&uMd%Z*xFgsw28(eWsU?2^kj55^QaLiAaqH03IO{lMfeEt68>B8+2AKCK` zZhGg({(~2cGOR&Ac%LDYyIMuupbgS${{lvXvHh&NtJVZ4lLLD@01>J-?u}fehA#l9 z|Brrx@D`BNpS+3>EL!;%Ifl9MgD+|a7$gyQ$DZ$V?Y!I z81s#_sR8<#6Q6}zR0QgGn@V_P8awndzqh0II&bfHDSC13U8clo>Cpdg8`U9AN6P3E z26mkZLj9Hvng#~0pUmoy@;^zx>zAne4kw^YSgQT13R$?Lf;J#!oZh!|aYqXd31lVu zn9X9{4fegJ2uS5vUqJx_mb7pvslF4JropybMs`;0Gne)HY4RY7al>Rq?|p&eoi7bx zCt5s8zGx|0oYRU`1T{2dqks~SdR@l`yB^i?RXkQv*{AR4;0xoai=dNtgO+kfe4oU7 zncw11g#bAr(IPeQ!lq%^5acchLsN09@5*8~i@2iYFjY!*4~u^Jt`cA)Fj_pXd{cv0 zy-tG-zxoC{UKeKn?Ne0JG`w*j=m)g%V0>(_$8_aWDEQiubwCs<7`1SRNkT_PdY$Lw zG`Y^~6*EQRtnmz-3|a<;3sxcc0Fp$m;QJwKMc_nxboLOuEOy`-DZUZWmjm z(<-vn3Yu-m@Ya#`kcniSeJ<+X-uBr?bBS+Z06iLrf7Xq{hQC$ES*9THkqhnT)d}H9o7ZrrQf<)~$iUvzFFJnsWm{o^yVDiBos1Xc>z3etg#B zkKV0#sT`!8lZmLmtM7}hf9kvR*Wmc~$o_F~lj1ANYz-|=QsC@ozwzI> zq@+llsCu2-3Qw=x_Fca1ejo5!`bx}O`G#*3y3VnztRFv%&oX;-;?X{sy(#sK zJ^dF6QGBYUpsL5MTesEN?%X8W5n*Qk6#ts=mRb$bjYJye_52bUr>~KdQd5z#q%+g)QBiZi6@Ol)pu{?SFQ? zSg`iFatRL9^EyyjmQoGk`&)Op6vKc2$Ns#sVJ19_O~PlsJft!S9#scz-WL z7(y9+^F1Q`-Xe<1AUMT&nrxv=uv=&vrFP zKn5ks1)XNSJz2agTI-Fwl6ZO>Pl?~=&obHZM;XikX^-%RAc z16-$2gZcS6i*0o|$Nq(#hu1t2(-(s5$mPAFy--KE)9b5lwkyw4AQ^B4f)8Y+PN(7? zUYZ)HltEBAC*=o0C7EOaX z`MrEtG@NJLX{zoOC3H3RK4pQ$6^va8vQ?igtos;`8Eh3zz?f&2xRpN2pfj5`v7XcU z#*n*ab7gXk`oO3ioiKGH3N&_-$cOo5J;*=uW!rB-)N+X44*@plv0D&T?Wc9#YwEqC zYJszWBYMl*k~Z!b-*W6&e~(+v_79=qQ1oId(){_B;>GDatPSjL;M>!&s4ge_q!NzJB={%W0%%KeNVqgy6qQCbgL1`w(`ePM9sY8UVdsnm-=-~11a*j(zD7B@?yXmNY~`2^!x z+S}Zlm=c9*mn7wa$X(MxoE83A>xX)!7mt+OavJY)36(~HOn!*`PPXrUjwZSCRio5h z5o^g6ZF+(Vz)iOd1+y_=e?EWF`!!@Tjev{q!t>Q(L*~Jl&8K>G^ZwHPQEn6sMbwFj zh}9;S_A9=9hLqzyU51T2cox@>ejZS$e4q0)r%2y{>y+?)!_m5_3!4%qv&N;6K3mrp$& zji``3P^J5YvMr%bWa@Gf*s+Ykj0{M>8|^=gskU>#shjdkLj^dLj;kkrDZF8E(UIL~ z)$YNkPB{`D1vkyfn+cy_;E3(52J8oQXuc7@;eA38mTzfpP(|Gh(ew#o6Mm23*V__# zWbk^hx%3}_2J1R2ZY4-vZu-Va#f@+jS9BGs026^9i2KxLv6DXhV8YhJt@5O0Hi+qx zBseQ&Jm}lWs}?MF8T0K{T5w!BRy9Z-Ugq{A29to}lx&N&s!FCkD>){|w1ROuHqVm}Pm(Q{9+;9$M~RZ^4LnLI*JM-lj(? zqH_!)F{mbA@|wtU+l>KHPI0jNL?t#WSfgC<6hWRq@){Ij>*m# zRqP`!Nt7W`YmV&>sR#oLFHPE4gC4~m&2g{x!Arf~^h-%6Lxco9&Dy&e`D;#0OYIIF z4Uh80hhHLcIeB8b{0sfg;wIC4fpMEfkfDxqgg9JoI0)sYg zqf9B3sW0NV!T^m~n{{rf3%w%*2L36vbhti(&urMkZG?jRqy@|!isBQr&9#+5&xwov zdSwB1S47Y7gE=-Y@LsLHnvuWCD&5@;h*H~KvzRg99Hy9$3^;P%V&Af zj&6PLf|?W$N!s?;4CQY@=7hS6yYrg4A7{Z#s#Eh(4_XsLLYK)pRLvcumDevmO3>3csG|qwjVsD|fb_W; z4cf1_|2R_pxdc~SKYT@!s-&JoMPZ&z0c}){(BtYDW!RVux@ zA2|zFiu}=8_hmRfGlMrc@}lIXP2dh56%VV9%O|h18Y|dS*{zQH4R5|tvVl@f1NhKU zK8v&1loz}UX5S0^)MrW{?T;@MGUB*Jx=_QAFYfYZrNMu@PMdaer%Q8*6I`}bQWpuL z6L8Xbte#>LJyBg(Z;D3c#GARz`c|hdl&ZYPcz&W3@W$%ufO*cr&6ku34!w0`jN3+;i<*?6&O@QZh9pj(K&^Y(B{@aGI}9$% zRHcyEZ6jeFoJhYz&I53;aXrG2*F=PVysR0SVMplzP8AXU@DPY(C4MFJ-pSvF8^ECk zu{2e|Khxzqe9@u=8Of&FpNi3FqKdF_N!k4DfDMOP0J{%Y+I>1+b|aF9wZhoQlRXL~ zr<;GHnv=+s1>DJ@&K}&UB)Urm>`!3o>MLe&Vf* zQ8Yr7yM5YV%6mGC8z>(C?WI1!&s5{i#fo*X6F=52dfAc?G}PV)c?#l zk7wE4e(9Md20L$!Dd}vA<2i9{OnQ+gkg%csrVHf?Tjlz~V<)@YfT%^J6zL_IgL9A) z6{a(#&iO{GW%FGb!M;#puefNd#zb39LnFU(&1+GT)-SRbAc2H{Y8R zog+IXf2_)#n(fLo ziFq!DZa4@LA6&c+QlV}MxXeto=Dx+l)3j4lQg{W_EVYDCD0Gs`Qp6UP|FG=3e#umZ z+|Lo6o%&-@^QZc6og#W3{5chAvUQKwK#XwWkFIx>M%PKl4BqcIbam|mbN0F2v-SRf z{qFXJyu9$vJltH^pg4!8jFVnO?HkTzX4$@HYS6UO*@rO*a^%MiNwjy!Y7huht3xjs zuQJt;A!>+7??2wj6!jas*A!I$`vq@4to$NJ(mugLMCu7x6A#s9C^aAUqDC1ayX|Yx zUKL=_uAUw~{RVW5UFeF{j!*GsI){sI%l=K$-z>@tFgqUi53EO;Dnq9AVMSM+wq`cC zai8qofwTJKQz#}qhiD}TBKu~cw!KpQ3ae37hyE=+UiP77cc0fF?{?*a62G&o(>qZ< z%427>EY-o67@#HjHuzf-8oBJ4+&A!2s9?^^%zW9-9fv1p&dT~F^AYKicc+WTRn1YP z?4)O=_pgBg<*`v3>@CS0P+?&ZQx6@gnccKp)-e~nTB?ygd--xCrM?}-N1S4zZro$H z`W#cQzcex6N9ibpNCVl7Xrg3Z)5im*e( zv$bvHrqUPt>ka3Uh|B5#%~O}Ufayf_ehea{p&a}8!J@-Gh$U=&TOVTop7$B&U}bt; zd;PZL&Uy05!uryw1036?qt2vJ^ZneVH1`hT1RLGV#a@l;!oSXWz9A}(9;!)7nK6k3 z(VA3dda6qNcz8gC7tZje;xNfJ&qSni&S$WCzG55QF(WWK-RL}Jqf1l&T0QUFc9;z6 z-Z-UXC=3hcyDR$PEv0#;DqF(C|2`kNoH|s`ZC1&nU;Rrh{%w!NOxf7(gX`X|#SCuq zBeA6c6U}SHp0-B6XC57@o8N7;?;T1p0AoW&LB;mM;F?=TkC$2g8HmxhUE ze=}Fy_*k(`QD^r?RNM>LyyVYpm8o3c%2S_Oq#ZLgxxgre#?{6H_A9n}g9tkkhL~^- zSG0BB<*hDT8V~N`MS}W%F$gVa!9V;A&2I=fyzBWp?5ES&Y^ir7==xMk%1@i~>2sC} zBIxijEoBd!j(hF&?65<5d?iAT)&ktEIA0JN=yzVTO9%8cH{{VBdl@e6CzH9ct`dlE zh`-jcQGC+pHg*|S`t}Rai@uf5RwEHT_@ptF(x}IKLB?9@1|I;HSsNuUZGb6ys+>uQ zU-tOT%C^*o*%i0m#K!(oTl72a2C{Kt`6I!1t6k$|pkV7=3~$IE7X3FXQmpodZtdKe zo-4J8O8#83C0rhS|dgmfM6kfsL#{u>~3Q<8T z0)fCro-nA3C^@MOr}5UHlPJb#mxXV;>)=jUW@UV`1o+MRthgM1*T8)_zb@VJ zYPHGyw2))0-c;5Hslt$P-`BF#kU*B^zw_H-IljyO);ianB})teTV@{Y*ZMT?0zm_$ zbwy=7dbC^x-9fItwC|KEL#KUq7I1aghJ2U%IG@b!4++u|&Cn-#-E^@yPrT;vF_Aip zM_iHyu~T(Lf@U9{US>()~fs1YnMclsr%+UJ$miYZI)1`rz z5ly7`Gn(9z_veYniKAuYjhyp?Qnxx2k2saem`q|3;XiHu=W||Bi0lSL|5D>>k!4A$ z#qq$t-k_XiVx#!1WZOX(3bA4x7rohjh5znkWTo+Y(Alq$XaW{|2#$1~iYkW=6u|8> z9r#CIMF~d`ERu7ffL1h)y;O!Ppl{-3zF%HmMkeuRRy&PPfdsW&*SMo|p-E?k$ zNmjhBHH@EB|1A}qLuT!hsDR*j%W6?bv8EN0GeojVgBage^(uc~9@rg*=Z|KPGML%5 zI~iQyE$K$DpF6*qu($H5>%$^J#y*a7sXlfx_W!LOkl66X%}S=l)zNk)LFCY}#$cRV z!A6<|LrVb**b3$^d9Rg1M)vrx#CTSmKd}48L;rKP^UUCfYyqQegVw~3hV;7wpCiY7 z`8jJcG39?rc>=`1=feyc3}zeqmVcugceHbjE$W=hlp!M(lEzRNL4PdT1ojw(>A*b{ zc80eb{|w(<3278{+EwmG^JUG7vy&6$Q^&pnJ5B!jsIoS+nTa+@JCwe@d^vD=B%dsF zPkel*38&s0$8`1X)m=OnGAM;>$!SdV$*kunOI4L6ji(|{Sj64;aXs+iijU# zclm9A__YHwAG^TleikFt2?C8s#{D8VjSF{dQQnW^<}by`p%YlVA6byUXyc=Rh8+K3 zTiu`Hr0BVn@+_KpcLx*@P2kH#z|xKhl0F-A#^zIMGYU!g2lw;4yM1Dls&U@%ul>6z zwc2=mJ7sI)xe9}RBv{Zr0?m&hDNk7N8Bxl^8@n^kt?PJLLs4w4EhmLRJ+Y*F@Pi^` z`KeRBQNBS496Bl+dKFC(*47$p3rD8s{b@zUp1V*&t9LSgUaga>bSuJpZ^Abd8F+*3 zaIfhQnZxJs`r&Prp?PQE0lePMhw_ zYW47cL!}5OJ8BKd{j!LPSlqCkf=z4TIz(($(nUD8CS%S-DuS78GKb!SlQ zW%swbT8n(6)VF2P)HtTAGHsH(ftHsG;umiZ(zmpBqIugmGmkSOyaOH!a#Pz5*Q&4A zFBnjc6H5(8^nN89Ua-&gd&K82Dq@XuxU)w_1pzVv85Hk5Rn#(nuHWBp8^Sx0)vKtM znqKXBP4r87jGv*&3r%K_j=zH+3r`-+|JUA||3mq<@xzriNm?Gfphuki!rA@Je z%=voieA?qfDWSCP>@E1^glchlH1n9 z!s*+QY$euy^C=JqkNl^?(*Nwb+S;++X9fyG_f2d>!Cv&BOBY*5!YCMY zmafMBXWyaPstLP@i4N4>1WTj~5%YdH)yv#t>dJJyMX~6LRmE9@N1cNwOuWw!m`1&q zf)?0wIdA|y30NWq$n0dIlp4swfBgGux1yW&m#OXj{eApW-Ol1W`>s?>zA|+Q_^R-^ zH8R<=N9l#=Xq|)YOlQjK6&m|koW==A6B0$_xmJ0hhmrmTTp(N7#L$b$0Feq$IidmrucVV_gTNi-;SZPeLc zz$<}k@UG~rqDVnc>X{ww&H`nH!0Da+GfAL*KID>UP><$(<-;B7fm-?%6r_0hjL$Cb zwwUHqkg{7pUAPr5cX#3rugb%3i)*ApY{7#yR2fu=p3dP~vJ1og**H1+*z3u>R3Z(yB5T_Lsn}|bdjW%EwM5s!|M-0>0J?e zkdCo)lTj~0b=7U$Y9IVMWT|DAOEvr>s`y?_@%#eOeK7q50V!8B9YqNhh^yJ)%nDr3 z+I|pjce|aX z?&FjD?_Og0qu5o$bH-sbv*Mr|sGb#M<`sVg#G632wu7HOKYBN%BDvsTFXs(sC)@lw zcsiaj)Y0ihd8Ww5H_Gq*Wa|V$Kcns6J~hHRpOG=!y7cmzizaK^QO#_h`%yK@93LmA zN#hsn71kGPg`q+w_G1B$&ALN89Zu|Rt)`ufEv`2qfsPSvU@aYEe~zHP&HH~zB*bfC zUDkI)ABLb@RIC>qAC4hiaIu8JnkJ)1jD;1%(wOY}DPbKR{!Xth?1hA}>_k74Hsr## zoJMKseXWqFmrnTc9kKd`KOLyWC(_8CE2||dS6{Bk0B>^LgDsU#*ma8-$V6Qbs|501 z77LywX7}&Kcl#<-UhtUxH}QAjcRoE$<@_`*di2ui88KB>iERDp06mS)!Cxc0pPFqa ziMX+5cz1SpzN#|CDu2J>`dhEYHwW5 zhGsS+#A7XPiq*-gtGVfkN15WQ&|E|J$_yTl3)T2&j)lH8^a9FtN?EWIs)bn-e1s8H zJ9ZzomT>-tR<3sxt9>oX@f_0Kz2b z)umK*D$@L4H8N}Ptl_Fg_QV|xGMPN#C+;|o;>{*= z?ua2+A zS^OP-)k&W}`bb7f^JHB^$mUIP{A#B{nvDxN#TX}__ETH@o6OkK4Xw4i;djV)qo50& znl_1HWQiGQG;kN_NcK($(F(vS4w@$&)TG3jrnglN_V~gAp`B%f_OvCg$&0~2v(3M5 zd$D|YB4blCn(Hp>SeEhRrz4JK$3Iqn7kcaG7!fvMbt^UdqefB6(m=e|o%{)QHtWKA zkRW%Gp3eL$8#D|T`$DIgn(;uofLZtW(vzYlcDAEVaPqK*Gxd1ZSy5JkqBBnDO<{wO zKPVB{19lKq!Xo7SmyDCt%s-~idPPMObf{l^FQiCl-DBGJSB6A(5w>U$b9Y!?_r4wJ zli+o#XZ;|tQNlii5;`ucbuhH4Q5HE8-;P&EANB)gW*VOvd?NPyh7y9a(St6vt?RQ= zt>dP?7mK1S&CT8Y{A`6ndZmLt#z!lP?vMYiH>J9v&j|0em1Dgn!@Kib`b>|*+hj$# zyMgIX#KL42ndWa^V=ZXiiE3h_1o~w+YbwcT?8{!aGJjr@(zbyO=(BF{vzw`=w2#ac zPd_mF-EbQMmop=Mth&>)w)i7_Gf+vW+Z$J}8>GaRTj+0du|6+TLAcS|TXVDvxnZ2k zhBtZtu??05M6h_z%&jg1h8$RVU$qYd~u*qjMrIU+HW@wuQ$#&>CHwa!j#mr9Wa$*V71H_ zBGx-;o>NijfYpxPZ8<-ywgG!}-~e2hz*Cqe>M4qVn+Fhojj7d(xt5PRgmoelV(xkD zYBYH$JzQ%Cr3FuW~x8#NOE* z1oK6cD7?C8QD8g!Vf9c#0-=1B^PFpfNYj+QRIHH-I^YM|92j%QATZ`}bw3MT{OfHZ zfCtMmdXKkL(lGl@3@dprTwKOj5^1p^DTq<#Vul5hgtyD90HQ*j95x%S3@v=Wez#Bh zX}&~sPUp~e9g*A=V_$K$9c$j&Vfyw)ZZ!NocQz10$12{glK^bcOCmptyeg^MmMBvBK!48;|4=D|9Y{Vv#&^VE^k@J;;=K$?+_a&Z&B|BI_7!{ zwE6Dpsy|)KcwQ;yyhncYvB+iDirJ+Y6UL_zGVN^|p#ixf0ufM24A}6NfJ``zn-@1B ze;c-?cII!>yo;b}&S-H0xA`@w<=8Iyi+e&|OTa#;e(48;)dWJsXDXt-BkaQq|IL08 zqsNviZmMfEo#xTD+7Qei)Y z*>-MYE5rt(P(aduSlgc9?z^cvSK16oS$E!3hq-n1qTMUqz^n$E6IpG+-Xzx0sJW`NB|Eb34cKxSy(fMQO%EFZG!!UsZ{XZ@Au#TarHPh+GKS#SdW)g31D8_7p%C| zBpG~+Q#Z$gL1)Gf--wBm;?ZnR)7Wn*6gU0|v9bvri+5g1sJdk>2KwDj#)J>0TP>Ec zz3_5xu;PF&(ghJ;0$FQv??R3yO zU$2~q*Vtmn?=?{r$+WKs;E+ul&#T605wjFyy}9#-p{q z7>%$?F_qVHi}lV{Qa1<1Tf=j=W`0AxPrBTcEK_xRvY6|VeN(cSg14HV=HX!D_L2~bk|YA20nx|p~ENCU+6_9@rX9M0j7bLGbReVXU*OAjkgb&bSWJ` zt=iS4sa856bEAs~+Le>deTo7t%)Y(Pla06F!jq1fK8cAe@eWA4F1e&(*~-~we#M?i zu+Ueh(q-KqmR_`)YdM#Z&hbqT50&*}iXGDPEt$tFFdCDp0T7R(=!g_A{s550LXkPd z#!G(1H>WvoL?kK*)!)QYgFtv!zAno6bk9y3D=ppG$xR0FeGWcP}G+XS6yCT zU)RkFAbc{9G%D(T?FL^?YylnkY+Ls-BS@&SiwIC_5oj&de>Ey?iQ<40FBo_rvqC-d za|9r!J_aj>tnnJl64C_4O?XULx?sk{cBk+R)uRbjN8Mg!&8FOhzq!4VV0`M-ip@*%iQ5B|Td#C|>jmj)zlvA7B96Mh5@YSK9ynt{U`JubGrbKTn6%KfrL05jf${zHFl|Z#F*d?ye@>a*C?H|-y z4#AzoAe^}GC7FLP*J$IK!vSgvVG>Kf&0reLREz%Bj9F-vsR*p7i_X z`YtvNI4=8&hI@SVY1#&72Rv$Jlbn|dGqklSt6;f^3Dc$=(8Qn;>+a~I#1oDP5>rX- z9h36Q7J=hB1l;FJ5r#Wi_AjOQ6LtEkZcQ!3y9zX8Zz24O@lxPRy zl8i*XEA9iXbddR8nM%OV$5S-4l?gXZWF=Q&6ysZVgW%&jo$Em6Ij^w!aojAZ*u{Xv zB!z?iQ1-B1pT<+YISjw^SrSPV9t!K7eBIpQB1cnwoY@-=R^s<`T~nSKBbBXjAzmx3 zM7o1&<03l_B={4FXW3Q2Z3h`nZ#em!W@W{ydz1I)hQzIsP~Z!XCNuJ*Sf(xl=l6x1<{{&wL!Q zn)3Ue4-`_=>@_K@C~+aV?H2jA{M@DHi44heeyOyi0iTC#l|@VPX-sHaSKV%v@kr0` zdp@UuQe09r|^TAQoIWRS?xJQR(b9evjVi>BEj!s63v`c-y=wKUTr+X_WaiM}~ZM z0lLO}aL}@x^9S*^_hn3+ThBW&DMK;j`U=fUF zj9QBCIg|H?5S8fpR2STVOP^Ya@UdElO7cXcrPNEEwZd@&y=T+Kdxoth=5vWZX90e^ znMi&tMmkV^Kgdg9dVGmgr6E%+P}r~y(B#(u>f9RerTfhTT>DL*9efen_J=~xaeaUO zz+T8^?Fl2h+fnV1rKpe>jh(gd!Ql{iQFb_``Vm}d&u!&%_%vvi+a3&qiI;Y;zzQo1 zh2ds2`Eim&*{8b9q=G8VykB!Ot{IoL-tMLTt`Xk4Lu^h|m}re`R~s^q3-E!r%m}xp zS#i8{GuJgk*l){uc$)Q|M*-y)=kvBnT>k#AOaeS?!VS$!G}IvG8wNJlVr6U~mK{%N zL9Mzan0w9y>YTch96>BwK;E!pUHs_kYCDr^$C$5}t%G{q!pIV{$(gQsG50FvCXXZ$ zXwMZD$EQ#HIc>5&QfJ#DJ3>;5aNE1XFJgEvyi=%G%Tdls6Suy~>7e+&C$MNL#VSEv zULw%w7)dR6@R_zJ7$ukI>e8>tsc$+|S#w_ul4?|Y1v zp64t5)zeph_SIOhrN)7XUEV?h57rv_pP>#89o5By-p7+wK7J~PQ48+Fr4Jp$dd_^6 ze0$s$cpX3;+t?$o4c1a`%05_~26*U6lQe)k+21V_?E8a0J{xXPUZWZCVFjN(NKjjn zXk+RuN(8u;z#o{DP1#@K*ElmlaBEmTAhfZN;=tqFQ^PL1@*_Q4aZd@5o%2e2U>c&+D80 zsKJq8zMdo(EX6PY&X#cfHgee25r}bcC<74-U*6|xQX$iGmid`mBH5ZNGS5U$A$j-6X^N9`9`O43nrhIzIU*7}0H@!~G8xgyS1n6GIDJV_3-=zVfw#G5^$ zi4|{>0D@GtJI#@(bZSkzg2U{ZO&iG;+c88XjV1nk?jb(-pw-}cZiP^!(?vX5&=euw z(ksfE)E=P_E8Z}nI{uY{5${v@5N}^lJMu#+Bjq7}e@-&RF_r ziA&EuIC+hQm=N_rnW3Z8=)>9M$km{2y@w~3@>O<9Dh^K10DwqNuw&3!k2TpRPr|ML zMhK+-Sg#R*s;I_MXwsgP#SjZI?(Z-&+o}^=dpz8UFWG3Zl&-RLCl}(rVAGOz{i5si z0rSR$|I*M)8WG~mJEHdHiWOwQNr|i=-u@zCwR4%n)HIev+{DmK%1On3il$!ZrCpPT zKxWG$Ca!Z`h;T(Pc+Y;6R8(SDAjdidoS~YyG}Lv{FWIA9CeZ#nincCBwEQXyM!jc7 zPct4ORsmLBR$jrmVRk3~90LswGh1SI!00a~d6!T#ryoS^z5R4vJb(ApUO z<^1BoQsTxv7hr`h;@Ljw8LCZ9{tj}lS94x0d=*`U_Yi}B(_X(@)JQVKqG?g>TezAiRofsi&+%VW%{>P-*4Nv%d!2vsUjZ^Hvtzf}3#&|2} z!+i8}2AA+Tm)l4o^xM+m0ceDt;qlt$#oABwMCvb**v-n$hMfne4tQwHOd8_{tLwx0 z0suxSR5@4;%J2Dx@~y8x#D=mz26b&`RVX1Ug$>lEJQ%yJMhO>Lw_?EVVh3b#YEjFe zW{5D6*aTt4N1TVhIcJ_=TU_i+o+K=(rlJ^8yXwV5_w-0>baMh_l7EH;8$9hcWJHs~%M`@FGGZNK&#L#F=N zDmP1?lX)drdhq4c|iAUA0G!# zvmf;@)N-bKqs@=`BEcC6ToZmKw>98)?4uePl_Jwqn^s8qBe@swEZ+Q!nhXaY>hIVM zwZ=oh$vW)7>b%xkVmO#yjv-!q?Vi_jf2yAfRA^N}-zi<`8rXxY)R(dB&@DZ-vV;>C zYo%a)UV}A-v;KgLxMzH6KTC<7cO&s2e{paAZkFm;A+0j7gHN-J{Di{Z;{p|%4|=U0 zq^H+&w27N6ve?+37Z8e;Ha&}q2Mh799tqbM`E*J~zC)U)<`JlD-DGCw8o!}rC)Rwi zA7B@Ms20&U9y^zPgIC{WB{Z)d18x|4vw4^QhB7lw?!#sIx!5Yl#=g>&jljSA+3PzC zJD*}GmKby}#7^iq*wn+Vd>^&rw5eybJb=pD_b7eI)jOZF=tGa9A~W6QzD3H>Hlp3q z$-RM?Ottgbm!guUTdS-bq$?rs! zsHvFx2h9iiNbXt>u3ogQALR_FpAU?!U$?rkuAh=LF&6cYQj~M_ z<8c97otu4yA$(XeXKU>^d^J(7AuKS-bxuqjHycR=iF5Z@?k^qi!E&|YR{$pxQ0Oz= z|MhgviXrSC*B_#Pkb#_a^SBC5%!K}32Dh@!7f|_hM`?47p9Qy?1~({ zZ_X6>s!S{5DInNtylw1P@898r;Fh;EpFb|3u6dzPhw)LJ7cKXhe5lR^T4sL9Cq?d_ z{(9JDU{e?j4sPt=^0}#iE`|mFvElT~pM=+c(wgkp2uyz`0+71WT)}7Woxv<<%27oD zWy^%jN1sE5Hjqhk^Vnmq7nR-24A0~Re|#yqujV$z{-~1dFT(za1<6?HcP&}umH@d&#hOYYn_d4b)}iF@WAHt-wLXxQJG#fhcjfn2Q(*+a zp&s@E93Ji;57ne#C!`$!Y09CL23TbVzc32W(McLWNz=9jjq1?Yfi1zz(KVxi14_hx zW@aYC(;GlTYaX_!U8_YMK`uawaHz%Qhnjv9DiIIc290y?z3v(-oQ4~Qq_>B!#Rb%@ z&CLASh;~u5|935)wHf#ZH$IwTlS);{6`N!`9Ff-g%p+f-yk4YeQz>PLJ+{DPaXZV5 zJ85(Swj{Ae7e5%(`!dQo!7^U9xpVkL;G_X0``IyYKBwxoZlxX~yZYmfLTiYi+UZ7f+3-&j@^BDZ9Qf1x#*;VLwfO%Wyi7 z0dcYN@hRRvzsB3cKzqya*Jg?KiXe=F^37MIpSRY6kSK8N^iqjl^xbm>bYsh^a!w)? ze}&Nld`VCin8}3EQ&rOT+whQIH6GsaXr~(my&qJd_a9TU86Qh$Rl?c62JJ86Ul4@F zQ1Lf43{njTh3#MKQOW@aPl-OJ^1Jlihvwn=ee!_-UsNS8bn{x-5YBo6^KM$z9XS;> zf1gckP^YyY_h9%7%yJ!^bJ4!YgKgz@wh*-x3#h47cmSBzK52Oc`gAu#ybi0gHv4nD z=^uUGySQV$7JtxY)8QKaE0E6y15|=ldr!N}^8K~jX?Df!?BVn(V93I13K=&~6Gl^J zzbpc%nXSm;b%e(fbAr}z4#Lcj4sJ`|J^oQA?>+lN^ySz>f$&5%CmEC}%&;|~GF}Y= z-zlGP6P=a0)!{OVx&?WT?AIs)U>IN$#JjAT;Yz*Y?jwDtE+t=I|6wtd8frA`)FvY< zQzGp_YftsVKKN)>Q#h!%VtG4_+zBCKMi#12Dq5EvaEVOgOvm(GRT zs%SVFO+0PZyq89y?>#q~F}cSl=ne6c8dR)?Sm>ZT-}f9XrxZqu|85<_Vss`ezy5d1 zEmmr90n_zwUz3XYe4XC7tUSj4en*Ip=E9FA1`#X+S6gryqiQx>{)rqtquNY`^K2I7 zUj+qz{WOEWzxiI1VeM(i%d!+zB`L|3HfDxqA#Cs^gEad0R>5sX0i2ZVw{uf$O;M$6 z@xuF2Yz&-c1l(wKaeBxD8KOY3$c2V&q&=lwDsCm3sfX)=%pp#t$cc`zcp6zAf~L zsWvxN^j#_TiN%W*!v;uQ7)8i)F)7*8e+~KeXw9782qW|-P8Y>Q{ZPcGN!iXj{7lzGyg&6-rt_>}a4Oth;l=CAa^q*e<3TSLAs z9u>1!B`pSNHQT`&#B(n7rk>E;s9xmGN^Z5cNxXUUR!UNDF_HcR5-ot;u^`#P9yOXu z<~gz(%pXAOz6K4^hnti3=M}mTc0D{)8Natz2#WXS?-CZ*4Qo+>_TkmF=-ZC-A`hoe z+-esJ>ca`r_OfTOc&XZ4Vt1B&_GIkn8K%N*++Yt*Z?yc{f}UT3$$rYa|Kzj&ma*BF zeM7V&ntlbcH13#s3h0B=_SR))XSSUg0>F=5W-KO&C+8g98w?gSVk>Z5M1ZH)YL{ILh#c9|Ba;bfi8meY4BJc9`g#CxdYRH!VSoUO>DtYX(jXO#;@|WZz*^>V{pdJBI5}@uO}NeDoHnR0 zHSnwf&1kJ1r&hweD`eBu5FBpj)^IB>Szdp9LC|Q1!;axPvt47u+wK>%t4B+)aaQuw z4Aia5VXvjbFCr?HWGl_ad5HG1$=IDyQ+OwA0>=qCLOr!VLA_cbnljzW*S~FyOE7MO z4aA7Vp`bauq~o&t1iXC->-mXevU8TE0-p2*ndqU{PL&WbL*+eo(|zapK5 z>Ug_7Oq(N61z?hBqn>|o^{@OK#q(ol6LB-M8@C0e#`C?}Je$H6&GF&lcNVA5Zg2}e z0bBlO3}kPSvUtii6Q z8DT+ZQd*KDI5q034jt?(0~!pKaS=8@>zNmHdAcI6UeBvNOo)SHIMZOz>w98IAES{} zEc9UbmZ8Oxs1m7MT548FMzC~{)2qvSqT=HfMz2H=IKy;juG|)Lj*LuY(dQQ9naOdO zRUnC3f=%ZG*!~Y-^7Sw!?Nvx|KLoDLTqx1uG-B0Iq{Y@2h&#zS@jT5gKZVD*dqhk21~^?w`iD?Bl^}t>y-CEPKy}^tQZCyxF06Oe2(_(JX^zcS!%qc)H4S6^6jC0_^0o! z$Fz)7c~Y`MQSfHbbe&3L)J?6|0_BTfuw$_#hpC;Gg~L+|t@KZ}!Y%_RP+<3PPMwUt zi|*k-vfNB&N|N*UBEvcl5)}WS|amx-6x4_#9rt3g%GO{d~$<;gyDcl)H6yi8Yxf08!O z8_2hkhFZIyF3YrW@jYq5OGO<}+ZC-#1OAb*oOre-whHuRt*{Rox&g=7!6^nHaH><6 z2lp9YaQ$ylkusFR=+zEfvZk*w|5b36p~V2^gHd&_bp905wIKEl ziTjt?;9-r|J;zCSq;!qF&T_j<<8f5=wb8xV@(kos2>bQhgq$g44<&G5k4M)G;E*>> z!!7CLM`L_mZ&=Jymh;>nF^khr!p9wAkyuyp@ZBL~oouagSkRri`6IQRn^37W%e$sUvl` zkk1iuW9{-yy@=&NZBxk>n>S5dyUWV@QYFf@ossdcx z($6&p{joh-=hnx;_W9((FEMv7GrgHFhV*U8mc|2pV~a%(PfI^Ft#aM6#Yw zFm9N9K5U;<;hXi0ii2((?iA4vzn#b@3+*KmzB1+$!DN(i?p3O52Z$Szn zgIE_IVhpRC?juLe{B>QX0oUcn{VUkFkiZR5*a_e@GX$=FlsD$$k&1yNbYKUf(8Vuh zkB8NxeYaSsyrQHiMDuQCDgc(TwbCeP^Xc=TmF!~qQ0p0OK=fp}o{=uxz z?Xx5bDVSzgKP`8;hd7`w&RUOb^;cS6tltcd0*?1kaiW*e$#_Tv~t)e|->YLwNb%K7g+y z9x(?dTANcHIz~K)?9X*&L~T>`>n^}(yZS6RAZP3u;`v729lHfin``!2(RI7>lJ^88 zSL^m3wH_O=F@dmpu!VVR7fXNM6Fk0G{YkB(GWdOr{EAWZD`u4aRYvOL!>DoL&&3iNCEC0PkO`Qjxtq*XOZ zU>ipl7rLN!no$vlKzRk`lof4cMAWo3bzM_V^u@er2O_cY(?eMu!r~HjcLG#iOXra) z69)yH#XNnC-Xech0I9)$j{-lG`ebtjh2Iw^%@?FVZ7Bx#ihQ~>*$ETsCOf{Mii$rT za@`SrPN5V!R`KYP=+N#sVt$`MZI#}J1x?#k_l6L z6s^PGrf^~X6mXI&uOoa6zAMxK$;JwqF{Va@(N3)D;oau&H>W@DREHq6E8`FGgPkor z#l5xigmfDS%k4zY|x1Z8mVtB)EbrS}IcRRl^uOKP^Gz+SRHROiH}E+pc7?_4tt zQI7u0HvI}?#b2s@vS#QBg8Ldq86}(ROW8&;V1vVLKVqiZyTA-yDh{^@VoXRCH#p8+ zVzKMeAR9qNoJ{la@}Kk&Zu2d<-6Gi=GXq-rZZsN= zH}WsTio56U35O*61l_*HBU$}9svTRxtgU^|>FG<=yIO1SRb?Qr^dl*lg?_dgL{>YT05bif*$(Wr)OdLIY7qoWy5J?-IiyB8(7v-k|KK@9| z|0t|uOB=MT&#Y)h3A_Kk_=#R*#GRovS!$AwYesDcH>1Y(4JSy?*wa&G;}t8^Y)5`S z6KmouOpIe8;W|b%RV`e`+Ax*CH3%>hm!Ba(3@55@*u&gb(3ptUUttz$EAT;V+(H+; zS93Vmg*&nq18eeqp(Zt)7AX#$Zp?zuVNOG!{7}E10j=>4DBqK?8T^aXvXj{2r=Jf7 zdv-+`)bl4|3oA#o-c}7GxdBiB%=r%Dlz_)6r115NmV%(Nn|YOhs*F2FZi?@WVI&^^=*2xJGTh^sOsKD*&kZpJ3%Y$nW5aAXFnXdGg5&-oJU_JrYt5SfZ-@)jly$fjp zZ6?-~Y|+9mCkj=PdzDnxUHI;#+OMtt_&8%#F-FUlt(jtQnOj5j%no|lb5Z z<0bLNa{Rt@RC{XJa|h=Cnrp3_9}mXdv%-suX}*5;EohYPTQZ7QjJBELT>ECENqGmJ!u*Wx> zU8)Tw?a)8+n6F;S9{Y4LsmNC9_j(G*!p4-pTKvDL=+Hw#R4SIsH`xH8gu}oD>kWXk z--uaH0Fum4EFqE>rz#(>_4y>{45C>o*AfwX_-b^TVJW*&6ZKjBYhH>9ZlAET{xn~UI~Lc4%Rtaq{FgJfKt zYhORbL&BZ*n(XR}Z0B6m);MnMv;G^6@!R-^d0>^{irdL1GVkuLJZ?FreKv{M#)fCh zGilY^37l$_d2g&IWQ^(ljOFv6ytPvEcA~{tRZr_;xFf%;-da1|#Qoi`)L?X~DE6tB z!t_|e`}BU4-dXcZuP(M`^l_x_gdrII8}K~OI(}K^0s|r)l1Un9Xa2GgnHuC_8*o;_ zUr?-!cNI9e%w@+Q8iE+|z*3-RFQV8sb1kg^M#q13IeTyZZ{j3r+{5cN6(;|EPw00% z^Bih*HEYw|X-k*3v6=Vb`9|8#5G`~>ikgYU>Ven$F#^!YVHNbcn8^XIVwjx9@}X-? zLr~))tHnpXB{8(@4}5GvA_U|?8h6s>@Atu|Fs%j4+QyUD3(WqU?|DS6ti$k>q~7`h zgaB9PzYpwf=jloe1Ul}74X)ql2(0l=+?po3jK|5_jJqM~gBHRmoF%o-H}~T(mW1uc z^6O&ep2mx1hSWpVQ#N4#@0bBU(1cAJj-||E2#9C%HdBIgE+FQCROuWeSNg#H%hifh z@==EDr{H(AxIJhJLZ4R68mQB$Wc-NSo_Zq)CLDdp0D18#d6uuwH3w2BHuF1kMAb)1 zMr4o+J98s`2N%kNUeZ7n`-JE{P0~Wgz1rPj)?53ke=Gl;00ItQ&==ZUK(61>uig)T z>{lx(YRWcVoxB+}X9)IWgd59{EKDbJt`NkmC6LakVr8hulgs6;feLaD4CDxD7Zb#p zicuh!oEOjrK>pd@S5)JGdj@|kWmgWA)mbu!<5|x47;5dxAUIV|162kO%MF^}fC`