Merge pull request #11895 from protocolbuffers/merge-main-to-22.x

Merge main to 22.x
pull/11907/head
Mike Kruskal 2 years ago committed by GitHub
commit d3dad7fd4d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 27
      .github/BUILD.bazel
  2. 1
      .github/CODEOWNERS
  3. 27
      .github/actions/bash/action.yml
  4. 75
      .github/actions/bazel-docker/action.yml
  5. 111
      .github/actions/bazel/action.yml
  6. 65
      .github/actions/ccache/action.yml
  7. 38
      .github/actions/cross-compile-protoc/action.yml
  8. 50
      .github/actions/docker/action.yml
  9. 73
      .github/actions/internal/bazel-setup/action.yml
  10. 36
      .github/actions/internal/ccache-setup-windows/action.yml
  11. 62
      .github/actions/internal/docker-run/action.yml
  12. 42
      .github/actions/internal/gcloud-auth/action.yml
  13. 41
      .github/actions/internal/repository-cache-restore/action.yml
  14. 19
      .github/actions/internal/repository-cache-save/action.yml
  15. 17
      .github/actions/internal/setup-runner/action.yml
  16. 15
      .github/mergeable.yml
  17. 29
      .github/workflows/clear_caches.yml
  18. 2
      .github/workflows/codespell.yml
  19. 40
      .github/workflows/objc_cocoapods.yml
  20. 67
      .github/workflows/ruby_install.yml
  21. 30
      .github/workflows/staleness_check.yml
  22. 4
      .github/workflows/staleness_refresh.yml
  23. 330
      .github/workflows/test_cpp.yml
  24. 86
      .github/workflows/test_csharp.yml
  25. 69
      .github/workflows/test_java.yml
  26. 102
      .github/workflows/test_objectivec.yml
  27. 182
      .github/workflows/test_php.yml
  28. 17
      .github/workflows/test_php_ext.yml
  29. 95
      .github/workflows/test_python.yml
  30. 139
      .github/workflows/test_ruby.yml
  31. 161
      .github/workflows/test_runner.yml
  32. 4
      .github/workflows/update_php_repo.yml
  33. 3
      .gitignore
  34. 5
      BUILD.bazel
  35. 75
      CHANGES.txt
  36. 11
      CMakeLists.txt
  37. 24
      WORKSPACE
  38. 19
      build_defs/upb.patch
  39. 3
      ci/Linux.bazelrc
  40. 2
      ci/Windows.bazelrc
  41. 3
      ci/clang_wrapper
  42. 3
      ci/clang_wrapper++
  43. 36
      ci/common.bazelrc
  44. 3
      ci/macOS.bazelrc
  45. 8
      cmake/gtest.cmake
  46. 7
      cmake/install.cmake
  47. 2
      conformance/README.md
  48. 2
      csharp/generate_protos.sh
  49. 62
      csharp/protos/map_unittest_proto3.proto
  50. 5
      csharp/protos/old_extensions1.proto
  51. 177
      csharp/protos/unittest.proto
  52. 94
      csharp/protos/unittest_custom_options_proto3.proto
  53. 4
      csharp/protos/unittest_import.proto
  54. 3
      csharp/protos/unittest_import_proto3.proto
  55. 7
      csharp/protos/unittest_issue6936_b.proto
  56. 7
      csharp/protos/unittest_issue6936_c.proto
  57. 17
      csharp/protos/unittest_proto3.proto
  58. 9
      csharp/protos/unittest_selfreferential_options.proto
  59. 255
      csharp/src/Google.Protobuf.Test.TestProtos/MapUnittestProto3.pb.cs
  60. 1283
      csharp/src/Google.Protobuf.Test.TestProtos/Unittest.pb.cs
  61. 234
      csharp/src/Google.Protobuf.Test.TestProtos/UnittestCustomOptionsProto3.pb.cs
  62. 20
      csharp/src/Google.Protobuf.Test.TestProtos/UnittestImport.pb.cs
  63. 19
      csharp/src/Google.Protobuf.Test.TestProtos/UnittestImportProto3.pb.cs
  64. 13
      csharp/src/Google.Protobuf.Test.TestProtos/UnittestImportPublic.pb.cs
  65. 14
      csharp/src/Google.Protobuf.Test.TestProtos/UnittestImportPublicProto3.pb.cs
  66. 16
      csharp/src/Google.Protobuf.Test.TestProtos/UnittestIssue6936A.pb.cs
  67. 13
      csharp/src/Google.Protobuf.Test.TestProtos/UnittestIssue6936B.pb.cs
  68. 17
      csharp/src/Google.Protobuf.Test.TestProtos/UnittestIssue6936C.pb.cs
  69. 94
      csharp/src/Google.Protobuf.Test.TestProtos/UnittestIssues.pb.cs
  70. 271
      csharp/src/Google.Protobuf.Test.TestProtos/UnittestProto3.pb.cs
  71. 5
      csharp/src/Google.Protobuf.Test.TestProtos/UnittestProto3Optional.pb.cs
  72. 37
      csharp/src/Google.Protobuf.Test.TestProtos/UnittestSelfreferentialOptions.pb.cs
  73. 10
      csharp/src/Google.Protobuf.Test/ExtensionSetTest.cs
  74. 8
      csharp/src/Google.Protobuf.Test/Reflection/DescriptorDeclarationTest.cs
  75. 25
      csharp/src/Google.Protobuf.Test/Reflection/DescriptorsTest.cs
  76. BIN
      csharp/src/Google.Protobuf.Test/testprotos.pb
  77. 33
      docs/third_party.md
  78. 2
      generate_descriptor_proto.sh
  79. 10
      java/bom/pom.xml
  80. 15
      java/core/src/main/java/com/google/protobuf/Descriptors.java
  81. 222
      java/core/src/main/java/com/google/protobuf/GeneratedMessageV3.java
  82. 13
      java/core/src/test/java/com/google/protobuf/DescriptorsTest.java
  83. 2
      java/core/src/test/java/com/google/protobuf/UnknownEnumValueTest.java
  84. 8
      java/pom.xml
  85. 12
      kokoro/README.md
  86. 46
      kokoro/common/bazel_flags.sh
  87. 92
      kokoro/common/caplog.sh
  88. 85
      kokoro/common/cmake.sh
  89. 11
      kokoro/common/setup_kokoro_environment.sh
  90. 44
      kokoro/docs/common.cfg
  91. 51
      kokoro/docs/publish-python.sh
  92. 7
      kokoro/docs/python.cfg
  93. 11
      kokoro/docs/trampoline.sh
  94. 29
      kokoro/linux/32-bit/build.sh
  95. 11
      kokoro/linux/32-bit/common.cfg
  96. 1
      kokoro/linux/32-bit/continuous.cfg
  97. 1
      kokoro/linux/32-bit/presubmit.cfg
  98. 57
      kokoro/linux/32-bit/test_php.sh
  99. 27
      kokoro/linux/aarch64/dockcross_helpers/run_dockcross_manylinux2014_aarch64.sh
  100. 18
      kokoro/linux/aarch64/php_build_and_run_tests_with_qemu_aarch64.sh
  101. Some files were not shown because too many files have changed in this diff Show More

@ -0,0 +1,27 @@
# This information is extracted from the MacOS runner specs located at:
# https://github.com/actions/runner-images/blob/win19/20230129.2/images/macos/macos-12-Readme.md
xcode_version(
name = "version14_2_14C18",
version = "14.2.14C18",
aliases = ["14C18"],
default_ios_sdk_version = "16.2",
default_tvos_sdk_version = "16.1",
default_macos_sdk_version = "13.1",
default_watchos_sdk_version = "9.1",
)
xcode_version(
name = "version14_1_0_14B47b",
version = "14.1.0.14B47b",
aliases = ["14B47b"],
default_ios_sdk_version = "16.1",
default_tvos_sdk_version = "16.1",
default_macos_sdk_version = "13.0",
default_watchos_sdk_version = "9.1",
)
xcode_config(
name = "host_xcodes",
versions = [":version14_2_14C18", ":version14_1_0_14B47b"],
default = ":version14_1_0_14B47b",
)

@ -34,3 +34,4 @@
/kokoro/ @protocolbuffers/protobuf-btr
/third_party/ @protocolbuffers/protobuf-btr
*.bazel @protocolbuffers/protobuf-btr
/.github/ @protocolbuffers/protobuf-btr

@ -0,0 +1,27 @@
name: 'Non-Bazel Bash Run'
description: 'Run a bash script for Protobuf CI testing with a non-Bazel build system'
inputs:
credentials:
required: true
description: "The GCP credentials to use for reading the docker image"
type: string
command:
required: true
description: A command to run in the docker image
runs:
using: 'composite'
steps:
- name: Setup Runner
uses: ./.github/actions/internal/setup-runner
- name: Update stale files using Bazel
uses: ./.github/actions/bazel
with:
credentials: ${{ inputs.credentials }}
bazel-cache: regenerate-stale-files
bash: ./regenerate_stale_files.sh $BAZEL_FLAGS
- name: Run
shell: bash
run: ${{ inputs.command }}

@ -0,0 +1,75 @@
name: 'Docker Bazel Run'
description: 'Run a Bazel-based docker image for Protobuf CI testing'
inputs:
credentials:
required: true
description: "The GCP credentials to use for reading the docker image"
type: string
image:
required: false
default: us-docker.pkg.dev/protobuf-build/containers/common/linux/bazel:5.1.1-aec4d74f2eb6938fc53ef7d9a79a4bf2da24abc1
description: "The docker image to use"
type: string
bazel-cache:
required: true
description: >
A unique path for the Bazel cache. This will trigger the generation
of a BAZEL_CACHE environment variable inside the container that provides
the appropriate flags for any bazel command.
type: string
bazel:
required: false
description: "The Bazel command to run"
type: string
bash:
required: false
description: "A bash command to run. $BAZEL_FLAGS will be available to use for bazel runs."
type: string
runs:
using: 'composite'
steps:
- name: Authenticate
id: auth
uses: ./.github/actions/internal/gcloud-auth
with:
credentials: ${{ inputs.credentials }}
- name: Setup Runner
uses: ./.github/actions/internal/setup-runner
- name: Setup Bazel
id: bazel
uses: ./.github/actions/internal/bazel-setup
with:
credentials-file: /workspace/$(basename ${{ steps.auth.outputs.credentials-file }})
bazel-cache: ${{ inputs.bazel-cache }}
- name: Hook up repository Cache
shell: bash
run: echo "BAZEL_FLAGS=$BAZEL_FLAGS --repository_cache='/workspace/${{ env.REPOSITORY_CACHE_PATH }}'" >> $GITHUB_ENV
- name: Validate inputs
if: ${{ (inputs.bash && inputs.bazel) || (!inputs.bash && !inputs.bazel) }}
shell: bash
run: echo "Invalid specification of both non-Bazel and Bazel command"; exit 1
- name: Run Bash Docker
uses: ./.github/actions/internal/docker-run
if: ${{ inputs.bash }}
with:
image: ${{ inputs.image }}
run-flags: --entrypoint "/bin/bash"
command: -l -c "${{ inputs.bash }}"
- name: Run Bazel Docker
uses: ./.github/actions/internal/docker-run
if: ${{ !inputs.bash }}
with:
image: ${{ inputs.image }}
command: ${{ inputs.bazel }} ${{ env.BAZEL_FLAGS }}
- name: Save Bazel repository cache
# Only allow repository cache updates during post-submits.
if: ${{ github.event_name == 'push' }}
uses: ./.github/actions/internal/repository-cache-save

@ -0,0 +1,111 @@
name: 'Docker Bazel Run'
description: 'Run a Bazel-based docker image for Protobuf CI testing'
inputs:
credentials:
required: true
description: The GCP credentials to use for reading the docker image
type: string
bazel-cache:
required: true
description: >
A unique path for the Bazel cache. This will trigger the generation
of a BAZEL_CACHE environment variable inside the container that provides
the appropriate flags for any bazel command.
type: string
version:
required: false
description: A pinned Bazel version to use
default: '5.1.1'
type: string
bazel:
required: false
description: The Bazel command to run
type: string
bash:
required: false
description: >
A bash command to run. $BAZEL_FLAGS and $BAZEL_STARTUP_FLAGS will be
available to use for bazel runs.
type: string
runs:
using: 'composite'
steps:
- name: Authenticate
id: auth
uses: ./.github/actions/internal/gcloud-auth
with:
credentials: ${{ inputs.credentials }}
- name: Setup Runner
uses: ./.github/actions/internal/setup-runner
- name: Setup Bazel
id: bazel
uses: ./.github/actions/internal/bazel-setup
with:
credentials-file: ${{ steps.auth.outputs.credentials-file }}
bazel-cache: ${{ inputs.bazel-cache }}
- name: Get Linux bazelisk path
if: runner.os == 'Linux'
shell: bash
run: echo "BAZELISK_PATH=~/.cache/bazelisk" >> $GITHUB_ENV
- name: Get MacOS bazelisk path
if: runner.os == 'macOS'
shell: bash
run: echo "BAZELISK_PATH=~/Library/Caches/bazelisk" >> $GITHUB_ENV
- name: Get Windows bazelisk path
if: runner.os == 'Windows'
shell: bash
run: echo "BAZELISK_PATH=$LOCALAPPDATA\bazelisk" >> $GITHUB_ENV
- name: Cache Bazelisk
if: ${{ github.event_name == 'push' }}
uses: actions/cache@627f0f41f6904a5b1efbaed9f96d9eb58e92e920 # v3.2.4
with:
path: ${{ env.BAZELISK_PATH }}
key: bazel-${{ runner.os }}-${{ inputs.version }}
- name: Restore Bazelisk
if: ${{ github.event_name != 'push' }}
uses: actions/cache/restore@627f0f41f6904a5b1efbaed9f96d9eb58e92e920 # v3.2.4
with:
path: ${{ env.BAZELISK_PATH }}
key: bazel-${{ runner.os }}-${{ inputs.version }}
- name: Hook up repository Cache
shell: bash
run: echo "BAZEL_FLAGS=$BAZEL_FLAGS --repository_cache=$(pwd)/${{ env.REPOSITORY_CACHE_PATH }}" >> $GITHUB_ENV
- name: Validate inputs
if: ${{ (inputs.bash && inputs.bazel) || (!inputs.bash && !inputs.bazel) }}
shell: bash
run: echo "Invalid specification of both non-Bazel and Bazel command"; exit 1
- name: Pin Bazel version
shell: bash
run: echo "USE_BAZEL_VERSION=${{ inputs.version }}" >> $GITHUB_ENV
- name: Output Bazel version
shell: bash
run: bazelisk version
- name: Run Bash
if: ${{ inputs.bash }}
run: ${{ inputs.bash }}
shell: bash
- name: Run Bazel
if: ${{ !inputs.bash }}
run: >-
bazelisk ${{ steps.bazel.outputs.bazel-startup-flags }}
${{ inputs.bazel }} $BAZEL_FLAGS
shell: bash
- name: Save Bazel repository cache
# Only allow repository cache updates during post-submits.
if: ${{ github.event_name == 'push' }}
uses: ./.github/actions/internal/repository-cache-save

@ -0,0 +1,65 @@
name: 'CCache Setup'
description: 'Run a Bazel-based docker image for Protobuf CI testing'
inputs:
cache-prefix:
required: true
description: A unique prefix to prevent cache pollution
type: string
support-modules:
required: false
description: Whether or not we need to support modules. This can result in extra cache misses.
runs:
using: 'composite'
steps:
- name: Setup ccache on Windows
if: ${{ runner.os == 'Windows' }}
uses: ./.github/actions/internal/ccache-setup-windows
- name: Setup ccache on Mac
if: ${{ runner.os == 'macOS' }}
shell: bash
run: brew install ccache
- name: Setup fixed path ccache caching
uses: actions/cache@627f0f41f6904a5b1efbaed9f96d9eb58e92e920 # v3.2.4
with:
path: .ccache
# Always push to a cache key unique to this commit.
key: ${{ format('ccache-{0}-{1}-{2}', inputs.cache-prefix, github.ref_name, github.sha) }}
# Select a cache to restore from with the follow order of preference:
# 1) The exact same commit we're running over
# 2) The latest cache from the current ref branch
# 3) The latest push to the base ref of a pull request
restore-keys: |
${{ format('ccache-{0}-{1}-{2}', inputs.cache-prefix, github.ref_name, github.sha) }}
${{ format('ccache-{0}-{1}', inputs.cache-prefix, github.ref_name) }}
${{ format('ccache-{0}-{1}', inputs.cache-prefix, github.base_ref) }}
- name: Configure ccache environment variables
shell: bash
run: |
echo "CCACHE_BASEDIR=${{ github.workspace }}" >> $GITHUB_ENV
echo "CCACHE_DIR=${{ github.workspace }}/.ccache" >> $GITHUB_ENV
echo "CCACHE_COMPRESS=true" >> $GITHUB_ENV
echo "CCACHE_COMPRESSLEVEL=6" >> $GITHUB_ENV
echo "CCACHE_MAXSIZE=600M" >> $GITHUB_ENV
echo "CCACHE_SLOPPINESS=clang_index_store,include_file_ctime,include_file_mtime,file_macro,time_macros" >> $GITHUB_ENV
echo "CCACHE_DIRECT=true" >> $GITHUB_ENV
echo "CCACHE_CMAKE_FLAGS=-Dprotobuf_ALLOW_CCACHE=ON -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache $CCACHE_CMAKE_FLAGS" >> $GITHUB_ENV
- name: Enable module support
if: ${{ inputs.support-modules }}
shell: bash
run: |
echo "CCACHE_SLOPPINESS=$CCACHE_SLOPPINESS,modules" >> $GITHUB_ENV
echo "CCACHE_DEPEND=true" >> $GITHUB_ENV
- name: Zero out ccache
if: ${{ runner.os == 'macOS' }}
shell: bash
run: ccache -z
- name: Zero out ccache
if: ${{ runner.os == 'Windows' }}
shell: pwsh
run: ${{ github.workspace }}\ccache.exe -z

@ -0,0 +1,38 @@
name: 'Cross-compile protoc'
description: 'Produces a cross-compiled protoc binary for a target architecture'
inputs:
credentials:
required: true
description: The GCP credentials to use for reading the docker image
type: string
architecture:
required: true
description: The target architecture to build for
type: string
outputs:
protoc:
description: "Cross-compiled protoc location. Also output to $PROTOC"
value: ${{ steps.output.outputs.protoc }}
runs:
using: 'composite'
steps:
- name: Cross compile protoc for ${{ inputs.architecture }}
uses: ./.github/actions/bazel-docker
with:
credentials: ${{ inputs.credentials }}
bazel-cache: xcompile-protoc/${{ inputs.architecture }}
bash: |
bazel build //:protoc --config=${{ inputs.architecture }} $BAZEL_FLAGS
cp bazel-bin/protoc .
- name: Set protoc environment variable
shell: bash
run: echo "PROTOC=protoc-${{ inputs.architecture }}" >> $GITHUB_ENV
- name: Extract binary
id: output
shell: bash
run: |
mv protoc $PROTOC
echo "protoc=$PROTOC" >> $GITHUB_OUTPUT

@ -0,0 +1,50 @@
name: 'Docker Non-Bazel Run'
description: 'Run a docker image for Protobuf CI testing with a non-Bazel build system'
inputs:
credentials:
required: true
description: "The GCP credentials to use for reading the docker image"
type: string
command:
required: true
description: A command to run in the docker image
image:
required: false
default: us-docker.pkg.dev/protobuf-build/containers/common/linux/bazel:5.1.1-aec4d74f2eb6938fc53ef7d9a79a4bf2da24abc1
description: "The docker image to use"
type: string
platform:
required: false
description: "The platform to use for the image"
type: string
skip-staleness-check:
required: false
description: "Skip staleness checks"
type: boolean
runs:
using: 'composite'
steps:
- name: Setup Runner
uses: ./.github/actions/internal/setup-runner
- name: Update stale files using Bazel
if: ${{ !inputs.skip-staleness-check }}
uses: ./.github/actions/bazel-docker
with:
image: us-docker.pkg.dev/protobuf-build/containers/common/linux/bazel:5.1.1-aec4d74f2eb6938fc53ef7d9a79a4bf2da24abc1
credentials: ${{ inputs.credentials }}
bazel-cache: regenerate-stale-files
bash: ./regenerate_stale_files.sh $BAZEL_FLAGS
- name: Generate docker flags
if: inputs.platform
shell: bash
run: echo "DOCKER_RUN_FLAGS=--platform ${{inputs.platform}}" >> $GITHUB_ENV
- name: Run Docker
uses: ./.github/actions/internal/docker-run
with:
image: ${{ inputs.image }}
command: ${{ inputs.command }}
run-flags: ${{ env.DOCKER_RUN_FLAGS }}

@ -0,0 +1,73 @@
name: Setup Bazel
description: Setup a Bazel environment for Protobuf CI testing
inputs:
credentials-file:
required: true
description: The GCP credentials file to use for caching
type: string
bazel-cache:
required: true
description: A unique path for the Bazel cache.
type: string
outputs:
bazel-flags:
description: Bazel flags that should be sent to all Bazel invocations
value: ${{ steps.output.outputs.bazel-flags }}
bazel-startup-flags:
description: Bazel startup flags that should be sent to all Bazel invocations
value: ${{ steps.output.outputs.bazel-startup-flags }}
runs:
using: 'composite'
steps:
- name: Initialize BAZEL environment variable
shell: bash
run: echo "BAZEL=bazelisk" >> $GITHUB_ENV
- name: Initialize Windows startup flags
if: runner.os == 'Windows'
shell: bash
run: echo "BAZEL_STARTUP_FLAGS=--output_user_root=C:/tmp --windows_enable_symlinks" >> $GITHUB_ENV
- name: Initialize Bazel flags
shell: bash
run: echo "BAZEL_FLAGS=--keep_going --test_output=errors --test_timeout=600" >> $GITHUB_ENV
- name: Initialize Windows-specific Bazel flags
if: runner.os == 'Windows'
shell: bash
run: echo "BAZEL_FLAGS=$BAZEL_FLAGS --enable_runfiles" >> $GITHUB_ENV
- name: Initialize MacOS-specific Bazel flags
if: runner.os == 'macOS'
shell: bash
run: echo "BAZEL_FLAGS=$BAZEL_FLAGS --xcode_version_config=//.github:host_xcodes" >> $GITHUB_ENV
- name: Configure Bazel caching
# Skip bazel cache for local act runs due to issue with credential files
# and nested docker images
if: ${{ inputs.bazel-cache && !github.event.act_local_test }}
shell: bash
run: >-
echo "BAZEL_FLAGS=$BAZEL_FLAGS
--google_credentials=${{ inputs.credentials-file }}
--remote_cache=https://storage.googleapis.com/protobuf-bazel-cache/protobuf/gha/${{ inputs.bazel-cache }}" >> $GITHUB_ENV
- name: Configure Bazel cache writing
# External runs should never write to our caches.
if: ${{ github.event_name != 'pull_request_target' && inputs.bazel-cache && !github.event.act_local_test }}
shell: bash
run: echo "BAZEL_FLAGS=$BAZEL_FLAGS --remote_upload_local_results" >> $GITHUB_ENV
- name: Output Bazel flags
id: output
shell: bash
run: |
echo "bazel-flags=$BAZEL_FLAGS" >> $GITHUB_OUTPUT
echo "bazel-startup-flags=$BAZEL_STARTUP_FLAGS" >> $GITHUB_OUTPUT
- name: Restore Bazel repository cache
uses: ./.github/actions/internal/repository-cache-restore
with:
bazel-cache: ${{ inputs.bazel-cache }}

@ -0,0 +1,36 @@
name: 'CCache Setup'
description: 'Setup ccache for us in Windows CI'
inputs:
ccache-version:
required: false
default: '4.7.4'
description: A pinned version of ccache
type: string
runs:
using: 'composite'
steps:
- name: Configure ccache environment variables
shell: pwsh
run: |
Write-Host $Env:GITHUB_REF
$cllocation = (Get-Command cl.exe).Path
echo "CCACHE_COMPILER=$cllocation" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append
echo "CCACHE_COMPILERTYPE=msvc" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append
- name: Download ccache
shell: bash
run: |
curl -kLSs "https://github.com/ccache/ccache/releases/download/v${{ inputs.ccache-version }}/ccache-${{ inputs.ccache-version }}-windows-x86_64.zip" -o ccache.zip
unzip ccache.zip
cp ccache-${{ inputs.ccache-version }}-windows-x86_64/ccache.exe ccache.exe
cp ccache.exe cl.exe
rm ccache.zip
- name: Configure msbuild flags
shell: bash
run: echo "CCACHE_MSBUILD_FLAGS=/p:CLToolExe=cl.exe /p:CLToolPath=${{ github.workspace}}" >> $GITHUB_ENV
- name: Configure cmake flags
shell: bash
run: echo "CCACHE_CMAKE_FLAGS=-Dprotobuf_ALLOW_CCACHE=ON" >> $GITHUB_ENV

@ -0,0 +1,62 @@
name: 'Run Docker'
description: 'Run a docker image for Protobuf CI testing'
inputs:
image:
required: true
description: "The docker image to use"
type: string
command:
required: true
description: "A raw docker command to run"
type: string
run-flags:
required: false
description: "Additional flags to pass to docker run"
type: string
# WARNING: loading from cache appears to be slower than pull!
docker-cache:
required: false
description: "Enabled caching of pulled docker images."
runs:
using: 'composite'
steps:
- name: Authenticate for GAR use
shell: bash
run: gcloud auth configure-docker -q us-docker.pkg.dev
- name: Setup QEMU for possible emulation
uses: docker/setup-qemu-action@e81a89b1732b9c48d79cd809d8d81d79c4647a18 # v2.1.0
- name: Check docker cache
if: ${{ inputs.docker-cache }}
id: check-docker-cache
uses: actions/cache@627f0f41f6904a5b1efbaed9f96d9eb58e92e920 # v3.2.4
with:
path: ci/docker/
key: ${{ inputs.image }}
- name: Pull and store if cache miss
shell: bash
if: ${{ inputs.docker-cache && steps.check-docker-cache.outputs.cache-hit != 'true' }}
run: >
time docker pull -q ${{ inputs.image }} &&
mkdir -p ci/docker/$(dirname ${{ inputs.image }}) &&
time docker image save ${{ inputs.image }} --output ./ci/docker/${{ inputs.image }}.tar
- name: Use the cached image on cache hit
shell: bash
if: ${{ inputs.docker-cache && steps.check-docker-cache.outputs.cache-hit == 'true' }}
run: time docker image load --input ./ci/docker/${{ inputs.image }}.tar
- name: Pull fresh docker image
shell: bash
if: ${{ !inputs.docker-cache }}
run: time docker pull -q ${{ inputs.image }}
- name: Run docker
shell: bash
run: >
time docker run ${{ inputs.run-flags}} -v${{ github.workspace }}:/workspace
${{ inputs.image }} ${{ inputs.command }}

@ -0,0 +1,42 @@
name: 'Authenticate for GCP'
description: 'Authenticate a workflow for Protobuf CI testing'
inputs:
credentials:
required: true
description: "The GCP credentials to use for GCP"
type: string
outputs:
credentials-file:
description: "Credentials file generated for GCP"
value: ${{ steps.output.outputs.credentials-file }}
runs:
using: 'composite'
steps:
- name: Authenticate to Google Cloud
id: auth
uses: google-github-actions/auth@ef5d53e30bbcd8d0836f4288f5e50ff3e086997d # v1.0.0
with:
credentials_json: ${{ inputs.credentials }}
- name: Set up Cloud SDK
uses: google-github-actions/setup-gcloud@d51b5346f85640ec2aa2fa057354d2b82c2fcbce # v1.0.1
- name: Use gcloud CLI
shell: bash
run: gcloud info
- name: Store credentials path
shell: bash
run: echo "CREDENTIALS_FILE=${{ steps.auth.outputs.credentials_file_path }}" >> $GITHUB_ENV
- name: Fix credentials path (Windows)
if: ${{ runner.os == 'Windows' }}
# Bash commands in windows don't like the backslash in the file path.
# Assume we're running in the root directory and grab the base name.
shell: bash
run: echo "CREDENTIALS_FILE="$(basename ${CREDENTIALS_FILE//\\//}) >> $GITHUB_ENV
- name: Output credentials file
id: output
shell: bash
run: echo "credentials-file=${{ env.CREDENTIALS_FILE }}" >> $GITHUB_OUTPUT

@ -0,0 +1,41 @@
name: Restore Repository Cache
description: Restore the Bazel repository cache from our github action cache
inputs:
bazel-cache:
required: true
description: A unique path for the Bazel cache.
type: string
# By design, these actions will restore the latest cache for this branch/os,
# and only save a new version if something has changed. Initially this will
# cause a lot of churn, since each test has a slightly different set of
# repositories to download. Over time though, since we don't upload no-op
# changes, this should converge to a stable set of 3 caches per branch. Every
# run will update the current cache with a new test's repositories, until there
# are no unique ones left.
#
# This saves asymptotic space, since each one of these can get up to ~500 MB
# and Github prunes the cache after 10 GB.
runs:
using: 'composite'
steps:
- name: Setup Bazel repository cache variables
shell: bash
run: |
REPOSITORY_CACHE_BASE=repository-cache-${{ github.base_ref || github.ref_name }}-${{ runner.os }}
echo "REPOSITORY_CACHE_BASE=$REPOSITORY_CACHE_BASE" >> $GITHUB_ENV
echo "REPOSITORY_CACHE_NAME=$REPOSITORY_CACHE_BASE-${{ inputs.bazel-cache}}-${{ github.sha }}" >> $GITHUB_ENV
echo "REPOSITORY_CACHE_PATH=.repository-cache" >> $GITHUB_ENV
- name: Restore Bazel repository cache
id: restore-cache
uses: actions/cache/restore@627f0f41f6904a5b1efbaed9f96d9eb58e92e920 # v3.2.4
with:
path: ${{ github.workspace }}/${{ env.REPOSITORY_CACHE_PATH }}
key: ${{ env.REPOSITORY_CACHE_NAME }}
restore-keys: ${{ env.REPOSITORY_CACHE_BASE }}
- name: Initialize BAZEL environment variable
if: ${{ steps.restore-cache.cache-hit }}
shell: bash
run: echo "REPOSITORY_CACHE_HASH=${{ hashFiles(format('{0}/**', env.REPOSITORY_CACHE_PATH)) }}" >> $GITHUB_ENV

@ -0,0 +1,19 @@
name: Restore Repository Cache
description: Restore the Bazel repository cache from our github action cache
# Note: this action will only work if repository-cache-restore has already
# been called. All bazel actions should specify the repository_cache parameter
# using REPOSITORY_CACHE_PATH.
#
# We intentionally upload to REPOSITORY_CACHE_BASE to prevent a flood of new
# caches on any change. Only 1 job per os in each test run will be allowed to
# update the cache because they're all trying to write to the same location.
runs:
using: 'composite'
steps:
- name: Save modified Bazel repository cache
if: ${{ env.REPOSITORY_CACHE_HASH != hashFiles(format('{0}/**', env.REPOSITORY_CACHE_PATH)) }}
uses: actions/cache/save@627f0f41f6904a5b1efbaed9f96d9eb58e92e920 # v3.2.4
with:
path: ${{ github.workspace }}/${{ env.REPOSITORY_CACHE_PATH }}
key: ${{ env.REPOSITORY_CACHE_BASE }}-${{ github.sha }}

@ -0,0 +1,17 @@
name: Setup CI Runner
# TODO(b/267357823) Consider moving this to it's own repository so we can
# include the call to actions/checkout.
description: Setup any platform-specific adjustments we need to make for CI
runs:
using: 'composite'
steps:
- name: Fix Windows line breaks
if: runner.os == 'Windows'
shell: bash
run: find . -type f -print0 | xargs -0 d2u 2>/dev/null
- name: Install bazelrc files
shell: bash
run: |
cp ci/*.bazelrc .
cp -f ${{ runner.os }}.bazelrc .bazelrc

@ -1,15 +0,0 @@
mergeable:
pull_requests:
label:
and:
- must_exclude:
regex: '^disposition/DO NOT MERGE'
message: 'Pull request marked not mergeable'
- must_include:
regex: 'mergeable:force-allow'
message: 'Pull requests should not be merged directly and should instead
be handled by Copybara.
To enable Github merges, add the `mergeable:force-allow` label and get a second
approval. This should almost never be used except for releases or as a break glass
measure after discussing with the team.'

@ -0,0 +1,29 @@
name: Clear expensive caches to prevent unbounded growth
on:
schedule:
# Run every 1st of the month at 10 AM UTC (2 AM PDT)
- cron: 0 10 1 * *
# manual
workflow_dispatch:
jobs:
bazel-repository-cache:
strategy:
fail-fast: false # Don't cancel all jobs if one fails.
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
name: Clear Bazel repository cache ${{ runner.os }}
runs-on: ${{ matrix.os }}
steps:
- uses: actions/cache@627f0f41f6904a5b1efbaed9f96d9eb58e92e920 # v3.2.4
with:
path: ${{ github.workspace }}/${{ steps.output.outputs.repository-cache }}
key: repository-cache-${{ github.ref_name }}-${{ runner.os }}-reset-${{ github.sha }}
- name: Create an empty cache with a single file
run: |
rm -rf .repository-cache
mkdir -p .repository-cache'
touch .repository-cache/reset_file

@ -10,7 +10,7 @@ jobs:
name: Check for spelling errors
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
- uses: codespell-project/actions-codespell@master
with:
check_filenames: true

@ -1,40 +0,0 @@
name: 'ObjC CocoaPods'
on:
push:
paths:
- '.github/workflows/objc_cocoapods.yml'
- 'Protobuf.podspec'
- 'objectivec/**'
- '!objectivec/DevTools/**'
- '!objectivec/ProtocolBuffers_*.xcodeproj/**'
- '!objectivec/Tests/**'
pull_request:
paths:
- '.github/workflows/objc_cocoapods.yml'
- 'Protobuf.podspec'
- 'objectivec/**'
- '!objectivec/DevTools/**'
- '!objectivec/ProtocolBuffers_*.xcodeproj/**'
- '!objectivec/Tests/**'
permissions:
contents: read # to fetch code (actions/checkout)
jobs:
pod-lib-lint:
runs-on: macos-latest
strategy:
fail-fast: false
matrix:
# Add back 'watchos'. See CocoaPods/CocoaPods#11558
PLATFORM: ["ios", "macos", "tvos"]
CONFIGURATION: ["Debug", "Release"]
steps:
- uses: actions/checkout@v2
- name: Pod lib lint
run: |
pod lib lint --verbose \
--configuration=${{ matrix.CONFIGURATION }} \
--platforms=${{ matrix.PLATFORM }} \
Protobuf.podspec

@ -1,67 +0,0 @@
name: Ruby Install Tests
on:
push:
branches:
- main
- '[0-9]+.x'
pull_request:
branches:
- main
- '[0-9]+.x'
workflow_dispatch:
jobs:
test_ruby_gems:
name: Test ruby gems
runs-on: ubuntu-20.04
strategy:
fail-fast: false
matrix:
include:
- { ruby: 2.6, bazel: 6.0.0}
- { ruby: 2.7, bazel: 6.0.0}
- { ruby: 3.0, bazel: 6.0.0}
- { ruby: 3.1, bazel: 6.0.0}
- { ruby: 3.2, bazel: 6.0.0}
- { ruby: jruby-9.2, bazel: 6.0.0}
- { ruby: jruby-9.3, bazel: 6.0.0}
- { ruby: 2.6, bazel: 5.1.1}
- { ruby: jruby-9.2, bazel: 5.1.1}
steps:
- uses: actions/checkout@v2
- name: Install bazel
run: |
sudo apt-get install -qy wget
mkdir $HOME/bin
wget -O $HOME/bin/bazel https://github.com/bazelbuild/bazel/releases/download/${{ matrix.bazel }}/bazel-${{ matrix.bazel }}-linux-x86_64
chmod a+x $HOME/bin/bazel
- name: Install git
run: |
sudo apt-get install -qy --no-install-recommends git
- name: Install ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ matrix.ruby }}
- name: Checkout
uses: actions/checkout@v3
with:
submodules: recursive
- name: Build cruby gem
run: $HOME/bin/bazel build ruby:release
if: ${{ !contains(matrix.ruby, 'jruby') }}
- name: Install cruby gem
run: gem install bazel-bin/ruby/google-protobuf-*
if: ${{ !contains(matrix.ruby, 'jruby') }}
- name: Build jruby gem
run: $HOME/bin/bazel build ruby:jruby_release
if: ${{ contains(matrix.ruby, 'jruby') }}
- name: Install jruby gem
run: gem install bazel-bin/ruby/google-protobuf-*
if: ${{ contains(matrix.ruby, 'jruby') }}
- name: Test installation
run: |
bazel run //:protoc -- --proto_path=$GITHUB_WORKSPACE/src --proto_path=$GITHUB_WORKSPACE/ruby/tests --proto_path=$GITHUB_WORKSPACE/ruby --ruby_out=$GITHUB_WORKSPACE/ruby tests/test_import_proto2.proto
bazel run //:protoc -- --proto_path=$GITHUB_WORKSPACE/src --proto_path=$GITHUB_WORKSPACE/ruby/tests --proto_path=$GITHUB_WORKSPACE/ruby --ruby_out=$GITHUB_WORKSPACE/ruby tests/basic_test.proto
ruby ruby/tests/basic.rb

@ -0,0 +1,30 @@
name: Staleness tests
on:
schedule:
# Run daily at 10 AM UTC (2 AM PDT)
- cron: 0 10 * * *
permissions: {}
jobs:
test:
strategy:
fail-fast: false
matrix:
branch: [main, 22.x]
os: [{ name: Linux, value: ubuntu-latest}]
name: ${{ matrix.os.name }} ${{ matrix.branch}}
runs-on: ${{ matrix.os.value }}
steps:
- name: Checkout ${{ matrix.branch }}
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
with:
ref: ${{ matrix.branch}}
- name: Run all staleness tests
uses: ./.github/actions/bazel
with:
credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
bazel-cache: staleness_check/${{ matrix.branch}}_${{ matrix.os.value }}
bash: bazel query 'attr(tags, "staleness_test", //...)' | xargs bazel test $BAZEL_FLAGS

@ -1,4 +1,4 @@
name: Auto-generate checked-in files
name: Auto-generate stale checked-in files
on:
push:
@ -22,7 +22,7 @@ jobs:
fail-fast: false # Don't cancel all jobs if one fails.
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
with:
# Note: this token has an expiration date, so if the workflow starts
# failing then you may need to generate a fresh token.

@ -0,0 +1,330 @@
name: C++ Tests
on:
workflow_call:
inputs:
safe-checkout:
required: true
description: "The SHA key for the commit we want to run over"
type: string
jobs:
linux:
strategy:
fail-fast: false # Don't cancel all jobs if one fails.
matrix:
config:
- { name: Optimized, flags: --config=opt }
- { name: Debug, flags: --config=dbg }
- { name: ASAN, flags: --config=asan }
- { name: MSAN, flags: --config=kokoro-msan }
- { name: TSAN, flags: --config=tsan }
- { name: UBSAN, flags: --config=ubsan }
- { name: No-RTTI, flags: --cxxopt=-fno-rtti }
include:
# Set defaults
- image: us-docker.pkg.dev/protobuf-build/containers/test/linux/sanitize@sha256:dbd2f15fb69734d72c3fd10cb819bbe2ce4890acf49e9a2f9403983fe48e8807
- targets: //pkg/... //src/... @com_google_protobuf_examples//...
# Override cases with custom images
- config: { name: "TCMalloc" }
image: "us-docker.pkg.dev/protobuf-build/containers/test/linux/tcmalloc@sha256:9d975616c3fd44d5a091aeb60ee94f37e22fb367d471d258fc18cb4a2387c943"
targets: "//src/..."
- config: { name: "aarch64" }
targets: "//src/... //src/google/protobuf/compiler:protoc_aarch64_test"
image: "us-docker.pkg.dev/protobuf-build/containers/test/linux/emulation:aarch64-e863f8ec6b1dfe41f7dc573bac9c8072a0a68b1b"
- config: { name: "Bazel4" }
targets: "//src/..."
image: "us-docker.pkg.dev/protobuf-build/containers/common/linux/bazel:4.2.3-3b71de326b62f67bf754c4dc4016d6a2fa9dd664"
name: Linux ${{ matrix.config.name }}
runs-on: ubuntu-latest
steps:
- name: Checkout pending changes
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
with:
ref: ${{ inputs.safe-checkout }}
- name: Run tests
uses: ./.github/actions/bazel-docker
with:
image: ${{ matrix.image }}
credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
bazel-cache: cpp_linux/${{ matrix.config.name }}
bazel: test ${{ matrix.targets }} ${{ matrix.config.flags }} --distinct_host_configuration=false
linux-cmake:
strategy:
fail-fast: false # Don't cancel all jobs if one fails.
matrix:
include:
- command: >-
/test.sh
-Dprotobuf_BUILD_CONFORMANCE=ON
-Dprotobuf_BUILD_EXAMPLES=ON
-DCMAKE_CXX_STANDARD=14
- name: Ninja
command: >-
/test.sh
-G Ninja
-Dprotobuf_BUILD_CONFORMANCE=ON
-DCMAKE_CXX_STANDARD=14
- name: Shared
command: >-
/test.sh
-Dprotobuf_BUILD_CONFORMANCE=ON
-Dprotobuf_BUILD_SHARED_LIBS=ON
-DCMAKE_CXX_STANDARD=14
name: Linux CMake ${{ matrix.name}}
runs-on: ubuntu-latest
steps:
- name: Checkout pending changes
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
with:
submodules: recursive
ref: ${{ inputs.safe-checkout }}
- name: Setup ccache
uses: ./.github/actions/ccache
with:
cache-prefix: linux-cmake-${{ matrix.name }}
- name: Run tests
uses: ./.github/actions/docker
with:
image: us-docker.pkg.dev/protobuf-build/containers/test/linux/cmake@sha256:e8282f42b1c1c0e6227d746e861954fd6fad0bd2e7424e6ceb23c249289a4016
credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
command: ${{ matrix.command }} ${{ env.CCACHE_CMAKE_FLAGS }}
linux-cmake-install:
name: Linux CMake Install
runs-on: ubuntu-latest
steps:
- name: Checkout pending changes
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
with:
submodules: recursive
ref: ${{ inputs.safe-checkout }}
- name: Setup ccache
uses: ./.github/actions/ccache
with:
cache-prefix: linux-cmake-install
- name: Run tests
uses: ./.github/actions/docker
with:
image: us-docker.pkg.dev/protobuf-build/containers/test/linux/cmake@sha256:e8282f42b1c1c0e6227d746e861954fd6fad0bd2e7424e6ceb23c249289a4016
credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
command: >-
/install.sh -DCMAKE_CXX_STANDARD=14 ${{ env.CCACHE_CMAKE_FLAGS }} \&\&
/test.sh
${{ env.CCACHE_CMAKE_FLAGS }}
-Dprotobuf_REMOVE_INSTALLED_HEADERS=ON
-Dprotobuf_BUILD_PROTOBUF_BINARIES=OFF
-Dprotobuf_BUILD_CONFORMANCE=ON
-DCMAKE_CXX_STANDARD=14
linux-cmake-32-bit:
name: Linux CMake 32-bit
runs-on: ubuntu-latest
steps:
- name: Checkout pending changes
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
with:
submodules: recursive
ref: ${{ inputs.safe-checkout }}
- name: Setup ccache
uses: ./.github/actions/ccache
with:
cache-prefix: linux-cmake-32-bit
- name: Run tests
uses: ./.github/actions/docker
with:
image: us-docker.pkg.dev/protobuf-build/containers/test/linux/32bit@sha256:f99f051daa8b12f4ebad5927f389bc71372f771ab080290ab451cbaf1648f9ea
platform: linux/386
credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
command: >-
/bin/bash -c '
cd /workspace;
ccache -z;
cmake . -DCMAKE_CXX_STANDARD=14 ${{ env.CCACHE_CMAKE_FLAGS }};
cmake --build . --parallel 20;
ctest --verbose --parallel 20;
ccache -s'
non-linux:
strategy:
fail-fast: false # Don't cancel all jobs if one fails.
matrix:
include:
- name: MacOS
os: macos-12
bazel: //src/...
- name: Windows
os: windows-2019
bazel: //src/... @com_google_protobuf_examples//... --test_tag_filters=-conformance --build_tag_filters=-conformance
name: ${{ matrix.name }} Bazel
runs-on: ${{ matrix.os }}
steps:
- name: Checkout pending changes
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
with:
ref: ${{ inputs.safe-checkout }}
- name: Run tests
uses: ./.github/actions/bazel
with:
credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
bazel: test ${{ matrix.bazel }}
bazel-cache: cpp_${{ matrix.os }}
macos-cmake:
name: MacOS CMake
runs-on: macos-12
steps:
- name: Checkout pending changes
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
with:
submodules: recursive
ref: ${{ inputs.safe-checkout }}
- name: Setup ccache
uses: ./.github/actions/ccache
with:
cache-prefix: macos-cmake
- name: Configure CMake
uses: ./.github/actions/bash
with:
credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
command: cmake . -DCMAKE_CXX_STANDARD=14 ${{ env.CCACHE_CMAKE_FLAGS }}
- name: Build
run: cmake --build . --parallel 8
- name: Test
run: ctest --verbose --parallel 20 -C Debug
- name: Report ccache stats
shell: bash
run: ccache -s -v
windows-cmake:
strategy:
fail-fast: false # Don't cancel all jobs if one fails.
matrix:
include:
- name: Visual Studio
flags: >-
-Dprotobuf_BUILD_SHARED_LIBS=OFF
-Dprotobuf_BUILD_EXAMPLES=ON
- name: Shared
flags: -Dprotobuf_BUILD_SHARED_LIBS=ON
name: Windows CMake ${{ matrix.name}}
runs-on: windows-2019
steps:
- name: Checkout pending changes
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
with:
submodules: recursive
ref: ${{ inputs.safe-checkout }}
- name: Setup MSVC
uses: ilammy/msvc-dev-cmd@cec98b9d092141f74527d0afa6feb2af698cfe89 # v1.12.1
with:
arch: x64
vsversion: '2019'
- name: Setup ccache
uses: ./.github/actions/ccache
with:
cache-prefix: windows-cmake-${{ matrix.name }}
- name: Configure CMake
uses: ./.github/actions/bash
with:
credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
command: |
cmake . -G "Visual Studio 16 2019" -A x64 \
${{ env.CCACHE_CMAKE_FLAGS }} \
-Dprotobuf_BUILD_CONFORMANCE=OFF \
-Dprotobuf_WITH_ZLIB=OFF \
${{ matrix.flags }}
- name: Build for Windows 15 2017
run: >-
msbuild.exe protobuf.sln /p:MultiProcessorCompilation=true /p:CL_MPCount=8 /maxcpucount:8 /p:BuildInParallel=true
/p:Configuration=Debug /p:Platform=x64 /p:VisualStudioVersion=15.0
${{ env.CCACHE_MSBUILD_FLAGS }}
- name: Run Tests
run: ctest --verbose --parallel 20 -C Debug
- name: Report ccache stats
run: ${{ github.workspace }}\ccache.exe -s -v
windows-cmake-install:
name: Windows CMake Install
runs-on: windows-2019
steps:
- name: Checkout pending changes
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
with:
submodules: recursive
ref: ${{ inputs.safe-checkout }}
- name: Setup MSVC
uses: ilammy/msvc-dev-cmd@cec98b9d092141f74527d0afa6feb2af698cfe89 # v1.12.1
with:
arch: x64
vsversion: '2019'
- name: Setup ccache
uses: ./.github/actions/ccache
with:
cache-prefix: windows-cmake
- name: Configure CMake for Install
uses: ./.github/actions/bash
with:
credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
command: |
mkdir build
pushd build
cmake .. -G "Visual Studio 16 2019" -A x64 \
${{ env.CCACHE_CMAKE_FLAGS }} \
-Dprotobuf_BUILD_CONFORMANCE=OFF \
-Dprotobuf_WITH_ZLIB=OFF
popd
- name: Build and Install Protobuf for Windows 15 2017
run: |
pushd build
msbuild.exe INSTALL.vcxproj /p:Platform=x64 /p:VisualStudioVersion=15.0 /p:MultiProcessorCompilation=true /p:CL_MPCount=8 /maxcpucount:8 /p:BuildInParallel=true ${{ env.CCACHE_MSBUILD_FLAGS }}
popd
- name: Clear CMake cache
shell: bash
run: rm -rf build/*
- name: Configure CMake
shell: bash
run: |
cmake . -G "Visual Studio 16 2019" -A x64 \
${{ env.CCACHE_CMAKE_FLAGS }} \
-Dprotobuf_REMOVE_INSTALLED_HEADERS=ON \
-Dprotobuf_BUILD_PROTOBUF_BINARIES=OFF \
-Dprotobuf_BUILD_CONFORMANCE=OFF \
-Dprotobuf_WITH_ZLIB=OFF
- name: Build for Windows 15 2017
run: >-
msbuild.exe protobuf.sln /p:MultiProcessorCompilation=true /p:CL_MPCount=8 /maxcpucount:8 /p:BuildInParallel=true
/p:Configuration=Debug /p:Platform=x64 /p:VisualStudioVersion=15.0
${{ env.CCACHE_MSBUILD_FLAGS }}
- name: Run Tests
run: ctest --verbose --parallel 20 -C Debug
- name: Report ccache stats
run: ${{ github.workspace }}\ccache.exe -s -v

@ -0,0 +1,86 @@
name: C# Tests
on:
workflow_call:
inputs:
safe-checkout:
required: true
description: "The SHA key for the commit we want to run over"
type: string
jobs:
linux:
name: Linux
runs-on: ubuntu-latest
steps:
- name: Checkout pending changes
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
with:
ref: ${{ inputs.safe-checkout }}
- name: Run tests
uses: ./.github/actions/bazel-docker
with:
image: us-docker.pkg.dev/protobuf-build/containers/test/linux/csharp:3.1.415-6.0.100-65526ea124d1034eac33e7c37cc6d65c5bef054f
credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
bazel-cache: csharp_linux
bazel: test //csharp/... --action_env=DOTNET_CLI_TELEMETRY_OPTOUT=1 --test_env=DOTNET_CLI_HOME=/home/bazel
windows:
name: Windows
runs-on: windows-2019
steps:
- name: Checkout pending changes
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
with:
ref: ${{ inputs.safe-checkout }}
- name: Setup dotnet
uses: actions/setup-dotnet@607fce577a46308457984d59e4954e075820f10a # v3.0.3
with:
dotnet-version: '6.0.x'
- name: Build
run: dotnet build csharp/src/Google.Protobuf.sln
- name: Run Tests
run: dotnet test csharp/src/Google.Protobuf.Test/Google.Protobuf.Test.csproj
linux-aarch64:
name: Linux aarch64
runs-on: ubuntu-latest
steps:
- name: Checkout pending changes
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
with:
ref: ${{ inputs.safe-checkout }}
- name: Build protobuf C# tests under x86_64 docker image
# Tests are built "dotnet publish" because we want all the dependencies to the copied to the destination directory
# (we want to avoid references to ~/.nuget that won't be available in the subsequent docker run)
uses: ./.github/actions/docker
with:
image: mcr.microsoft.com/dotnet/sdk:6.0.100-bullseye-slim
credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
command: >-
/bin/bash -c '
DOTNET_CLI_TELEMETRY_OPTOUT=true
DOTNET_SKIP_FIRST_TIME_EXPERIENCE=true
dotnet publish -c Release -f net60 /workspace/csharp/src/Google.Protobuf.Test/Google.Protobuf.Test.csproj'
- name: Use an actual aarch64 docker image to run protobuf C# tests with an emulator
# "dotnet vstest" allows running tests from a pre-built project.
# * mount the protobuf root as /work to be able to access the crosscompiled files
# * to avoid running the process inside docker as root (which can pollute the workspace with files owned by root), we force
# running under current user's UID and GID. To be able to do that, we need to provide a home directory for the user
# otherwise the UID would be homeless under the docker container and pip install wouldn't work. For simplicity,
# we just run map the user's home to a throwaway temporary directory
uses: ./.github/actions/docker
with:
image: mcr.microsoft.com/dotnet/sdk:6.0.100-bullseye-slim-arm64v8
skip-staleness-check: true
credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
command: >-
/bin/bash -c '
DOTNET_CLI_TELEMETRY_OPTOUT=true
DOTNET_SKIP_FIRST_TIME_EXPERIENCE=true
dotnet vstest /workspace/csharp/src/Google.Protobuf.Test/bin/Release/net60/publish/Google.Protobuf.Test.dll'

@ -0,0 +1,69 @@
name: Java Tests
on:
workflow_call:
inputs:
safe-checkout:
required: true
description: "The SHA key for the commit we want to run over"
type: string
jobs:
linux:
strategy:
fail-fast: false
matrix:
include:
- name: OpenJDK 11
version: '11'
image: us-docker.pkg.dev/protobuf-build/containers/common/linux/bazel:5.1.1-aec4d74f2eb6938fc53ef7d9a79a4bf2da24abc1
targets: //java/... //java/internal:java_version
- name: OpenJDK 17
version: '17'
image: us-docker.pkg.dev/protobuf-build/containers/test/linux/java:17-65526ea124d1034eac33e7c37cc6d65c5bef054f
targets: //java/... //java/internal:java_version
- name: aarch64
version: 'aarch64'
image: us-docker.pkg.dev/protobuf-build/containers/test/linux/emulation:aarch64-e863f8ec6b1dfe41f7dc573bac9c8072a0a68b1b
targets: //java/... //src/google/protobuf/compiler:protoc_aarch64_test
name: Linux ${{ matrix.name }}
runs-on: ubuntu-latest
steps:
- name: Checkout pending changes
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
with:
ref: ${{ inputs.safe-checkout }}
- name: Run tests
uses: ./.github/actions/bazel-docker
with:
image: ${{ matrix.image }}
credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
bazel-cache: java_linux/${{ matrix.version }}
bazel: test ${{ matrix.targets }} --test_env=KOKORO_JAVA_VERSION
linkage-monitor:
name: Linux Linkage Monitor
runs-on: ubuntu-latest
steps:
- name: Checkout pending changes
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
with:
ref: ${{ inputs.safe-checkout }}
- name: Build protoc
uses: ./.github/actions/bazel
with:
credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
bazel-cache: java_linux_linkage
bash: |
$BAZEL build //:protoc $BAZEL_FLAGS
# The java build setup expects protoc in the root directory.
cp bazel-bin/protoc .
- name: Install snapshot version locally
run: |
cd java
mvn -e -B -Dhttps.protocols=TLSv1.2 install -Dmaven.test.skip=true
- name: Download Linkage Monitor
run: curl -v -O "https://storage.googleapis.com/cloud-opensource-java-linkage-monitor/linkage-monitor-latest-all-deps.jar"
- name: Fails if there's new linkage errors compared with baseline
run: java -Xmx2048m -jar linkage-monitor-latest-all-deps.jar com.google.cloud:libraries-bom

@ -0,0 +1,102 @@
name: Objective-C Tests
on:
workflow_call:
inputs:
safe-checkout:
required: true
description: "The SHA key for the commit we want to run over"
type: string
jobs:
xcode:
strategy:
fail-fast: false # Don't cancel all jobs if one fails.
matrix:
include:
- name: macOS
config: osx
flags: --skip-xcode-ios --skip-xcode-tvos --skip-objc-conformance
# The iOS simulator takes a while to start up, so Debug & Release are run in
# parallel to get the testing done faster.
- name: iOS Debug
config: ios_debug
flags: --skip-xcode-osx --skip-xcode-tvos --skip-objc-conformance --skip-xcode-release
- name: iOS Release
config: ios_release
flags: --skip-xcode-osx --skip-xcode-tvos --skip-objc-conformance --skip-xcode-debug
name: Xcode ${{ matrix.name}}
runs-on: macos-12
env:
DEVELOPER_DIR: /Applications/Xcode_14.1.app/Contents/Developer
steps:
- name: Checkout pending changes
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
with:
ref: ${{ inputs.safe-checkout }}
- name: Setup ccache
uses: ./.github/actions/ccache
with:
cache-prefix: objectivec_macos_${{ matrix.config }}
support-modules: true
- name: Run tests
uses: ./.github/actions/bazel
env:
CC: ${{ github.workspace }}/ci/clang_wrapper
CXX: ${{ github.workspace }}/ci/clang_wrapper++
with:
credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
bazel-cache: objectivec_macos/${{ matrix.config }}
bash: objectivec/DevTools/full_mac_build.sh ${{ matrix.flags }}
- name: Report ccache stats
shell: bash
run: ccache -s -v
pod-lib-lint:
strategy:
fail-fast: false # Don't cancel all jobs if one fails.
matrix:
# Add back 'watchos'. See CocoaPods/CocoaPods#11558
PLATFORM: ["ios", "macos", "tvos"]
CONFIGURATION: ["Debug", "Release"]
name: CocoaPods ${{ matrix.PLATFORM}} ${{ matrix.CONFIGURATION}}
runs-on: macos-12
env:
DEVELOPER_DIR: /Applications/Xcode_14.1.app/Contents/Developer
steps:
- name: Checkout pending changes
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
with:
ref: ${{ inputs.safe-checkout }}
- name: Pod lib lint
run: |
pod lib lint --verbose \
--configuration=${{ matrix.CONFIGURATION }} \
--platforms=${{ matrix.PLATFORM }} \
Protobuf.podspec
bazel:
strategy:
fail-fast: false # Don't cancel all jobs if one fails.
matrix:
include:
# TODO: Could add iOS to atleast build the objc_library targets for that.
- name: macOS
bazel: //objectivec/...
name: Bazel ${{ matrix.name }}
runs-on: macos-12
steps:
- name: Checkout pending changes
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
with:
ref: ${{ inputs.safe-checkout }}
- name: Run tests
uses: ./.github/actions/bazel
with:
credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
bazel: test ${{ matrix.bazel }}
bazel-cache: objc_${{ matrix.name }}

@ -0,0 +1,182 @@
name: PHP Tests
on:
workflow_call:
inputs:
safe-checkout:
required: true
description: "The SHA key for the commit we want to run over"
type: string
jobs:
linux:
strategy:
fail-fast: false # Don't cancel all jobs if one fails.
matrix:
include:
- name: 7.3 Debug
version: 7.3.28-dbg
command: composer test \&\& composer test_c
- name: 7.4 Debug
version: 7.4.18-dbg
command: composer test \&\& composer test_c
- name: 8.0 Optimized
version: 8.0.5
command: composer test \&\& composer test_c
- name: 8.0 Debug
version: 8.0.5-dbg
command: composer test \&\& composer test_c
- name: 8.0 Memory Leak
version: 8.0.5-dbg
# Run specialized memory leak & multirequest tests.
command: composer test_c \&\& tests/multirequest.sh \&\& tests/memory_leak_test.sh
- name: 8.0 Valgrind
version: 8.0.5-dbg
command: composer test_valgrind
name: Linux ${{ matrix.name}}
runs-on: ubuntu-latest
steps:
- name: Checkout pending changes
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
with:
submodules: recursive
ref: ${{ inputs.safe-checkout }}
- name: Run tests
uses: ./.github/actions/docker
with:
image: us-docker.pkg.dev/protobuf-build/containers/test/linux/php:${{ matrix.version }}-6e95c0e221e4bd52e3b4dc1398c6336985196931
credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
command: ${{ matrix.command }}
linux-32bit:
strategy:
fail-fast: false # Don't cancel all jobs if one fails.
matrix:
version: ['7.4', '8.0']
suffix: [ '', '-zts']
test: ['test', 'test_c']
exclude:
- suffix: '-zts'
test: 'test'
include:
- suffix: '-zts'
suffix_name: ' Thread Safe'
- test: 'test_c'
test_name: ' Extension'
name: Linux 32-bit ${{ matrix.version}}${{ matrix.suffix_name }}${{ matrix.test_name }}
runs-on: ubuntu-latest
env:
image: us-docker.pkg.dev/protobuf-build/containers/test/linux/32bit@sha256:97f50ab24582380012d7ddef5f82f08e19b9dff55d09a4a8d90a87421ae66a45
steps:
- name: Checkout pending changes
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
with:
submodules: recursive
ref: ${{ inputs.safe-checkout }}
- name: Cross compile protoc for i386
id: cross-compile
uses: ./.github/actions/cross-compile-protoc
with:
credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
architecture: linux-i386
- name: Run tests
uses: ./.github/actions/docker
with:
image: ${{ env.image }}
skip-staleness-check: true
platform: linux/386
credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
command: >-
/bin/bash -c '
cd php && php -v && php -m;
composer update --ignore-platform-reqs;
PROTOC=/workspace/${{ steps.cross-compile.outputs.protoc }}
PATH="/usr/local/php-${{ matrix.version }}${{matrix.suffix}}/bin:$PATH"
composer ${{ matrix.test }}'
linux-aarch64:
name: Linux aarch64
runs-on: ubuntu-latest
steps:
- name: Checkout pending changes
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
with:
ref: ${{ inputs.safe-checkout }}
- name: Cross compile protoc for aarch64
id: cross-compile
uses: ./.github/actions/cross-compile-protoc
with:
credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
architecture: linux-aarch64
- name: Run tests
uses: ./.github/actions/docker
with:
image: us-docker.pkg.dev/protobuf-build/containers/test/linux/php-aarch64:0cc100b6e03d14c1e8f71ae794dc162ed122fe31@sha256:77b70feba68dced1f0fd21b52a08d3d2e0c5c797bfe68435a0038ce87ecfd310
platform: linux/arm64
skip-staleness-check: true
credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
command: >-
-c '
cd php;
composer update --ignore-platform-reqs;
PROTOC=/workspace/${{ steps.cross-compile.outputs.protoc }}
composer test;
PROTOC=/workspace/${{ steps.cross-compile.outputs.protoc }}
composer test_c'
macos:
strategy:
fail-fast: false # Don't cancel all jobs if one fails.
matrix:
version: ['7.4', '8.0']
name: MacOS PHP ${{ matrix.version }}
runs-on: macos-12
steps:
- name: Checkout pending changes
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
with:
submodules: recursive
ref: ${{ inputs.safe-checkout }}
- name: Install dependencies
run: brew install coreutils # For sha256sum
- name: Pin PHP version
uses: shivammathur/setup-php@d30ad8b1843ace22e6698ab99bbafaa747b6bd0d # 2.24.0
with:
php-version: ${{ matrix.version }}
- name: Check PHP version
run: php --version | grep ${{ matrix.version }} || (echo "Invalid PHP version - $(php --version)" && exit 1)
- name: Run tests
uses: ./.github/actions/bazel
with:
credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
bazel-cache: php_macos/${{ matrix.version }}
bash: |
pushd php
rm -rf vendor
php -v
php -m
composer update
composer test_c
popd
- name: Run conformance tests
uses: ./.github/actions/bazel
with:
credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
bazel-cache: php_macos/${{ matrix.version }}
bash: >-
bazelisk $BAZEL_STARTUP_FLAGS \
test $BAZEL_FLAGS \
--action_env=PATH --test_env=PATH \
//php:conformance_test_c

@ -1,15 +1,19 @@
name: PHP extension
name: PHP Extension Tests
on:
- push
- pull_request
workflow_call:
inputs:
safe-checkout:
required: true
description: "The SHA key for the commit we want to run over"
type: string
permissions:
contents: read # to fetch code (actions/checkout)
jobs:
build-php:
name: Build PHP extension
name: Build
runs-on: ubuntu-latest
container: ${{ matrix.php-image }}
strategy:
@ -17,6 +21,8 @@ jobs:
php-image:
- php:7.4-cli
- php:8.1-cli
# TODO(b/266868629) Dockerize these instead of installing all the
# dependencies on each run.
steps:
- name: Install python3
run: |
@ -32,8 +38,9 @@ jobs:
run: |
apt-get install -qy --no-install-recommends git
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
with:
ref: ${{ inputs.safe-checkout }}
submodules: recursive
- name: Create package
run: |

@ -0,0 +1,95 @@
name: Python Tests
on:
workflow_call:
inputs:
safe-checkout:
required: true
description: "The SHA key for the commit we want to run over"
type: string
jobs:
linux:
strategy:
fail-fast: false # Don't cancel all jobs if one fails.
matrix:
type: [ Pure, C++]
version: [ "3.7", "3.8", "3.9", "3.10" ]
include:
- type: Pure
targets: //python/... @upb//python/... //python:python_version
flags: --define=use_fast_cpp_protos=false
- type: C++
targets: //python/... //python:python_version
flags: --define=use_fast_cpp_protos=true
- type: C++
version: aarch64
targets: //python/... //python:aarch64_test
# TODO(b/262628111) Enable this once conformance tests are fixed.
flags: --define=use_fast_cpp_protos=true --test_tag_filters=-conformance
image: us-docker.pkg.dev/protobuf-build/containers/test/linux/emulation:aarch64-e863f8ec6b1dfe41f7dc573bac9c8072a0a68b1b
name: Linux ${{ matrix.type }} ${{ matrix.version }}
runs-on: ubuntu-latest
steps:
- name: Checkout pending changes
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
with:
ref: ${{ inputs.safe-checkout }}
- name: Run tests
uses: ./.github/actions/bazel-docker
with:
image: ${{ matrix.image || format('us-docker.pkg.dev/protobuf-build/containers/test/linux/python:{0}-65526ea124d1034eac33e7c37cc6d65c5bef054f', matrix.version) }}
credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
bazel-cache: python_linux/${{ matrix.type }}_${{ matrix.version }}
bazel: test ${{ matrix.targets }} ${{ matrix.flags }} --test_env=KOKORO_PYTHON_VERSION
macos:
strategy:
fail-fast: false # Don't cancel all jobs if one fails.
matrix:
type: [ Pure, C++]
# TODO(b/267550843) Consider expanding this set of versions.
version: [ "3.10" ]
include:
- type: Pure
targets: //python/... @upb//python/... //python:python_version
- type: C++
targets: //python/... //python:python_version
flags: --define=use_fast_cpp_protos=true
name: MacOS ${{ matrix.type }} ${{ matrix.version }}
runs-on: macos-12
steps:
- name: Checkout pending changes
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
with:
submodules: recursive
ref: ${{ inputs.safe-checkout }}
- name: Pin Python version
uses: actions/setup-python@d27e3f3d7c64b4bbf8e4abfb9b63b83e846e0435 # v4.5.0
with:
python-version: ${{ matrix.version }}
cache: pip
- name: Validate version
run: python3 --version | grep ${{ matrix.version }} || (echo "Invalid Python version - $(python3 --version)" && exit 1)
- name: Create and start virtual environment
run: |
python3 -m venv venv
source venv/bin/activate
- name: Run tests
uses: ./.github/actions/bazel
env:
KOKORO_PYTHON_VERSION: ${{ matrix.version }}
with:
credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
bazel-cache: python_macos/${{ matrix.type }}_${{ matrix.version }}
bazel: >-
test ${{ matrix.targets }} ${{ matrix.flags }}
--test_env=KOKORO_PYTHON_VERSION=${{ matrix.version }}
--macos_minimum_os=10.9

@ -0,0 +1,139 @@
name: Ruby Tests
on:
workflow_call:
inputs:
safe-checkout:
required: true
description: "The SHA key for the commit we want to run over"
type: string
jobs:
linux:
strategy:
fail-fast: false
matrix:
include:
- { name: Ruby 2.6, ruby: ruby-2.6.0, bazel: 5.1.1}
- { name: Ruby 2.7, ruby: ruby-2.7.0, bazel: 5.1.1}
- { name: Ruby 3.0, ruby: ruby-3.0.2, bazel: 5.1.1}
- { name: Ruby 3.1, ruby: ruby-3.1.0, bazel: 5.1.1}
- { name: Ruby 3.2, ruby: ruby-3.2.0, bazel: 5.1.1}
- { name: JRuby 9.2, ruby: jruby-9.2.20.1, bazel: 5.1.1}
- { name: JRuby 9.3, ruby: jruby-9.3.4.0, bazel: 5.1.1}
- { name: Ruby 2.6 (Bazel6), ruby: ruby-2.6.0, bazel: 6.0.0}
- { name: JRuby 9.2 (Bazel6), ruby: jruby-9.2.20.1, bazel: 6.0.0}
name: Linux ${{ matrix.name }}
runs-on: ubuntu-latest
steps:
- name: Checkout pending changes
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
with:
ref: ${{ inputs.safe-checkout }}
- name: Run tests
uses: ./.github/actions/bazel-docker
with:
image: ${{ matrix.image || format('us-docker.pkg.dev/protobuf-build/containers/test/linux/ruby:{0}-{1}-75e79f791b96e056086f43ace729cf3ebf9a9f5d', matrix.ruby, matrix.bazel) }}
credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
bazel-cache: ruby_linux/${{ matrix.ruby }}_${{ matrix.bazel }}
bazel: test //ruby/... //ruby/tests:ruby_version --test_env=KOKORO_RUBY_VERSION
linux-aarch64:
name: Linux aarch64
runs-on: ubuntu-latest
steps:
- name: Checkout pending changes
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
with:
ref: ${{ inputs.safe-checkout }}
- name: Cross compile protoc for aarch64
id: cross-compile
uses: ./.github/actions/cross-compile-protoc
with:
credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
architecture: linux-aarch64
- name: Run tests
uses: ./.github/actions/docker
with:
image: arm64v8/ruby:2.7.3-buster
skip-staleness-check: true
credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
command: >-
/bin/bash -c '
gem install bundler;
cd /workspace/ruby;
bundle;
PROTOC=/workspace/${{ steps.cross-compile.outputs.protoc }} rake;
rake clobber_package gem;
PROTOC=/workspace/${{ steps.cross-compile.outputs.protoc }} rake test'
macos:
strategy:
fail-fast: false # Don't cancel all jobs if one fails.
matrix:
# This is the full set of versions we support on MacOS.
version: [ "2.7", "3.0", "3.1", "3.2" ]
name: MacOS Ruby ${{ matrix.version }}
runs-on: macos-12
steps:
- name: Checkout pending changes
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
with:
submodules: recursive
ref: ${{ inputs.safe-checkout }}
- name: Pin Ruby version
uses: ruby/setup-ruby@ee26e27437bde475b19a6bf8cb73c9fa658876a2 # v1.134.0
with:
ruby-version: ${{ matrix.version }}
- name: Validate version
run: ruby --version | grep ${{ matrix.version }} || (echo "Invalid Ruby version - $(ruby --version)" && exit 1)
- name: Run tests
uses: ./.github/actions/bazel
with:
credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
bazel-cache: ruby_macos/${{ matrix.version }}
bazel: test //ruby/... --test_env=KOKORO_RUBY_VERSION=${{ matrix.version }}
test_ruby_gems:
strategy:
fail-fast: false
matrix:
include:
- { name: Ruby 2.6, ruby: ruby-2.6.0, bazel: 5.1.1}
- { name: Ruby 2.7, ruby: ruby-2.7.0, bazel: 5.1.1}
- { name: Ruby 3.0, ruby: ruby-3.0.2, bazel: 5.1.1}
- { name: Ruby 3.1, ruby: ruby-3.1.0, bazel: 5.1.1}
- { name: Ruby 3.2, ruby: ruby-3.2.0, bazel: 5.1.1}
- { name: JRuby 9.2, ruby: jruby-9.2.20.1, bazel: 5.1.1}
- { name: JRuby 9.3, ruby: jruby-9.3.4.0, bazel: 5.1.1}
- { name: Ruby 2.6 (Bazel6), ruby: ruby-2.6.0, bazel: 6.0.0}
- { name: JRuby 9.2 (Bazel6), ruby: jruby-9.2.20.1, bazel: 6.0.0}
name: Install ${{ matrix.name }}
runs-on: ubuntu-latest
steps:
- name: Checkout pending changes
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
with:
ref: ${{ inputs.safe-checkout }}
- name: Run tests
uses: ./.github/actions/bazel-docker
with:
image: us-docker.pkg.dev/protobuf-build/containers/test/linux/ruby:${{ matrix.ruby }}-${{ matrix.bazel }}-75e79f791b96e056086f43ace729cf3ebf9a9f5d
credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
bazel-cache: ruby_install/${{ matrix.ruby }}_${{ matrix.bazel }}
bash: >
bazel --version;
ruby --version;
bazel build //ruby:release //:protoc $BAZEL_FLAGS;
gem install bazel-bin/ruby/google-protobuf-*;
bazel-bin/protoc --proto_path=src --proto_path=ruby/tests --proto_path=ruby --ruby_out=ruby tests/test_import_proto2.proto;
bazel-bin/protoc --proto_path=src --proto_path=ruby/tests --proto_path=ruby --ruby_out=ruby tests/basic_test.proto;
ruby ruby/tests/basic.rb

@ -0,0 +1,161 @@
name: Tests
# This file implements the protection strategy laid out in
# go/protobuf-gha-protected-resources. Pull requests from branches within this
# repository are considered safe and will immediately start running tests on
# every commit. Pull requests from forked repositories are unsafe, and leave
# us vulnerable to PWN requests and stolen resources. In these cases, we
# require a special "safe for tests" tag to be added to the pull request before
# we start testing. This will be immediately removed, so that further commits
# require their own stamp to test.
on:
# continuous
schedule:
# Run daily at 10 AM UTC (2 AM PDT)
- cron: 0 10 * * *
# postsubmit
push:
branches:
- main
- '[0-9]+.x'
# The 21.x branch still uses Kokoro
- '!21.x'
# For testing purposes so we can stage this on the `gha` branch.
- gha
# safe presubmit
pull_request:
branches:
- main
- '[0-9]+.x'
# The 21.x branch still uses Kokoro
- '!21.x'
# For testing purposes so we can stage this on the `gha` branch.
- gha
# unsafe presubmit
pull_request_target:
branches:
- main
- '[0-9]+.x'
# The 21.x branch still uses Kokoro
- '!21.x'
# For testing purposes so we can stage this on the `gha` branch.
- gha
types: [labeled, opened, reopened, synchronize]
# manual
workflow_dispatch:
jobs:
check-tag:
name: Check for Safety
# Avoid running tests twice on PR updates. If the PR is coming from our
# repository, it's safe and we can use `pull_request`. Otherwise, we should
# use `pull_request_target`.
if: |
(github.event_name == 'push' &&
github.event.repository.full_name == 'protocolbuffers/protobuf') ||
(github.event_name == 'pull_request' &&
github.event.pull_request.head.repo.full_name == 'protocolbuffers/protobuf') ||
(github.event_name == 'pull_request_target' &&
github.event.pull_request.head.repo.full_name != 'protocolbuffers/protobuf')
runs-on: ubuntu-latest
outputs:
# Store the sha for checkout so we can easily use it later. For safe
# events, this will be blank and use the defaults.
checkout-sha: ${{ steps.safe-checkout.outputs.sha }}
steps:
- name: Check
# Trivially pass for safe PRs, and explicitly error for unsafe ones
# unless this is specifically an event for adding the safe label.
run: >
${{ github.event_name != 'pull_request_target' || github.event.label.name == ':a: safe for tests' }} ||
(echo "This pull request is from an unsafe fork and hasn't been approved to run tests!" && exit 1)
- name: Cache safe commit
id: safe-checkout
run: >
${{ github.event_name != 'pull_request_target' }} ||
echo "sha=${{ github.event.pull_request.head.sha }}" >> $GITHUB_OUTPUT
remove-tag:
name: Remove safety tag
needs: [check-tag]
if: github.event.action == 'labeled'
runs-on: ubuntu-latest
steps:
- uses: actions-ecosystem/action-remove-labels@2ce5d41b4b6aa8503e285553f75ed56e0a40bae0 # v1.3.0
with:
labels: safe for tests
# Note: this pattern of passing the head sha is vulnerable to PWN requests for
# pull_request_target events. We carefully limit those workflows to require a
# human stamp before continuing.
cpp:
name: C++
needs: [check-tag]
uses: ./.github/workflows/test_cpp.yml
with:
safe-checkout: ${{ needs.check-tag.outputs.checkout-sha }}
secrets: inherit
java:
name: Java
needs: [check-tag]
uses: ./.github/workflows/test_java.yml
with:
safe-checkout: ${{ needs.check-tag.outputs.checkout-sha }}
secrets: inherit
python:
name: Python
needs: [check-tag]
uses: ./.github/workflows/test_python.yml
with:
safe-checkout: ${{ needs.check-tag.outputs.checkout-sha }}
secrets: inherit
ruby:
name: Ruby
needs: [check-tag]
uses: ./.github/workflows/test_ruby.yml
with:
safe-checkout: ${{ needs.check-tag.outputs.checkout-sha }}
secrets: inherit
php:
name: PHP
needs: [check-tag]
uses: ./.github/workflows/test_php.yml
with:
safe-checkout: ${{ needs.check-tag.outputs.checkout-sha }}
secrets: inherit
php-ext:
name: PHP Extension
needs: [check-tag]
uses: ./.github/workflows/test_php_ext.yml
with:
safe-checkout: ${{ needs.check-tag.outputs.checkout-sha }}
secrets: inherit
csharp:
name: C#
needs: [check-tag]
uses: ./.github/workflows/test_csharp.yml
with:
safe-checkout: ${{ needs.check-tag.outputs.checkout-sha }}
secrets: inherit
objectivec:
name: Objective-C
needs: [check-tag]
uses: ./.github/workflows/test_objectivec.yml
with:
safe-checkout: ${{ needs.check-tag.outputs.checkout-sha }}
secrets: inherit

@ -15,12 +15,12 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout protobuf-php
uses: actions/checkout@v3
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
with:
repository: protocolbuffers/protobuf-php
token: ${{ secrets.BOT_ACCESS_TOKEN }}
- name: Clone protobuf
uses: actions/checkout@v3
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
with:
path: protobuf
- name: Configure Git Bot

3
.gitignore vendored

@ -208,3 +208,6 @@ BenchmarkDotNet.Artifacts/
# Clangd uses these common ephemeral files
.cache
compile_commands.json
# Ignore GHA NodeJS files
.github/**/node_modules/

@ -194,10 +194,6 @@ alias(
cc_library(
name = "protobuf",
hdrs = glob([
"src/**/*.h",
"src/**/*.inc",
]),
copts = COPTS,
include_prefix = "google/protobuf/io",
linkopts = LINK_OPTS,
@ -550,7 +546,6 @@ pkg_files(
allow_empty = True,
) + [
"BUILD.bazel",
"CHANGES.txt",
"CMakeLists.txt",
"CONTRIBUTORS.txt",
"LICENSE",

@ -1,75 +0,0 @@
2022-07-01 Unreleased version
# C++
* cpp_generated_lib_linked support is removed in protoc
* Reduced .pb.o object file size slightly by explicitly instantiating
InternalMetadata templates in the runtime.
* Breaking change: Add C++20 reserved keywords.
* Fixed crash in ThreadLocalStorage for pre-C++17 compilers on 32-bit ARM.
* Clarified that JSON API non-OK statuses are not a stable API.
* Added a default implementation of MessageDifferencer::Reporter methods.
* proto2::MapPair is now an alias to std::pair.
* Hide C++ RepeatedField::UnsafeArenaSwap
* Use table-driven parser for reflection based objects.
* Update Map's InternalSwap() to take a pointer to the other Map.
* Add ARM-optimized Varint decoding functions.
* Minor optimization for parsing groups
* Declare ReflectiveProtoHook class
* Reduce size of VarintParse code in protocol buffers, by calling the shared
routine after handling just one-byte varint encoding inline, rather than
handling one-byte and two-byte varints inline.
* Avoid inlining some large heavily duplicated routines in repeated_ptr_field.h
* Add ReflectiveProtoHook to Reflection.
* Turns on table-driven parser for reflection based objects.
* Save code space by avoiding inlining of large-in-aggregate code-space MessageLite::~MessageLite destructor.
* Undefine the macro `linux` when compiling protobuf
* Reduce memory consumption of MessageSet parsing.
* Save code space by avoiding inlining of large-in-aggregate code-space MessageLite::~MessageLite destructor.
* Breaking change: Delete Arena::Init
* Make a PROTOBUF_POISON/UNPOISON to reduce noise in the source
* Put alignment functions in "arena_align.h"
* Split off `cleanup` arena functions into "arena_cleanup.h"
* Fix signed / unsigned match in CHECK_EQ
* Kill Atomic<>. it's not pulling it's weight
* Move AllocationPolicy out of arena_impl, and unify arena_config for bazel
* Fix failure case in table-driven parser.
* Add a new JSON parser.
* Removed old JSON parsing code.
* Introduce the Printer::{SetRedactDebugString,SetRandomizeDebugString} private flags.
* Introduce global flags to control Printer::{SetRedactDebugString, SetRandomizeDebugString}.
* proto3 string fields no longer trigger clang-tidy warning bugprone-branch-clone.
* Fix the API of DescriptorUpgrader::set_allow_unknown_dependencies to set to True always, and to populate into the DescriptorPool as well.
* Report line numbers consistently in text-format deprecated-field warnings.
* Reserve C++20 keywords
* Fixed C++ code generation for protos that use int32_t, uint32_t, int64_t, uint64_t, size_t as field names.
* Annotate generated C++ public aliases for enum types.
* Change default arena max block size from 8K to 32K.
# Kotlin
* Suppress deprecation warnings in Kotlin generated code.
* Kotlin generated code comments now use kdoc format instead of javadoc.
* Escape keywords in package names in proto generated code
* Add Kotlin enum int value getters and setters
# Java
* Performance improvement for repeated use of FieldMaskUtil#merge by caching
constructed FieldMaskTrees.
* Optimized Java proto serialization gencode for protos having many extension ranges with few fields in between.
* More thoroughly annotate public generated code in Java lite protocol buffers.
* Fixed Bug in proto3 java lite repeated enum fields. Failed to call copyOnWrite before modifying previously built message. Causes modification to already "built" messages that should be immutable.
* Fix Java reflection serialization of empty packed fields.
* Refactoring java full runtime to reuse sub-message builders and prepare to migrate parsing logic from parse constructor to builder.
* Move proto wireformat parsing functionality from the private "parsing constructor" to the Builder class.
* Change the Lite runtime to prefer merging from the wireformat into mutable messages rather than building up a new immutable object before merging. This way results in fewer allocations and copy operations.
* Make message-type extensions merge from wire-format instead of building up instances and merging afterwards. This has much better performance.
* Fix TextFormat parser to build up recurring (but supposedly not repeated) sub-messages directly from text rather than building a new sub-message and merging the fully formed message into the existing field.
* Fix bug in nested builder caching logic where cleared sub-field builders would remain dirty after a clear and build in a parent layer. https://github.com/protocolbuffers/protobuf/issues/10624
# Python
* Changes ordering of printed fields in .pyi files from lexicographic to the same ordering found in the proto descriptor.
* Adds GeneratedCodeInfo annotations to python proto .pyi outputs as a base64 encoded docstring in the last line of the .pyi file for code analysis tools.
* Fix message factory's behavior in python cpp extension to return same message classes for same descriptor, even if the factories are different.
* Add type annotation for enum value fields in enum classes.
# Compiler
* Print full path name of source .proto file on error
* Include proto message type in the annotation comments.

@ -61,6 +61,7 @@ option(protobuf_BUILD_PROTOC_BINARIES "Build libprotoc and protoc compiler" ON)
option(protobuf_BUILD_LIBPROTOC "Build libprotoc" OFF)
option(protobuf_DISABLE_RTTI "Remove runtime type information in the binaries" OFF)
option(protobuf_TEST_XML_OUTDIR "Output directory for XML logs from tests." "")
option(protobuf_ALLOW_CCACHE "Adjust build flags to allow for ccache support." OFF)
if (BUILD_SHARED_LIBS)
set(protobuf_BUILD_SHARED_LIBS_DEFAULT ON)
else (BUILD_SHARED_LIBS)
@ -290,6 +291,16 @@ if (MSVC)
string(REPLACE "/" "\\" PROTOBUF_BINARY_WIN32_PATH ${protobuf_BINARY_DIR})
string(REPLACE "." "," protobuf_RC_FILEVERSION "${protobuf_VERSION}")
if (protobuf_ALLOW_CCACHE)
# In order to support ccache, we replace the /Zi option with /Z7. This
# embeds debug symbols into the object files instead of creating a separate
# pdb file, which isn't currently supported by ccache.
string(REPLACE "/Zi" "/Z7" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")
string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
string(REPLACE "/Zi" "/Z7" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}")
string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
endif()
# Suppress linker warnings about files with no symbols defined.
string(APPEND CMAKE_STATIC_LINKER_FLAGS " /ignore:4221")

@ -9,10 +9,10 @@ local_repository(
http_archive(
name = "com_google_googletest",
sha256 = "ea54c9845568cb31c03f2eddc7a40f7f83912d04ab977ff50ec33278119548dd",
sha256 = "833bfaf9f8f508a4ef4a35e25131112ed55bf9ff5c073e272397ff38eb4d90ec",
strip_prefix = "googletest-4c9a3bb62bf3ba1f1010bf96f9c8ed767b363774",
urls = [
"https://github.com/google/googletest/archive/4c9a3bb62bf3ba1f1010bf96f9c8ed767b363774.tar.gz",
"https://github.com/google/googletest/archive/4c9a3bb62bf3ba1f1010bf96f9c8ed767b363774.zip",
],
)
@ -113,7 +113,27 @@ install_deps()
load("@utf8_range//:workspace_deps.bzl", "utf8_range_deps")
utf8_range_deps()
http_archive(
name = "rules_fuzzing",
sha256 = "d9002dd3cd6437017f08593124fdd1b13b3473c7b929ceb0e60d317cb9346118",
strip_prefix = "rules_fuzzing-0.3.2",
urls = ["https://github.com/bazelbuild/rules_fuzzing/archive/v0.3.2.zip"],
)
load("@rules_fuzzing//fuzzing:repositories.bzl", "rules_fuzzing_dependencies")
rules_fuzzing_dependencies()
bind(
name = "python_headers",
actual = "@system_python//:python_headers",
)
http_archive(
name = "rules_rust",
sha256 = "d125fb75432dc3b20e9b5a19347b45ec607fabe75f98c6c4ba9badaab9c193ce",
urls = ["https://github.com/bazelbuild/rules_rust/releases/download/0.17.0/rules_rust-v0.17.0.tar.gz"],
)
load("@rules_rust//rust:repositories.bzl", "rules_rust_dependencies", "rust_register_toolchains")
rules_rust_dependencies()
rust_register_toolchains()

@ -9,3 +9,22 @@
# end:github_only
def _upbc(stage):
--- cmake/build_defs.bzl
+++ cmake/build_defs.bzl
@@ -25,7 +25,7 @@
"""Bazel support functions related to CMake support."""
-def staleness_test(name, outs, generated_pattern, target_files = None, **kwargs):
+def staleness_test(name, outs, generated_pattern, target_files = None, tags = [], **kwargs):
"""Tests that checked-in file(s) match the contents of generated file(s).
The resulting test will verify that all output files exist and have the
@@ -72,5 +72,6 @@ def staleness_test(name, outs, generated_pattern, target_files = None, **kwargs)
deps = [
Label("//cmake:staleness_test_lib"),
],
+ tags = ["staleness_test"] + tags,
**kwargs
)

@ -0,0 +1,3 @@
import common.bazelrc
build --cxxopt=-std=c++14 --host_cxxopt=-std=c++14

@ -0,0 +1,2 @@
import common.bazelrc

@ -0,0 +1,3 @@
#!/bin/sh
# This file wraps clang with ccache to enable faster runs of xcodebuild
ccache clang "$@"

@ -0,0 +1,3 @@
#!/bin/sh
# This file wraps clang with ccache to enable faster runs of xcodebuild
ccache clang++ "$@"

@ -0,0 +1,36 @@
# Fail if a glob doesn't match anything (https://github.com/bazelbuild/bazel/issues/8195)
build --incompatible_disallow_empty_glob
build:dbg --compilation_mode=dbg
build:opt --compilation_mode=opt
build:san-common --config=dbg --strip=never --copt=-O0 --copt=-fno-omit-frame-pointer
build:asan --config=san-common --copt=-fsanitize=address --linkopt=-fsanitize=address
build:asan --copt=-DADDRESS_SANITIZER=1
# ASAN hits ODR violations with shared linkage due to rules_proto.
build:asan --dynamic_mode=off
build:msan --config=san-common --copt=-fsanitize=memory --linkopt=-fsanitize=memory
build:msan --copt=-fsanitize-memory-track-origins
build:msan --copt=-fsanitize-memory-use-after-dtor
build:msan --action_env=MSAN_OPTIONS=poison_in_dtor=1
build:msan --copt=-DMEMORY_SANITIZER=1
# Use our instrumented LLVM libc++ in Kokoro.
build:kokoro-msan --config=msan
build:kokoro-msan --linkopt=-L/opt/libcxx_msan/lib
build:kokoro-msan --linkopt=-Wl,-rpath,/opt/libcxx_msan/lib
build:kokoro-msan --cxxopt=-stdlib=libc++ --linkopt=-stdlib=libc++
build:tsan --config=san-common --copt=-fsanitize=thread --linkopt=-fsanitize=thread
build:tsan --copt=-DTHREAD_SANITIZER=1
build:ubsan --config=san-common --copt=-fsanitize=undefined --linkopt=-fsanitize=undefined
build:ubsan --action_env=UBSAN_OPTIONS=halt_on_error=1:print_stacktrace=1
build:ubsan --copt=-DUNDEFINED_SANITIZER=1
# Workaround for the fact that Bazel links with $CC, not $CXX
# https://github.com/bazelbuild/bazel/issues/11122#issuecomment-613746748
build:ubsan --copt=-fno-sanitize=function --copt=-fno-sanitize=vptr

@ -0,0 +1,3 @@
import common.bazelrc
build --cxxopt=-std=c++14 --host_cxxopt=-std=c++14

@ -31,10 +31,10 @@ else()
COMPILE_DEFINITIONS
"GTEST_CREATE_SHARED_LIBRARY=1"
)
install(TARGETS gmock EXPORT protobuf-targets
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
if (protobuf_INSTALL)
set(protobuf_INSTALL_TESTS ON)
endif()
endif()
target_link_libraries(gmock ${CMAKE_THREAD_LIBS_INIT})

@ -113,3 +113,10 @@ if(protobuf_INSTALL_EXAMPLES)
DESTINATION "${CMAKE_INSTALL_EXAMPLEDIR}"
COMPONENT protobuf-examples)
endif()
if (protobuf_INSTALL_TESTS)
install(TARGETS gmock EXPORT protobuf-targets
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
endif()

@ -68,7 +68,7 @@ C#:
--action_env=DOTNET_CLI_TELEMETRY_OPTOUT=1 --test_env=DOTNET_CLI_HOME=~ \
--action_env=DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1
Objective-c (Mac only):
Objective-C (Mac only):
$ `bazel test //objectivec:conformance_test --macos_minimum_os=10.9

@ -50,7 +50,7 @@ $PROTOC -Isrc --csharp_out=csharp/src/Google.Protobuf \
# Note that this deliberately does *not* include old_extensions1.proto
# and old_extensions2.proto, which are generated with an older version
# of protoc.
$PROTOC -Isrc -Icsharp/protos \
$PROTOC -Isrc -I. \
--experimental_allow_proto3_optional \
--csharp_out=csharp/src/Google.Protobuf.Test.TestProtos \
--csharp_opt=file_extension=.pb.cs \

@ -36,31 +36,31 @@
// required fields in proto3.
syntax = "proto3";
option csharp_namespace = "Google.Protobuf.TestProtos";
package protobuf_unittest3;
import "unittest_proto3.proto";
import "csharp/protos/unittest_proto3.proto";
package protobuf_unittest3;
option csharp_namespace = "Google.Protobuf.TestProtos";
// Tests maps.
message TestMap {
map<int32 , int32 > map_int32_int32 = 1;
map<int64 , int64 > map_int64_int64 = 2;
map<uint32 , uint32 > map_uint32_uint32 = 3;
map<uint64 , uint64 > map_uint64_uint64 = 4;
map<sint32 , sint32 > map_sint32_sint32 = 5;
map<sint64 , sint64 > map_sint64_sint64 = 6;
map<fixed32 , fixed32 > map_fixed32_fixed32 = 7;
map<fixed64 , fixed64 > map_fixed64_fixed64 = 8;
map<int32, int32> map_int32_int32 = 1;
map<int64, int64> map_int64_int64 = 2;
map<uint32, uint32> map_uint32_uint32 = 3;
map<uint64, uint64> map_uint64_uint64 = 4;
map<sint32, sint32> map_sint32_sint32 = 5;
map<sint64, sint64> map_sint64_sint64 = 6;
map<fixed32, fixed32> map_fixed32_fixed32 = 7;
map<fixed64, fixed64> map_fixed64_fixed64 = 8;
map<sfixed32, sfixed32> map_sfixed32_sfixed32 = 9;
map<sfixed64, sfixed64> map_sfixed64_sfixed64 = 10;
map<int32 , float > map_int32_float = 11;
map<int32 , double > map_int32_double = 12;
map<bool , bool > map_bool_bool = 13;
map<string , string > map_string_string = 14;
map<int32 , bytes > map_int32_bytes = 15;
map<int32 , MapEnum > map_int32_enum = 16;
map<int32 , ForeignMessage> map_int32_foreign_message = 17;
map<int32, float> map_int32_float = 11;
map<int32, double> map_int32_double = 12;
map<bool, bool> map_bool_bool = 13;
map<string, string> map_string_string = 14;
map<int32, bytes> map_int32_bytes = 15;
map<int32, MapEnum> map_int32_enum = 16;
map<int32, ForeignMessage> map_int32_foreign_message = 17;
}
message TestMapSubmessage {
@ -84,21 +84,21 @@ enum MapEnum {
}
message TestArenaMap {
map<int32 , int32 > map_int32_int32 = 1;
map<int64 , int64 > map_int64_int64 = 2;
map<uint32 , uint32 > map_uint32_uint32 = 3;
map<uint64 , uint64 > map_uint64_uint64 = 4;
map<sint32 , sint32 > map_sint32_sint32 = 5;
map<sint64 , sint64 > map_sint64_sint64 = 6;
map<fixed32 , fixed32 > map_fixed32_fixed32 = 7;
map<fixed64 , fixed64 > map_fixed64_fixed64 = 8;
map<int32, int32> map_int32_int32 = 1;
map<int64, int64> map_int64_int64 = 2;
map<uint32, uint32> map_uint32_uint32 = 3;
map<uint64, uint64> map_uint64_uint64 = 4;
map<sint32, sint32> map_sint32_sint32 = 5;
map<sint64, sint64> map_sint64_sint64 = 6;
map<fixed32, fixed32> map_fixed32_fixed32 = 7;
map<fixed64, fixed64> map_fixed64_fixed64 = 8;
map<sfixed32, sfixed32> map_sfixed32_sfixed32 = 9;
map<sfixed64, sfixed64> map_sfixed64_sfixed64 = 10;
map<int32 , float > map_int32_float = 11;
map<int32 , double > map_int32_double = 12;
map<bool , bool > map_bool_bool = 13;
map<int32 , MapEnum > map_int32_enum = 14;
map<int32 , ForeignMessage> map_int32_foreign_message = 15;
map<int32, float> map_int32_float = 11;
map<int32, double> map_int32_double = 12;
map<bool, bool> map_bool_bool = 13;
map<int32, MapEnum> map_int32_enum = 14;
map<int32, ForeignMessage> map_int32_foreign_message = 15;
}
// Previously, message containing enum called Type cannot be used as value of

@ -43,10 +43,9 @@ syntax = "proto3";
// Import the proto file containing the extension. We don't use it,
// but the import is what caused the issue.
import "old_extensions2.proto";
import "csharp/protos/old_extensions2.proto";
option csharp_namespace = "Google.Protobuf.TestProtos.OldGenerator";
// We don't use this message other than to get its descriptor.
message TestMessage {
}
message TestMessage {}

@ -45,7 +45,7 @@ option java_generic_services = true; // auto-added
option py_generic_services = true; // auto-added
option cc_enable_arenas = true;
import "unittest_import.proto";
import "csharp/protos/unittest_import.proto";
// We don't put this in a package within proto2 because we need to make sure
// that the generated code doesn't depend on being in the proto2 namespace.
@ -99,20 +99,21 @@ message TestAllTypes {
optional NestedMessage optional_nested_message = 18;
optional ForeignMessage optional_foreign_message = 19;
optional protobuf_unittest_import_proto2.ImportMessage optional_import_message = 20;
optional protobuf_unittest_import_proto2.ImportMessage
optional_import_message = 20;
optional NestedEnum optional_nested_enum = 21;
optional ForeignEnum optional_foreign_enum = 22;
optional protobuf_unittest_import_proto2.ImportEnum optional_import_enum = 23;
optional string optional_string_piece = 24 [ctype=STRING_PIECE];
optional string optional_cord = 25 [ctype=CORD];
optional string optional_string_piece = 24 [ctype = STRING_PIECE];
optional string optional_cord = 25 [ctype = CORD];
// Defined in unittest_import_public.proto
optional protobuf_unittest_import_proto2.PublicImportMessage
optional_public_import_message = 26;
optional NestedMessage optional_lazy_message = 27 [lazy=true];
optional NestedMessage optional_lazy_message = 27 [lazy = true];
// Repeated
repeated int32 repeated_int32 = 31;
@ -137,41 +138,43 @@ message TestAllTypes {
repeated NestedMessage repeated_nested_message = 48;
repeated ForeignMessage repeated_foreign_message = 49;
repeated protobuf_unittest_import_proto2.ImportMessage repeated_import_message = 50;
repeated protobuf_unittest_import_proto2.ImportMessage
repeated_import_message = 50;
repeated NestedEnum repeated_nested_enum = 51;
repeated ForeignEnum repeated_foreign_enum = 52;
repeated protobuf_unittest_import_proto2.ImportEnum repeated_import_enum = 53;
repeated string repeated_string_piece = 54 [ctype=STRING_PIECE];
repeated string repeated_cord = 55 [ctype=CORD];
repeated string repeated_string_piece = 54 [ctype = STRING_PIECE];
repeated string repeated_cord = 55 [ctype = CORD];
repeated NestedMessage repeated_lazy_message = 57 [lazy=true];
repeated NestedMessage repeated_lazy_message = 57 [lazy = true];
// Singular with defaults
optional int32 default_int32 = 61 [default = 41 ];
optional int64 default_int64 = 62 [default = 42 ];
optional uint32 default_uint32 = 63 [default = 43 ];
optional uint64 default_uint64 = 64 [default = 44 ];
optional sint32 default_sint32 = 65 [default = -45 ];
optional sint64 default_sint64 = 66 [default = 46 ];
optional fixed32 default_fixed32 = 67 [default = 47 ];
optional fixed64 default_fixed64 = 68 [default = 48 ];
optional sfixed32 default_sfixed32 = 69 [default = 49 ];
optional sfixed64 default_sfixed64 = 70 [default = -50 ];
optional float default_float = 71 [default = 51.5 ];
optional double default_double = 72 [default = 52e3 ];
optional bool default_bool = 73 [default = true ];
optional int32 default_int32 = 61 [default = 41];
optional int64 default_int64 = 62 [default = 42];
optional uint32 default_uint32 = 63 [default = 43];
optional uint64 default_uint64 = 64 [default = 44];
optional sint32 default_sint32 = 65 [default = -45];
optional sint64 default_sint64 = 66 [default = 46];
optional fixed32 default_fixed32 = 67 [default = 47];
optional fixed64 default_fixed64 = 68 [default = 48];
optional sfixed32 default_sfixed32 = 69 [default = 49];
optional sfixed64 default_sfixed64 = 70 [default = -50];
optional float default_float = 71 [default = 51.5];
optional double default_double = 72 [default = 52e3];
optional bool default_bool = 73 [default = true];
optional string default_string = 74 [default = "hello"];
optional bytes default_bytes = 75 [default = "world"];
optional NestedEnum default_nested_enum = 81 [default = BAR ];
optional NestedEnum default_nested_enum = 81 [default = BAR];
optional ForeignEnum default_foreign_enum = 82 [default = FOREIGN_BAR];
optional protobuf_unittest_import_proto2.ImportEnum
default_import_enum = 83 [default = IMPORT_BAR];
optional protobuf_unittest_import_proto2.ImportEnum default_import_enum = 83
[default = IMPORT_BAR];
optional string default_string_piece = 84 [ctype=STRING_PIECE,default="abc"];
optional string default_cord = 85 [ctype=CORD,default="123"];
optional string default_string_piece = 84
[ctype = STRING_PIECE, default = "abc"];
optional string default_cord = 85 [ctype = CORD, default = "123"];
// For oneof test
oneof oneof_field {
@ -190,9 +193,9 @@ message NestedTestAllTypes {
}
message TestDeprecatedFields {
optional int32 deprecated_int32 = 1 [deprecated=true];
optional int32 deprecated_int32 = 1 [deprecated = true];
oneof oneof_fields {
int32 deprecated_int32_in_oneof = 2 [deprecated=true];
int32 deprecated_int32_in_oneof = 2 [deprecated = true];
}
}
@ -254,14 +257,14 @@ extend TestAllExtensions {
optional protobuf_unittest_import_proto2.ImportEnum
optional_import_enum_extension = 23;
optional string optional_string_piece_extension = 24 [ctype=STRING_PIECE];
optional string optional_cord_extension = 25 [ctype=CORD];
optional string optional_string_piece_extension = 24 [ctype = STRING_PIECE];
optional string optional_cord_extension = 25 [ctype = CORD];
optional protobuf_unittest_import_proto2.PublicImportMessage
optional_public_import_message_extension = 26;
optional TestAllTypes.NestedMessage
optional_lazy_message_extension = 27 [lazy=true];
optional TestAllTypes.NestedMessage optional_lazy_message_extension = 27
[lazy = true];
// Repeated
repeated int32 repeated_int32_extension = 31;
@ -294,39 +297,39 @@ extend TestAllExtensions {
repeated protobuf_unittest_import_proto2.ImportEnum
repeated_import_enum_extension = 53;
repeated string repeated_string_piece_extension = 54 [ctype=STRING_PIECE];
repeated string repeated_cord_extension = 55 [ctype=CORD];
repeated string repeated_string_piece_extension = 54 [ctype = STRING_PIECE];
repeated string repeated_cord_extension = 55 [ctype = CORD];
repeated TestAllTypes.NestedMessage
repeated_lazy_message_extension = 57 [lazy=true];
repeated TestAllTypes.NestedMessage repeated_lazy_message_extension = 57
[lazy = true];
// Singular with defaults
optional int32 default_int32_extension = 61 [default = 41 ];
optional int64 default_int64_extension = 62 [default = 42 ];
optional uint32 default_uint32_extension = 63 [default = 43 ];
optional uint64 default_uint64_extension = 64 [default = 44 ];
optional sint32 default_sint32_extension = 65 [default = -45 ];
optional sint64 default_sint64_extension = 66 [default = 46 ];
optional fixed32 default_fixed32_extension = 67 [default = 47 ];
optional fixed64 default_fixed64_extension = 68 [default = 48 ];
optional sfixed32 default_sfixed32_extension = 69 [default = 49 ];
optional sfixed64 default_sfixed64_extension = 70 [default = -50 ];
optional float default_float_extension = 71 [default = 51.5 ];
optional double default_double_extension = 72 [default = 52e3 ];
optional bool default_bool_extension = 73 [default = true ];
optional int32 default_int32_extension = 61 [default = 41];
optional int64 default_int64_extension = 62 [default = 42];
optional uint32 default_uint32_extension = 63 [default = 43];
optional uint64 default_uint64_extension = 64 [default = 44];
optional sint32 default_sint32_extension = 65 [default = -45];
optional sint64 default_sint64_extension = 66 [default = 46];
optional fixed32 default_fixed32_extension = 67 [default = 47];
optional fixed64 default_fixed64_extension = 68 [default = 48];
optional sfixed32 default_sfixed32_extension = 69 [default = 49];
optional sfixed64 default_sfixed64_extension = 70 [default = -50];
optional float default_float_extension = 71 [default = 51.5];
optional double default_double_extension = 72 [default = 52e3];
optional bool default_bool_extension = 73 [default = true];
optional string default_string_extension = 74 [default = "hello"];
optional bytes default_bytes_extension = 75 [default = "world"];
optional TestAllTypes.NestedEnum
default_nested_enum_extension = 81 [default = BAR];
optional ForeignEnum
default_foreign_enum_extension = 82 [default = FOREIGN_BAR];
optional TestAllTypes.NestedEnum default_nested_enum_extension = 81
[default = BAR];
optional ForeignEnum default_foreign_enum_extension = 82
[default = FOREIGN_BAR];
optional protobuf_unittest_import_proto2.ImportEnum
default_import_enum_extension = 83 [default = IMPORT_BAR];
optional string default_string_piece_extension = 84 [ctype=STRING_PIECE,
default="abc"];
optional string default_cord_extension = 85 [ctype=CORD, default="123"];
optional string default_string_piece_extension = 84
[ctype = STRING_PIECE, default = "abc"];
optional string default_cord_extension = 85 [ctype = CORD, default = "123"];
// For oneof test
optional uint32 oneof_uint32_extension = 111;
@ -350,7 +353,7 @@ message TestNestedExtension {
extend TestAllExtensions {
// Check for bug where string extensions declared in tested scope did not
// compile.
optional string test = 1002 [default="test"];
optional string test = 1002 [default = "test"];
// Used to test if generated extension name is correct when there are
// underscores.
optional string nested_string_extension = 1003;
@ -432,8 +435,7 @@ message TestForeignNested {
}
// TestEmptyMessage is used to test unknown field support.
message TestEmptyMessage {
}
message TestEmptyMessage {}
// Like above, but declare all field numbers as potential extensions. No
// actual extensions should ever be defined for this type.
@ -487,21 +489,25 @@ message TestIsInitialized {
}
// Test that groups have disjoint field numbers from their siblings and
// parents. This is NOT possible in proto1; only google.protobuf. When attempting
// to compile with proto1, this will emit an error; so we only include it
// in protobuf_unittest_proto.
// parents. This is NOT possible in proto1; only google.protobuf. When
// attempting to compile with proto1, this will emit an error; so we only
// include it in protobuf_unittest_proto.
message TestDupFieldNumber { // NO_PROTO1
optional int32 a = 1; // NO_PROTO1
optional group Foo = 2 { optional int32 a = 1; } // NO_PROTO1
optional group Bar = 3 { optional int32 a = 1; } // NO_PROTO1
optional group Foo = 2 {
optional int32 a = 1;
} // NO_PROTO1
optional group Bar = 3 {
optional int32 a = 1;
} // NO_PROTO1
} // NO_PROTO1
// Additional messages for testing lazy fields.
message TestEagerMessage {
optional TestAllTypes sub_message = 1 [lazy=false];
optional TestAllTypes sub_message = 1 [lazy = false];
}
message TestLazyMessage {
optional TestAllTypes sub_message = 1 [lazy=true];
optional TestAllTypes sub_message = 1 [lazy = true];
}
// Needed for a Python test.
@ -513,7 +519,6 @@ message TestNestedMessageHasBits {
optional NestedMessage optional_nested_message = 1;
}
// Test an enum that has multiple values with the same number.
enum TestEnumWithDupValue {
option allow_alias = true;
@ -543,18 +548,17 @@ message TestCamelCaseFieldNames {
optional string StringField = 2;
optional ForeignEnum EnumField = 3;
optional ForeignMessage MessageField = 4;
optional string StringPieceField = 5 [ctype=STRING_PIECE];
optional string CordField = 6 [ctype=CORD];
optional string StringPieceField = 5 [ctype = STRING_PIECE];
optional string CordField = 6 [ctype = CORD];
repeated int32 RepeatedPrimitiveField = 7;
repeated string RepeatedStringField = 8;
repeated ForeignEnum RepeatedEnumField = 9;
repeated ForeignMessage RepeatedMessageField = 10;
repeated string RepeatedStringPieceField = 11 [ctype=STRING_PIECE];
repeated string RepeatedCordField = 12 [ctype=CORD];
repeated string RepeatedStringPieceField = 11 [ctype = STRING_PIECE];
repeated string RepeatedCordField = 12 [ctype = CORD];
}
// We list fields out of order, to ensure that we're using field number and not
// field index to determine serialization order.
message TestFieldOrderings {
@ -641,11 +645,10 @@ message TestExtremeDefaultValues {
// String defaults containing the character '\000'
optional string string_with_zero = 23 [default = "hel\000lo"];
optional bytes bytes_with_zero = 24 [default = "wor\000ld"];
optional string string_piece_with_zero = 25 [ctype=STRING_PIECE,
default="ab\000c"];
optional string cord_with_zero = 26 [ctype=CORD,
default="12\0003"];
optional string replacement_string = 27 [default="${unknown}"];
optional string string_piece_with_zero = 25
[ctype = STRING_PIECE, default = "ab\000c"];
optional string cord_with_zero = 26 [ctype = CORD, default = "12\0003"];
optional string replacement_string = 27 [default = "${unknown}"];
}
message SparseEnumMessage {
@ -717,8 +720,8 @@ message TestOneof2 {
oneof foo {
int32 foo_int = 1;
string foo_string = 2;
string foo_cord = 3 [ctype=CORD];
string foo_string_piece = 4 [ctype=STRING_PIECE];
string foo_cord = 3 [ctype = CORD];
string foo_string_piece = 4 [ctype = STRING_PIECE];
bytes foo_bytes = 5;
NestedEnum foo_enum = 6;
NestedMessage foo_message = 7;
@ -726,14 +729,14 @@ message TestOneof2 {
optional int32 a = 9;
optional string b = 10;
}
NestedMessage foo_lazy_message = 11 [lazy=true];
NestedMessage foo_lazy_message = 11 [lazy = true];
}
oneof bar {
int32 bar_int = 12 [default = 5];
string bar_string = 13 [default = "STRING"];
string bar_cord = 14 [ctype=CORD, default = "CORD"];
string bar_string_piece = 15 [ctype=STRING_PIECE, default = "SPIECE"];
string bar_cord = 14 [ctype = CORD, default = "CORD"];
string bar_string_piece = 15 [ctype = STRING_PIECE, default = "SPIECE"];
bytes bar_bytes = 16 [default = "BYTES"];
NestedEnum bar_enum = 17 [default = BAR];
}
@ -931,23 +934,21 @@ message TestParsingMerge {
message TestCommentInjectionMessage {
// */ <- This should not close the generated doc comment
optional string a = 1 [default="*/ <- Neither should this."];
optional string a = 1 [default = "*/ <- Neither should this."];
}
// Test that RPC services work.
message FooRequest {}
message FooResponse {}
message FooClientMessage {}
message FooServerMessage{}
message FooServerMessage {}
service TestService {
rpc Foo(FooRequest) returns (FooResponse);
rpc Bar(BarRequest) returns (BarResponse);
}
message BarRequest {}
message BarResponse {}
@ -1110,4 +1111,4 @@ enum VeryLargeEnum {
ENUM_LABEL_98 = 98;
ENUM_LABEL_99 = 99;
ENUM_LABEL_100 = 100;
};
}

@ -41,7 +41,6 @@
// proto2 syntax. It's cut down significantly as proto3 only supports
// extensions for options.
syntax = "proto3";
// A custom file option (defined below).
@ -98,39 +97,34 @@ extend google.protobuf.MethodOptions {
// regular options, to make sure they interact nicely).
message TestMessageWithCustomOptions {
option message_set_wire_format = false;
option (message_opt1) = -56;
string field1 = 1 [ctype=CORD,
(field_opt1)=8765432109];
string field1 = 1 [ctype = CORD, (field_opt1) = 8765432109];
oneof AnOneof {
option (oneof_opt1) = -99;
int32 oneof_field = 2;
}
enum AnEnum {
option (enum_opt1) = -789;
ANENUM_UNSPECIFIED = 0;
ANENUM_VAL1 = 1;
ANENUM_VAL2 = 2 [(enum_value_opt1) = 123];
}
}
// A test RPC service with custom options at all possible locations (and also
// some regular options, to make sure they interact nicely).
message CustomOptionFooRequest {
}
message CustomOptionFooRequest {}
message CustomOptionFooResponse {
}
message CustomOptionFooResponse {}
message CustomOptionFooClientMessage {
}
message CustomOptionFooClientMessage {}
message CustomOptionFooServerMessage {
}
message CustomOptionFooServerMessage {}
service TestServiceWithCustomOptions {
option (service_opt1) = -9876543210;
@ -140,8 +134,6 @@ service TestServiceWithCustomOptions {
}
}
// Options of every possible field type, so we can test them all exhaustively.
message DummyMessageContainingEnum {
@ -152,8 +144,7 @@ message DummyMessageContainingEnum {
}
}
message DummyMessageInvalidAsOptionType {
}
message DummyMessageInvalidAsOptionType {}
extend google.protobuf.MessageOptions {
bool bool_opt = 7706090;
@ -267,8 +258,12 @@ message VariousComplexOptions {
option (complex_opt2).bar.foo = 743;
option (ComplexOptionType2.ComplexOptionType4.complex_opt4).waldo = 1971;
option (complex_opt2).fred.waldo = 321;
option (complex_opt2).barney = { waldo: 101 };
option (complex_opt2).barney = { waldo: 212 };
option (complex_opt2).barney = {
waldo: 101
};
option (complex_opt2).barney = {
waldo: 212
};
option (protobuf_unittest.complex_opt3).qux = 9;
}
@ -287,50 +282,79 @@ message Aggregate {
// Allow Aggregate to be used as an option at all possible locations
// in the .proto grammar.
extend google.protobuf.FileOptions { Aggregate fileopt = 15478479; }
extend google.protobuf.MessageOptions { Aggregate msgopt = 15480088; }
extend google.protobuf.FieldOptions { Aggregate fieldopt = 15481374; }
extend google.protobuf.EnumOptions { Aggregate enumopt = 15483218; }
extend google.protobuf.EnumValueOptions { Aggregate enumvalopt = 15486921; }
extend google.protobuf.ServiceOptions { Aggregate serviceopt = 15497145; }
extend google.protobuf.MethodOptions { Aggregate methodopt = 15512713; }
extend google.protobuf.FileOptions {
Aggregate fileopt = 15478479;
}
extend google.protobuf.MessageOptions {
Aggregate msgopt = 15480088;
}
extend google.protobuf.FieldOptions {
Aggregate fieldopt = 15481374;
}
extend google.protobuf.EnumOptions {
Aggregate enumopt = 15483218;
}
extend google.protobuf.EnumValueOptions {
Aggregate enumvalopt = 15486921;
}
extend google.protobuf.ServiceOptions {
Aggregate serviceopt = 15497145;
}
extend google.protobuf.MethodOptions {
Aggregate methodopt = 15512713;
}
// Try using AggregateOption at different points in the proto grammar
option (fileopt) = {
s: 'FileAnnotation'
// Also test the handling of comments
/* of both types */ i: 100
/* of both types */
i: 100
sub { s: 'NestedFileAnnotation' }
};
message AggregateMessage {
option (msgopt) = { i:101 s:'MessageAnnotation' };
int32 fieldname = 1 [(fieldopt) = { s:'FieldAnnotation' }];
option (msgopt) = {
i: 101
s: 'MessageAnnotation'
};
int32 fieldname = 1 [(fieldopt) = { s: 'FieldAnnotation' }];
}
service AggregateService {
option (serviceopt) = { s:'ServiceAnnotation' };
rpc Method (AggregateMessage) returns (AggregateMessage) {
option (methodopt) = { s:'MethodAnnotation' };
option (serviceopt) = {
s: 'ServiceAnnotation'
};
rpc Method(AggregateMessage) returns (AggregateMessage) {
option (methodopt) = {
s: 'MethodAnnotation'
};
}
}
enum AggregateEnum {
option (enumopt) = { s:'EnumAnnotation' };
option (enumopt) = {
s: 'EnumAnnotation'
};
UNSPECIFIED = 0;
VALUE = 1 [(enumvalopt) = { s:'EnumValueAnnotation' }];
VALUE = 1 [(enumvalopt) = { s: 'EnumValueAnnotation' }];
}
// Test custom options for nested type.
message NestedOptionType {
message NestedMessage {
option (message_opt1) = 1001;
int32 nested_field = 1 [(field_opt1) = 1002];
}
enum NestedEnum {
UNSPECIFIED = 0;
option (enum_opt1) = 1003;
UNSPECIFIED = 0;
NESTED_ENUM_VALUE = 1 [(enum_value_opt1) = 1004];
}
}

@ -44,11 +44,10 @@ package protobuf_unittest_import_proto2;
option optimize_for = SPEED;
option cc_enable_arenas = true;
option csharp_namespace = "Google.Protobuf.TestProtos.Proto2";
// Test public import
import public "unittest_import_public.proto";
import public "csharp/protos/unittest_import_public.proto";
message ImportMessage {
optional int32 d = 1;
@ -60,7 +59,6 @@ enum ImportEnum {
IMPORT_BAZ = 9;
}
// To use an enum in a map, it must has the first value as 0.
enum ImportEnumForMap {
UNKNOWN = 0;

@ -41,7 +41,7 @@ package protobuf_unittest_import;
option csharp_namespace = "Google.Protobuf.TestProtos";
// Test public import
import public "unittest_import_public_proto3.proto";
import public "csharp/protos/unittest_import_public_proto3.proto";
message ImportMessage {
int32 d = 1;
@ -53,4 +53,3 @@ enum ImportEnum {
IMPORT_BAR = 8;
IMPORT_BAZ = 9;
}

@ -30,14 +30,15 @@
syntax = "proto3";
import "unittest_issue6936_a.proto";
package unittest_issues;
import "csharp/protos/unittest_issue6936_a.proto";
option csharp_namespace = "UnitTest.Issues.TestProtos";
// This file is used as part of a unit test for issue 6936
// We don't need to use it, we just have to import it in "unittest_issue6936_c.proto"
// We don't need to use it, we just have to import it in
// "unittest_issue6936_c.proto"
message Foo {
option (opt) = "foo";

@ -30,11 +30,11 @@
syntax = "proto3";
import "unittest_issue6936_a.proto";
import "unittest_issue6936_b.proto";
package unittest_issues;
import "csharp/protos/unittest_issue6936_a.proto";
import "csharp/protos/unittest_issue6936_b.proto";
option csharp_namespace = "UnitTest.Issues.TestProtos";
// This file is used as part of a unit test for issue 6936
@ -42,5 +42,6 @@ option csharp_namespace = "UnitTest.Issues.TestProtos";
message Bar {
option (opt) = "bar";
Foo foo = 1;
}

@ -42,7 +42,7 @@ option csharp_namespace = "Google.Protobuf.TestProtos";
// of a non-C# option)
option java_outer_classname = "UnittestProto";
import "unittest_import_proto3.proto";
import "csharp/protos/unittest_import_proto3.proto";
package protobuf_unittest3;
@ -90,8 +90,8 @@ message TestAllTypes {
protobuf_unittest_import.ImportEnum single_import_enum = 23;
// Defined in unittest_import_public.proto
protobuf_unittest_import.PublicImportMessage
single_public_import_message = 26;
protobuf_unittest_import.PublicImportMessage single_public_import_message =
26;
// Repeated
repeated int32 repeated_int32 = 31;
@ -138,7 +138,7 @@ message NestedTestAllTypes {
}
message TestDeprecatedFields {
int32 deprecated_int32 = 1 [deprecated=true];
int32 deprecated_int32 = 1 [deprecated = true];
}
// Define these after TestAllTypes to make sure the compiler can handle
@ -159,7 +159,6 @@ message TestReservedFields {
reserved "bar", "baz";
}
// Test that we can use NestedMessage from outside TestAllTypes.
message TestForeignNested {
TestAllTypes.NestedMessage foreign_nested = 1;
@ -194,9 +193,10 @@ message TestEnumAllowAlias {
// Test an enum that has multiple values with the same number.
enum TestEnumWithDupValue {
TEST_ENUM_WITH_DUP_VALUE_UNSPECIFIED = 0;
option allow_alias = true;
TEST_ENUM_WITH_DUP_VALUE_UNSPECIFIED = 0;
FOO1 = 1;
BAR1 = 2;
BAZ = 3;
@ -231,7 +231,6 @@ message TestCamelCaseFieldNames {
repeated ForeignMessage RepeatedMessageField = 10;
}
// We list fields out of order, to ensure that we're using field number and not
// field index to determine serialization order.
message TestFieldOrderings {
@ -360,13 +359,12 @@ message TestCommentInjectionMessage {
string a = 1;
}
// Test that RPC services work.
message FooRequest {}
message FooResponse {}
message FooClientMessage {}
message FooServerMessage{}
message FooServerMessage {}
// This is a test service
service TestService {
@ -375,7 +373,6 @@ service TestService {
rpc Bar(BarRequest) returns (BarResponse);
}
message BarRequest {}
message BarResponse {}

@ -31,22 +31,21 @@
syntax = "proto2";
package protobuf_unittest_selfreferential_options;
option csharp_namespace = "UnitTest.Issues.TestProtos.SelfreferentialOptions";
import "google/protobuf/descriptor.proto";
option csharp_namespace = "UnitTest.Issues.TestProtos.SelfreferentialOptions";
message FooOptions {
// Custom field option used in definition of the extension message.
optional int32 int_opt = 1 [(foo_options) = {
int_opt: 1
[foo_int_opt]: 2
[foo_foo_opt]: {
int_opt: 3
}
[foo_foo_opt]: { int_opt: 3 }
}];
// Custom field option used in definition of the custom option's message.
optional int32 foo = 2 [(foo_options) = {foo: 1234}];
optional int32 foo = 2 [(foo_options) = { foo: 1234 }];
extensions 1000 to max;
}

@ -1,6 +1,6 @@
// <auto-generated>
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: map_unittest_proto3.proto
// source: csharp/protos/map_unittest_proto3.proto
// </auto-generated>
#pragma warning disable 1591, 0612, 3021, 8981
#region Designer generated code
@ -11,11 +11,11 @@ using pbr = global::Google.Protobuf.Reflection;
using scg = global::System.Collections.Generic;
namespace Google.Protobuf.TestProtos {
/// <summary>Holder for reflection information generated from map_unittest_proto3.proto</summary>
/// <summary>Holder for reflection information generated from csharp/protos/map_unittest_proto3.proto</summary>
public static partial class MapUnittestProto3Reflection {
#region Descriptor
/// <summary>File descriptor for map_unittest_proto3.proto</summary>
/// <summary>File descriptor for csharp/protos/map_unittest_proto3.proto</summary>
public static pbr::FileDescriptor Descriptor {
get { return descriptor; }
}
@ -24,130 +24,131 @@ namespace Google.Protobuf.TestProtos {
static MapUnittestProto3Reflection() {
byte[] descriptorData = global::System.Convert.FromBase64String(
string.Concat(
"ChltYXBfdW5pdHRlc3RfcHJvdG8zLnByb3RvEhJwcm90b2J1Zl91bml0dGVz",
"dDMaFXVuaXR0ZXN0X3Byb3RvMy5wcm90byKpEgoHVGVzdE1hcBJHCg9tYXBf",
"aW50MzJfaW50MzIYASADKAsyLi5wcm90b2J1Zl91bml0dGVzdDMuVGVzdE1h",
"cC5NYXBJbnQzMkludDMyRW50cnkSRwoPbWFwX2ludDY0X2ludDY0GAIgAygL",
"Mi4ucHJvdG9idWZfdW5pdHRlc3QzLlRlc3RNYXAuTWFwSW50NjRJbnQ2NEVu",
"dHJ5EksKEW1hcF91aW50MzJfdWludDMyGAMgAygLMjAucHJvdG9idWZfdW5p",
"dHRlc3QzLlRlc3RNYXAuTWFwVWludDMyVWludDMyRW50cnkSSwoRbWFwX3Vp",
"bnQ2NF91aW50NjQYBCADKAsyMC5wcm90b2J1Zl91bml0dGVzdDMuVGVzdE1h",
"cC5NYXBVaW50NjRVaW50NjRFbnRyeRJLChFtYXBfc2ludDMyX3NpbnQzMhgF",
"IAMoCzIwLnByb3RvYnVmX3VuaXR0ZXN0My5UZXN0TWFwLk1hcFNpbnQzMlNp",
"bnQzMkVudHJ5EksKEW1hcF9zaW50NjRfc2ludDY0GAYgAygLMjAucHJvdG9i",
"dWZfdW5pdHRlc3QzLlRlc3RNYXAuTWFwU2ludDY0U2ludDY0RW50cnkSTwoT",
"bWFwX2ZpeGVkMzJfZml4ZWQzMhgHIAMoCzIyLnByb3RvYnVmX3VuaXR0ZXN0",
"My5UZXN0TWFwLk1hcEZpeGVkMzJGaXhlZDMyRW50cnkSTwoTbWFwX2ZpeGVk",
"NjRfZml4ZWQ2NBgIIAMoCzIyLnByb3RvYnVmX3VuaXR0ZXN0My5UZXN0TWFw",
"Lk1hcEZpeGVkNjRGaXhlZDY0RW50cnkSUwoVbWFwX3NmaXhlZDMyX3NmaXhl",
"ZDMyGAkgAygLMjQucHJvdG9idWZfdW5pdHRlc3QzLlRlc3RNYXAuTWFwU2Zp",
"eGVkMzJTZml4ZWQzMkVudHJ5ElMKFW1hcF9zZml4ZWQ2NF9zZml4ZWQ2NBgK",
"IAMoCzI0LnByb3RvYnVmX3VuaXR0ZXN0My5UZXN0TWFwLk1hcFNmaXhlZDY0",
"U2ZpeGVkNjRFbnRyeRJHCg9tYXBfaW50MzJfZmxvYXQYCyADKAsyLi5wcm90",
"b2J1Zl91bml0dGVzdDMuVGVzdE1hcC5NYXBJbnQzMkZsb2F0RW50cnkSSQoQ",
"bWFwX2ludDMyX2RvdWJsZRgMIAMoCzIvLnByb3RvYnVmX3VuaXR0ZXN0My5U",
"ZXN0TWFwLk1hcEludDMyRG91YmxlRW50cnkSQwoNbWFwX2Jvb2xfYm9vbBgN",
"IAMoCzIsLnByb3RvYnVmX3VuaXR0ZXN0My5UZXN0TWFwLk1hcEJvb2xCb29s",
"RW50cnkSSwoRbWFwX3N0cmluZ19zdHJpbmcYDiADKAsyMC5wcm90b2J1Zl91",
"bml0dGVzdDMuVGVzdE1hcC5NYXBTdHJpbmdTdHJpbmdFbnRyeRJHCg9tYXBf",
"aW50MzJfYnl0ZXMYDyADKAsyLi5wcm90b2J1Zl91bml0dGVzdDMuVGVzdE1h",
"cC5NYXBJbnQzMkJ5dGVzRW50cnkSRQoObWFwX2ludDMyX2VudW0YECADKAsy",
"LS5wcm90b2J1Zl91bml0dGVzdDMuVGVzdE1hcC5NYXBJbnQzMkVudW1FbnRy",
"eRJaChltYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlGBEgAygLMjcucHJvdG9i",
"dWZfdW5pdHRlc3QzLlRlc3RNYXAuTWFwSW50MzJGb3JlaWduTWVzc2FnZUVu",
"dHJ5GjQKEk1hcEludDMySW50MzJFbnRyeRILCgNrZXkYASABKAUSDQoFdmFs",
"dWUYAiABKAU6AjgBGjQKEk1hcEludDY0SW50NjRFbnRyeRILCgNrZXkYASAB",
"KAMSDQoFdmFsdWUYAiABKAM6AjgBGjYKFE1hcFVpbnQzMlVpbnQzMkVudHJ5",
"EgsKA2tleRgBIAEoDRINCgV2YWx1ZRgCIAEoDToCOAEaNgoUTWFwVWludDY0",
"VWludDY0RW50cnkSCwoDa2V5GAEgASgEEg0KBXZhbHVlGAIgASgEOgI4ARo2",
"ChRNYXBTaW50MzJTaW50MzJFbnRyeRILCgNrZXkYASABKBESDQoFdmFsdWUY",
"AiABKBE6AjgBGjYKFE1hcFNpbnQ2NFNpbnQ2NEVudHJ5EgsKA2tleRgBIAEo",
"EhINCgV2YWx1ZRgCIAEoEjoCOAEaOAoWTWFwRml4ZWQzMkZpeGVkMzJFbnRy",
"eRILCgNrZXkYASABKAcSDQoFdmFsdWUYAiABKAc6AjgBGjgKFk1hcEZpeGVk",
"NjRGaXhlZDY0RW50cnkSCwoDa2V5GAEgASgGEg0KBXZhbHVlGAIgASgGOgI4",
"ARo6ChhNYXBTZml4ZWQzMlNmaXhlZDMyRW50cnkSCwoDa2V5GAEgASgPEg0K",
"BXZhbHVlGAIgASgPOgI4ARo6ChhNYXBTZml4ZWQ2NFNmaXhlZDY0RW50cnkS",
"CwoDa2V5GAEgASgQEg0KBXZhbHVlGAIgASgQOgI4ARo0ChJNYXBJbnQzMkZs",
"b2F0RW50cnkSCwoDa2V5GAEgASgFEg0KBXZhbHVlGAIgASgCOgI4ARo1ChNN",
"YXBJbnQzMkRvdWJsZUVudHJ5EgsKA2tleRgBIAEoBRINCgV2YWx1ZRgCIAEo",
"AToCOAEaMgoQTWFwQm9vbEJvb2xFbnRyeRILCgNrZXkYASABKAgSDQoFdmFs",
"dWUYAiABKAg6AjgBGjYKFE1hcFN0cmluZ1N0cmluZ0VudHJ5EgsKA2tleRgB",
"IAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaNAoSTWFwSW50MzJCeXRlc0VudHJ5",
"EgsKA2tleRgBIAEoBRINCgV2YWx1ZRgCIAEoDDoCOAEaUAoRTWFwSW50MzJF",
"bnVtRW50cnkSCwoDa2V5GAEgASgFEioKBXZhbHVlGAIgASgOMhsucHJvdG9i",
"dWZfdW5pdHRlc3QzLk1hcEVudW06AjgBGmEKG01hcEludDMyRm9yZWlnbk1l",
"c3NhZ2VFbnRyeRILCgNrZXkYASABKAUSMQoFdmFsdWUYAiABKAsyIi5wcm90",
"b2J1Zl91bml0dGVzdDMuRm9yZWlnbk1lc3NhZ2U6AjgBIkIKEVRlc3RNYXBT",
"dWJtZXNzYWdlEi0KCHRlc3RfbWFwGAEgASgLMhsucHJvdG9idWZfdW5pdHRl",
"c3QzLlRlc3RNYXAivgEKDlRlc3RNZXNzYWdlTWFwElIKEW1hcF9pbnQzMl9t",
"ZXNzYWdlGAEgAygLMjcucHJvdG9idWZfdW5pdHRlc3QzLlRlc3RNZXNzYWdl",
"TWFwLk1hcEludDMyTWVzc2FnZUVudHJ5GlgKFE1hcEludDMyTWVzc2FnZUVu",
"dHJ5EgsKA2tleRgBIAEoBRIvCgV2YWx1ZRgCIAEoCzIgLnByb3RvYnVmX3Vu",
"aXR0ZXN0My5UZXN0QWxsVHlwZXM6AjgBIuUBCg9UZXN0U2FtZVR5cGVNYXAS",
"OwoEbWFwMRgBIAMoCzItLnByb3RvYnVmX3VuaXR0ZXN0My5UZXN0U2FtZVR5",
"cGVNYXAuTWFwMUVudHJ5EjsKBG1hcDIYAiADKAsyLS5wcm90b2J1Zl91bml0",
"dGVzdDMuVGVzdFNhbWVUeXBlTWFwLk1hcDJFbnRyeRorCglNYXAxRW50cnkS",
"CwoDa2V5GAEgASgFEg0KBXZhbHVlGAIgASgFOgI4ARorCglNYXAyRW50cnkS",
"CwoDa2V5GAEgASgFEg0KBXZhbHVlGAIgASgFOgI4ASL1EAoMVGVzdEFyZW5h",
"TWFwEkwKD21hcF9pbnQzMl9pbnQzMhgBIAMoCzIzLnByb3RvYnVmX3VuaXR0",
"ZXN0My5UZXN0QXJlbmFNYXAuTWFwSW50MzJJbnQzMkVudHJ5EkwKD21hcF9p",
"bnQ2NF9pbnQ2NBgCIAMoCzIzLnByb3RvYnVmX3VuaXR0ZXN0My5UZXN0QXJl",
"bmFNYXAuTWFwSW50NjRJbnQ2NEVudHJ5ElAKEW1hcF91aW50MzJfdWludDMy",
"GAMgAygLMjUucHJvdG9idWZfdW5pdHRlc3QzLlRlc3RBcmVuYU1hcC5NYXBV",
"aW50MzJVaW50MzJFbnRyeRJQChFtYXBfdWludDY0X3VpbnQ2NBgEIAMoCzI1",
"LnByb3RvYnVmX3VuaXR0ZXN0My5UZXN0QXJlbmFNYXAuTWFwVWludDY0VWlu",
"dDY0RW50cnkSUAoRbWFwX3NpbnQzMl9zaW50MzIYBSADKAsyNS5wcm90b2J1",
"Zl91bml0dGVzdDMuVGVzdEFyZW5hTWFwLk1hcFNpbnQzMlNpbnQzMkVudHJ5",
"ElAKEW1hcF9zaW50NjRfc2ludDY0GAYgAygLMjUucHJvdG9idWZfdW5pdHRl",
"c3QzLlRlc3RBcmVuYU1hcC5NYXBTaW50NjRTaW50NjRFbnRyeRJUChNtYXBf",
"Zml4ZWQzMl9maXhlZDMyGAcgAygLMjcucHJvdG9idWZfdW5pdHRlc3QzLlRl",
"c3RBcmVuYU1hcC5NYXBGaXhlZDMyRml4ZWQzMkVudHJ5ElQKE21hcF9maXhl",
"ZDY0X2ZpeGVkNjQYCCADKAsyNy5wcm90b2J1Zl91bml0dGVzdDMuVGVzdEFy",
"ZW5hTWFwLk1hcEZpeGVkNjRGaXhlZDY0RW50cnkSWAoVbWFwX3NmaXhlZDMy",
"X3NmaXhlZDMyGAkgAygLMjkucHJvdG9idWZfdW5pdHRlc3QzLlRlc3RBcmVu",
"YU1hcC5NYXBTZml4ZWQzMlNmaXhlZDMyRW50cnkSWAoVbWFwX3NmaXhlZDY0",
"X3NmaXhlZDY0GAogAygLMjkucHJvdG9idWZfdW5pdHRlc3QzLlRlc3RBcmVu",
"YU1hcC5NYXBTZml4ZWQ2NFNmaXhlZDY0RW50cnkSTAoPbWFwX2ludDMyX2Zs",
"b2F0GAsgAygLMjMucHJvdG9idWZfdW5pdHRlc3QzLlRlc3RBcmVuYU1hcC5N",
"YXBJbnQzMkZsb2F0RW50cnkSTgoQbWFwX2ludDMyX2RvdWJsZRgMIAMoCzI0",
"LnByb3RvYnVmX3VuaXR0ZXN0My5UZXN0QXJlbmFNYXAuTWFwSW50MzJEb3Vi",
"bGVFbnRyeRJICg1tYXBfYm9vbF9ib29sGA0gAygLMjEucHJvdG9idWZfdW5p",
"dHRlc3QzLlRlc3RBcmVuYU1hcC5NYXBCb29sQm9vbEVudHJ5EkoKDm1hcF9p",
"bnQzMl9lbnVtGA4gAygLMjIucHJvdG9idWZfdW5pdHRlc3QzLlRlc3RBcmVu",
"YU1hcC5NYXBJbnQzMkVudW1FbnRyeRJfChltYXBfaW50MzJfZm9yZWlnbl9t",
"ZXNzYWdlGA8gAygLMjwucHJvdG9idWZfdW5pdHRlc3QzLlRlc3RBcmVuYU1h",
"cC5NYXBJbnQzMkZvcmVpZ25NZXNzYWdlRW50cnkaNAoSTWFwSW50MzJJbnQz",
"MkVudHJ5EgsKA2tleRgBIAEoBRINCgV2YWx1ZRgCIAEoBToCOAEaNAoSTWFw",
"SW50NjRJbnQ2NEVudHJ5EgsKA2tleRgBIAEoAxINCgV2YWx1ZRgCIAEoAzoC",
"OAEaNgoUTWFwVWludDMyVWludDMyRW50cnkSCwoDa2V5GAEgASgNEg0KBXZh",
"bHVlGAIgASgNOgI4ARo2ChRNYXBVaW50NjRVaW50NjRFbnRyeRILCgNrZXkY",
"ASABKAQSDQoFdmFsdWUYAiABKAQ6AjgBGjYKFE1hcFNpbnQzMlNpbnQzMkVu",
"dHJ5EgsKA2tleRgBIAEoERINCgV2YWx1ZRgCIAEoEToCOAEaNgoUTWFwU2lu",
"dDY0U2ludDY0RW50cnkSCwoDa2V5GAEgASgSEg0KBXZhbHVlGAIgASgSOgI4",
"ARo4ChZNYXBGaXhlZDMyRml4ZWQzMkVudHJ5EgsKA2tleRgBIAEoBxINCgV2",
"YWx1ZRgCIAEoBzoCOAEaOAoWTWFwRml4ZWQ2NEZpeGVkNjRFbnRyeRILCgNr",
"ZXkYASABKAYSDQoFdmFsdWUYAiABKAY6AjgBGjoKGE1hcFNmaXhlZDMyU2Zp",
"eGVkMzJFbnRyeRILCgNrZXkYASABKA8SDQoFdmFsdWUYAiABKA86AjgBGjoK",
"GE1hcFNmaXhlZDY0U2ZpeGVkNjRFbnRyeRILCgNrZXkYASABKBASDQoFdmFs",
"dWUYAiABKBA6AjgBGjQKEk1hcEludDMyRmxvYXRFbnRyeRILCgNrZXkYASAB",
"KAUSDQoFdmFsdWUYAiABKAI6AjgBGjUKE01hcEludDMyRG91YmxlRW50cnkS",
"CwoDa2V5GAEgASgFEg0KBXZhbHVlGAIgASgBOgI4ARoyChBNYXBCb29sQm9v",
"bEVudHJ5EgsKA2tleRgBIAEoCBINCgV2YWx1ZRgCIAEoCDoCOAEaUAoRTWFw",
"SW50MzJFbnVtRW50cnkSCwoDa2V5GAEgASgFEioKBXZhbHVlGAIgASgOMhsu",
"cHJvdG9idWZfdW5pdHRlc3QzLk1hcEVudW06AjgBGmEKG01hcEludDMyRm9y",
"ZWlnbk1lc3NhZ2VFbnRyeRILCgNrZXkYASABKAUSMQoFdmFsdWUYAiABKAsy",
"Ii5wcm90b2J1Zl91bml0dGVzdDMuRm9yZWlnbk1lc3NhZ2U6AjgBIuYBCh9N",
"ZXNzYWdlQ29udGFpbmluZ0VudW1DYWxsZWRUeXBlEksKBHR5cGUYASADKAsy",
"PS5wcm90b2J1Zl91bml0dGVzdDMuTWVzc2FnZUNvbnRhaW5pbmdFbnVtQ2Fs",
"bGVkVHlwZS5UeXBlRW50cnkaYAoJVHlwZUVudHJ5EgsKA2tleRgBIAEoBRJC",
"CgV2YWx1ZRgCIAEoCzIzLnByb3RvYnVmX3VuaXR0ZXN0My5NZXNzYWdlQ29u",
"dGFpbmluZ0VudW1DYWxsZWRUeXBlOgI4ASIUCgRUeXBlEgwKCFRZUEVfRk9P",
"EAAingEKH01lc3NhZ2VDb250YWluaW5nTWFwQ2FsbGVkRW50cnkSTQoFZW50",
"cnkYASADKAsyPi5wcm90b2J1Zl91bml0dGVzdDMuTWVzc2FnZUNvbnRhaW5p",
"bmdNYXBDYWxsZWRFbnRyeS5FbnRyeUVudHJ5GiwKCkVudHJ5RW50cnkSCwoD",
"a2V5GAEgASgFEg0KBXZhbHVlGAIgASgFOgI4ASo/CgdNYXBFbnVtEhAKDE1B",
"UF9FTlVNX0ZPTxAAEhAKDE1BUF9FTlVNX0JBUhABEhAKDE1BUF9FTlVNX0JB",
"WhACQh2qAhpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvc2IGcHJvdG8z"));
"Cidjc2hhcnAvcHJvdG9zL21hcF91bml0dGVzdF9wcm90bzMucHJvdG8SEnBy",
"b3RvYnVmX3VuaXR0ZXN0MxojY3NoYXJwL3Byb3Rvcy91bml0dGVzdF9wcm90",
"bzMucHJvdG8iqRIKB1Rlc3RNYXASRwoPbWFwX2ludDMyX2ludDMyGAEgAygL",
"Mi4ucHJvdG9idWZfdW5pdHRlc3QzLlRlc3RNYXAuTWFwSW50MzJJbnQzMkVu",
"dHJ5EkcKD21hcF9pbnQ2NF9pbnQ2NBgCIAMoCzIuLnByb3RvYnVmX3VuaXR0",
"ZXN0My5UZXN0TWFwLk1hcEludDY0SW50NjRFbnRyeRJLChFtYXBfdWludDMy",
"X3VpbnQzMhgDIAMoCzIwLnByb3RvYnVmX3VuaXR0ZXN0My5UZXN0TWFwLk1h",
"cFVpbnQzMlVpbnQzMkVudHJ5EksKEW1hcF91aW50NjRfdWludDY0GAQgAygL",
"MjAucHJvdG9idWZfdW5pdHRlc3QzLlRlc3RNYXAuTWFwVWludDY0VWludDY0",
"RW50cnkSSwoRbWFwX3NpbnQzMl9zaW50MzIYBSADKAsyMC5wcm90b2J1Zl91",
"bml0dGVzdDMuVGVzdE1hcC5NYXBTaW50MzJTaW50MzJFbnRyeRJLChFtYXBf",
"c2ludDY0X3NpbnQ2NBgGIAMoCzIwLnByb3RvYnVmX3VuaXR0ZXN0My5UZXN0",
"TWFwLk1hcFNpbnQ2NFNpbnQ2NEVudHJ5Ek8KE21hcF9maXhlZDMyX2ZpeGVk",
"MzIYByADKAsyMi5wcm90b2J1Zl91bml0dGVzdDMuVGVzdE1hcC5NYXBGaXhl",
"ZDMyRml4ZWQzMkVudHJ5Ek8KE21hcF9maXhlZDY0X2ZpeGVkNjQYCCADKAsy",
"Mi5wcm90b2J1Zl91bml0dGVzdDMuVGVzdE1hcC5NYXBGaXhlZDY0Rml4ZWQ2",
"NEVudHJ5ElMKFW1hcF9zZml4ZWQzMl9zZml4ZWQzMhgJIAMoCzI0LnByb3Rv",
"YnVmX3VuaXR0ZXN0My5UZXN0TWFwLk1hcFNmaXhlZDMyU2ZpeGVkMzJFbnRy",
"eRJTChVtYXBfc2ZpeGVkNjRfc2ZpeGVkNjQYCiADKAsyNC5wcm90b2J1Zl91",
"bml0dGVzdDMuVGVzdE1hcC5NYXBTZml4ZWQ2NFNmaXhlZDY0RW50cnkSRwoP",
"bWFwX2ludDMyX2Zsb2F0GAsgAygLMi4ucHJvdG9idWZfdW5pdHRlc3QzLlRl",
"c3RNYXAuTWFwSW50MzJGbG9hdEVudHJ5EkkKEG1hcF9pbnQzMl9kb3VibGUY",
"DCADKAsyLy5wcm90b2J1Zl91bml0dGVzdDMuVGVzdE1hcC5NYXBJbnQzMkRv",
"dWJsZUVudHJ5EkMKDW1hcF9ib29sX2Jvb2wYDSADKAsyLC5wcm90b2J1Zl91",
"bml0dGVzdDMuVGVzdE1hcC5NYXBCb29sQm9vbEVudHJ5EksKEW1hcF9zdHJp",
"bmdfc3RyaW5nGA4gAygLMjAucHJvdG9idWZfdW5pdHRlc3QzLlRlc3RNYXAu",
"TWFwU3RyaW5nU3RyaW5nRW50cnkSRwoPbWFwX2ludDMyX2J5dGVzGA8gAygL",
"Mi4ucHJvdG9idWZfdW5pdHRlc3QzLlRlc3RNYXAuTWFwSW50MzJCeXRlc0Vu",
"dHJ5EkUKDm1hcF9pbnQzMl9lbnVtGBAgAygLMi0ucHJvdG9idWZfdW5pdHRl",
"c3QzLlRlc3RNYXAuTWFwSW50MzJFbnVtRW50cnkSWgoZbWFwX2ludDMyX2Zv",
"cmVpZ25fbWVzc2FnZRgRIAMoCzI3LnByb3RvYnVmX3VuaXR0ZXN0My5UZXN0",
"TWFwLk1hcEludDMyRm9yZWlnbk1lc3NhZ2VFbnRyeRo0ChJNYXBJbnQzMklu",
"dDMyRW50cnkSCwoDa2V5GAEgASgFEg0KBXZhbHVlGAIgASgFOgI4ARo0ChJN",
"YXBJbnQ2NEludDY0RW50cnkSCwoDa2V5GAEgASgDEg0KBXZhbHVlGAIgASgD",
"OgI4ARo2ChRNYXBVaW50MzJVaW50MzJFbnRyeRILCgNrZXkYASABKA0SDQoF",
"dmFsdWUYAiABKA06AjgBGjYKFE1hcFVpbnQ2NFVpbnQ2NEVudHJ5EgsKA2tl",
"eRgBIAEoBBINCgV2YWx1ZRgCIAEoBDoCOAEaNgoUTWFwU2ludDMyU2ludDMy",
"RW50cnkSCwoDa2V5GAEgASgREg0KBXZhbHVlGAIgASgROgI4ARo2ChRNYXBT",
"aW50NjRTaW50NjRFbnRyeRILCgNrZXkYASABKBISDQoFdmFsdWUYAiABKBI6",
"AjgBGjgKFk1hcEZpeGVkMzJGaXhlZDMyRW50cnkSCwoDa2V5GAEgASgHEg0K",
"BXZhbHVlGAIgASgHOgI4ARo4ChZNYXBGaXhlZDY0Rml4ZWQ2NEVudHJ5EgsK",
"A2tleRgBIAEoBhINCgV2YWx1ZRgCIAEoBjoCOAEaOgoYTWFwU2ZpeGVkMzJT",
"Zml4ZWQzMkVudHJ5EgsKA2tleRgBIAEoDxINCgV2YWx1ZRgCIAEoDzoCOAEa",
"OgoYTWFwU2ZpeGVkNjRTZml4ZWQ2NEVudHJ5EgsKA2tleRgBIAEoEBINCgV2",
"YWx1ZRgCIAEoEDoCOAEaNAoSTWFwSW50MzJGbG9hdEVudHJ5EgsKA2tleRgB",
"IAEoBRINCgV2YWx1ZRgCIAEoAjoCOAEaNQoTTWFwSW50MzJEb3VibGVFbnRy",
"eRILCgNrZXkYASABKAUSDQoFdmFsdWUYAiABKAE6AjgBGjIKEE1hcEJvb2xC",
"b29sRW50cnkSCwoDa2V5GAEgASgIEg0KBXZhbHVlGAIgASgIOgI4ARo2ChRN",
"YXBTdHJpbmdTdHJpbmdFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiAB",
"KAk6AjgBGjQKEk1hcEludDMyQnl0ZXNFbnRyeRILCgNrZXkYASABKAUSDQoF",
"dmFsdWUYAiABKAw6AjgBGlAKEU1hcEludDMyRW51bUVudHJ5EgsKA2tleRgB",
"IAEoBRIqCgV2YWx1ZRgCIAEoDjIbLnByb3RvYnVmX3VuaXR0ZXN0My5NYXBF",
"bnVtOgI4ARphChtNYXBJbnQzMkZvcmVpZ25NZXNzYWdlRW50cnkSCwoDa2V5",
"GAEgASgFEjEKBXZhbHVlGAIgASgLMiIucHJvdG9idWZfdW5pdHRlc3QzLkZv",
"cmVpZ25NZXNzYWdlOgI4ASJCChFUZXN0TWFwU3VibWVzc2FnZRItCgh0ZXN0",
"X21hcBgBIAEoCzIbLnByb3RvYnVmX3VuaXR0ZXN0My5UZXN0TWFwIr4BCg5U",
"ZXN0TWVzc2FnZU1hcBJSChFtYXBfaW50MzJfbWVzc2FnZRgBIAMoCzI3LnBy",
"b3RvYnVmX3VuaXR0ZXN0My5UZXN0TWVzc2FnZU1hcC5NYXBJbnQzMk1lc3Nh",
"Z2VFbnRyeRpYChRNYXBJbnQzMk1lc3NhZ2VFbnRyeRILCgNrZXkYASABKAUS",
"LwoFdmFsdWUYAiABKAsyIC5wcm90b2J1Zl91bml0dGVzdDMuVGVzdEFsbFR5",
"cGVzOgI4ASLlAQoPVGVzdFNhbWVUeXBlTWFwEjsKBG1hcDEYASADKAsyLS5w",
"cm90b2J1Zl91bml0dGVzdDMuVGVzdFNhbWVUeXBlTWFwLk1hcDFFbnRyeRI7",
"CgRtYXAyGAIgAygLMi0ucHJvdG9idWZfdW5pdHRlc3QzLlRlc3RTYW1lVHlw",
"ZU1hcC5NYXAyRW50cnkaKwoJTWFwMUVudHJ5EgsKA2tleRgBIAEoBRINCgV2",
"YWx1ZRgCIAEoBToCOAEaKwoJTWFwMkVudHJ5EgsKA2tleRgBIAEoBRINCgV2",
"YWx1ZRgCIAEoBToCOAEi9RAKDFRlc3RBcmVuYU1hcBJMCg9tYXBfaW50MzJf",
"aW50MzIYASADKAsyMy5wcm90b2J1Zl91bml0dGVzdDMuVGVzdEFyZW5hTWFw",
"Lk1hcEludDMySW50MzJFbnRyeRJMCg9tYXBfaW50NjRfaW50NjQYAiADKAsy",
"My5wcm90b2J1Zl91bml0dGVzdDMuVGVzdEFyZW5hTWFwLk1hcEludDY0SW50",
"NjRFbnRyeRJQChFtYXBfdWludDMyX3VpbnQzMhgDIAMoCzI1LnByb3RvYnVm",
"X3VuaXR0ZXN0My5UZXN0QXJlbmFNYXAuTWFwVWludDMyVWludDMyRW50cnkS",
"UAoRbWFwX3VpbnQ2NF91aW50NjQYBCADKAsyNS5wcm90b2J1Zl91bml0dGVz",
"dDMuVGVzdEFyZW5hTWFwLk1hcFVpbnQ2NFVpbnQ2NEVudHJ5ElAKEW1hcF9z",
"aW50MzJfc2ludDMyGAUgAygLMjUucHJvdG9idWZfdW5pdHRlc3QzLlRlc3RB",
"cmVuYU1hcC5NYXBTaW50MzJTaW50MzJFbnRyeRJQChFtYXBfc2ludDY0X3Np",
"bnQ2NBgGIAMoCzI1LnByb3RvYnVmX3VuaXR0ZXN0My5UZXN0QXJlbmFNYXAu",
"TWFwU2ludDY0U2ludDY0RW50cnkSVAoTbWFwX2ZpeGVkMzJfZml4ZWQzMhgH",
"IAMoCzI3LnByb3RvYnVmX3VuaXR0ZXN0My5UZXN0QXJlbmFNYXAuTWFwRml4",
"ZWQzMkZpeGVkMzJFbnRyeRJUChNtYXBfZml4ZWQ2NF9maXhlZDY0GAggAygL",
"MjcucHJvdG9idWZfdW5pdHRlc3QzLlRlc3RBcmVuYU1hcC5NYXBGaXhlZDY0",
"Rml4ZWQ2NEVudHJ5ElgKFW1hcF9zZml4ZWQzMl9zZml4ZWQzMhgJIAMoCzI5",
"LnByb3RvYnVmX3VuaXR0ZXN0My5UZXN0QXJlbmFNYXAuTWFwU2ZpeGVkMzJT",
"Zml4ZWQzMkVudHJ5ElgKFW1hcF9zZml4ZWQ2NF9zZml4ZWQ2NBgKIAMoCzI5",
"LnByb3RvYnVmX3VuaXR0ZXN0My5UZXN0QXJlbmFNYXAuTWFwU2ZpeGVkNjRT",
"Zml4ZWQ2NEVudHJ5EkwKD21hcF9pbnQzMl9mbG9hdBgLIAMoCzIzLnByb3Rv",
"YnVmX3VuaXR0ZXN0My5UZXN0QXJlbmFNYXAuTWFwSW50MzJGbG9hdEVudHJ5",
"Ek4KEG1hcF9pbnQzMl9kb3VibGUYDCADKAsyNC5wcm90b2J1Zl91bml0dGVz",
"dDMuVGVzdEFyZW5hTWFwLk1hcEludDMyRG91YmxlRW50cnkSSAoNbWFwX2Jv",
"b2xfYm9vbBgNIAMoCzIxLnByb3RvYnVmX3VuaXR0ZXN0My5UZXN0QXJlbmFN",
"YXAuTWFwQm9vbEJvb2xFbnRyeRJKCg5tYXBfaW50MzJfZW51bRgOIAMoCzIy",
"LnByb3RvYnVmX3VuaXR0ZXN0My5UZXN0QXJlbmFNYXAuTWFwSW50MzJFbnVt",
"RW50cnkSXwoZbWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZRgPIAMoCzI8LnBy",
"b3RvYnVmX3VuaXR0ZXN0My5UZXN0QXJlbmFNYXAuTWFwSW50MzJGb3JlaWdu",
"TWVzc2FnZUVudHJ5GjQKEk1hcEludDMySW50MzJFbnRyeRILCgNrZXkYASAB",
"KAUSDQoFdmFsdWUYAiABKAU6AjgBGjQKEk1hcEludDY0SW50NjRFbnRyeRIL",
"CgNrZXkYASABKAMSDQoFdmFsdWUYAiABKAM6AjgBGjYKFE1hcFVpbnQzMlVp",
"bnQzMkVudHJ5EgsKA2tleRgBIAEoDRINCgV2YWx1ZRgCIAEoDToCOAEaNgoU",
"TWFwVWludDY0VWludDY0RW50cnkSCwoDa2V5GAEgASgEEg0KBXZhbHVlGAIg",
"ASgEOgI4ARo2ChRNYXBTaW50MzJTaW50MzJFbnRyeRILCgNrZXkYASABKBES",
"DQoFdmFsdWUYAiABKBE6AjgBGjYKFE1hcFNpbnQ2NFNpbnQ2NEVudHJ5EgsK",
"A2tleRgBIAEoEhINCgV2YWx1ZRgCIAEoEjoCOAEaOAoWTWFwRml4ZWQzMkZp",
"eGVkMzJFbnRyeRILCgNrZXkYASABKAcSDQoFdmFsdWUYAiABKAc6AjgBGjgK",
"Fk1hcEZpeGVkNjRGaXhlZDY0RW50cnkSCwoDa2V5GAEgASgGEg0KBXZhbHVl",
"GAIgASgGOgI4ARo6ChhNYXBTZml4ZWQzMlNmaXhlZDMyRW50cnkSCwoDa2V5",
"GAEgASgPEg0KBXZhbHVlGAIgASgPOgI4ARo6ChhNYXBTZml4ZWQ2NFNmaXhl",
"ZDY0RW50cnkSCwoDa2V5GAEgASgQEg0KBXZhbHVlGAIgASgQOgI4ARo0ChJN",
"YXBJbnQzMkZsb2F0RW50cnkSCwoDa2V5GAEgASgFEg0KBXZhbHVlGAIgASgC",
"OgI4ARo1ChNNYXBJbnQzMkRvdWJsZUVudHJ5EgsKA2tleRgBIAEoBRINCgV2",
"YWx1ZRgCIAEoAToCOAEaMgoQTWFwQm9vbEJvb2xFbnRyeRILCgNrZXkYASAB",
"KAgSDQoFdmFsdWUYAiABKAg6AjgBGlAKEU1hcEludDMyRW51bUVudHJ5EgsK",
"A2tleRgBIAEoBRIqCgV2YWx1ZRgCIAEoDjIbLnByb3RvYnVmX3VuaXR0ZXN0",
"My5NYXBFbnVtOgI4ARphChtNYXBJbnQzMkZvcmVpZ25NZXNzYWdlRW50cnkS",
"CwoDa2V5GAEgASgFEjEKBXZhbHVlGAIgASgLMiIucHJvdG9idWZfdW5pdHRl",
"c3QzLkZvcmVpZ25NZXNzYWdlOgI4ASLmAQofTWVzc2FnZUNvbnRhaW5pbmdF",
"bnVtQ2FsbGVkVHlwZRJLCgR0eXBlGAEgAygLMj0ucHJvdG9idWZfdW5pdHRl",
"c3QzLk1lc3NhZ2VDb250YWluaW5nRW51bUNhbGxlZFR5cGUuVHlwZUVudHJ5",
"GmAKCVR5cGVFbnRyeRILCgNrZXkYASABKAUSQgoFdmFsdWUYAiABKAsyMy5w",
"cm90b2J1Zl91bml0dGVzdDMuTWVzc2FnZUNvbnRhaW5pbmdFbnVtQ2FsbGVk",
"VHlwZToCOAEiFAoEVHlwZRIMCghUWVBFX0ZPTxAAIp4BCh9NZXNzYWdlQ29u",
"dGFpbmluZ01hcENhbGxlZEVudHJ5Ek0KBWVudHJ5GAEgAygLMj4ucHJvdG9i",
"dWZfdW5pdHRlc3QzLk1lc3NhZ2VDb250YWluaW5nTWFwQ2FsbGVkRW50cnku",
"RW50cnlFbnRyeRosCgpFbnRyeUVudHJ5EgsKA2tleRgBIAEoBRINCgV2YWx1",
"ZRgCIAEoBToCOAEqPwoHTWFwRW51bRIQCgxNQVBfRU5VTV9GT08QABIQCgxN",
"QVBfRU5VTV9CQVIQARIQCgxNQVBfRU5VTV9CQVoQAkIdqgIaR29vZ2xlLlBy",
"b3RvYnVmLlRlc3RQcm90b3NiBnByb3RvMw=="));
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
new pbr::FileDescriptor[] { global::Google.Protobuf.TestProtos.UnittestProto3Reflection.Descriptor, },
new pbr::GeneratedClrTypeInfo(new[] {typeof(global::Google.Protobuf.TestProtos.MapEnum), }, null, new pbr::GeneratedClrTypeInfo[] {

File diff suppressed because one or more lines are too long

@ -1,6 +1,6 @@
// <auto-generated>
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: unittest_custom_options_proto3.proto
// source: csharp/protos/unittest_custom_options_proto3.proto
// </auto-generated>
#pragma warning disable 1591, 0612, 3021, 8981
#region Designer generated code
@ -11,11 +11,11 @@ using pbr = global::Google.Protobuf.Reflection;
using scg = global::System.Collections.Generic;
namespace UnitTest.Issues.TestProtos {
/// <summary>Holder for reflection information generated from unittest_custom_options_proto3.proto</summary>
/// <summary>Holder for reflection information generated from csharp/protos/unittest_custom_options_proto3.proto</summary>
public static partial class UnittestCustomOptionsProto3Reflection {
#region Descriptor
/// <summary>File descriptor for unittest_custom_options_proto3.proto</summary>
/// <summary>File descriptor for csharp/protos/unittest_custom_options_proto3.proto</summary>
public static pbr::FileDescriptor Descriptor {
get { return descriptor; }
}
@ -24,119 +24,119 @@ namespace UnitTest.Issues.TestProtos {
static UnittestCustomOptionsProto3Reflection() {
byte[] descriptorData = global::System.Convert.FromBase64String(
string.Concat(
"CiR1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wcm90bzMucHJvdG8SEXByb3Rv",
"YnVmX3VuaXR0ZXN0GiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90",
"byLXAQocVGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9ucxIeCgZmaWVsZDEY",
"ASABKAlCDggBweDDHS3hdQoCAAAAEhUKC29uZW9mX2ZpZWxkGAIgASgFSAAi",
"UwoGQW5FbnVtEhYKEkFORU5VTV9VTlNQRUNJRklFRBAAEg8KC0FORU5VTV9W",
"QUwxEAESFgoLQU5FTlVNX1ZBTDIQAhoFsIb6BXsaCMX2yR3r/P//OhAIAODp",
"wh3I//////////8BQhkKB0FuT25lb2YSDviswx2d//////////8BIhgKFkN1",
"c3RvbU9wdGlvbkZvb1JlcXVlc3QiGQoXQ3VzdG9tT3B0aW9uRm9vUmVzcG9u",
"c2UiHgocQ3VzdG9tT3B0aW9uRm9vQ2xpZW50TWVzc2FnZSIeChxDdXN0b21P",
"cHRpb25Gb29TZXJ2ZXJNZXNzYWdlIo8BChpEdW1teU1lc3NhZ2VDb250YWlu",
"aW5nRW51bSJxCgxUZXN0RW51bVR5cGUSIAocVEVTVF9PUFRJT05fRU5VTV9V",
"TlNQRUNJRklFRBAAEhoKFlRFU1RfT1BUSU9OX0VOVU1fVFlQRTEQFhIjChZU",
"RVNUX09QVElPTl9FTlVNX1RZUEUyEOn//////////wEiIQofRHVtbXlNZXNz",
"YWdlSW52YWxpZEFzT3B0aW9uVHlwZSKKAQocQ3VzdG9tT3B0aW9uTWluSW50",
"ZWdlclZhbHVlczpq0N6yHQDoxrIdgICAgPj/////AbC8sh2AgICAgICAgIAB",
"gJOyHQD49bAdAIDEsB3/////D/iXsB3///////////8BnfWvHQAAAACR7q8d",
"AAAAAAAAAACtja8dAAAAgJnWqB0AAAAAAAAAgCKRAQocQ3VzdG9tT3B0aW9u",
"TWF4SW50ZWdlclZhbHVlczpx0N6yHQHoxrId/////wewvLId//////////9/",
"gJOyHf////8P+PWwHf///////////wGAxLAd/v///w/4l7Ad/v//////////",
"AZ31rx3/////ke6vHf//////////rY2vHf///3+Z1qgd/////////38ibgoX",
"Q3VzdG9tT3B0aW9uT3RoZXJWYWx1ZXM6U+jGsh2c//////////8B9d+jHeeH",
"RUHp3KId+1mMQsrA8z+q3KIdDkhlbGxvLCAiV29ybGQistmiHQtIZWxsbwBX",
"b3JsZIjZoh3p//////////8BIjQKHFNldHRpbmdSZWFsc0Zyb21Qb3NpdGl2",
"ZUludHM6FPXfox0AAEBB6dyiHQAAAAAAQGNAIjQKHFNldHRpbmdSZWFsc0Zy",
"b21OZWdhdGl2ZUludHM6FPXfox0AAEDB6dyiHQAAAAAAQGPAIksKEkNvbXBs",
"ZXhPcHRpb25UeXBlMRILCgNmb28YASABKAUSDAoEZm9vMhgCIAEoBRIMCgRm",
"b28zGAMgASgFEgwKBGZvbzQYBCADKAUigQMKEkNvbXBsZXhPcHRpb25UeXBl",
"MhIyCgNiYXIYASABKAsyJS5wcm90b2J1Zl91bml0dGVzdC5Db21wbGV4T3B0",
"aW9uVHlwZTESCwoDYmF6GAIgASgFEkYKBGZyZWQYAyABKAsyOC5wcm90b2J1",
"Zl91bml0dGVzdC5Db21wbGV4T3B0aW9uVHlwZTIuQ29tcGxleE9wdGlvblR5",
"cGU0EkgKBmJhcm5leRgEIAMoCzI4LnByb3RvYnVmX3VuaXR0ZXN0LkNvbXBs",
"ZXhPcHRpb25UeXBlMi5Db21wbGV4T3B0aW9uVHlwZTQalwEKEkNvbXBsZXhP",
"cHRpb25UeXBlNBINCgV3YWxkbxgBIAEoBTJyCgxjb21wbGV4X29wdDQSHy5n",
"b29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMYivXRAyABKAsyOC5wcm90",
"b2J1Zl91bml0dGVzdC5Db21wbGV4T3B0aW9uVHlwZTIuQ29tcGxleE9wdGlv",
"blR5cGU0IiEKEkNvbXBsZXhPcHRpb25UeXBlMxILCgNxdXgYASABKAUibAoV",
"VmFyaW91c0NvbXBsZXhPcHRpb25zOlOi4pUdAggqouKVHQIgY6LilR0CIFiq",
"/ZAdAxDbB6r9kB0FCgMI5wXSqI8dAwizD6r9kB0FGgMIwQKq/ZAdBCICCGWq",
"/ZAdBSIDCNQB+t6QHQIICSJMCglBZ2dyZWdhdGUSCQoBaRgBIAEoBRIJCgFz",
"GAIgASgJEikKA3N1YhgDIAEoCzIcLnByb3RvYnVmX3VuaXR0ZXN0LkFnZ3Jl",
"Z2F0ZSJZChBBZ2dyZWdhdGVNZXNzYWdlEikKCWZpZWxkbmFtZRgBIAEoBUIW",
"8qGHOxESD0ZpZWxkQW5ub3RhdGlvbjoawtGGOxUIZRIRTWVzc2FnZUFubm90",
"YXRpb24ilwEKEE5lc3RlZE9wdGlvblR5cGUaOwoNTmVzdGVkTWVzc2FnZRIi",
"CgxuZXN0ZWRfZmllbGQYASABKAVCDMHgwx3qAwAAAAAAADoG4OnCHekHIkYK",
"Ck5lc3RlZEVudW0SDwoLVU5TUEVDSUZJRUQQABIdChFORVNURURfRU5VTV9W",
"QUxVRRABGgawhvoF7AcaCMX2yR3rAwAAKlIKCk1ldGhvZE9wdDESGgoWTUVU",
"SE9ET1BUMV9VTlNQRUNJRklFRBAAEhMKD01FVEhPRE9QVDFfVkFMMRABEhMK",
"D01FVEhPRE9QVDFfVkFMMhACKl4KDUFnZ3JlZ2F0ZUVudW0SDwoLVU5TUEVD",
"SUZJRUQQABIlCgVWQUxVRRABGhrK/Ik7FRITRW51bVZhbHVlQW5ub3RhdGlv",
"bhoVkpWIOxASDkVudW1Bbm5vdGF0aW9uMo4BChxUZXN0U2VydmljZVdpdGhD",
"dXN0b21PcHRpb25zEmMKA0ZvbxIpLnByb3RvYnVmX3VuaXR0ZXN0LkN1c3Rv",
"bU9wdGlvbkZvb1JlcXVlc3QaKi5wcm90b2J1Zl91bml0dGVzdC5DdXN0b21P",
"cHRpb25Gb29SZXNwb25zZSIF4PqMHgIaCZCyix7T24DLSTKZAQoQQWdncmVn",
"YXRlU2VydmljZRJrCgZNZXRob2QSIy5wcm90b2J1Zl91bml0dGVzdC5BZ2dy",
"ZWdhdGVNZXNzYWdlGiMucHJvdG9idWZfdW5pdHRlc3QuQWdncmVnYXRlTWVz",
"c2FnZSIXysiWOxISEE1ldGhvZEFubm90YXRpb24aGMr7jjsTEhFTZXJ2aWNl",
"QW5ub3RhdGlvbjoyCglmaWxlX29wdDESHC5nb29nbGUucHJvdG9idWYuRmls",
"ZU9wdGlvbnMYjp3YAyABKAQ6OAoMbWVzc2FnZV9vcHQxEh8uZ29vZ2xlLnBy",
"b3RvYnVmLk1lc3NhZ2VPcHRpb25zGJyt2AMgASgFOjQKCmZpZWxkX29wdDES",
"HS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zGIi82AMgASgGOjQKCm9u",
"ZW9mX29wdDESHS5nb29nbGUucHJvdG9idWYuT25lb2ZPcHRpb25zGM+12AMg",
"ASgFOjIKCWVudW1fb3B0MRIcLmdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9u",
"cxjontkDIAEoDzo8Cg9lbnVtX3ZhbHVlX29wdDESIS5nb29nbGUucHJvdG9i",
"dWYuRW51bVZhbHVlT3B0aW9ucxjmoF8gASgFOjgKDHNlcnZpY2Vfb3B0MRIf",
"Lmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucxiituEDIAEoEjpVCgtt",
"ZXRob2Rfb3B0MRIeLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zGKzP",
"4QMgASgOMh0ucHJvdG9idWZfdW5pdHRlc3QuTWV0aG9kT3B0MTo0Cghib29s",
"X29wdBIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxjqq9YDIAEo",
"CDo1CglpbnQzMl9vcHQSHy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlv",
"bnMY7ajWAyABKAU6NQoJaW50NjRfb3B0Eh8uZ29vZ2xlLnByb3RvYnVmLk1l",
"c3NhZ2VPcHRpb25zGMan1gMgASgDOjYKCnVpbnQzMl9vcHQSHy5nb29nbGUu",
"cHJvdG9idWYuTWVzc2FnZU9wdGlvbnMYsKLWAyABKA06NgoKdWludDY0X29w",
"dBIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxjfjtYDIAEoBDo2",
"CgpzaW50MzJfb3B0Eh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25z",
"GMCI1gMgASgROjYKCnNpbnQ2NF9vcHQSHy5nb29nbGUucHJvdG9idWYuTWVz",
"c2FnZU9wdGlvbnMY/4LWAyABKBI6NwoLZml4ZWQzMl9vcHQSHy5nb29nbGUu",
"cHJvdG9idWYuTWVzc2FnZU9wdGlvbnMY0/7VAyABKAc6NwoLZml4ZWQ2NF9v",
"cHQSHy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMY4v3VAyABKAY6",
"OAoMc2ZpeGVkMzJfb3B0Eh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRp",
"b25zGNXx1QMgASgPOjgKDHNmaXhlZDY0X29wdBIfLmdvb2dsZS5wcm90b2J1",
"Zi5NZXNzYWdlT3B0aW9ucxjjitUDIAEoEDo1CglmbG9hdF9vcHQSHy5nb29n",
"bGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMY/rvUAyABKAI6NgoKZG91Ymxl",
"X29wdBIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxjNq9QDIAEo",
"ATo2CgpzdHJpbmdfb3B0Eh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRp",
"b25zGMWr1AMgASgJOjUKCWJ5dGVzX29wdBIfLmdvb2dsZS5wcm90b2J1Zi5N",
"ZXNzYWdlT3B0aW9ucxiWq9QDIAEoDDpwCghlbnVtX29wdBIfLmdvb2dsZS5w",
"cm90b2J1Zi5NZXNzYWdlT3B0aW9ucxiRq9QDIAEoDjI6LnByb3RvYnVmX3Vu",
"aXR0ZXN0LkR1bW15TWVzc2FnZUNvbnRhaW5pbmdFbnVtLlRlc3RFbnVtVHlw",
"ZTpwChBtZXNzYWdlX3R5cGVfb3B0Eh8uZ29vZ2xlLnByb3RvYnVmLk1lc3Nh",
"Z2VPcHRpb25zGK/y0wMgASgLMjIucHJvdG9idWZfdW5pdHRlc3QuRHVtbXlN",
"ZXNzYWdlSW52YWxpZEFzT3B0aW9uVHlwZTpfCgxjb21wbGV4X29wdDESHy5n",
"b29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMYpNzSAyABKAsyJS5wcm90",
"b2J1Zl91bml0dGVzdC5Db21wbGV4T3B0aW9uVHlwZTE6XwoMY29tcGxleF9v",
"cHQyEh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zGNWP0gMgASgL",
"MiUucHJvdG9idWZfdW5pdHRlc3QuQ29tcGxleE9wdGlvblR5cGUyOl8KDGNv",
"bXBsZXhfb3B0MxIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxjv",
"i9IDIAEoCzIlLnByb3RvYnVmX3VuaXR0ZXN0LkNvbXBsZXhPcHRpb25UeXBl",
"MzpOCgdmaWxlb3B0EhwuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zGM/d",
"sAcgASgLMhwucHJvdG9idWZfdW5pdHRlc3QuQWdncmVnYXRlOlAKBm1zZ29w",
"dBIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxiY6rAHIAEoCzIc",
"LnByb3RvYnVmX3VuaXR0ZXN0LkFnZ3JlZ2F0ZTpQCghmaWVsZG9wdBIdLmdv",
"b2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMYnvSwByABKAsyHC5wcm90b2J1",
"Zl91bml0dGVzdC5BZ2dyZWdhdGU6TgoHZW51bW9wdBIcLmdvb2dsZS5wcm90",
"b2J1Zi5FbnVtT3B0aW9ucxjSgrEHIAEoCzIcLnByb3RvYnVmX3VuaXR0ZXN0",
"LkFnZ3JlZ2F0ZTpWCgplbnVtdmFsb3B0EiEuZ29vZ2xlLnByb3RvYnVmLkVu",
"dW1WYWx1ZU9wdGlvbnMYyZ+xByABKAsyHC5wcm90b2J1Zl91bml0dGVzdC5B",
"Z2dyZWdhdGU6VAoKc2VydmljZW9wdBIfLmdvb2dsZS5wcm90b2J1Zi5TZXJ2",
"aWNlT3B0aW9ucxi577EHIAEoCzIcLnByb3RvYnVmX3VuaXR0ZXN0LkFnZ3Jl",
"Z2F0ZTpSCgltZXRob2RvcHQSHi5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0",
"aW9ucxiJ6bIHIAEoCzIcLnByb3RvYnVmX3VuaXR0ZXN0LkFnZ3JlZ2F0ZUJV",
"qgIaVW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3Pw6MEd6q3A5ST67IU7Kghk",
"Eg5GaWxlQW5ub3RhdGlvbhoWEhROZXN0ZWRGaWxlQW5ub3RhdGlvbmIGcHJv",
"dG8z"));
"CjJjc2hhcnAvcHJvdG9zL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3Byb3Rv",
"My5wcm90bxIRcHJvdG9idWZfdW5pdHRlc3QaIGdvb2dsZS9wcm90b2J1Zi9k",
"ZXNjcmlwdG9yLnByb3RvItcBChxUZXN0TWVzc2FnZVdpdGhDdXN0b21PcHRp",
"b25zEh4KBmZpZWxkMRgBIAEoCUIOCAHB4MMdLeF1CgIAAAASFQoLb25lb2Zf",
"ZmllbGQYAiABKAVIACJTCgZBbkVudW0SFgoSQU5FTlVNX1VOU1BFQ0lGSUVE",
"EAASDwoLQU5FTlVNX1ZBTDEQARIWCgtBTkVOVU1fVkFMMhACGgWwhvoFexoI",
"xfbJHev8//86EAgA4OnCHcj//////////wFCGQoHQW5PbmVvZhIO+KzDHZ3/",
"/////////wEiGAoWQ3VzdG9tT3B0aW9uRm9vUmVxdWVzdCIZChdDdXN0b21P",
"cHRpb25Gb29SZXNwb25zZSIeChxDdXN0b21PcHRpb25Gb29DbGllbnRNZXNz",
"YWdlIh4KHEN1c3RvbU9wdGlvbkZvb1NlcnZlck1lc3NhZ2UijwEKGkR1bW15",
"TWVzc2FnZUNvbnRhaW5pbmdFbnVtInEKDFRlc3RFbnVtVHlwZRIgChxURVNU",
"X09QVElPTl9FTlVNX1VOU1BFQ0lGSUVEEAASGgoWVEVTVF9PUFRJT05fRU5V",
"TV9UWVBFMRAWEiMKFlRFU1RfT1BUSU9OX0VOVU1fVFlQRTIQ6f//////////",
"ASIhCh9EdW1teU1lc3NhZ2VJbnZhbGlkQXNPcHRpb25UeXBlIooBChxDdXN0",
"b21PcHRpb25NaW5JbnRlZ2VyVmFsdWVzOmrQ3rIdAOjGsh2AgICA+P////8B",
"sLyyHYCAgICAgICAgAGAk7IdAPj1sB0AgMSwHf////8P+JewHf//////////",
"/wGd9a8dAAAAAJHurx0AAAAAAAAAAK2Nrx0AAACAmdaoHQAAAAAAAACAIpEB",
"ChxDdXN0b21PcHRpb25NYXhJbnRlZ2VyVmFsdWVzOnHQ3rIdAejGsh3/////",
"B7C8sh3//////////3+Ak7Id/////w/49bAd////////////AYDEsB3+////",
"D/iXsB3+//////////8BnfWvHf////+R7q8d//////////+tja8d////f5nW",
"qB3/////////fyJuChdDdXN0b21PcHRpb25PdGhlclZhbHVlczpT6MayHZz/",
"/////////wH136Md54dFQencoh37WYxCysDzP6rcoh0OSGVsbG8sICJXb3Js",
"ZCKy2aIdC0hlbGxvAFdvcmxkiNmiHen//////////wEiNAocU2V0dGluZ1Jl",
"YWxzRnJvbVBvc2l0aXZlSW50czoU9d+jHQAAQEHp3KIdAAAAAABAY0AiNAoc",
"U2V0dGluZ1JlYWxzRnJvbU5lZ2F0aXZlSW50czoU9d+jHQAAQMHp3KIdAAAA",
"AABAY8AiSwoSQ29tcGxleE9wdGlvblR5cGUxEgsKA2ZvbxgBIAEoBRIMCgRm",
"b28yGAIgASgFEgwKBGZvbzMYAyABKAUSDAoEZm9vNBgEIAMoBSKBAwoSQ29t",
"cGxleE9wdGlvblR5cGUyEjIKA2JhchgBIAEoCzIlLnByb3RvYnVmX3VuaXR0",
"ZXN0LkNvbXBsZXhPcHRpb25UeXBlMRILCgNiYXoYAiABKAUSRgoEZnJlZBgD",
"IAEoCzI4LnByb3RvYnVmX3VuaXR0ZXN0LkNvbXBsZXhPcHRpb25UeXBlMi5D",
"b21wbGV4T3B0aW9uVHlwZTQSSAoGYmFybmV5GAQgAygLMjgucHJvdG9idWZf",
"dW5pdHRlc3QuQ29tcGxleE9wdGlvblR5cGUyLkNvbXBsZXhPcHRpb25UeXBl",
"NBqXAQoSQ29tcGxleE9wdGlvblR5cGU0Eg0KBXdhbGRvGAEgASgFMnIKDGNv",
"bXBsZXhfb3B0NBIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxiK",
"9dEDIAEoCzI4LnByb3RvYnVmX3VuaXR0ZXN0LkNvbXBsZXhPcHRpb25UeXBl",
"Mi5Db21wbGV4T3B0aW9uVHlwZTQiIQoSQ29tcGxleE9wdGlvblR5cGUzEgsK",
"A3F1eBgBIAEoBSJsChVWYXJpb3VzQ29tcGxleE9wdGlvbnM6U6LilR0CCCqi",
"4pUdAiBjouKVHQIgWKr9kB0DENsHqv2QHQUKAwjnBdKojx0DCLMPqv2QHQUa",
"AwjBAqr9kB0EIgIIZar9kB0FIgMI1AH63pAdAggJIkwKCUFnZ3JlZ2F0ZRIJ",
"CgFpGAEgASgFEgkKAXMYAiABKAkSKQoDc3ViGAMgASgLMhwucHJvdG9idWZf",
"dW5pdHRlc3QuQWdncmVnYXRlIlkKEEFnZ3JlZ2F0ZU1lc3NhZ2USKQoJZmll",
"bGRuYW1lGAEgASgFQhbyoYc7ERIPRmllbGRBbm5vdGF0aW9uOhrC0YY7FQhl",
"EhFNZXNzYWdlQW5ub3RhdGlvbiKXAQoQTmVzdGVkT3B0aW9uVHlwZRo7Cg1O",
"ZXN0ZWRNZXNzYWdlEiIKDG5lc3RlZF9maWVsZBgBIAEoBUIMweDDHeoDAAAA",
"AAAAOgbg6cId6QciRgoKTmVzdGVkRW51bRIPCgtVTlNQRUNJRklFRBAAEh0K",
"EU5FU1RFRF9FTlVNX1ZBTFVFEAEaBrCG+gXsBxoIxfbJHesDAAAqUgoKTWV0",
"aG9kT3B0MRIaChZNRVRIT0RPUFQxX1VOU1BFQ0lGSUVEEAASEwoPTUVUSE9E",
"T1BUMV9WQUwxEAESEwoPTUVUSE9ET1BUMV9WQUwyEAIqXgoNQWdncmVnYXRl",
"RW51bRIPCgtVTlNQRUNJRklFRBAAEiUKBVZBTFVFEAEaGsr8iTsVEhNFbnVt",
"VmFsdWVBbm5vdGF0aW9uGhWSlYg7EBIORW51bUFubm90YXRpb24yjgEKHFRl",
"c3RTZXJ2aWNlV2l0aEN1c3RvbU9wdGlvbnMSYwoDRm9vEikucHJvdG9idWZf",
"dW5pdHRlc3QuQ3VzdG9tT3B0aW9uRm9vUmVxdWVzdBoqLnByb3RvYnVmX3Vu",
"aXR0ZXN0LkN1c3RvbU9wdGlvbkZvb1Jlc3BvbnNlIgXg+oweAhoJkLKLHtPb",
"gMtJMpkBChBBZ2dyZWdhdGVTZXJ2aWNlEmsKBk1ldGhvZBIjLnByb3RvYnVm",
"X3VuaXR0ZXN0LkFnZ3JlZ2F0ZU1lc3NhZ2UaIy5wcm90b2J1Zl91bml0dGVz",
"dC5BZ2dyZWdhdGVNZXNzYWdlIhfKyJY7EhIQTWV0aG9kQW5ub3RhdGlvbhoY",
"yvuOOxMSEVNlcnZpY2VBbm5vdGF0aW9uOjIKCWZpbGVfb3B0MRIcLmdvb2ds",
"ZS5wcm90b2J1Zi5GaWxlT3B0aW9ucxiOndgDIAEoBDo4CgxtZXNzYWdlX29w",
"dDESHy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMYnK3YAyABKAU6",
"NAoKZmllbGRfb3B0MRIdLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMY",
"iLzYAyABKAY6NAoKb25lb2Zfb3B0MRIdLmdvb2dsZS5wcm90b2J1Zi5PbmVv",
"Zk9wdGlvbnMYz7XYAyABKAU6MgoJZW51bV9vcHQxEhwuZ29vZ2xlLnByb3Rv",
"YnVmLkVudW1PcHRpb25zGOie2QMgASgPOjwKD2VudW1fdmFsdWVfb3B0MRIh",
"Lmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zGOagXyABKAU6OAoM",
"c2VydmljZV9vcHQxEh8uZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25z",
"GKK24QMgASgSOlUKC21ldGhvZF9vcHQxEh4uZ29vZ2xlLnByb3RvYnVmLk1l",
"dGhvZE9wdGlvbnMYrM/hAyABKA4yHS5wcm90b2J1Zl91bml0dGVzdC5NZXRo",
"b2RPcHQxOjQKCGJvb2xfb3B0Eh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VP",
"cHRpb25zGOqr1gMgASgIOjUKCWludDMyX29wdBIfLmdvb2dsZS5wcm90b2J1",
"Zi5NZXNzYWdlT3B0aW9ucxjtqNYDIAEoBTo1CglpbnQ2NF9vcHQSHy5nb29n",
"bGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMYxqfWAyABKAM6NgoKdWludDMy",
"X29wdBIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxiwotYDIAEo",
"DTo2Cgp1aW50NjRfb3B0Eh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRp",
"b25zGN+O1gMgASgEOjYKCnNpbnQzMl9vcHQSHy5nb29nbGUucHJvdG9idWYu",
"TWVzc2FnZU9wdGlvbnMYwIjWAyABKBE6NgoKc2ludDY0X29wdBIfLmdvb2ds",
"ZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxj/gtYDIAEoEjo3CgtmaXhlZDMy",
"X29wdBIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxjT/tUDIAEo",
"Bzo3CgtmaXhlZDY0X29wdBIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0",
"aW9ucxji/dUDIAEoBjo4CgxzZml4ZWQzMl9vcHQSHy5nb29nbGUucHJvdG9i",
"dWYuTWVzc2FnZU9wdGlvbnMY1fHVAyABKA86OAoMc2ZpeGVkNjRfb3B0Eh8u",
"Z29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zGOOK1QMgASgQOjUKCWZs",
"b2F0X29wdBIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxj+u9QD",
"IAEoAjo2Cgpkb3VibGVfb3B0Eh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VP",
"cHRpb25zGM2r1AMgASgBOjYKCnN0cmluZ19vcHQSHy5nb29nbGUucHJvdG9i",
"dWYuTWVzc2FnZU9wdGlvbnMYxavUAyABKAk6NQoJYnl0ZXNfb3B0Eh8uZ29v",
"Z2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zGJar1AMgASgMOnAKCGVudW1f",
"b3B0Eh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zGJGr1AMgASgO",
"MjoucHJvdG9idWZfdW5pdHRlc3QuRHVtbXlNZXNzYWdlQ29udGFpbmluZ0Vu",
"dW0uVGVzdEVudW1UeXBlOnAKEG1lc3NhZ2VfdHlwZV9vcHQSHy5nb29nbGUu",
"cHJvdG9idWYuTWVzc2FnZU9wdGlvbnMYr/LTAyABKAsyMi5wcm90b2J1Zl91",
"bml0dGVzdC5EdW1teU1lc3NhZ2VJbnZhbGlkQXNPcHRpb25UeXBlOl8KDGNv",
"bXBsZXhfb3B0MRIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxik",
"3NIDIAEoCzIlLnByb3RvYnVmX3VuaXR0ZXN0LkNvbXBsZXhPcHRpb25UeXBl",
"MTpfCgxjb21wbGV4X29wdDISHy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9w",
"dGlvbnMY1Y/SAyABKAsyJS5wcm90b2J1Zl91bml0dGVzdC5Db21wbGV4T3B0",
"aW9uVHlwZTI6XwoMY29tcGxleF9vcHQzEh8uZ29vZ2xlLnByb3RvYnVmLk1l",
"c3NhZ2VPcHRpb25zGO+L0gMgASgLMiUucHJvdG9idWZfdW5pdHRlc3QuQ29t",
"cGxleE9wdGlvblR5cGUzOk4KB2ZpbGVvcHQSHC5nb29nbGUucHJvdG9idWYu",
"RmlsZU9wdGlvbnMYz92wByABKAsyHC5wcm90b2J1Zl91bml0dGVzdC5BZ2dy",
"ZWdhdGU6UAoGbXNnb3B0Eh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRp",
"b25zGJjqsAcgASgLMhwucHJvdG9idWZfdW5pdHRlc3QuQWdncmVnYXRlOlAK",
"CGZpZWxkb3B0Eh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucxie9LAH",
"IAEoCzIcLnByb3RvYnVmX3VuaXR0ZXN0LkFnZ3JlZ2F0ZTpOCgdlbnVtb3B0",
"EhwuZ29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zGNKCsQcgASgLMhwucHJv",
"dG9idWZfdW5pdHRlc3QuQWdncmVnYXRlOlYKCmVudW12YWxvcHQSIS5nb29n",
"bGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucxjJn7EHIAEoCzIcLnByb3Rv",
"YnVmX3VuaXR0ZXN0LkFnZ3JlZ2F0ZTpUCgpzZXJ2aWNlb3B0Eh8uZ29vZ2xl",
"LnByb3RvYnVmLlNlcnZpY2VPcHRpb25zGLnvsQcgASgLMhwucHJvdG9idWZf",
"dW5pdHRlc3QuQWdncmVnYXRlOlIKCW1ldGhvZG9wdBIeLmdvb2dsZS5wcm90",
"b2J1Zi5NZXRob2RPcHRpb25zGInpsgcgASgLMhwucHJvdG9idWZfdW5pdHRl",
"c3QuQWdncmVnYXRlQlWqAhpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvc/Do",
"wR3qrcDlJPrshTsqCGQSDkZpbGVBbm5vdGF0aW9uGhYSFE5lc3RlZEZpbGVB",
"bm5vdGF0aW9uYgZwcm90bzM="));
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
new pbr::FileDescriptor[] { global::Google.Protobuf.Reflection.DescriptorReflection.Descriptor, },
new pbr::GeneratedClrTypeInfo(new[] {typeof(global::UnitTest.Issues.TestProtos.MethodOpt1), typeof(global::UnitTest.Issues.TestProtos.AggregateEnum), }, new pb::Extension[] { UnittestCustomOptionsProto3Extensions.FileOpt1, UnittestCustomOptionsProto3Extensions.MessageOpt1, UnittestCustomOptionsProto3Extensions.FieldOpt1, UnittestCustomOptionsProto3Extensions.OneofOpt1, UnittestCustomOptionsProto3Extensions.EnumOpt1, UnittestCustomOptionsProto3Extensions.EnumValueOpt1, UnittestCustomOptionsProto3Extensions.ServiceOpt1, UnittestCustomOptionsProto3Extensions.MethodOpt1, UnittestCustomOptionsProto3Extensions.BoolOpt, UnittestCustomOptionsProto3Extensions.Int32Opt, UnittestCustomOptionsProto3Extensions.Int64Opt, UnittestCustomOptionsProto3Extensions.Uint32Opt, UnittestCustomOptionsProto3Extensions.Uint64Opt, UnittestCustomOptionsProto3Extensions.Sint32Opt, UnittestCustomOptionsProto3Extensions.Sint64Opt, UnittestCustomOptionsProto3Extensions.Fixed32Opt, UnittestCustomOptionsProto3Extensions.Fixed64Opt, UnittestCustomOptionsProto3Extensions.Sfixed32Opt, UnittestCustomOptionsProto3Extensions.Sfixed64Opt, UnittestCustomOptionsProto3Extensions.FloatOpt, UnittestCustomOptionsProto3Extensions.DoubleOpt, UnittestCustomOptionsProto3Extensions.StringOpt, UnittestCustomOptionsProto3Extensions.BytesOpt, UnittestCustomOptionsProto3Extensions.EnumOpt, UnittestCustomOptionsProto3Extensions.MessageTypeOpt, UnittestCustomOptionsProto3Extensions.ComplexOpt1, UnittestCustomOptionsProto3Extensions.ComplexOpt2, UnittestCustomOptionsProto3Extensions.ComplexOpt3, UnittestCustomOptionsProto3Extensions.Fileopt, UnittestCustomOptionsProto3Extensions.Msgopt, UnittestCustomOptionsProto3Extensions.Fieldopt, UnittestCustomOptionsProto3Extensions.Enumopt, UnittestCustomOptionsProto3Extensions.Enumvalopt, UnittestCustomOptionsProto3Extensions.Serviceopt, UnittestCustomOptionsProto3Extensions.Methodopt }, new pbr::GeneratedClrTypeInfo[] {
@ -164,7 +164,7 @@ namespace UnitTest.Issues.TestProtos {
#endregion
}
/// <summary>Holder for extension identifiers generated from the top level of unittest_custom_options_proto3.proto</summary>
/// <summary>Holder for extension identifiers generated from the top level of csharp/protos/unittest_custom_options_proto3.proto</summary>
public static partial class UnittestCustomOptionsProto3Extensions {
public static readonly pb::Extension<global::Google.Protobuf.Reflection.FileOptions, ulong> FileOpt1 =
new pb::Extension<global::Google.Protobuf.Reflection.FileOptions, ulong>(7736974, pb::FieldCodec.ForUInt64(61895792, 0UL));

@ -1,6 +1,6 @@
// <auto-generated>
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: unittest_import.proto
// source: csharp/protos/unittest_import.proto
// </auto-generated>
#pragma warning disable 1591, 0612, 3021, 8981
#region Designer generated code
@ -11,11 +11,11 @@ using pbr = global::Google.Protobuf.Reflection;
using scg = global::System.Collections.Generic;
namespace Google.Protobuf.TestProtos.Proto2 {
/// <summary>Holder for reflection information generated from unittest_import.proto</summary>
/// <summary>Holder for reflection information generated from csharp/protos/unittest_import.proto</summary>
public static partial class UnittestImportReflection {
#region Descriptor
/// <summary>File descriptor for unittest_import.proto</summary>
/// <summary>File descriptor for csharp/protos/unittest_import.proto</summary>
public static pbr::FileDescriptor Descriptor {
get { return descriptor; }
}
@ -24,13 +24,13 @@ namespace Google.Protobuf.TestProtos.Proto2 {
static UnittestImportReflection() {
byte[] descriptorData = global::System.Convert.FromBase64String(
string.Concat(
"ChV1bml0dGVzdF9pbXBvcnQucHJvdG8SH3Byb3RvYnVmX3VuaXR0ZXN0X2lt",
"cG9ydF9wcm90bzIaHHVuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucHJvdG8iGgoN",
"SW1wb3J0TWVzc2FnZRIJCgFkGAEgASgFKjwKCkltcG9ydEVudW0SDgoKSU1Q",
"T1JUX0ZPTxAHEg4KCklNUE9SVF9CQVIQCBIOCgpJTVBPUlRfQkFaEAkqMQoQ",
"SW1wb3J0RW51bUZvck1hcBILCgdVTktOT1dOEAASBwoDRk9PEAESBwoDQkFS",
"EAJCKUgB+AEBqgIhR29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuUHJvdG8y",
"UAA="));
"CiNjc2hhcnAvcHJvdG9zL3VuaXR0ZXN0X2ltcG9ydC5wcm90bxIfcHJvdG9i",
"dWZfdW5pdHRlc3RfaW1wb3J0X3Byb3RvMhoqY3NoYXJwL3Byb3Rvcy91bml0",
"dGVzdF9pbXBvcnRfcHVibGljLnByb3RvIhoKDUltcG9ydE1lc3NhZ2USCQoB",
"ZBgBIAEoBSo8CgpJbXBvcnRFbnVtEg4KCklNUE9SVF9GT08QBxIOCgpJTVBP",
"UlRfQkFSEAgSDgoKSU1QT1JUX0JBWhAJKjEKEEltcG9ydEVudW1Gb3JNYXAS",
"CwoHVU5LTk9XThAAEgcKA0ZPTxABEgcKA0JBUhACQilIAfgBAaoCIUdvb2ds",
"ZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlByb3RvMlAA"));
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
new pbr::FileDescriptor[] { global::Google.Protobuf.TestProtos.Proto2.UnittestImportPublicReflection.Descriptor, },
new pbr::GeneratedClrTypeInfo(new[] {typeof(global::Google.Protobuf.TestProtos.Proto2.ImportEnum), typeof(global::Google.Protobuf.TestProtos.Proto2.ImportEnumForMap), }, null, new pbr::GeneratedClrTypeInfo[] {

@ -1,6 +1,6 @@
// <auto-generated>
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: unittest_import_proto3.proto
// source: csharp/protos/unittest_import_proto3.proto
// </auto-generated>
#pragma warning disable 1591, 0612, 3021, 8981
#region Designer generated code
@ -11,11 +11,11 @@ using pbr = global::Google.Protobuf.Reflection;
using scg = global::System.Collections.Generic;
namespace Google.Protobuf.TestProtos {
/// <summary>Holder for reflection information generated from unittest_import_proto3.proto</summary>
/// <summary>Holder for reflection information generated from csharp/protos/unittest_import_proto3.proto</summary>
public static partial class UnittestImportProto3Reflection {
#region Descriptor
/// <summary>File descriptor for unittest_import_proto3.proto</summary>
/// <summary>File descriptor for csharp/protos/unittest_import_proto3.proto</summary>
public static pbr::FileDescriptor Descriptor {
get { return descriptor; }
}
@ -24,12 +24,13 @@ namespace Google.Protobuf.TestProtos {
static UnittestImportProto3Reflection() {
byte[] descriptorData = global::System.Convert.FromBase64String(
string.Concat(
"Chx1bml0dGVzdF9pbXBvcnRfcHJvdG8zLnByb3RvEhhwcm90b2J1Zl91bml0",
"dGVzdF9pbXBvcnQaI3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfcHJvdG8zLnBy",
"b3RvIhoKDUltcG9ydE1lc3NhZ2USCQoBZBgBIAEoBSpZCgpJbXBvcnRFbnVt",
"EhsKF0lNUE9SVF9FTlVNX1VOU1BFQ0lGSUVEEAASDgoKSU1QT1JUX0ZPTxAH",
"Eg4KCklNUE9SVF9CQVIQCBIOCgpJTVBPUlRfQkFaEAlCHaoCGkdvb2dsZS5Q",
"cm90b2J1Zi5UZXN0UHJvdG9zUABiBnByb3RvMw=="));
"Cipjc2hhcnAvcHJvdG9zL3VuaXR0ZXN0X2ltcG9ydF9wcm90bzMucHJvdG8S",
"GHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydBoxY3NoYXJwL3Byb3Rvcy91bml0",
"dGVzdF9pbXBvcnRfcHVibGljX3Byb3RvMy5wcm90byIaCg1JbXBvcnRNZXNz",
"YWdlEgkKAWQYASABKAUqWQoKSW1wb3J0RW51bRIbChdJTVBPUlRfRU5VTV9V",
"TlNQRUNJRklFRBAAEg4KCklNUE9SVF9GT08QBxIOCgpJTVBPUlRfQkFSEAgS",
"DgoKSU1QT1JUX0JBWhAJQh2qAhpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rv",
"c1AAYgZwcm90bzM="));
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
new pbr::FileDescriptor[] { global::Google.Protobuf.TestProtos.UnittestImportPublicProto3Reflection.Descriptor, },
new pbr::GeneratedClrTypeInfo(new[] {typeof(global::Google.Protobuf.TestProtos.ImportEnum), }, null, new pbr::GeneratedClrTypeInfo[] {

@ -1,6 +1,6 @@
// <auto-generated>
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: unittest_import_public.proto
// source: csharp/protos/unittest_import_public.proto
// </auto-generated>
#pragma warning disable 1591, 0612, 3021, 8981
#region Designer generated code
@ -11,11 +11,11 @@ using pbr = global::Google.Protobuf.Reflection;
using scg = global::System.Collections.Generic;
namespace Google.Protobuf.TestProtos.Proto2 {
/// <summary>Holder for reflection information generated from unittest_import_public.proto</summary>
/// <summary>Holder for reflection information generated from csharp/protos/unittest_import_public.proto</summary>
public static partial class UnittestImportPublicReflection {
#region Descriptor
/// <summary>File descriptor for unittest_import_public.proto</summary>
/// <summary>File descriptor for csharp/protos/unittest_import_public.proto</summary>
public static pbr::FileDescriptor Descriptor {
get { return descriptor; }
}
@ -24,9 +24,10 @@ namespace Google.Protobuf.TestProtos.Proto2 {
static UnittestImportPublicReflection() {
byte[] descriptorData = global::System.Convert.FromBase64String(
string.Concat(
"Chx1bml0dGVzdF9pbXBvcnRfcHVibGljLnByb3RvEh9wcm90b2J1Zl91bml0",
"dGVzdF9pbXBvcnRfcHJvdG8yIiAKE1B1YmxpY0ltcG9ydE1lc3NhZ2USCQoB",
"ZRgBIAEoBUIkqgIhR29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuUHJvdG8y"));
"Cipjc2hhcnAvcHJvdG9zL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucHJvdG8S",
"H3Byb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydF9wcm90bzIiIAoTUHVibGljSW1w",
"b3J0TWVzc2FnZRIJCgFlGAEgASgFQiSqAiFHb29nbGUuUHJvdG9idWYuVGVz",
"dFByb3Rvcy5Qcm90bzI="));
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
new pbr::FileDescriptor[] { },
new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] {

@ -1,6 +1,6 @@
// <auto-generated>
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: unittest_import_public_proto3.proto
// source: csharp/protos/unittest_import_public_proto3.proto
// </auto-generated>
#pragma warning disable 1591, 0612, 3021, 8981
#region Designer generated code
@ -11,11 +11,11 @@ using pbr = global::Google.Protobuf.Reflection;
using scg = global::System.Collections.Generic;
namespace Google.Protobuf.TestProtos {
/// <summary>Holder for reflection information generated from unittest_import_public_proto3.proto</summary>
/// <summary>Holder for reflection information generated from csharp/protos/unittest_import_public_proto3.proto</summary>
public static partial class UnittestImportPublicProto3Reflection {
#region Descriptor
/// <summary>File descriptor for unittest_import_public_proto3.proto</summary>
/// <summary>File descriptor for csharp/protos/unittest_import_public_proto3.proto</summary>
public static pbr::FileDescriptor Descriptor {
get { return descriptor; }
}
@ -24,10 +24,10 @@ namespace Google.Protobuf.TestProtos {
static UnittestImportPublicProto3Reflection() {
byte[] descriptorData = global::System.Convert.FromBase64String(
string.Concat(
"CiN1bml0dGVzdF9pbXBvcnRfcHVibGljX3Byb3RvMy5wcm90bxIYcHJvdG9i",
"dWZfdW5pdHRlc3RfaW1wb3J0IiAKE1B1YmxpY0ltcG9ydE1lc3NhZ2USCQoB",
"ZRgBIAEoBUIdqgIaR29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3NiBnByb3Rv",
"Mw=="));
"CjFjc2hhcnAvcHJvdG9zL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfcHJvdG8z",
"LnByb3RvEhhwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQiIAoTUHVibGljSW1w",
"b3J0TWVzc2FnZRIJCgFlGAEgASgFQh2qAhpHb29nbGUuUHJvdG9idWYuVGVz",
"dFByb3Rvc2IGcHJvdG8z"));
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
new pbr::FileDescriptor[] { },
new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] {

@ -1,6 +1,6 @@
// <auto-generated>
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: unittest_issue6936_a.proto
// source: csharp/protos/unittest_issue6936_a.proto
// </auto-generated>
#pragma warning disable 1591, 0612, 3021, 8981
#region Designer generated code
@ -11,11 +11,11 @@ using pbr = global::Google.Protobuf.Reflection;
using scg = global::System.Collections.Generic;
namespace UnitTest.Issues.TestProtos {
/// <summary>Holder for reflection information generated from unittest_issue6936_a.proto</summary>
/// <summary>Holder for reflection information generated from csharp/protos/unittest_issue6936_a.proto</summary>
public static partial class UnittestIssue6936AReflection {
#region Descriptor
/// <summary>File descriptor for unittest_issue6936_a.proto</summary>
/// <summary>File descriptor for csharp/protos/unittest_issue6936_a.proto</summary>
public static pbr::FileDescriptor Descriptor {
get { return descriptor; }
}
@ -24,10 +24,10 @@ namespace UnitTest.Issues.TestProtos {
static UnittestIssue6936AReflection() {
byte[] descriptorData = global::System.Convert.FromBase64String(
string.Concat(
"Chp1bml0dGVzdF9pc3N1ZTY5MzZfYS5wcm90bxIPdW5pdHRlc3RfaXNzdWVz",
"GiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bzouCgNvcHQSHy5n",
"b29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMY0IYDIAEoCUIdqgIaVW5p",
"dFRlc3QuSXNzdWVzLlRlc3RQcm90b3NiBnByb3RvMw=="));
"Cihjc2hhcnAvcHJvdG9zL3VuaXR0ZXN0X2lzc3VlNjkzNl9hLnByb3RvEg91",
"bml0dGVzdF9pc3N1ZXMaIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBy",
"b3RvOi4KA29wdBIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxjQ",
"hgMgASgJQh2qAhpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvc2IGcHJvdG8z"));
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
new pbr::FileDescriptor[] { global::Google.Protobuf.Reflection.DescriptorReflection.Descriptor, },
new pbr::GeneratedClrTypeInfo(null, new pb::Extension[] { UnittestIssue6936AExtensions.Opt }, null));
@ -35,7 +35,7 @@ namespace UnitTest.Issues.TestProtos {
#endregion
}
/// <summary>Holder for extension identifiers generated from the top level of unittest_issue6936_a.proto</summary>
/// <summary>Holder for extension identifiers generated from the top level of csharp/protos/unittest_issue6936_a.proto</summary>
public static partial class UnittestIssue6936AExtensions {
public static readonly pb::Extension<global::Google.Protobuf.Reflection.MessageOptions, string> Opt =
new pb::Extension<global::Google.Protobuf.Reflection.MessageOptions, string>(50000, pb::FieldCodec.ForString(400002, ""));

@ -1,6 +1,6 @@
// <auto-generated>
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: unittest_issue6936_b.proto
// source: csharp/protos/unittest_issue6936_b.proto
// </auto-generated>
#pragma warning disable 1591, 0612, 3021, 8981
#region Designer generated code
@ -11,11 +11,11 @@ using pbr = global::Google.Protobuf.Reflection;
using scg = global::System.Collections.Generic;
namespace UnitTest.Issues.TestProtos {
/// <summary>Holder for reflection information generated from unittest_issue6936_b.proto</summary>
/// <summary>Holder for reflection information generated from csharp/protos/unittest_issue6936_b.proto</summary>
public static partial class UnittestIssue6936BReflection {
#region Descriptor
/// <summary>File descriptor for unittest_issue6936_b.proto</summary>
/// <summary>File descriptor for csharp/protos/unittest_issue6936_b.proto</summary>
public static pbr::FileDescriptor Descriptor {
get { return descriptor; }
}
@ -24,9 +24,10 @@ namespace UnitTest.Issues.TestProtos {
static UnittestIssue6936BReflection() {
byte[] descriptorData = global::System.Convert.FromBase64String(
string.Concat(
"Chp1bml0dGVzdF9pc3N1ZTY5MzZfYi5wcm90bxIPdW5pdHRlc3RfaXNzdWVz",
"Ghp1bml0dGVzdF9pc3N1ZTY5MzZfYS5wcm90byIOCgNGb286B4K1GANmb29C",
"HaoCGlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zYgZwcm90bzM="));
"Cihjc2hhcnAvcHJvdG9zL3VuaXR0ZXN0X2lzc3VlNjkzNl9iLnByb3RvEg91",
"bml0dGVzdF9pc3N1ZXMaKGNzaGFycC9wcm90b3MvdW5pdHRlc3RfaXNzdWU2",
"OTM2X2EucHJvdG8iDgoDRm9vOgeCtRgDZm9vQh2qAhpVbml0VGVzdC5Jc3N1",
"ZXMuVGVzdFByb3Rvc2IGcHJvdG8z"));
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
new pbr::FileDescriptor[] { global::UnitTest.Issues.TestProtos.UnittestIssue6936AReflection.Descriptor, },
new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] {

@ -1,6 +1,6 @@
// <auto-generated>
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: unittest_issue6936_c.proto
// source: csharp/protos/unittest_issue6936_c.proto
// </auto-generated>
#pragma warning disable 1591, 0612, 3021, 8981
#region Designer generated code
@ -11,11 +11,11 @@ using pbr = global::Google.Protobuf.Reflection;
using scg = global::System.Collections.Generic;
namespace UnitTest.Issues.TestProtos {
/// <summary>Holder for reflection information generated from unittest_issue6936_c.proto</summary>
/// <summary>Holder for reflection information generated from csharp/protos/unittest_issue6936_c.proto</summary>
public static partial class UnittestIssue6936CReflection {
#region Descriptor
/// <summary>File descriptor for unittest_issue6936_c.proto</summary>
/// <summary>File descriptor for csharp/protos/unittest_issue6936_c.proto</summary>
public static pbr::FileDescriptor Descriptor {
get { return descriptor; }
}
@ -24,11 +24,12 @@ namespace UnitTest.Issues.TestProtos {
static UnittestIssue6936CReflection() {
byte[] descriptorData = global::System.Convert.FromBase64String(
string.Concat(
"Chp1bml0dGVzdF9pc3N1ZTY5MzZfYy5wcm90bxIPdW5pdHRlc3RfaXNzdWVz",
"Ghp1bml0dGVzdF9pc3N1ZTY5MzZfYS5wcm90bxoadW5pdHRlc3RfaXNzdWU2",
"OTM2X2IucHJvdG8iMQoDQmFyEiEKA2ZvbxgBIAEoCzIULnVuaXR0ZXN0X2lz",
"c3Vlcy5Gb286B4K1GANiYXJCHaoCGlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJv",
"dG9zYgZwcm90bzM="));
"Cihjc2hhcnAvcHJvdG9zL3VuaXR0ZXN0X2lzc3VlNjkzNl9jLnByb3RvEg91",
"bml0dGVzdF9pc3N1ZXMaKGNzaGFycC9wcm90b3MvdW5pdHRlc3RfaXNzdWU2",
"OTM2X2EucHJvdG8aKGNzaGFycC9wcm90b3MvdW5pdHRlc3RfaXNzdWU2OTM2",
"X2IucHJvdG8iMQoDQmFyEiEKA2ZvbxgBIAEoCzIULnVuaXR0ZXN0X2lzc3Vl",
"cy5Gb286B4K1GANiYXJCHaoCGlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9z",
"YgZwcm90bzM="));
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
new pbr::FileDescriptor[] { global::UnitTest.Issues.TestProtos.UnittestIssue6936AReflection.Descriptor, global::UnitTest.Issues.TestProtos.UnittestIssue6936BReflection.Descriptor, },
new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] {

@ -1,6 +1,6 @@
// <auto-generated>
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: unittest_issues.proto
// source: csharp/protos/unittest_issues.proto
// </auto-generated>
#pragma warning disable 1591, 0612, 3021, 8981
#region Designer generated code
@ -11,11 +11,11 @@ using pbr = global::Google.Protobuf.Reflection;
using scg = global::System.Collections.Generic;
namespace UnitTest.Issues.TestProtos {
/// <summary>Holder for reflection information generated from unittest_issues.proto</summary>
/// <summary>Holder for reflection information generated from csharp/protos/unittest_issues.proto</summary>
public static partial class UnittestIssuesReflection {
#region Descriptor
/// <summary>File descriptor for unittest_issues.proto</summary>
/// <summary>File descriptor for csharp/protos/unittest_issues.proto</summary>
public static pbr::FileDescriptor Descriptor {
get { return descriptor; }
}
@ -24,50 +24,50 @@ namespace UnitTest.Issues.TestProtos {
static UnittestIssuesReflection() {
byte[] descriptorData = global::System.Convert.FromBase64String(
string.Concat(
"ChV1bml0dGVzdF9pc3N1ZXMucHJvdG8SD3VuaXR0ZXN0X2lzc3VlcxocZ29v",
"Z2xlL3Byb3RvYnVmL3N0cnVjdC5wcm90byInCghJc3N1ZTMwNxobCgpOZXN0",
"ZWRPbmNlGg0KC05lc3RlZFR3aWNlIrABChNOZWdhdGl2ZUVudW1NZXNzYWdl",
"EiwKBXZhbHVlGAEgASgOMh0udW5pdHRlc3RfaXNzdWVzLk5lZ2F0aXZlRW51",
"bRIxCgZ2YWx1ZXMYAiADKA4yHS51bml0dGVzdF9pc3N1ZXMuTmVnYXRpdmVF",
"bnVtQgIQABI4Cg1wYWNrZWRfdmFsdWVzGAMgAygOMh0udW5pdHRlc3RfaXNz",
"dWVzLk5lZ2F0aXZlRW51bUICEAEiFQoPRGVwcmVjYXRlZENoaWxkOgIYASK5",
"AgoXRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2USGgoOUHJpbWl0aXZlVmFsdWUY",
"ASABKAVCAhgBEhoKDlByaW1pdGl2ZUFycmF5GAIgAygFQgIYARI6CgxNZXNz",
"YWdlVmFsdWUYAyABKAsyIC51bml0dGVzdF9pc3N1ZXMuRGVwcmVjYXRlZENo",
"aWxkQgIYARI6CgxNZXNzYWdlQXJyYXkYBCADKAsyIC51bml0dGVzdF9pc3N1",
"ZXMuRGVwcmVjYXRlZENoaWxkQgIYARI2CglFbnVtVmFsdWUYBSABKA4yHy51",
"bml0dGVzdF9pc3N1ZXMuRGVwcmVjYXRlZEVudW1CAhgBEjYKCUVudW1BcnJh",
"eRgGIAMoDjIfLnVuaXR0ZXN0X2lzc3Vlcy5EZXByZWNhdGVkRW51bUICGAEi",
"GQoJSXRlbUZpZWxkEgwKBGl0ZW0YASABKAUiRAoNUmVzZXJ2ZWROYW1lcxIN",
"CgV0eXBlcxgBIAEoBRISCgpkZXNjcmlwdG9yGAIgASgFGhAKDlNvbWVOZXN0",
"ZWRUeXBlIqABChVUZXN0SnNvbkZpZWxkT3JkZXJpbmcSEwoLcGxhaW5faW50",
"MzIYBCABKAUSEwoJbzFfc3RyaW5nGAIgASgJSAASEgoIbzFfaW50MzIYBSAB",
"KAVIABIUCgxwbGFpbl9zdHJpbmcYASABKAkSEgoIbzJfaW50MzIYBiABKAVI",
"ARITCglvMl9zdHJpbmcYAyABKAlIAUIECgJvMUIECgJvMiJLCgxUZXN0SnNv",
"bk5hbWUSDAoEbmFtZRgBIAEoCRIZCgtkZXNjcmlwdGlvbhgCIAEoCVIEZGVz",
"YxISCgRndWlkGAMgASgJUgRleGlkIn8KDE9uZW9mTWVyZ2luZxIOCgR0ZXh0",
"GAEgASgJSAASNgoGbmVzdGVkGAIgASgLMiQudW5pdHRlc3RfaXNzdWVzLk9u",
"ZW9mTWVyZ2luZy5OZXN0ZWRIABoeCgZOZXN0ZWQSCQoBeBgBIAEoBRIJCgF5",
"GAIgASgFQgcKBXZhbHVlImsKFk51bGxWYWx1ZU91dHNpZGVTdHJ1Y3QSFgoM",
"c3RyaW5nX3ZhbHVlGAEgASgJSAASMAoKbnVsbF92YWx1ZRgCIAEoDjIaLmdv",
"b2dsZS5wcm90b2J1Zi5OdWxsVmFsdWVIAEIHCgV2YWx1ZSJFChNOdWxsVmFs",
"dWVOb3RJbk9uZW9mEi4KCm51bGxfdmFsdWUYAiABKA4yGi5nb29nbGUucHJv",
"dG9idWYuTnVsbFZhbHVlImAKF01peGVkUmVndWxhckFuZE9wdGlvbmFsEhUK",
"DXJlZ3VsYXJfZmllbGQYASABKAkSGwoOb3B0aW9uYWxfZmllbGQYAiABKAlI",
"AIgBAUIRCg9fb3B0aW9uYWxfZmllbGQiOQoST25lb2ZXaXRoTm9uZUZpZWxk",
"EgsKAXgYASABKAlIABIOCgRub25lGAIgASgJSABCBgoEdGVzdCI1ChFPbmVv",
"ZldpdGhOb25lTmFtZRILCgF4GAEgASgJSAASCwoBeRgCIAEoCUgAQgYKBG5v",
"bmUikwIKGURpc2FtYmlndWF0ZUNvbW1vbk1lbWJlcnMSIwobZGlzYW1iaWd1",
"YXRlX2NvbW1vbl9tZW1iZXJzGAEgASgFEg0KBXR5cGVzGAIgASgFEhIKCmRl",
"c2NyaXB0b3IYAyABKAUSDgoGZXF1YWxzGAQgASgFEhEKCXRvX3N0cmluZxgF",
"IAEoBRIVCg1nZXRfaGFzaF9jb2RlGAYgASgFEhAKCHdyaXRlX3RvGAcgASgF",
"Eg0KBWNsb25lGAggASgFEhYKDmNhbGN1bGF0ZV9zaXplGAkgASgFEhIKCm1l",
"cmdlX2Zyb20YCiABKAUSFwoPb25fY29uc3RydWN0aW9uGAsgASgFEg4KBnBh",
"cnNlchgMIAEoBSpVCgxOZWdhdGl2ZUVudW0SFgoSTkVHQVRJVkVfRU5VTV9a",
"RVJPEAASFgoJRml2ZUJlbG93EPv//////////wESFQoITWludXNPbmUQ////",
"////////ASo2Cg5EZXByZWNhdGVkRW51bRIXCg9ERVBSRUNBVEVEX1pFUk8Q",
"ABoCCAESBwoDb25lEAEaAhgBQh2qAhpVbml0VGVzdC5Jc3N1ZXMuVGVzdFBy",
"b3Rvc2IGcHJvdG8z"));
"CiNjc2hhcnAvcHJvdG9zL3VuaXR0ZXN0X2lzc3Vlcy5wcm90bxIPdW5pdHRl",
"c3RfaXNzdWVzGhxnb29nbGUvcHJvdG9idWYvc3RydWN0LnByb3RvIicKCElz",
"c3VlMzA3GhsKCk5lc3RlZE9uY2UaDQoLTmVzdGVkVHdpY2UisAEKE05lZ2F0",
"aXZlRW51bU1lc3NhZ2USLAoFdmFsdWUYASABKA4yHS51bml0dGVzdF9pc3N1",
"ZXMuTmVnYXRpdmVFbnVtEjEKBnZhbHVlcxgCIAMoDjIdLnVuaXR0ZXN0X2lz",
"c3Vlcy5OZWdhdGl2ZUVudW1CAhAAEjgKDXBhY2tlZF92YWx1ZXMYAyADKA4y",
"HS51bml0dGVzdF9pc3N1ZXMuTmVnYXRpdmVFbnVtQgIQASIVCg9EZXByZWNh",
"dGVkQ2hpbGQ6AhgBIrkCChdEZXByZWNhdGVkRmllbGRzTWVzc2FnZRIaCg5Q",
"cmltaXRpdmVWYWx1ZRgBIAEoBUICGAESGgoOUHJpbWl0aXZlQXJyYXkYAiAD",
"KAVCAhgBEjoKDE1lc3NhZ2VWYWx1ZRgDIAEoCzIgLnVuaXR0ZXN0X2lzc3Vl",
"cy5EZXByZWNhdGVkQ2hpbGRCAhgBEjoKDE1lc3NhZ2VBcnJheRgEIAMoCzIg",
"LnVuaXR0ZXN0X2lzc3Vlcy5EZXByZWNhdGVkQ2hpbGRCAhgBEjYKCUVudW1W",
"YWx1ZRgFIAEoDjIfLnVuaXR0ZXN0X2lzc3Vlcy5EZXByZWNhdGVkRW51bUIC",
"GAESNgoJRW51bUFycmF5GAYgAygOMh8udW5pdHRlc3RfaXNzdWVzLkRlcHJl",
"Y2F0ZWRFbnVtQgIYASIZCglJdGVtRmllbGQSDAoEaXRlbRgBIAEoBSJECg1S",
"ZXNlcnZlZE5hbWVzEg0KBXR5cGVzGAEgASgFEhIKCmRlc2NyaXB0b3IYAiAB",
"KAUaEAoOU29tZU5lc3RlZFR5cGUioAEKFVRlc3RKc29uRmllbGRPcmRlcmlu",
"ZxITCgtwbGFpbl9pbnQzMhgEIAEoBRITCglvMV9zdHJpbmcYAiABKAlIABIS",
"CghvMV9pbnQzMhgFIAEoBUgAEhQKDHBsYWluX3N0cmluZxgBIAEoCRISCghv",
"Ml9pbnQzMhgGIAEoBUgBEhMKCW8yX3N0cmluZxgDIAEoCUgBQgQKAm8xQgQK",
"Am8yIksKDFRlc3RKc29uTmFtZRIMCgRuYW1lGAEgASgJEhkKC2Rlc2NyaXB0",
"aW9uGAIgASgJUgRkZXNjEhIKBGd1aWQYAyABKAlSBGV4aWQifwoMT25lb2ZN",
"ZXJnaW5nEg4KBHRleHQYASABKAlIABI2CgZuZXN0ZWQYAiABKAsyJC51bml0",
"dGVzdF9pc3N1ZXMuT25lb2ZNZXJnaW5nLk5lc3RlZEgAGh4KBk5lc3RlZBIJ",
"CgF4GAEgASgFEgkKAXkYAiABKAVCBwoFdmFsdWUiawoWTnVsbFZhbHVlT3V0",
"c2lkZVN0cnVjdBIWCgxzdHJpbmdfdmFsdWUYASABKAlIABIwCgpudWxsX3Zh",
"bHVlGAIgASgOMhouZ29vZ2xlLnByb3RvYnVmLk51bGxWYWx1ZUgAQgcKBXZh",
"bHVlIkUKE051bGxWYWx1ZU5vdEluT25lb2YSLgoKbnVsbF92YWx1ZRgCIAEo",
"DjIaLmdvb2dsZS5wcm90b2J1Zi5OdWxsVmFsdWUiYAoXTWl4ZWRSZWd1bGFy",
"QW5kT3B0aW9uYWwSFQoNcmVndWxhcl9maWVsZBgBIAEoCRIbCg5vcHRpb25h",
"bF9maWVsZBgCIAEoCUgAiAEBQhEKD19vcHRpb25hbF9maWVsZCI5ChJPbmVv",
"ZldpdGhOb25lRmllbGQSCwoBeBgBIAEoCUgAEg4KBG5vbmUYAiABKAlIAEIG",
"CgR0ZXN0IjUKEU9uZW9mV2l0aE5vbmVOYW1lEgsKAXgYASABKAlIABILCgF5",
"GAIgASgJSABCBgoEbm9uZSKTAgoZRGlzYW1iaWd1YXRlQ29tbW9uTWVtYmVy",
"cxIjChtkaXNhbWJpZ3VhdGVfY29tbW9uX21lbWJlcnMYASABKAUSDQoFdHlw",
"ZXMYAiABKAUSEgoKZGVzY3JpcHRvchgDIAEoBRIOCgZlcXVhbHMYBCABKAUS",
"EQoJdG9fc3RyaW5nGAUgASgFEhUKDWdldF9oYXNoX2NvZGUYBiABKAUSEAoI",
"d3JpdGVfdG8YByABKAUSDQoFY2xvbmUYCCABKAUSFgoOY2FsY3VsYXRlX3Np",
"emUYCSABKAUSEgoKbWVyZ2VfZnJvbRgKIAEoBRIXCg9vbl9jb25zdHJ1Y3Rp",
"b24YCyABKAUSDgoGcGFyc2VyGAwgASgFKlUKDE5lZ2F0aXZlRW51bRIWChJO",
"RUdBVElWRV9FTlVNX1pFUk8QABIWCglGaXZlQmVsb3cQ+///////////ARIV",
"CghNaW51c09uZRD///////////8BKjYKDkRlcHJlY2F0ZWRFbnVtEhcKD0RF",
"UFJFQ0FURURfWkVSTxAAGgIIARIHCgNvbmUQARoCGAFCHaoCGlVuaXRUZXN0",
"Lklzc3Vlcy5UZXN0UHJvdG9zYgZwcm90bzM="));
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
new pbr::FileDescriptor[] { global::Google.Protobuf.WellKnownTypes.StructReflection.Descriptor, },
new pbr::GeneratedClrTypeInfo(new[] {typeof(global::UnitTest.Issues.TestProtos.NegativeEnum), typeof(global::UnitTest.Issues.TestProtos.DeprecatedEnum), }, null, new pbr::GeneratedClrTypeInfo[] {

@ -1,6 +1,6 @@
// <auto-generated>
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: unittest_proto3.proto
// source: csharp/protos/unittest_proto3.proto
// </auto-generated>
#pragma warning disable 1591, 0612, 3021, 8981
#region Designer generated code
@ -11,11 +11,11 @@ using pbr = global::Google.Protobuf.Reflection;
using scg = global::System.Collections.Generic;
namespace Google.Protobuf.TestProtos {
/// <summary>Holder for reflection information generated from unittest_proto3.proto</summary>
/// <summary>Holder for reflection information generated from csharp/protos/unittest_proto3.proto</summary>
public static partial class UnittestProto3Reflection {
#region Descriptor
/// <summary>File descriptor for unittest_proto3.proto</summary>
/// <summary>File descriptor for csharp/protos/unittest_proto3.proto</summary>
public static pbr::FileDescriptor Descriptor {
get { return descriptor; }
}
@ -24,138 +24,139 @@ namespace Google.Protobuf.TestProtos {
static UnittestProto3Reflection() {
byte[] descriptorData = global::System.Convert.FromBase64String(
string.Concat(
"ChV1bml0dGVzdF9wcm90bzMucHJvdG8SEnByb3RvYnVmX3VuaXR0ZXN0Mxoc",
"dW5pdHRlc3RfaW1wb3J0X3Byb3RvMy5wcm90byL5DwoMVGVzdEFsbFR5cGVz",
"EhQKDHNpbmdsZV9pbnQzMhgBIAEoBRIUCgxzaW5nbGVfaW50NjQYAiABKAMS",
"FQoNc2luZ2xlX3VpbnQzMhgDIAEoDRIVCg1zaW5nbGVfdWludDY0GAQgASgE",
"EhUKDXNpbmdsZV9zaW50MzIYBSABKBESFQoNc2luZ2xlX3NpbnQ2NBgGIAEo",
"EhIWCg5zaW5nbGVfZml4ZWQzMhgHIAEoBxIWCg5zaW5nbGVfZml4ZWQ2NBgI",
"IAEoBhIXCg9zaW5nbGVfc2ZpeGVkMzIYCSABKA8SFwoPc2luZ2xlX3NmaXhl",
"ZDY0GAogASgQEhQKDHNpbmdsZV9mbG9hdBgLIAEoAhIVCg1zaW5nbGVfZG91",
"YmxlGAwgASgBEhMKC3NpbmdsZV9ib29sGA0gASgIEhUKDXNpbmdsZV9zdHJp",
"bmcYDiABKAkSFAoMc2luZ2xlX2J5dGVzGA8gASgMEk0KFXNpbmdsZV9uZXN0",
"ZWRfbWVzc2FnZRgSIAEoCzIuLnByb3RvYnVmX3VuaXR0ZXN0My5UZXN0QWxs",
"VHlwZXMuTmVzdGVkTWVzc2FnZRJCChZzaW5nbGVfZm9yZWlnbl9tZXNzYWdl",
"GBMgASgLMiIucHJvdG9idWZfdW5pdHRlc3QzLkZvcmVpZ25NZXNzYWdlEkYK",
"FXNpbmdsZV9pbXBvcnRfbWVzc2FnZRgUIAEoCzInLnByb3RvYnVmX3VuaXR0",
"ZXN0X2ltcG9ydC5JbXBvcnRNZXNzYWdlEkcKEnNpbmdsZV9uZXN0ZWRfZW51",
"bRgVIAEoDjIrLnByb3RvYnVmX3VuaXR0ZXN0My5UZXN0QWxsVHlwZXMuTmVz",
"dGVkRW51bRI8ChNzaW5nbGVfZm9yZWlnbl9lbnVtGBYgASgOMh8ucHJvdG9i",
"dWZfdW5pdHRlc3QzLkZvcmVpZ25FbnVtEkAKEnNpbmdsZV9pbXBvcnRfZW51",
"bRgXIAEoDjIkLnByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRFbnVt",
"ElMKHHNpbmdsZV9wdWJsaWNfaW1wb3J0X21lc3NhZ2UYGiABKAsyLS5wcm90",
"b2J1Zl91bml0dGVzdF9pbXBvcnQuUHVibGljSW1wb3J0TWVzc2FnZRIWCg5y",
"ZXBlYXRlZF9pbnQzMhgfIAMoBRIWCg5yZXBlYXRlZF9pbnQ2NBggIAMoAxIX",
"Cg9yZXBlYXRlZF91aW50MzIYISADKA0SFwoPcmVwZWF0ZWRfdWludDY0GCIg",
"AygEEhcKD3JlcGVhdGVkX3NpbnQzMhgjIAMoERIXCg9yZXBlYXRlZF9zaW50",
"NjQYJCADKBISGAoQcmVwZWF0ZWRfZml4ZWQzMhglIAMoBxIYChByZXBlYXRl",
"ZF9maXhlZDY0GCYgAygGEhkKEXJlcGVhdGVkX3NmaXhlZDMyGCcgAygPEhkK",
"EXJlcGVhdGVkX3NmaXhlZDY0GCggAygQEhYKDnJlcGVhdGVkX2Zsb2F0GCkg",
"AygCEhcKD3JlcGVhdGVkX2RvdWJsZRgqIAMoARIVCg1yZXBlYXRlZF9ib29s",
"GCsgAygIEhcKD3JlcGVhdGVkX3N0cmluZxgsIAMoCRIWCg5yZXBlYXRlZF9i",
"eXRlcxgtIAMoDBJPChdyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZRgwIAMoCzIu",
"LnByb3RvYnVmX3VuaXR0ZXN0My5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2Fn",
"ZRJEChhyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UYMSADKAsyIi5wcm90b2J1",
"Zl91bml0dGVzdDMuRm9yZWlnbk1lc3NhZ2USSAoXcmVwZWF0ZWRfaW1wb3J0",
"X21lc3NhZ2UYMiADKAsyJy5wcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1w",
"b3J0TWVzc2FnZRJJChRyZXBlYXRlZF9uZXN0ZWRfZW51bRgzIAMoDjIrLnBy",
"b3RvYnVmX3VuaXR0ZXN0My5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bRI+ChVy",
"ZXBlYXRlZF9mb3JlaWduX2VudW0YNCADKA4yHy5wcm90b2J1Zl91bml0dGVz",
"dDMuRm9yZWlnbkVudW0SQgoUcmVwZWF0ZWRfaW1wb3J0X2VudW0YNSADKA4y",
"JC5wcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0RW51bRJVCh5yZXBl",
"YXRlZF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UYNiADKAsyLS5wcm90b2J1Zl91",
"bml0dGVzdF9pbXBvcnQuUHVibGljSW1wb3J0TWVzc2FnZRIWCgxvbmVvZl91",
"aW50MzIYbyABKA1IABJOChRvbmVvZl9uZXN0ZWRfbWVzc2FnZRhwIAEoCzIu",
"LnByb3RvYnVmX3VuaXR0ZXN0My5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2Fn",
"ZUgAEhYKDG9uZW9mX3N0cmluZxhxIAEoCUgAEhUKC29uZW9mX2J5dGVzGHIg",
"ASgMSAAaGwoNTmVzdGVkTWVzc2FnZRIKCgJiYhgBIAEoBSJWCgpOZXN0ZWRF",
"bnVtEhsKF05FU1RFRF9FTlVNX1VOU1BFQ0lGSUVEEAASBwoDRk9PEAESBwoD",
"QkFSEAISBwoDQkFaEAMSEAoDTkVHEP///////////wFCDQoLb25lb2ZfZmll",
"bGQivgEKEk5lc3RlZFRlc3RBbGxUeXBlcxI1CgVjaGlsZBgBIAEoCzImLnBy",
"b3RvYnVmX3VuaXR0ZXN0My5OZXN0ZWRUZXN0QWxsVHlwZXMSMQoHcGF5bG9h",
"ZBgCIAEoCzIgLnByb3RvYnVmX3VuaXR0ZXN0My5UZXN0QWxsVHlwZXMSPgoO",
"cmVwZWF0ZWRfY2hpbGQYAyADKAsyJi5wcm90b2J1Zl91bml0dGVzdDMuTmVz",
"dGVkVGVzdEFsbFR5cGVzIjQKFFRlc3REZXByZWNhdGVkRmllbGRzEhwKEGRl",
"cHJlY2F0ZWRfaW50MzIYASABKAVCAhgBIhsKDkZvcmVpZ25NZXNzYWdlEgkK",
"AWMYASABKAUiMAoSVGVzdFJlc2VydmVkRmllbGRzSgQIAhADSgQIDxAQSgQI",
"CRAMUgNiYXJSA2JheiJbChFUZXN0Rm9yZWlnbk5lc3RlZBJGCg5mb3JlaWdu",
"X25lc3RlZBgBIAEoCzIuLnByb3RvYnVmX3VuaXR0ZXN0My5UZXN0QWxsVHlw",
"ZXMuTmVzdGVkTWVzc2FnZSI0ChhUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIS",
"CQoBYRgBIAEoBRINCgJiYhj///9/IAEoBSJWChRUZXN0UmVjdXJzaXZlTWVz",
"c2FnZRIzCgFhGAEgASgLMigucHJvdG9idWZfdW5pdHRlc3QzLlRlc3RSZWN1",
"cnNpdmVNZXNzYWdlEgkKAWkYAiABKAUiTAoUVGVzdE11dHVhbFJlY3Vyc2lv",
"bkESNAoCYmIYASABKAsyKC5wcm90b2J1Zl91bml0dGVzdDMuVGVzdE11dHVh",
"bFJlY3Vyc2lvbkIiYwoUVGVzdE11dHVhbFJlY3Vyc2lvbkISMwoBYRgBIAEo",
"CzIoLnByb3RvYnVmX3VuaXR0ZXN0My5UZXN0TXV0dWFsUmVjdXJzaW9uQRIW",
"Cg5vcHRpb25hbF9pbnQzMhgCIAEoBSJNChJUZXN0RW51bUFsbG93QWxpYXMS",
"NwoFdmFsdWUYASABKA4yKC5wcm90b2J1Zl91bml0dGVzdDMuVGVzdEVudW1X",
"aXRoRHVwVmFsdWUi7wIKF1Rlc3RDYW1lbENhc2VGaWVsZE5hbWVzEhYKDlBy",
"aW1pdGl2ZUZpZWxkGAEgASgFEhMKC1N0cmluZ0ZpZWxkGAIgASgJEjIKCUVu",
"dW1GaWVsZBgDIAEoDjIfLnByb3RvYnVmX3VuaXR0ZXN0My5Gb3JlaWduRW51",
"bRI4CgxNZXNzYWdlRmllbGQYBCABKAsyIi5wcm90b2J1Zl91bml0dGVzdDMu",
"Rm9yZWlnbk1lc3NhZ2USHgoWUmVwZWF0ZWRQcmltaXRpdmVGaWVsZBgHIAMo",
"BRIbChNSZXBlYXRlZFN0cmluZ0ZpZWxkGAggAygJEjoKEVJlcGVhdGVkRW51",
"bUZpZWxkGAkgAygOMh8ucHJvdG9idWZfdW5pdHRlc3QzLkZvcmVpZ25FbnVt",
"EkAKFFJlcGVhdGVkTWVzc2FnZUZpZWxkGAogAygLMiIucHJvdG9idWZfdW5p",
"dHRlc3QzLkZvcmVpZ25NZXNzYWdlIsgBChJUZXN0RmllbGRPcmRlcmluZ3MS",
"EQoJbXlfc3RyaW5nGAsgASgJEg4KBm15X2ludBgBIAEoAxIQCghteV9mbG9h",
"dBhlIAEoAhJUChVzaW5nbGVfbmVzdGVkX21lc3NhZ2UYyAEgASgLMjQucHJv",
"dG9idWZfdW5pdHRlc3QzLlRlc3RGaWVsZE9yZGVyaW5ncy5OZXN0ZWRNZXNz",
"YWdlGicKDU5lc3RlZE1lc3NhZ2USCgoCb28YAiABKAMSCgoCYmIYASABKAUi",
"TAoRU3BhcnNlRW51bU1lc3NhZ2USNwoLc3BhcnNlX2VudW0YASABKA4yIi5w",
"cm90b2J1Zl91bml0dGVzdDMuVGVzdFNwYXJzZUVudW0iGQoJT25lU3RyaW5n",
"EgwKBGRhdGEYASABKAkiGgoKTW9yZVN0cmluZxIMCgRkYXRhGAEgAygJIhgK",
"CE9uZUJ5dGVzEgwKBGRhdGEYASABKAwiGQoJTW9yZUJ5dGVzEgwKBGRhdGEY",
"ASABKAwiHAoMSW50MzJNZXNzYWdlEgwKBGRhdGEYASABKAUiHQoNVWludDMy",
"TWVzc2FnZRIMCgRkYXRhGAEgASgNIhwKDEludDY0TWVzc2FnZRIMCgRkYXRh",
"GAEgASgDIh0KDVVpbnQ2NE1lc3NhZ2USDAoEZGF0YRgBIAEoBCIbCgtCb29s",
"TWVzc2FnZRIMCgRkYXRhGAEgASgIInQKCVRlc3RPbmVvZhIRCgdmb29faW50",
"GAEgASgFSAASFAoKZm9vX3N0cmluZxgCIAEoCUgAEjcKC2Zvb19tZXNzYWdl",
"GAMgASgLMiAucHJvdG9idWZfdW5pdHRlc3QzLlRlc3RBbGxUeXBlc0gAQgUK",
"A2ZvbyKrAwoPVGVzdFBhY2tlZFR5cGVzEhgKDHBhY2tlZF9pbnQzMhhaIAMo",
"BUICEAESGAoMcGFja2VkX2ludDY0GFsgAygDQgIQARIZCg1wYWNrZWRfdWlu",
"dDMyGFwgAygNQgIQARIZCg1wYWNrZWRfdWludDY0GF0gAygEQgIQARIZCg1w",
"YWNrZWRfc2ludDMyGF4gAygRQgIQARIZCg1wYWNrZWRfc2ludDY0GF8gAygS",
"QgIQARIaCg5wYWNrZWRfZml4ZWQzMhhgIAMoB0ICEAESGgoOcGFja2VkX2Zp",
"eGVkNjQYYSADKAZCAhABEhsKD3BhY2tlZF9zZml4ZWQzMhhiIAMoD0ICEAES",
"GwoPcGFja2VkX3NmaXhlZDY0GGMgAygQQgIQARIYCgxwYWNrZWRfZmxvYXQY",
"ZCADKAJCAhABEhkKDXBhY2tlZF9kb3VibGUYZSADKAFCAhABEhcKC3BhY2tl",
"ZF9ib29sGGYgAygIQgIQARI4CgtwYWNrZWRfZW51bRhnIAMoDjIfLnByb3Rv",
"YnVmX3VuaXR0ZXN0My5Gb3JlaWduRW51bUICEAEiyQMKEVRlc3RVbnBhY2tl",
"ZFR5cGVzEhoKDnVucGFja2VkX2ludDMyGFogAygFQgIQABIaCg51bnBhY2tl",
"ZF9pbnQ2NBhbIAMoA0ICEAASGwoPdW5wYWNrZWRfdWludDMyGFwgAygNQgIQ",
"ABIbCg91bnBhY2tlZF91aW50NjQYXSADKARCAhAAEhsKD3VucGFja2VkX3Np",
"bnQzMhheIAMoEUICEAASGwoPdW5wYWNrZWRfc2ludDY0GF8gAygSQgIQABIc",
"ChB1bnBhY2tlZF9maXhlZDMyGGAgAygHQgIQABIcChB1bnBhY2tlZF9maXhl",
"ZDY0GGEgAygGQgIQABIdChF1bnBhY2tlZF9zZml4ZWQzMhhiIAMoD0ICEAAS",
"HQoRdW5wYWNrZWRfc2ZpeGVkNjQYYyADKBBCAhAAEhoKDnVucGFja2VkX2Zs",
"b2F0GGQgAygCQgIQABIbCg91bnBhY2tlZF9kb3VibGUYZSADKAFCAhAAEhkK",
"DXVucGFja2VkX2Jvb2wYZiADKAhCAhAAEjoKDXVucGFja2VkX2VudW0YZyAD",
"KA4yHy5wcm90b2J1Zl91bml0dGVzdDMuRm9yZWlnbkVudW1CAhAAIsABCiNU",
"ZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcxIYChByZXBlYXRl",
"ZF9maXhlZDMyGAwgAygHEhYKDnJlcGVhdGVkX2ludDMyGA0gAygFEhkKEHJl",
"cGVhdGVkX2ZpeGVkNjQY/g8gAygGEhcKDnJlcGVhdGVkX2ludDY0GP8PIAMo",
"AxIYCg5yZXBlYXRlZF9mbG9hdBj+/w8gAygCEhkKD3JlcGVhdGVkX3VpbnQ2",
"NBj//w8gAygEIigKG1Rlc3RDb21tZW50SW5qZWN0aW9uTWVzc2FnZRIJCgFh",
"GAEgASgJIgwKCkZvb1JlcXVlc3QiDQoLRm9vUmVzcG9uc2UiEgoQRm9vQ2xp",
"ZW50TWVzc2FnZSISChBGb29TZXJ2ZXJNZXNzYWdlIgwKCkJhclJlcXVlc3Qi",
"DQoLQmFyUmVzcG9uc2UiEgoQVGVzdEVtcHR5TWVzc2FnZSJwCg5Db21tZW50",
"TWVzc2FnZRIMCgR0ZXh0GAEgASgJGisKFE5lc3RlZENvbW1lbnRNZXNzYWdl",
"EhMKC25lc3RlZF90ZXh0GAEgASgJIiMKEU5lc3RlZENvbW1lbnRFbnVtEg4K",
"ClpFUk9fVkFMVUUQACpZCgtGb3JlaWduRW51bRIXChNGT1JFSUdOX1VOU1BF",
"Q0lGSUVEEAASDwoLRk9SRUlHTl9GT08QBBIPCgtGT1JFSUdOX0JBUhAFEg8K",
"C0ZPUkVJR05fQkFaEAYqdQoUVGVzdEVudW1XaXRoRHVwVmFsdWUSKAokVEVT",
"VF9FTlVNX1dJVEhfRFVQX1ZBTFVFX1VOU1BFQ0lGSUVEEAASCAoERk9PMRAB",
"EggKBEJBUjEQAhIHCgNCQVoQAxIICgRGT08yEAESCAoEQkFSMhACGgIQASqd",
"AQoOVGVzdFNwYXJzZUVudW0SIAocVEVTVF9TUEFSU0VfRU5VTV9VTlNQRUNJ",
"RklFRBAAEgwKCFNQQVJTRV9BEHsSDgoIU1BBUlNFX0IQpucDEg8KCFNQQVJT",
"RV9DELKxgAYSFQoIU1BBUlNFX0QQ8f//////////ARIVCghTUEFSU0VfRRC0",
"3vz///////8BEgwKCFNQQVJTRV9HEAIqHQoLQ29tbWVudEVudW0SDgoKWkVS",
"T19WQUxVRRAAMp0BCgtUZXN0U2VydmljZRJGCgNGb28SHi5wcm90b2J1Zl91",
"bml0dGVzdDMuRm9vUmVxdWVzdBofLnByb3RvYnVmX3VuaXR0ZXN0My5Gb29S",
"ZXNwb25zZRJGCgNCYXISHi5wcm90b2J1Zl91bml0dGVzdDMuQmFyUmVxdWVz",
"dBofLnByb3RvYnVmX3VuaXR0ZXN0My5CYXJSZXNwb25zZUIsQg1Vbml0dGVz",
"dFByb3RvqgIaR29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3NiBnByb3RvMw=="));
"CiNjc2hhcnAvcHJvdG9zL3VuaXR0ZXN0X3Byb3RvMy5wcm90bxIScHJvdG9i",
"dWZfdW5pdHRlc3QzGipjc2hhcnAvcHJvdG9zL3VuaXR0ZXN0X2ltcG9ydF9w",
"cm90bzMucHJvdG8i+Q8KDFRlc3RBbGxUeXBlcxIUCgxzaW5nbGVfaW50MzIY",
"ASABKAUSFAoMc2luZ2xlX2ludDY0GAIgASgDEhUKDXNpbmdsZV91aW50MzIY",
"AyABKA0SFQoNc2luZ2xlX3VpbnQ2NBgEIAEoBBIVCg1zaW5nbGVfc2ludDMy",
"GAUgASgREhUKDXNpbmdsZV9zaW50NjQYBiABKBISFgoOc2luZ2xlX2ZpeGVk",
"MzIYByABKAcSFgoOc2luZ2xlX2ZpeGVkNjQYCCABKAYSFwoPc2luZ2xlX3Nm",
"aXhlZDMyGAkgASgPEhcKD3NpbmdsZV9zZml4ZWQ2NBgKIAEoEBIUCgxzaW5n",
"bGVfZmxvYXQYCyABKAISFQoNc2luZ2xlX2RvdWJsZRgMIAEoARITCgtzaW5n",
"bGVfYm9vbBgNIAEoCBIVCg1zaW5nbGVfc3RyaW5nGA4gASgJEhQKDHNpbmds",
"ZV9ieXRlcxgPIAEoDBJNChVzaW5nbGVfbmVzdGVkX21lc3NhZ2UYEiABKAsy",
"Li5wcm90b2J1Zl91bml0dGVzdDMuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3Nh",
"Z2USQgoWc2luZ2xlX2ZvcmVpZ25fbWVzc2FnZRgTIAEoCzIiLnByb3RvYnVm",
"X3VuaXR0ZXN0My5Gb3JlaWduTWVzc2FnZRJGChVzaW5nbGVfaW1wb3J0X21l",
"c3NhZ2UYFCABKAsyJy5wcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0",
"TWVzc2FnZRJHChJzaW5nbGVfbmVzdGVkX2VudW0YFSABKA4yKy5wcm90b2J1",
"Zl91bml0dGVzdDMuVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0SPAoTc2luZ2xl",
"X2ZvcmVpZ25fZW51bRgWIAEoDjIfLnByb3RvYnVmX3VuaXR0ZXN0My5Gb3Jl",
"aWduRW51bRJAChJzaW5nbGVfaW1wb3J0X2VudW0YFyABKA4yJC5wcm90b2J1",
"Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0RW51bRJTChxzaW5nbGVfcHVibGlj",
"X2ltcG9ydF9tZXNzYWdlGBogASgLMi0ucHJvdG9idWZfdW5pdHRlc3RfaW1w",
"b3J0LlB1YmxpY0ltcG9ydE1lc3NhZ2USFgoOcmVwZWF0ZWRfaW50MzIYHyAD",
"KAUSFgoOcmVwZWF0ZWRfaW50NjQYICADKAMSFwoPcmVwZWF0ZWRfdWludDMy",
"GCEgAygNEhcKD3JlcGVhdGVkX3VpbnQ2NBgiIAMoBBIXCg9yZXBlYXRlZF9z",
"aW50MzIYIyADKBESFwoPcmVwZWF0ZWRfc2ludDY0GCQgAygSEhgKEHJlcGVh",
"dGVkX2ZpeGVkMzIYJSADKAcSGAoQcmVwZWF0ZWRfZml4ZWQ2NBgmIAMoBhIZ",
"ChFyZXBlYXRlZF9zZml4ZWQzMhgnIAMoDxIZChFyZXBlYXRlZF9zZml4ZWQ2",
"NBgoIAMoEBIWCg5yZXBlYXRlZF9mbG9hdBgpIAMoAhIXCg9yZXBlYXRlZF9k",
"b3VibGUYKiADKAESFQoNcmVwZWF0ZWRfYm9vbBgrIAMoCBIXCg9yZXBlYXRl",
"ZF9zdHJpbmcYLCADKAkSFgoOcmVwZWF0ZWRfYnl0ZXMYLSADKAwSTwoXcmVw",
"ZWF0ZWRfbmVzdGVkX21lc3NhZ2UYMCADKAsyLi5wcm90b2J1Zl91bml0dGVz",
"dDMuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2USRAoYcmVwZWF0ZWRfZm9y",
"ZWlnbl9tZXNzYWdlGDEgAygLMiIucHJvdG9idWZfdW5pdHRlc3QzLkZvcmVp",
"Z25NZXNzYWdlEkgKF3JlcGVhdGVkX2ltcG9ydF9tZXNzYWdlGDIgAygLMicu",
"cHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydE1lc3NhZ2USSQoUcmVw",
"ZWF0ZWRfbmVzdGVkX2VudW0YMyADKA4yKy5wcm90b2J1Zl91bml0dGVzdDMu",
"VGVzdEFsbFR5cGVzLk5lc3RlZEVudW0SPgoVcmVwZWF0ZWRfZm9yZWlnbl9l",
"bnVtGDQgAygOMh8ucHJvdG9idWZfdW5pdHRlc3QzLkZvcmVpZ25FbnVtEkIK",
"FHJlcGVhdGVkX2ltcG9ydF9lbnVtGDUgAygOMiQucHJvdG9idWZfdW5pdHRl",
"c3RfaW1wb3J0LkltcG9ydEVudW0SVQoecmVwZWF0ZWRfcHVibGljX2ltcG9y",
"dF9tZXNzYWdlGDYgAygLMi0ucHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LlB1",
"YmxpY0ltcG9ydE1lc3NhZ2USFgoMb25lb2ZfdWludDMyGG8gASgNSAASTgoU",
"b25lb2ZfbmVzdGVkX21lc3NhZ2UYcCABKAsyLi5wcm90b2J1Zl91bml0dGVz",
"dDMuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2VIABIWCgxvbmVvZl9zdHJp",
"bmcYcSABKAlIABIVCgtvbmVvZl9ieXRlcxhyIAEoDEgAGhsKDU5lc3RlZE1l",
"c3NhZ2USCgoCYmIYASABKAUiVgoKTmVzdGVkRW51bRIbChdORVNURURfRU5V",
"TV9VTlNQRUNJRklFRBAAEgcKA0ZPTxABEgcKA0JBUhACEgcKA0JBWhADEhAK",
"A05FRxD///////////8BQg0KC29uZW9mX2ZpZWxkIr4BChJOZXN0ZWRUZXN0",
"QWxsVHlwZXMSNQoFY2hpbGQYASABKAsyJi5wcm90b2J1Zl91bml0dGVzdDMu",
"TmVzdGVkVGVzdEFsbFR5cGVzEjEKB3BheWxvYWQYAiABKAsyIC5wcm90b2J1",
"Zl91bml0dGVzdDMuVGVzdEFsbFR5cGVzEj4KDnJlcGVhdGVkX2NoaWxkGAMg",
"AygLMiYucHJvdG9idWZfdW5pdHRlc3QzLk5lc3RlZFRlc3RBbGxUeXBlcyI0",
"ChRUZXN0RGVwcmVjYXRlZEZpZWxkcxIcChBkZXByZWNhdGVkX2ludDMyGAEg",
"ASgFQgIYASIbCg5Gb3JlaWduTWVzc2FnZRIJCgFjGAEgASgFIjAKElRlc3RS",
"ZXNlcnZlZEZpZWxkc0oECAIQA0oECA8QEEoECAkQDFIDYmFyUgNiYXoiWwoR",
"VGVzdEZvcmVpZ25OZXN0ZWQSRgoOZm9yZWlnbl9uZXN0ZWQYASABKAsyLi5w",
"cm90b2J1Zl91bml0dGVzdDMuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2Ui",
"NAoYVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyEgkKAWEYASABKAUSDQoCYmIY",
"////fyABKAUiVgoUVGVzdFJlY3Vyc2l2ZU1lc3NhZ2USMwoBYRgBIAEoCzIo",
"LnByb3RvYnVmX3VuaXR0ZXN0My5UZXN0UmVjdXJzaXZlTWVzc2FnZRIJCgFp",
"GAIgASgFIkwKFFRlc3RNdXR1YWxSZWN1cnNpb25BEjQKAmJiGAEgASgLMigu",
"cHJvdG9idWZfdW5pdHRlc3QzLlRlc3RNdXR1YWxSZWN1cnNpb25CImMKFFRl",
"c3RNdXR1YWxSZWN1cnNpb25CEjMKAWEYASABKAsyKC5wcm90b2J1Zl91bml0",
"dGVzdDMuVGVzdE11dHVhbFJlY3Vyc2lvbkESFgoOb3B0aW9uYWxfaW50MzIY",
"AiABKAUiTQoSVGVzdEVudW1BbGxvd0FsaWFzEjcKBXZhbHVlGAEgASgOMigu",
"cHJvdG9idWZfdW5pdHRlc3QzLlRlc3RFbnVtV2l0aER1cFZhbHVlIu8CChdU",
"ZXN0Q2FtZWxDYXNlRmllbGROYW1lcxIWCg5QcmltaXRpdmVGaWVsZBgBIAEo",
"BRITCgtTdHJpbmdGaWVsZBgCIAEoCRIyCglFbnVtRmllbGQYAyABKA4yHy5w",
"cm90b2J1Zl91bml0dGVzdDMuRm9yZWlnbkVudW0SOAoMTWVzc2FnZUZpZWxk",
"GAQgASgLMiIucHJvdG9idWZfdW5pdHRlc3QzLkZvcmVpZ25NZXNzYWdlEh4K",
"FlJlcGVhdGVkUHJpbWl0aXZlRmllbGQYByADKAUSGwoTUmVwZWF0ZWRTdHJp",
"bmdGaWVsZBgIIAMoCRI6ChFSZXBlYXRlZEVudW1GaWVsZBgJIAMoDjIfLnBy",
"b3RvYnVmX3VuaXR0ZXN0My5Gb3JlaWduRW51bRJAChRSZXBlYXRlZE1lc3Nh",
"Z2VGaWVsZBgKIAMoCzIiLnByb3RvYnVmX3VuaXR0ZXN0My5Gb3JlaWduTWVz",
"c2FnZSLIAQoSVGVzdEZpZWxkT3JkZXJpbmdzEhEKCW15X3N0cmluZxgLIAEo",
"CRIOCgZteV9pbnQYASABKAMSEAoIbXlfZmxvYXQYZSABKAISVAoVc2luZ2xl",
"X25lc3RlZF9tZXNzYWdlGMgBIAEoCzI0LnByb3RvYnVmX3VuaXR0ZXN0My5U",
"ZXN0RmllbGRPcmRlcmluZ3MuTmVzdGVkTWVzc2FnZRonCg1OZXN0ZWRNZXNz",
"YWdlEgoKAm9vGAIgASgDEgoKAmJiGAEgASgFIkwKEVNwYXJzZUVudW1NZXNz",
"YWdlEjcKC3NwYXJzZV9lbnVtGAEgASgOMiIucHJvdG9idWZfdW5pdHRlc3Qz",
"LlRlc3RTcGFyc2VFbnVtIhkKCU9uZVN0cmluZxIMCgRkYXRhGAEgASgJIhoK",
"Ck1vcmVTdHJpbmcSDAoEZGF0YRgBIAMoCSIYCghPbmVCeXRlcxIMCgRkYXRh",
"GAEgASgMIhkKCU1vcmVCeXRlcxIMCgRkYXRhGAEgASgMIhwKDEludDMyTWVz",
"c2FnZRIMCgRkYXRhGAEgASgFIh0KDVVpbnQzMk1lc3NhZ2USDAoEZGF0YRgB",
"IAEoDSIcCgxJbnQ2NE1lc3NhZ2USDAoEZGF0YRgBIAEoAyIdCg1VaW50NjRN",
"ZXNzYWdlEgwKBGRhdGEYASABKAQiGwoLQm9vbE1lc3NhZ2USDAoEZGF0YRgB",
"IAEoCCJ0CglUZXN0T25lb2YSEQoHZm9vX2ludBgBIAEoBUgAEhQKCmZvb19z",
"dHJpbmcYAiABKAlIABI3Cgtmb29fbWVzc2FnZRgDIAEoCzIgLnByb3RvYnVm",
"X3VuaXR0ZXN0My5UZXN0QWxsVHlwZXNIAEIFCgNmb28iqwMKD1Rlc3RQYWNr",
"ZWRUeXBlcxIYCgxwYWNrZWRfaW50MzIYWiADKAVCAhABEhgKDHBhY2tlZF9p",
"bnQ2NBhbIAMoA0ICEAESGQoNcGFja2VkX3VpbnQzMhhcIAMoDUICEAESGQoN",
"cGFja2VkX3VpbnQ2NBhdIAMoBEICEAESGQoNcGFja2VkX3NpbnQzMhheIAMo",
"EUICEAESGQoNcGFja2VkX3NpbnQ2NBhfIAMoEkICEAESGgoOcGFja2VkX2Zp",
"eGVkMzIYYCADKAdCAhABEhoKDnBhY2tlZF9maXhlZDY0GGEgAygGQgIQARIb",
"Cg9wYWNrZWRfc2ZpeGVkMzIYYiADKA9CAhABEhsKD3BhY2tlZF9zZml4ZWQ2",
"NBhjIAMoEEICEAESGAoMcGFja2VkX2Zsb2F0GGQgAygCQgIQARIZCg1wYWNr",
"ZWRfZG91YmxlGGUgAygBQgIQARIXCgtwYWNrZWRfYm9vbBhmIAMoCEICEAES",
"OAoLcGFja2VkX2VudW0YZyADKA4yHy5wcm90b2J1Zl91bml0dGVzdDMuRm9y",
"ZWlnbkVudW1CAhABIskDChFUZXN0VW5wYWNrZWRUeXBlcxIaCg51bnBhY2tl",
"ZF9pbnQzMhhaIAMoBUICEAASGgoOdW5wYWNrZWRfaW50NjQYWyADKANCAhAA",
"EhsKD3VucGFja2VkX3VpbnQzMhhcIAMoDUICEAASGwoPdW5wYWNrZWRfdWlu",
"dDY0GF0gAygEQgIQABIbCg91bnBhY2tlZF9zaW50MzIYXiADKBFCAhAAEhsK",
"D3VucGFja2VkX3NpbnQ2NBhfIAMoEkICEAASHAoQdW5wYWNrZWRfZml4ZWQz",
"MhhgIAMoB0ICEAASHAoQdW5wYWNrZWRfZml4ZWQ2NBhhIAMoBkICEAASHQoR",
"dW5wYWNrZWRfc2ZpeGVkMzIYYiADKA9CAhAAEh0KEXVucGFja2VkX3NmaXhl",
"ZDY0GGMgAygQQgIQABIaCg51bnBhY2tlZF9mbG9hdBhkIAMoAkICEAASGwoP",
"dW5wYWNrZWRfZG91YmxlGGUgAygBQgIQABIZCg11bnBhY2tlZF9ib29sGGYg",
"AygIQgIQABI6Cg11bnBhY2tlZF9lbnVtGGcgAygOMh8ucHJvdG9idWZfdW5p",
"dHRlc3QzLkZvcmVpZ25FbnVtQgIQACLAAQojVGVzdFJlcGVhdGVkU2NhbGFy",
"RGlmZmVyZW50VGFnU2l6ZXMSGAoQcmVwZWF0ZWRfZml4ZWQzMhgMIAMoBxIW",
"Cg5yZXBlYXRlZF9pbnQzMhgNIAMoBRIZChByZXBlYXRlZF9maXhlZDY0GP4P",
"IAMoBhIXCg5yZXBlYXRlZF9pbnQ2NBj/DyADKAMSGAoOcmVwZWF0ZWRfZmxv",
"YXQY/v8PIAMoAhIZCg9yZXBlYXRlZF91aW50NjQY//8PIAMoBCIoChtUZXN0",
"Q29tbWVudEluamVjdGlvbk1lc3NhZ2USCQoBYRgBIAEoCSIMCgpGb29SZXF1",
"ZXN0Ig0KC0Zvb1Jlc3BvbnNlIhIKEEZvb0NsaWVudE1lc3NhZ2UiEgoQRm9v",
"U2VydmVyTWVzc2FnZSIMCgpCYXJSZXF1ZXN0Ig0KC0JhclJlc3BvbnNlIhIK",
"EFRlc3RFbXB0eU1lc3NhZ2UicAoOQ29tbWVudE1lc3NhZ2USDAoEdGV4dBgB",
"IAEoCRorChROZXN0ZWRDb21tZW50TWVzc2FnZRITCgtuZXN0ZWRfdGV4dBgB",
"IAEoCSIjChFOZXN0ZWRDb21tZW50RW51bRIOCgpaRVJPX1ZBTFVFEAAqWQoL",
"Rm9yZWlnbkVudW0SFwoTRk9SRUlHTl9VTlNQRUNJRklFRBAAEg8KC0ZPUkVJ",
"R05fRk9PEAQSDwoLRk9SRUlHTl9CQVIQBRIPCgtGT1JFSUdOX0JBWhAGKnUK",
"FFRlc3RFbnVtV2l0aER1cFZhbHVlEigKJFRFU1RfRU5VTV9XSVRIX0RVUF9W",
"QUxVRV9VTlNQRUNJRklFRBAAEggKBEZPTzEQARIICgRCQVIxEAISBwoDQkFa",
"EAMSCAoERk9PMhABEggKBEJBUjIQAhoCEAEqnQEKDlRlc3RTcGFyc2VFbnVt",
"EiAKHFRFU1RfU1BBUlNFX0VOVU1fVU5TUEVDSUZJRUQQABIMCghTUEFSU0Vf",
"QRB7Eg4KCFNQQVJTRV9CEKbnAxIPCghTUEFSU0VfQxCysYAGEhUKCFNQQVJT",
"RV9EEPH//////////wESFQoIU1BBUlNFX0UQtN78////////ARIMCghTUEFS",
"U0VfRxACKh0KC0NvbW1lbnRFbnVtEg4KClpFUk9fVkFMVUUQADKdAQoLVGVz",
"dFNlcnZpY2USRgoDRm9vEh4ucHJvdG9idWZfdW5pdHRlc3QzLkZvb1JlcXVl",
"c3QaHy5wcm90b2J1Zl91bml0dGVzdDMuRm9vUmVzcG9uc2USRgoDQmFyEh4u",
"cHJvdG9idWZfdW5pdHRlc3QzLkJhclJlcXVlc3QaHy5wcm90b2J1Zl91bml0",
"dGVzdDMuQmFyUmVzcG9uc2VCLEINVW5pdHRlc3RQcm90b6oCGkdvb2dsZS5Q",
"cm90b2J1Zi5UZXN0UHJvdG9zYgZwcm90bzM="));
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
new pbr::FileDescriptor[] { global::Google.Protobuf.TestProtos.UnittestImportProto3Reflection.Descriptor, },
new pbr::GeneratedClrTypeInfo(new[] {typeof(global::Google.Protobuf.TestProtos.ForeignEnum), typeof(global::Google.Protobuf.TestProtos.TestEnumWithDupValue), typeof(global::Google.Protobuf.TestProtos.TestSparseEnum), typeof(global::Google.Protobuf.TestProtos.CommentEnum), }, null, new pbr::GeneratedClrTypeInfo[] {

@ -65,8 +65,9 @@ namespace ProtobufUnittest {
"bzNPcHRpb25hbEV4dGVuc2lvbnMyPAoPZXh0X25vX29wdGlvbmFsEh8uZ29v",
"Z2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zGIjN2akBIAEoBTJBChFleHRf",
"d2l0aF9vcHRpb25hbBIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9u",
"cxiJzdmpASABKAWIAQE6DMDozM0KCMjozM0KEEIlCiFjb20uZ29vZ2xlLnBy",
"b3RvYnVmLnRlc3RpbmcucHJvdG9QAWIGcHJvdG8z"));
"cxiJzdmpASABKAWIAQE6DMDozM0KCMjozM0KEEI4CiFjb20uZ29vZ2xlLnBy",
"b3RvYnVmLnRlc3RpbmcucHJvdG9QAaoCEFByb3RvYnVmVW5pdHRlc3RiBnBy",
"b3RvMw=="));
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
new pbr::FileDescriptor[] { global::Google.Protobuf.Reflection.DescriptorReflection.Descriptor, },
new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] {

@ -1,6 +1,6 @@
// <auto-generated>
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: unittest_selfreferential_options.proto
// source: csharp/protos/unittest_selfreferential_options.proto
// </auto-generated>
#pragma warning disable 1591, 0612, 3021, 8981
#region Designer generated code
@ -11,11 +11,11 @@ using pbr = global::Google.Protobuf.Reflection;
using scg = global::System.Collections.Generic;
namespace UnitTest.Issues.TestProtos.SelfreferentialOptions {
/// <summary>Holder for reflection information generated from unittest_selfreferential_options.proto</summary>
/// <summary>Holder for reflection information generated from csharp/protos/unittest_selfreferential_options.proto</summary>
public static partial class UnittestSelfreferentialOptionsReflection {
#region Descriptor
/// <summary>File descriptor for unittest_selfreferential_options.proto</summary>
/// <summary>File descriptor for csharp/protos/unittest_selfreferential_options.proto</summary>
public static pbr::FileDescriptor Descriptor {
get { return descriptor; }
}
@ -24,20 +24,21 @@ namespace UnitTest.Issues.TestProtos.SelfreferentialOptions {
static UnittestSelfreferentialOptionsReflection() {
byte[] descriptorData = global::System.Convert.FromBase64String(
string.Concat(
"CiZ1bml0dGVzdF9zZWxmcmVmZXJlbnRpYWxfb3B0aW9ucy5wcm90bxIpcHJv",
"dG9idWZfdW5pdHRlc3Rfc2VsZnJlZmVyZW50aWFsX29wdGlvbnMaIGdvb2ds",
"ZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvIkwKCkZvb09wdGlvbnMSHgoH",
"aW50X29wdBgBIAEoBUINyj4KCAHAPgLKPgIIAxITCgNmb28YAiABKAVCBso+",
"AxDSCSoJCOgHEICAgIACOjkKC2Jhcl9vcHRpb25zEh0uZ29vZ2xlLnByb3Rv",
"YnVmLkZpZWxkT3B0aW9ucxjoByABKAVCBMA+0gk6agoLZm9vX29wdGlvbnMS",
"HS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zGOkHIAEoCzI1LnByb3Rv",
"YnVmX3VuaXR0ZXN0X3NlbGZyZWZlcmVudGlhbF9vcHRpb25zLkZvb09wdGlv",
"bnM6SwoLZm9vX2ludF9vcHQSNS5wcm90b2J1Zl91bml0dGVzdF9zZWxmcmVm",
"ZXJlbnRpYWxfb3B0aW9ucy5Gb29PcHRpb25zGOgHIAEoBTqCAQoLZm9vX2Zv",
"b19vcHQSNS5wcm90b2J1Zl91bml0dGVzdF9zZWxmcmVmZXJlbnRpYWxfb3B0",
"aW9ucy5Gb29PcHRpb25zGOkHIAEoCzI1LnByb3RvYnVmX3VuaXR0ZXN0X3Nl",
"bGZyZWZlcmVudGlhbF9vcHRpb25zLkZvb09wdGlvbnNCNKoCMVVuaXRUZXN0",
"Lklzc3Vlcy5UZXN0UHJvdG9zLlNlbGZyZWZlcmVudGlhbE9wdGlvbnM="));
"CjRjc2hhcnAvcHJvdG9zL3VuaXR0ZXN0X3NlbGZyZWZlcmVudGlhbF9vcHRp",
"b25zLnByb3RvEilwcm90b2J1Zl91bml0dGVzdF9zZWxmcmVmZXJlbnRpYWxf",
"b3B0aW9ucxogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8iTAoK",
"Rm9vT3B0aW9ucxIeCgdpbnRfb3B0GAEgASgFQg3KPgoIAcA+Aso+AggDEhMK",
"A2ZvbxgCIAEoBUIGyj4DENIJKgkI6AcQgICAgAI6OQoLYmFyX29wdGlvbnMS",
"HS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zGOgHIAEoBUIEwD7SCTpq",
"Cgtmb29fb3B0aW9ucxIdLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMY",
"6QcgASgLMjUucHJvdG9idWZfdW5pdHRlc3Rfc2VsZnJlZmVyZW50aWFsX29w",
"dGlvbnMuRm9vT3B0aW9uczpLCgtmb29faW50X29wdBI1LnByb3RvYnVmX3Vu",
"aXR0ZXN0X3NlbGZyZWZlcmVudGlhbF9vcHRpb25zLkZvb09wdGlvbnMY6Acg",
"ASgFOoIBCgtmb29fZm9vX29wdBI1LnByb3RvYnVmX3VuaXR0ZXN0X3NlbGZy",
"ZWZlcmVudGlhbF9vcHRpb25zLkZvb09wdGlvbnMY6QcgASgLMjUucHJvdG9i",
"dWZfdW5pdHRlc3Rfc2VsZnJlZmVyZW50aWFsX29wdGlvbnMuRm9vT3B0aW9u",
"c0I0qgIxVW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuU2VsZnJlZmVyZW50",
"aWFsT3B0aW9ucw=="));
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
new pbr::FileDescriptor[] { global::Google.Protobuf.Reflection.DescriptorReflection.Descriptor, },
new pbr::GeneratedClrTypeInfo(null, new pb::Extension[] { UnittestSelfreferentialOptionsExtensions.BarOptions, UnittestSelfreferentialOptionsExtensions.FooOptions, UnittestSelfreferentialOptionsExtensions.FooIntOpt, UnittestSelfreferentialOptionsExtensions.FooFooOpt }, new pbr::GeneratedClrTypeInfo[] {
@ -47,7 +48,7 @@ namespace UnitTest.Issues.TestProtos.SelfreferentialOptions {
#endregion
}
/// <summary>Holder for extension identifiers generated from the top level of unittest_selfreferential_options.proto</summary>
/// <summary>Holder for extension identifiers generated from the top level of csharp/protos/unittest_selfreferential_options.proto</summary>
public static partial class UnittestSelfreferentialOptionsExtensions {
/// <summary>
/// Custom field option used on the definition of that field option.

@ -135,8 +135,9 @@ namespace Google.Protobuf
var ex = Assert.Throws<InvalidOperationException>(() => message.GetExtension(wrongTypedExtension));
var expectedMessage = "The stored extension value has a type of 'Google.Protobuf.TestProtos.Proto2.TestAllTypes+Types+NestedMessage, Google.Protobuf.Test.TestProtos, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604'. " +
"This a different from the requested type of 'Google.Protobuf.TestProtos.Proto2.TestAllTypes, Google.Protobuf.Test.TestProtos, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604'.";
var fullAssemblyName = typeof(TestAllTypes).Assembly.FullName;
var expectedMessage = $"The stored extension value has a type of 'Google.Protobuf.TestProtos.Proto2.TestAllTypes+Types+NestedMessage, {fullAssemblyName}'. " +
$"This a different from the requested type of 'Google.Protobuf.TestProtos.Proto2.TestAllTypes, {fullAssemblyName}'.";
Assert.AreEqual(expectedMessage, ex.Message);
}
@ -165,8 +166,9 @@ namespace Google.Protobuf
var ex = Assert.Throws<InvalidOperationException>(() => message.GetExtension(wrongTypedExtension));
var expectedMessage = "The stored extension value has a type of 'Google.Protobuf.TestProtos.Proto2.TestAllTypes+Types+NestedMessage, Google.Protobuf.Test.TestProtos, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604'. " +
"This a different from the requested type of 'Google.Protobuf.TestProtos.Proto2.TestAllTypes, Google.Protobuf.Test.TestProtos, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604'.";
var fullAssemblyName = typeof(TestAllTypes).Assembly.FullName;
var expectedMessage = $"The stored extension value has a type of 'Google.Protobuf.TestProtos.Proto2.TestAllTypes+Types+NestedMessage, {fullAssemblyName}'. " +
$"This a different from the requested type of 'Google.Protobuf.TestProtos.Proto2.TestAllTypes, {fullAssemblyName}'.";
Assert.AreEqual(expectedMessage, ex.Message);
}

@ -1,4 +1,4 @@
#region Copyright notice and license
#region Copyright notice and license
// Protocol Buffers - Google's data interchange format
// Copyright 2018 Google Inc. All rights reserved.
// https://developers.google.com/protocol-buffers/
@ -86,10 +86,10 @@ namespace Google.Protobuf.Test.Reflection
{
var message = unitTestProto3Descriptor.FindTypeByName<MessageDescriptor>("CommentMessage");
Assert.NotNull(message.Declaration);
Assert.AreEqual(389, message.Declaration.StartLine);
Assert.AreEqual(386, message.Declaration.StartLine);
Assert.AreEqual(1, message.Declaration.StartColumn);
Assert.AreEqual(404, message.Declaration.EndLine);
Assert.AreEqual(401, message.Declaration.EndLine);
Assert.AreEqual(2, message.Declaration.EndColumn);
}
@ -169,7 +169,7 @@ namespace Google.Protobuf.Test.Reflection
}
var byteStrings = descriptorSet.File.Select(f => f.ToByteString()).ToList();
var descriptors = FileDescriptor.BuildFromByteStrings(byteStrings);
return descriptors.Single(d => d.Name == "unittest_proto3.proto");
return descriptors.Single(d => d.Name == "csharp/protos/unittest_proto3.proto");
}
}
}

@ -91,11 +91,11 @@ namespace Google.Protobuf.Reflection
private void TestFileDescriptor(FileDescriptor file, FileDescriptor importedFile, FileDescriptor importedPublicFile)
{
Assert.AreEqual("unittest_proto3.proto", file.Name);
Assert.AreEqual("csharp/protos/unittest_proto3.proto", file.Name);
Assert.AreEqual("protobuf_unittest3", file.Package);
Assert.AreEqual("UnittestProto", file.Proto.Options.JavaOuterClassname);
Assert.AreEqual("unittest_proto3.proto", file.Proto.Name);
Assert.AreEqual("csharp/protos/unittest_proto3.proto", file.Proto.Name);
// unittest_proto3.proto doesn't have any public imports, but unittest_import_proto3.proto does.
Assert.AreEqual(0, file.PublicDependencies.Count);
@ -126,16 +126,6 @@ namespace Google.Protobuf.Reflection
TestDescriptorToProto(file.ToProto, file.Proto);
}
[Test]
public void FileDescriptor_NonRootPath()
{
// unittest_proto3.proto used to be in google/protobuf. Now it's in the C#-specific location,
// let's test something that's still in a directory.
FileDescriptor file = UnittestWellKnownTypesReflection.Descriptor;
Assert.AreEqual("google/protobuf/unittest_well_known_types.proto", file.Name);
Assert.AreEqual("protobuf_unittest", file.Package);
}
[Test]
public void FileDescriptor_BuildFromByteStrings_MissingDependency()
{
@ -407,6 +397,11 @@ namespace Google.Protobuf.Reflection
[Test]
public void DescriptorImportingExtensionsFromOldCodeGen()
{
if (MethodOptions.Descriptor.FullName != "google.protobuf.MethodOptions")
{
Assert.Ignore("Embedded descriptor for OldExtensions expects google.protobuf reflection package.");
}
// The extension collection includes a null extension. There's not a lot we can do about that
// in itself, as the old generator didn't provide us the extension information.
var extensions = TestProtos.OldGenerator.OldExtensions2Reflection.Descriptor.Extensions;
@ -445,10 +440,12 @@ namespace Google.Protobuf.Reflection
}
// Expect no oneof in the original proto3 unit test file to be synthetic.
// (This excludes oneofs with "lazy" in the name, due to internal differences.)
foreach (var descriptor in ProtobufTestMessages.Proto3.TestMessagesProto3Reflection.Descriptor.MessageTypes)
{
Assert.AreEqual(descriptor.Oneofs.Count, descriptor.RealOneofCount);
foreach (var oneof in descriptor.Oneofs)
var nonLazyOneofs = descriptor.Oneofs.Where(d => !d.Name.Contains("lazy")).ToList();
Assert.AreEqual(nonLazyOneofs.Count, descriptor.RealOneofCount);
foreach (var oneof in nonLazyOneofs)
{
Assert.False(oneof.IsSynthetic);
}

@ -160,9 +160,11 @@ Inactive:
There are miscellaneous other things you may find useful as a Protocol Buffers developer.
* [Bazel Build](https://bazel.build)
* [rules_closure](https://github.com/bazelbuild/rules_closure) `js-closure`
* [rules_closure](https://github.com/bazelbuild/rules_closure)
`js-closure`
* [rules_go](https://github.com/bazelbuild/rules_go) `go`
* [rules_protobuf](https://github.com/pubref/rules_protobuf) `java` `c++` `c#` `go` `js-closure` `js-node` `python` `ruby`
* [rules_protobuf](https://github.com/pubref/rules_protobuf) `java` `c++`
`c#` `go` `js-closure` `js-node` `python` `ruby`
* [NetBeans IDE plugin](https://code.google.com/p/protobuf-netbeans-plugin/)
* [Wireshark/Ethereal packet sniffer plugin](https://code.google.com/p/protobuf-wireshark/)
* [Alternate encodings (JSON, XML, HTML) for Java protobufs](https://code.google.com/p/protobuf-java-format/)
@ -175,7 +177,10 @@ There are miscellaneous other things you may find useful as a Protocol Buffers d
* [Eclipse editor for protobuf (from Google)](https://code.google.com/p/protobuf-dt/)
* [C++ Builder compatible protobuf](https://github.com/saadware/protobuf-cppbuilder)
* Maven Protobuf Compiler Plugin
* By xolstice.org ([Documentation](https://www.xolstice.org/protobuf-maven-plugin/)) ([Source](https://github.com/xolstice/protobuf-maven-plugin/)) [![Maven Central](https://img.shields.io/maven-central/v/org.xolstice.maven.plugins/protobuf-maven-plugin.svg)](https://repo1.maven.org/maven2/org/xolstice/maven/plugins/protobuf-maven-plugin/)
* By xolstice.org
([Documentation](https://www.xolstice.org/protobuf-maven-plugin/))
([Source](https://github.com/xolstice/protobuf-maven-plugin/))
[![Maven Central](https://img.shields.io/maven-central/v/org.xolstice.maven.plugins/protobuf-maven-plugin.svg)](https://repo1.maven.org/maven2/org/xolstice/maven/plugins/protobuf-maven-plugin/)
* https://code.google.com/p/maven-protoc-plugin/
* https://github.com/os72/protoc-jar-maven-plugin
* [Documentation generator plugin (Markdown/HTML/DocBook/...)](https://github.com/pseudomuto/protoc-gen-doc)
@ -188,17 +193,24 @@ There are miscellaneous other things you may find useful as a Protocol Buffers d
* [Python scripts to convert between Protocol Buffers and JSON](https://github.com/NextTuesday/py-pb-converters)
* [Visual Studio Language Service support for Protocol Buffers](http://visualstudiogallery.msdn.microsoft.com/4bc0f38c-b058-4e05-ae38-155e053c19c5)
* [Visual Studio Code Support for Protocol Buffers](https://marketplace.visualstudio.com/items?itemName=zxh404.vscode-proto3)
* [C++ library for serialization/de-serialization between Protocol Buffers and JSON.](https://github.com/yinqiwen/pbjson)
* [ProtoBuf with Java EE7 Expression Language 3.0; pure Java ProtoBuf Parser and Builder.](https://github.com/protobufel/protobuf-el)
* [C++ library for serialization/de-serialization between Protocol Buffers and
JSON.](https://github.com/yinqiwen/pbjson)
* [ProtoBuf with Java EE7 Expression Language 3.0; pure Java ProtoBuf Parser
and Builder.](https://github.com/protobufel/protobuf-el)
* [Notepad++ Syntax Highlighting for .proto files](https://github.com/chai2010/notepadplus-protobuf)
* [Linter for .proto files](https://github.com/ckaznocha/protoc-gen-lint)
* [Protocol Buffers Dynamic Schema - create protobuf schemas programmatically (Java)](https://github.com/os72/protobuf-dynamic)
* [Protocol Buffers Dynamic Schema - create protobuf schemas programmatically
(Java)](https://github.com/os72/protobuf-dynamic)
* [Make protoc plugins in NodeJS](https://github.com/konsumer/node-protoc-plugin)
* [ProfaneDB - A Protocol Buffers database](https://profanedb.gitlab.io)
* [Protocol Buffer property-based testing utility and example message generator (Python / Hypothesis)](https://github.com/CurataEng/hypothesis-protobuf)
* [Protolock - CLI utility to prevent backward-incompatible changes to .proto files](https://github.com/nilslice/protolock)
* [Protocol Buffer property-based testing utility and example message
generator (Python /
Hypothesis)](https://github.com/CurataEng/hypothesis-protobuf)
* [Protolock - CLI utility to prevent backward-incompatible changes to .proto
files](https://github.com/nilslice/protolock)
* [Optional GRPC - GRPC for testable microservices (Python)](https://github.com/mattpaletta/optional-grpc.git)
* [Protobuf Parser - Yet another Go package which parses a Protocol Buffer file (proto2+proto3)](https://github.com/yoheimuta/go-protoparser)
* [Protobuf Parser - Yet another Go package which parses a Protocol Buffer
file (proto2+proto3)](https://github.com/yoheimuta/go-protoparser)
* [Protolint - A tool to enforce Protocol Buffer style and conventions.](https://github.com/yoheimuta/protolint)
* [vscode-protolint: A protobuf linter for visual studio code](https://github.com/plexsystems/vscode-protolint)
* [intellij-protolint: A protobuf linter for JetBrains IDEs](https://github.com/yoheimuta/intellij-protolint)
@ -206,3 +218,6 @@ There are miscellaneous other things you may find useful as a Protocol Buffers d
* [super-linter: Protocol Buffer lint as GitHub Action](https://github.com/github/super-linter)
* [protoc-gen-fieldmask - A plugin to generate static type fieldmask paths](https://github.com/idodod/protoc-gen-fieldmask)
* [protoc-gen-bq-schema - A protoc plugin to generate BigQuery schema files](https://github.com/GoogleCloudPlatform/protoc-gen-bq-schema)
* [protobuf-decoder-explainer - Web page which decodes and explains pasted
binary Protocol
Buffers](https://github.com/jamesdbrock/protobuf-decoder-explainer)

@ -62,7 +62,7 @@ do
PROTOC=$BOOTSTRAP_PROTOC
BOOTSTRAP_PROTOC=""
else
bazel build $@ //:protoc
${BAZEL:-bazel} ${BAZEL_STARTUP_FLAGS:-} build $@ //:protoc ${BAZEL_FLAGS:-}
if test $? -ne 0; then
echo "Failed to build protoc."
exit 1

@ -13,16 +13,16 @@
<organization>
<name>Google LLC</name>
<url>https://cloud.google.com</url>
<url>https://protobuf.dev</url>
</organization>
<developers>
<developer>
<id>haon</id>
<name>Hao Nguyen</name>
<email>haon@google.com</email>
<id>protobuf</id>
<name>Protocol Buffers</name>
<email>protobuf@googlegroups.com</email>
<organization>Google</organization>
<organizationUrl>https://cloud.google.com</organizationUrl>
<organizationUrl>https://protobuf.dev</organizationUrl>
<timezone>America/Los_Angeles</timezone>
</developer>
</developers>

@ -1772,6 +1772,21 @@ public final class Descriptors {
return file;
}
/**
* Determines if the given enum is closed.
*
* <p>Closed enum means that it:
*
* <ul>
* <li>Has a fixed set of named values. *
* <li>Encountering values not in this set causes them to be treated as unknown fields.
* <li>The first value (i.e., the default) may be nonzero.
* </ul>
*/
public boolean isClosed() {
return getFile().getSyntax() != Syntax.PROTO3;
}
/** If this is a nested type, get the outer descriptor, otherwise null. */
public Descriptor getContainingType() {
return containingType;

@ -731,7 +731,7 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
if (field.isRepeated()) {
// The underlying list object is still modifiable at this point.
// Make sure not to expose the modifiable list to the caller.
return Collections.unmodifiableList((List) object);
return Collections.unmodifiableList((List<?>) object);
} else {
return object;
}
@ -940,7 +940,7 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
protected MapField internalGetMapField(int fieldNumber) {
// Note that we can't use descriptor names here because this method will
// be called when descriptor is being initialized.
throw new RuntimeException("No map fields found in " + getClass().getName());
throw new IllegalArgumentException("No map fields found in " + getClass().getName());
}
/** Like {@link #internalGetMapField} but return a mutable version. */
@ -956,7 +956,7 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
// Extensions-related stuff
/** Extends {@link MessageOrBuilder} with extension-related functions. */
public interface ExtendableMessageOrBuilder<MessageT extends ExtendableMessage>
public interface ExtendableMessageOrBuilder<MessageT extends ExtendableMessage<MessageT>>
extends MessageOrBuilder {
// Re-define for return type covariance.
@Override
@ -1058,7 +1058,7 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
*
* <p>See also {@link ExtendableBuilder}.
*/
public abstract static class ExtendableMessage<MessageT extends ExtendableMessage>
public abstract static class ExtendableMessage<MessageT extends ExtendableMessage<MessageT>>
extends GeneratedMessageV3 implements ExtendableMessageOrBuilder<MessageT> {
private static final long serialVersionUID = 1L;
@ -1088,7 +1088,6 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
/** Check if a singular extension is present. */
@Override
@SuppressWarnings("unchecked")
public final <T> boolean hasExtension(final ExtensionLite<MessageT, T> extensionLite) {
Extension<MessageT, T> extension = checkNotLite(extensionLite);
@ -1098,7 +1097,6 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
/** Get the number of elements in a repeated extension. */
@Override
@SuppressWarnings("unchecked")
public final <T> int getExtensionCount(final ExtensionLite<MessageT, List<T>> extensionLite) {
Extension<MessageT, List<T>> extension = checkNotLite(extensionLite);
@ -1455,7 +1453,7 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
*/
@SuppressWarnings("unchecked")
public abstract static class ExtendableBuilder<
MessageT extends ExtendableMessage,
MessageT extends ExtendableMessage<MessageT>,
BuilderT extends ExtendableBuilder<MessageT, BuilderT>>
extends Builder<BuilderT> implements ExtendableMessageOrBuilder<MessageT> {
@ -1591,8 +1589,8 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
}
/** Clear an extension. */
public final BuilderT clearExtension(final ExtensionLite<MessageT, ?> extensionLite) {
Extension<MessageT, ?> extension = checkNotLite(extensionLite);
public final <T> BuilderT clearExtension(final ExtensionLite<MessageT, T> extensionLite) {
Extension<MessageT, T> extension = checkNotLite(extensionLite);
verifyExtensionContainingType(extension);
ensureExtensionsIsMutable();
@ -1725,16 +1723,16 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
* <p>TODO(b/258340024): handled by ExtensionLite version
*/
public final <T> BuilderT clearExtension(
final Extension<MessageT, ?> extension) {
return clearExtension((ExtensionLite<MessageT, ?>) extension);
final Extension<MessageT, T> extension) {
return clearExtension((ExtensionLite<MessageT, T>) extension);
}
/**
* Clear an extension.
* Clears an extension.
* <p>TODO(b/258340024): handled by ExtensionLite version
*/
public <T> BuilderT clearExtension(
final GeneratedExtension<MessageT, ?> extension) {
return clearExtension((ExtensionLite<MessageT, ?>) extension);
final GeneratedExtension<MessageT, T> extension) {
return clearExtension((ExtensionLite<MessageT, T>) extension);
}
/** Called by subclasses to check if all extensions are initialized. */
@ -1943,7 +1941,7 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
}
}
protected final void mergeExtensionFields(final ExtendableMessage other) {
protected final void mergeExtensionFields(final ExtendableMessage<?> other) {
if (other.extensions != null) {
ensureExtensionsIsMutable();
extensions.mergeFrom(other.extensions);
@ -1985,13 +1983,12 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
// =================================================================
/** Calls Class.getMethod and throws a RuntimeException if it fails. */
@SuppressWarnings("unchecked")
private static Method getMethodOrDie(
final Class clazz, final String name, final Class... params) {
final Class<?> clazz, final String name, final Class<?>... params) {
try {
return clazz.getMethod(name, params);
} catch (NoSuchMethodException e) {
throw new RuntimeException(
throw new IllegalStateException(
"Generated message class \"" + clazz.getName() + "\" missing method \"" + name + "\".",
e);
}
@ -2004,8 +2001,8 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
try {
return method.invoke(object, params);
} catch (IllegalAccessException e) {
throw new RuntimeException(
"Couldn't use Java reflection to implement protocol message " + "reflection.", e);
throw new IllegalStateException(
"Couldn't use Java reflection to implement protocol message reflection.", e);
} catch (InvocationTargetException e) {
final Throwable cause = e.getCause();
if (cause instanceof RuntimeException) {
@ -2013,7 +2010,7 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
} else if (cause instanceof Error) {
throw (Error) cause;
} else {
throw new RuntimeException(
throw new IllegalStateException(
"Unexpected exception thrown by generated accessor method.", cause);
}
}
@ -2032,7 +2029,7 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
protected MapField internalGetMapField(int fieldNumber) {
// Note that we can't use descriptor names here because this method will
// be called when descriptor is being initialized.
throw new RuntimeException("No map fields found in " + getClass().getName());
throw new IllegalArgumentException("No map fields found in " + getClass().getName());
}
/**
@ -2055,7 +2052,7 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
final Descriptor descriptor,
final String[] camelCaseNames,
final Class<? extends GeneratedMessageV3> messageClass,
final Class<? extends Builder> builderClass) {
final Class<? extends Builder<?>> builderClass) {
this(descriptor, camelCaseNames);
ensureFieldAccessorsInitialized(messageClass, builderClass);
}
@ -2080,7 +2077,7 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
* @return this
*/
public FieldAccessorTable ensureFieldAccessorsInitialized(
Class<? extends GeneratedMessageV3> messageClass, Class<? extends Builder> builderClass) {
Class<? extends GeneratedMessageV3> messageClass, Class<? extends Builder<?>> builderClass) {
if (initialized) {
return this;
}
@ -2195,35 +2192,29 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
private interface FieldAccessor {
Object get(GeneratedMessageV3 message);
Object get(GeneratedMessageV3.Builder builder);
Object get(GeneratedMessageV3.Builder<?> builder);
Object getRaw(GeneratedMessageV3 message);
Object getRaw(GeneratedMessageV3.Builder builder);
void set(Builder builder, Object value);
void set(Builder<?> builder, Object value);
Object getRepeated(GeneratedMessageV3 message, int index);
Object getRepeated(GeneratedMessageV3.Builder builder, int index);
Object getRepeatedRaw(GeneratedMessageV3 message, int index);
Object getRepeatedRaw(GeneratedMessageV3.Builder builder, int index);
Object getRepeated(GeneratedMessageV3.Builder<?> builder, int index);
void setRepeated(Builder builder, int index, Object value);
void setRepeated(Builder<?> builder, int index, Object value);
void addRepeated(Builder builder, Object value);
void addRepeated(Builder<?> builder, Object value);
boolean has(GeneratedMessageV3 message);
boolean has(GeneratedMessageV3.Builder builder);
boolean has(GeneratedMessageV3.Builder<?> builder);
int getRepeatedCount(GeneratedMessageV3 message);
int getRepeatedCount(GeneratedMessageV3.Builder builder);
int getRepeatedCount(GeneratedMessageV3.Builder<?> builder);
void clear(Builder builder);
void clear(Builder<?> builder);
Message.Builder newBuilder();
@ -2239,7 +2230,7 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
final int oneofIndex,
final String camelCaseName,
final Class<? extends GeneratedMessageV3> messageClass,
final Class<? extends Builder> builderClass) {
final Class<? extends Builder<?>> builderClass) {
this.descriptor = descriptor;
OneofDescriptor oneofDescriptor = descriptor.getOneofs().get(oneofIndex);
if (oneofDescriptor.isSynthetic()) {
@ -2268,7 +2259,7 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
}
}
public boolean has(GeneratedMessageV3.Builder builder) {
public boolean has(GeneratedMessageV3.Builder<?> builder) {
if (fieldDescriptor != null) {
return builder.hasField(fieldDescriptor);
} else {
@ -2288,7 +2279,7 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
return null;
}
public FieldDescriptor get(GeneratedMessageV3.Builder builder) {
public FieldDescriptor get(GeneratedMessageV3.Builder<?> builder) {
if (fieldDescriptor != null) {
return builder.hasField(fieldDescriptor) ? fieldDescriptor : null;
} else {
@ -2301,7 +2292,7 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
return null;
}
public void clear(final Builder builder) {
public void clear(final Builder<?> builder) {
// TODO(b/230609037): remove the unused variable
Object unused = invokeOrDie(clearMethod, builder);
}
@ -2342,7 +2333,7 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
final FieldDescriptor descriptor,
final String camelCaseName,
final Class<? extends GeneratedMessageV3> messageClass,
final Class<? extends Builder> builderClass,
final Class<? extends Builder<?>> builderClass,
final String containingOneofCamelCaseName,
boolean isOneofField,
boolean hasHasMethod) {
@ -2411,7 +2402,7 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
final FieldDescriptor descriptor,
final String camelCaseName,
final Class<? extends GeneratedMessageV3> messageClass,
final Class<? extends Builder> builderClass,
final Class<? extends Builder<?>> builderClass,
final String containingOneofCamelCaseName) {
isOneofField =
descriptor.getContainingOneof() != null
@ -2453,7 +2444,7 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
}
@Override
public Object get(GeneratedMessageV3.Builder builder) {
public Object get(GeneratedMessageV3.Builder<?> builder) {
return invoker.get(builder);
}
@ -2463,12 +2454,7 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
}
@Override
public Object getRaw(GeneratedMessageV3.Builder builder) {
return get(builder);
}
@Override
public void set(final Builder builder, final Object value) {
public void set(final Builder<?> builder, final Object value) {
invoker.set(builder, value);
}
@ -2478,29 +2464,17 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
}
@Override
public Object getRepeatedRaw(final GeneratedMessageV3 message, final int index) {
throw new UnsupportedOperationException(
"getRepeatedFieldRaw() called on a singular field.");
}
@Override
public Object getRepeated(GeneratedMessageV3.Builder builder, int index) {
public Object getRepeated(GeneratedMessageV3.Builder<?> builder, int index) {
throw new UnsupportedOperationException("getRepeatedField() called on a singular field.");
}
@Override
public Object getRepeatedRaw(GeneratedMessageV3.Builder builder, int index) {
throw new UnsupportedOperationException(
"getRepeatedFieldRaw() called on a singular field.");
}
@Override
public void setRepeated(final Builder builder, final int index, final Object value) {
public void setRepeated(final Builder<?> builder, final int index, final Object value) {
throw new UnsupportedOperationException("setRepeatedField() called on a singular field.");
}
@Override
public void addRepeated(final Builder builder, final Object value) {
public void addRepeated(final Builder<?> builder, final Object value) {
throw new UnsupportedOperationException("addRepeatedField() called on a singular field.");
}
@ -2516,7 +2490,7 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
}
@Override
public boolean has(GeneratedMessageV3.Builder builder) {
public boolean has(GeneratedMessageV3.Builder<?> builder) {
if (!hasHasMethod) {
if (isOneofField) {
return invoker.getOneofFieldNumber(builder) == field.getNumber();
@ -2533,13 +2507,13 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
}
@Override
public int getRepeatedCount(GeneratedMessageV3.Builder builder) {
public int getRepeatedCount(GeneratedMessageV3.Builder<?> builder) {
throw new UnsupportedOperationException(
"getRepeatedFieldSize() called on a singular field.");
}
@Override
public void clear(final Builder builder) {
public void clear(final Builder<?> builder) {
invoker.clear(builder);
}
@ -2598,7 +2572,7 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
final FieldDescriptor descriptor,
final String camelCaseName,
final Class<? extends GeneratedMessageV3> messageClass,
final Class<? extends Builder> builderClass) {
final Class<? extends Builder<?>> builderClass) {
getMethod = getMethodOrDie(messageClass, "get" + camelCaseName + "List");
getMethodBuilder = getMethodOrDie(builderClass, "get" + camelCaseName + "List");
getRepeatedMethod = getMethodOrDie(messageClass, "get" + camelCaseName, Integer.TYPE);
@ -2663,14 +2637,14 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
}
}
protected final Class type;
protected final Class<?> type;
protected final MethodInvoker invoker;
RepeatedFieldAccessor(
final FieldDescriptor descriptor,
final String camelCaseName,
final Class<? extends GeneratedMessageV3> messageClass,
final Class<? extends Builder> builderClass) {
final Class<? extends Builder<?>> builderClass) {
ReflectionInvoker reflectionInvoker =
new ReflectionInvoker(descriptor, camelCaseName, messageClass, builderClass);
type = reflectionInvoker.getRepeatedMethod.getReturnType();
@ -2687,7 +2661,7 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
}
@Override
public Object get(GeneratedMessageV3.Builder builder) {
public Object get(GeneratedMessageV3.Builder<?> builder) {
return invoker.get(builder);
}
@ -2697,12 +2671,7 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
}
@Override
public Object getRaw(GeneratedMessageV3.Builder builder) {
return get(builder);
}
@Override
public void set(final Builder builder, final Object value) {
public void set(final Builder<?> builder, final Object value) {
// Add all the elements individually. This serves two purposes:
// 1) Verifies that each element has the correct type.
// 2) Insures that the caller cannot modify the list later on and
@ -2719,27 +2688,17 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
}
@Override
public Object getRepeated(GeneratedMessageV3.Builder builder, int index) {
public Object getRepeated(GeneratedMessageV3.Builder<?> builder, int index) {
return invoker.getRepeated(builder, index);
}
@Override
public Object getRepeatedRaw(GeneratedMessageV3 message, int index) {
return getRepeated(message, index);
}
@Override
public Object getRepeatedRaw(GeneratedMessageV3.Builder builder, int index) {
return getRepeated(builder, index);
}
@Override
public void setRepeated(final Builder builder, final int index, final Object value) {
public void setRepeated(final Builder<?> builder, final int index, final Object value) {
invoker.setRepeated(builder, index, value);
}
@Override
public void addRepeated(final Builder builder, final Object value) {
public void addRepeated(final Builder<?> builder, final Object value) {
invoker.addRepeated(builder, value);
}
@ -2749,7 +2708,7 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
}
@Override
public boolean has(GeneratedMessageV3.Builder builder) {
public boolean has(GeneratedMessageV3.Builder<?> builder) {
throw new UnsupportedOperationException("hasField() called on a repeated field.");
}
@ -2759,12 +2718,12 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
}
@Override
public int getRepeatedCount(GeneratedMessageV3.Builder builder) {
public int getRepeatedCount(GeneratedMessageV3.Builder<?> builder) {
return invoker.getRepeatedCount(builder);
}
@Override
public void clear(final Builder builder) {
public void clear(final Builder<?> builder) {
invoker.clear(builder);
}
@ -2803,11 +2762,11 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
return (MapField<?, ?>) message.internalGetMapField(field.getNumber());
}
private MapField<?, ?> getMapField(GeneratedMessageV3.Builder builder) {
private MapField<?, ?> getMapField(GeneratedMessageV3.Builder<?> builder) {
return (MapField<?, ?>) builder.internalGetMapField(field.getNumber());
}
private MapField<?, ?> getMutableMapField(GeneratedMessageV3.Builder builder) {
private MapField<?, ?> getMutableMapField(GeneratedMessageV3.Builder<?> builder) {
return (MapField<?, ?>) builder.internalGetMutableMapField(field.getNumber());
}
@ -2826,9 +2785,8 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
}
@Override
@SuppressWarnings("unchecked")
public Object get(GeneratedMessageV3 message) {
List result = new ArrayList<>();
List<Object> result = new ArrayList<>();
for (int i = 0; i < getRepeatedCount(message); i++) {
result.add(getRepeated(message, i));
}
@ -2836,9 +2794,8 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
}
@Override
@SuppressWarnings("unchecked")
public Object get(Builder builder) {
List result = new ArrayList<>();
public Object get(Builder<?> builder) {
List<Object> result = new ArrayList<>();
for (int i = 0; i < getRepeatedCount(builder); i++) {
result.add(getRepeated(builder, i));
}
@ -2851,14 +2808,9 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
}
@Override
public Object getRaw(GeneratedMessageV3.Builder builder) {
return get(builder);
}
@Override
public void set(Builder builder, Object value) {
public void set(Builder<?> builder, Object value) {
clear(builder);
for (Object entry : (List) value) {
for (Object entry : (List<?>) value) {
addRepeated(builder, entry);
}
}
@ -2869,27 +2821,17 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
}
@Override
public Object getRepeated(Builder builder, int index) {
public Object getRepeated(Builder<?> builder, int index) {
return getMapField(builder).getList().get(index);
}
@Override
public Object getRepeatedRaw(GeneratedMessageV3 message, int index) {
return getRepeated(message, index);
}
@Override
public Object getRepeatedRaw(Builder builder, int index) {
return getRepeated(builder, index);
}
@Override
public void setRepeated(Builder builder, int index, Object value) {
public void setRepeated(Builder<?> builder, int index, Object value) {
getMutableMapField(builder).getMutableList().set(index, coerceType((Message) value));
}
@Override
public void addRepeated(Builder builder, Object value) {
public void addRepeated(Builder<?> builder, Object value) {
getMutableMapField(builder).getMutableList().add(coerceType((Message) value));
}
@ -2899,7 +2841,7 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
}
@Override
public boolean has(Builder builder) {
public boolean has(Builder<?> builder) {
throw new UnsupportedOperationException("hasField() is not supported for repeated fields.");
}
@ -2909,12 +2851,12 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
}
@Override
public int getRepeatedCount(Builder builder) {
public int getRepeatedCount(Builder<?> builder) {
return getMapField(builder).getList().size();
}
@Override
public void clear(Builder builder) {
public void clear(Builder<?> builder) {
getMutableMapField(builder).getMutableList().clear();
}
@ -2941,7 +2883,7 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
final FieldDescriptor descriptor,
final String camelCaseName,
final Class<? extends GeneratedMessageV3> messageClass,
final Class<? extends Builder> builderClass,
final Class<? extends Builder<?>> builderClass,
final String containingOneofCamelCaseName) {
super(descriptor, camelCaseName, messageClass, builderClass, containingOneofCamelCaseName);
@ -2978,7 +2920,7 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
}
@Override
public Object get(final GeneratedMessageV3.Builder builder) {
public Object get(final GeneratedMessageV3.Builder<?> builder) {
if (supportUnknownEnumValue) {
int value = (Integer) invokeOrDie(getValueMethodBuilder, builder);
return enumDescriptor.findValueByNumberCreatingIfUnknown(value);
@ -2987,7 +2929,7 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
}
@Override
public void set(final Builder builder, final Object value) {
public void set(final Builder<?> builder, final Object value) {
if (supportUnknownEnumValue) {
// TODO(b/230609037): remove the unused variable
Object unused =
@ -3003,7 +2945,7 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
final FieldDescriptor descriptor,
final String camelCaseName,
final Class<? extends GeneratedMessageV3> messageClass,
final Class<? extends Builder> builderClass) {
final Class<? extends Builder<?>> builderClass) {
super(descriptor, camelCaseName, messageClass, builderClass);
enumDescriptor = descriptor.getEnumType();
@ -3047,7 +2989,7 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
}
@Override
public Object get(final GeneratedMessageV3.Builder builder) {
public Object get(final GeneratedMessageV3.Builder<?> builder) {
final List<Object> newList = new ArrayList<>();
final int size = getRepeatedCount(builder);
for (int i = 0; i < size; i++) {
@ -3066,7 +3008,7 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
}
@Override
public Object getRepeated(final GeneratedMessageV3.Builder builder, final int index) {
public Object getRepeated(final GeneratedMessageV3.Builder<?> builder, final int index) {
if (supportUnknownEnumValue) {
int value = (Integer) invokeOrDie(getRepeatedValueMethodBuilder, builder, index);
return enumDescriptor.findValueByNumberCreatingIfUnknown(value);
@ -3075,7 +3017,7 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
}
@Override
public void setRepeated(final Builder builder, final int index, final Object value) {
public void setRepeated(final Builder<?> builder, final int index, final Object value) {
if (supportUnknownEnumValue) {
// TODO(b/230609037): remove the unused variable
Object unused =
@ -3090,7 +3032,7 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
}
@Override
public void addRepeated(final Builder builder, final Object value) {
public void addRepeated(final Builder<?> builder, final Object value) {
if (supportUnknownEnumValue) {
// TODO(b/230609037): remove the unused variable
Object unused =
@ -3119,7 +3061,7 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
final FieldDescriptor descriptor,
final String camelCaseName,
final Class<? extends GeneratedMessageV3> messageClass,
final Class<? extends Builder> builderClass,
final Class<? extends Builder<?>> builderClass,
final String containingOneofCamelCaseName) {
super(descriptor, camelCaseName, messageClass, builderClass, containingOneofCamelCaseName);
getBytesMethod = getMethodOrDie(messageClass, "get" + camelCaseName + "Bytes");
@ -3136,7 +3078,7 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
}
@Override
public void set(GeneratedMessageV3.Builder builder, Object value) {
public void set(GeneratedMessageV3.Builder<?> builder, Object value) {
if (value instanceof ByteString) {
// TODO(b/230609037): remove the unused variable
Object unused = invokeOrDie(setBytesMethodBuilder, builder, value);
@ -3153,7 +3095,7 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
final FieldDescriptor descriptor,
final String camelCaseName,
final Class<? extends GeneratedMessageV3> messageClass,
final Class<? extends Builder> builderClass,
final Class<? extends Builder<?>> builderClass,
final String containingOneofCamelCaseName) {
super(descriptor, camelCaseName, messageClass, builderClass, containingOneofCamelCaseName);
@ -3179,7 +3121,7 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
}
@Override
public void set(final Builder builder, final Object value) {
public void set(final Builder<?> builder, final Object value) {
super.set(builder, coerceType(value));
}
@ -3199,7 +3141,7 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
final FieldDescriptor descriptor,
final String camelCaseName,
final Class<? extends GeneratedMessageV3> messageClass,
final Class<? extends Builder> builderClass) {
final Class<? extends Builder<?>> builderClass) {
super(descriptor, camelCaseName, messageClass, builderClass);
newBuilderMethod = getMethodOrDie(type, "newBuilder");
@ -3225,12 +3167,12 @@ public abstract class GeneratedMessageV3 extends AbstractMessage implements Seri
}
@Override
public void setRepeated(final Builder builder, final int index, final Object value) {
public void setRepeated(final Builder<?> builder, final int index, final Object value) {
super.setRepeated(builder, index, coerceType(value));
}
@Override
public void addRepeated(final Builder builder, final Object value) {
public void addRepeated(final Builder<?> builder, final Object value) {
super.addRepeated(builder, coerceType(value));
}

@ -38,6 +38,7 @@ import com.google.protobuf.DescriptorProtos.EnumDescriptorProto;
import com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto;
import com.google.protobuf.DescriptorProtos.FieldDescriptorProto;
import com.google.protobuf.DescriptorProtos.FileDescriptorProto;
import com.google.protobuf.DescriptorProtos.FileOptions;
import com.google.protobuf.Descriptors.Descriptor;
import com.google.protobuf.Descriptors.DescriptorValidationException;
import com.google.protobuf.Descriptors.EnumDescriptor;
@ -64,6 +65,7 @@ import protobuf_unittest.UnittestProto.TestRequired;
import protobuf_unittest.UnittestProto.TestReservedEnumFields;
import protobuf_unittest.UnittestProto.TestReservedFields;
import protobuf_unittest.UnittestProto.TestService;
import protobuf_unittest.UnittestRetention;
import java.util.Collections;
import java.util.List;
import org.junit.Test;
@ -295,6 +297,7 @@ public class DescriptorsTest {
assertThat(enumType.getName()).isEqualTo("ForeignEnum");
assertThat(enumType.getFullName()).isEqualTo("protobuf_unittest.ForeignEnum");
assertThat(enumType.getFile()).isEqualTo(UnittestProto.getDescriptor());
assertThat(enumType.isClosed()).isTrue();
assertThat(enumType.getContainingType()).isNull();
assertThat(enumType.getOptions()).isEqualTo(DescriptorProtos.EnumOptions.getDefaultInstance());
@ -392,6 +395,16 @@ public class DescriptorsTest {
.isEqualTo(UnittestCustomOptions.MethodOpt1.METHODOPT1_VAL2);
}
@Test
public void testOptionRetention() throws Exception {
// Verify that options with RETENTION_SOURCE are stripped from the
// generated descriptors.
FileOptions options = UnittestRetention.getDescriptor().getOptions();
assertThat(options.hasExtension(UnittestRetention.plainOption)).isTrue();
assertThat(options.hasExtension(UnittestRetention.runtimeRetentionOption)).isTrue();
assertThat(options.hasExtension(UnittestRetention.sourceRetentionOption)).isFalse();
}
/** Test that the FieldDescriptor.Type enum is the same as the WireFormat.FieldType enum. */
@Test
public void testFieldTypeTablesMatch() throws Exception {

@ -56,6 +56,7 @@ public class UnknownEnumValueTest {
@Test
@SuppressWarnings("ProtoNewBuilderMergeFrom")
public void testUnknownEnumValues() throws Exception {
assertThat(TestAllTypes.NestedEnum.getDescriptor().isClosed()).isFalse();
TestAllTypes.Builder builder = TestAllTypes.newBuilder();
builder.setOptionalNestedEnumValue(4321);
builder.addRepeatedNestedEnumValue(5432);
@ -270,6 +271,7 @@ public class UnknownEnumValueTest {
@Test
public void testUnknownEnumValuesInProto2() throws Exception {
assertThat(Proto2TestEnum.getDescriptor().isClosed()).isTrue();
Proto2EnumMessage.Builder sourceMessage = Proto2EnumMessage.newBuilder();
sourceMessage
.addRepeatedPackedEnum(Proto2TestEnum.ZERO)

@ -17,11 +17,11 @@
<developers>
<developer>
<id>haon</id>
<name>Hao Nguyen</name>
<email>haon@google.com</email>
<id>protobuf</id>
<name>Protocol Buffers</name>
<email>protobuf@googlegroups.com</email>
<organization>Google</organization>
<organizationUrl>https://cloud.google.com</organizationUrl>
<organizationUrl>https://protobuf.dev</organizationUrl>
<timezone>America/Los_Angeles</timezone>
</developer>
</developers>

@ -1,12 +0,0 @@
Kokoro Infrastructure
----------------------
The files in this directory serve as plumbing for running Protobuf
tests under Kokoro, our internal CI.
We have shared this part of our CI configuration in hopes that it is
helpful to contributors who want to better understand the details of
our test and release processes. If there are changes, please file an
issue; unfortunately, we may not be able to accept PRs (but feel free
to send one if it helps to explain the issue).

@ -1,46 +0,0 @@
#!/bin/bash
# Helper for setting up common bazel flags in Kokoro.
#
# This script prints extra flags to a bazel invocation when it is run from
# Kokoro. When the special environment variables are not present (e.g., if you
# run Kokoro build scripts locally), this script only flips some debug settings.
#
# Example of running directly:
# bazel test $(path/to/bazel_flags.sh) //...
function bazel_flags::gen_invocation_id() {
# Create a new invocation ID and store in the artifacts dir.
local _invocation_id=$(uuidgen | tr A-Z a-z)
# Put the new invocation ID at the start of the output IDs file. Some
# Google-internal tools only look at the first entry, so this ensures the most
# recent entry is first.
local _ids_file=${KOKORO_ARTIFACTS_DIR}/bazel_invocation_ids
local _temp_ids=$(mktemp)
echo ${_invocation_id} > ${_temp_ids}
[[ -e ${_ids_file} ]] && cat ${_ids_file} >> ${_temp_ids}
mv -f ${_temp_ids} ${_ids_file}
echo -n ${_invocation_id}
}
# Prints flags to use on Kokoro.
function bazel_flags::kokoro_flags() {
[[ -n ${KOKORO_JOB_NAME:-} ]] || return
local -a _flags
_flags+=(
--invocation_id=$(bazel_flags::gen_invocation_id)
--remote_cache=https://storage.googleapis.com/protobuf-bazel-cache/${KOKORO_JOB_NAME}
)
if [[ -n ${KOKORO_BAZEL_AUTH_CREDENTIAL:-} ]]; then
_flags+=( --google_credentials=${KOKORO_BAZEL_AUTH_CREDENTIAL} )
else
_flags+=( --google_default_credentials=true )
fi
echo "${_flags[@]}"
}
echo "$(bazel_flags::kokoro_flags) --keep_going --test_output=errors"

@ -1,92 +0,0 @@
# Log capturing for the Kokoro runtime environment.
#
# This script should be `source`d from Kokoro build scripts to configure log
# capturing when running under Kokoro.
#
# When not running under Kokoro, no logs will be collected. If you want to run
# locally and collect logs anyway, set the KOKORO_ARTIFACTS_DIR environment
# variable to a directory where the logs should go.
#
# The job `.cfg` file needs the following stanzas to declare the captured logs
# as outputs (yes, these are globs, not regexes):
#
# action: {
# define_artifacts: {
# regex: "**/*sponge_log.log"
# regex: "**/*sponge_log.xml"
# }
# }
#
# Use the provided functions below as build/test fixtures, e.g.:
#
# source kokoro/common/capture_logs.sh
# caplog build/step1 <build command>
# caplog tests/step2 <test command>
#
# If log capturing is enabled, this script will set some variables that can be
# used if necessary:
#
# CAPLOG_DIR is used for logs
# CAPLOG_CMAKE_ARGS contains extra cmake args to enable test XML output
# CAPLOG_CTEST_ARGS contains extra ctest args to capture combined test logs
#
# For example:
#
# if [[ -v CAPLOG_DIR_BUILD ]]; then
# cp extra_diagnostics.log "${CAPLOG_DIR_BUILD}/diagnostics.log"
# fi
#
# # Use ${...:-} form under `set -u`:
# caplog build/01_configure cmake -G Ninja ${CAPLOG_CMAKE_ARGS:-}
# caplog build/02_build cmake --build
# caplog test/03_test ctest ${CAPLOG_CTEST_ARGS:-}
if [[ -z ${KOKORO_ARTIFACTS_DIR:-} ]]; then
function caplog() { shift; "$@"; }
else
CAPLOG_DIR="$(mktemp -d)"
CAPLOG_CMAKE_ARGS="-Dprotobuf_TEST_XML_OUTDIR=${CAPLOG_DIR}/tests/"
CAPLOG_CTEST_ARGS="--verbose"
# Captures the stdout/stderr of a command to a named log file.
# Usage: caplog NAME COMMAND [ARGS...]
function caplog() {
_name="${CAPLOG_DIR}/${1%.log}.log"; shift
mkdir -p "${_name%/*}"
date
time ( "$@" 2>&1 | tee "${_name}" )
if [[ $? != 0 ]] ; then
cat "${_name}"
return 1
fi
}
# Trap handler: renames logs on script exit so they will be found by Kokoro.
function _caplog_onexit() {
_rc=$?
set +x
echo "Collecting logs [${BASH_SOURCE}]"
find "${CAPLOG_DIR}" -type f -name '*.log' \
| while read _textlog; do
# Ensure an XML file exists for each .log file.
touch ${_textlog%.log}.xml
done
find "${CAPLOG_DIR}" -type f \( -name '*.xml' -or -name '*.log' \) \
| while read _src; do
# Move to artifacts dir, preserving the path relative to CAPLOG_DIR.
# The filename changes from foo/bar.log to foo/bar/sponge_log.log.
_logfile=${_src/${CAPLOG_DIR}\//}
_stem=${KOKORO_ARTIFACTS_DIR}/${_logfile%.*}
_ext=${_logfile##*.}
mkdir -p ${_stem}
mv -v "${_src}" "${_stem}/sponge_log.${_ext}"
done
rm -rv "${CAPLOG_DIR}"
exit ${_rc}
}
trap _caplog_onexit EXIT
fi

@ -1,85 +0,0 @@
#!/bin/bash
#
# Build tests under CMake.
#
# This script is used from macos and linux builds. It runs cmake and ctest in
# the current directory. Any additional setup should be done before running this
# script.
#
# This script uses `caplog` to save logfiles. See caplog.sh for details.
set -eu -o pipefail
: ${SCRIPT_ROOT:=$(cd $(dirname $0)/../..; pwd)}
################################################################################
# If you are using this script to run tests, you can set some environment
# variables to control behavior:
#
# By default, find the sources based on this script's path.
: ${SOURCE_DIR:=${SCRIPT_ROOT}}
#
# By default, put outputs under <git root>/cmake/build.
: ${BUILD_DIR:=${SOURCE_DIR}/cmake/build}
#
# CMAKE_BUILD_TYPE is supported in cmake 3.22+. If set, we pass the value of this
# variable explicitly for compatibility with older versions of cmake. See:
# https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html
# (N.B.: not to be confused with CMAKE_CONFIG_TYPE.)
if [[ -n ${CMAKE_BUILD_TYPE:-} ]]; then
CMAKE_BUILD_TYPE_FLAG="-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}"
else
CMAKE_BUILD_TYPE_FLAG=
fi
#
# For several other CMake options, see docs here:
# https://cmake.org/cmake/help/latest/manual/cmake-env-variables.7.html
#
# Some variables you may want to override (see cmake docs for details):
# CMAKE_BUILD_PARALLEL_LEVEL
# CMAKE_CONFIG_TYPE (N.B.: not to be confused with CMAKE_BUILD_TYPE)
# CMAKE_GENERATOR
# CTEST_PARALLEL_LEVEL
################################################################################
echo "Building using..."
echo " Sources: ${SOURCE_DIR}"
echo " Build output: ${BUILD_DIR}"
if [[ ${SOURCE_DIR} != ${SCRIPT_ROOT} ]]; then
echo " Build scripts: ${SCRIPT_ROOT}"
fi
set -x
source ${SCRIPT_ROOT}/kokoro/common/caplog.sh
#
# Configure under $BUILD_DIR:
#
mkdir -p "${BUILD_DIR}"
(
cd "${BUILD_DIR}"
caplog 01_configure \
cmake -S "${SOURCE_DIR}" \
${CMAKE_BUILD_TYPE_FLAG} \
${CAPLOG_CMAKE_ARGS:-} \
-DCMAKE_CXX_STANDARD=14
)
if [[ -n ${CAPLOG_DIR:-} ]]; then
# Save configuration logs.
mkdir -p "${CAPLOG_DIR}/CMakeFiles"
cp "${BUILD_DIR}"/CMakeFiles/CMake*.log "${CAPLOG_DIR}/CMakeFiles"
fi
#
# Build:
#
caplog 02_build \
cmake --build "${BUILD_DIR}"
#
# Run tests
#
(
cd "${BUILD_DIR}"
caplog 03_combined_testlog \
ctest ${CAPLOG_CTEST_ARGS:-}
)

@ -1,11 +0,0 @@
#!/bin/bash
set -eux
# Upgrade to a supported gcc version
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get -y update && \
sudo apt-get install --no-install-recommends -y --fix-missing --option Acquire::Retries=10 --option Acquire::http::Timeout="1800" \
gcc-7 g++-7
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 100 --slave /usr/bin/g++ g++ /usr/bin/g++-7
sudo update-alternatives --set gcc /usr/bin/gcc-7

@ -1,44 +0,0 @@
# Format: //devtools/kokoro/config/proto/build.proto
# Build logs will be here
action {
define_artifacts {
regex: "**/*sponge_log.xml"
}
}
# Download trampoline resources.
gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline"
# Use the trampoline script to run in docker.
build_file: "protobuf/kokoro/docs/trampoline.sh"
# Configure the docker image for kokoro-trampoline.
env_vars: {
key: "TRAMPOLINE_IMAGE"
value: "gcr.io/cloud-devrel-kokoro-resources/python-multi"
}
env_vars: {
key: "STAGING_BUCKET"
value: "docs-staging"
}
# Fetch the token needed for reporting release status to GitHub
before_action {
fetch_keystore {
keystore_resource {
keystore_config_id: 73713
keyname: "yoshi-automation-github-key"
}
}
}
before_action {
fetch_keystore {
keystore_resource {
keystore_config_id: 73713
keyname: "docuploader_service_account"
}
}
}

@ -1,51 +0,0 @@
#!/bin/bash
# Adapted from https://github.com/googleapis/google-cloud-python/blob/main/.kokoro/publish-docs.sh
set -eo pipefail
# Disable buffering, so that the logs stream through.
export PYTHONUNBUFFERED=1
cd github/protobuf/python
# install package
sudo apt-get update
sudo apt-get -y install software-properties-common
sudo add-apt-repository universe
sudo apt-get update
sudo apt-get -y install unzip
wget https://github.com/protocolbuffers/protobuf/releases/download/v21.1/protoc-21.1-linux-x86_64.zip
unzip protoc-21.1-linux-x86_64.zip bin/protoc
mv bin/protoc ../protoc
python3 -m venv venv
source venv/bin/activate
python setup.py install
# install docs dependencies
python -m pip install -r docs/requirements.txt
# build docs
cd docs
make html
cd ..
deactivate
python3 -m pip install protobuf==4.21.1 gcp-docuploader==0.6.3
# install a json parser
sudo apt-get -y install jq
# create metadata
python3 -m docuploader create-metadata \
--name=$(jq --raw-output '.name // empty' .repo-metadata.json) \
--version=$(python3 setup.py --version) \
--language=$(jq --raw-output '.language // empty' .repo-metadata.json) \
--distribution-name=$(python3 setup.py --name) \
--product-page=$(jq --raw-output '.product_documentation // empty' .repo-metadata.json) \
--github-repository=$(jq --raw-output '.repo // empty' .repo-metadata.json) \
--issue-tracker=$(jq --raw-output '.issue_tracker // empty' .repo-metadata.json)
cat docs.metadata
# upload docs
python3 -m docuploader upload docs/_build/html --metadata-file docs.metadata --staging-bucket docs-staging

@ -1,7 +0,0 @@
# Format: //devtools/kokoro/config/proto/build.proto
# Tell the trampoline which build file to use.
env_vars: {
key: "TRAMPOLINE_BUILD_FILE"
value: "github/protobuf/kokoro/docs/publish-python.sh"
}

@ -1,11 +0,0 @@
#!/bin/bash
# Copied from https://github.com/googleapis/google-cloud-python/blob/main/.kokoro/trampoline.sh
set -eo pipefail
python3 "${KOKORO_GFILE_DIR}/trampoline_v1.py" || ret_code=$?
chmod +x ${KOKORO_GFILE_DIR}/trampoline_cleanup.sh
${KOKORO_GFILE_DIR}/trampoline_cleanup.sh || true
exit ${ret_code}

@ -1,29 +0,0 @@
#!/bin/bash
#
# This is the top-level script we give to Kokoro as the entry point for
# running the "pull request 32" project:
#
# This script selects a specific Dockerfile (for building a Docker image) and
# a script to run inside that image.
set -ex
# Change to repo root
cd $(dirname $0)/../../..
GIT_REPO_ROOT=$(pwd)
CONTAINER_IMAGE=us-docker.pkg.dev/protobuf-build/containers/test/linux/32bit@sha256:6651a299483f7368876db7aed0802ad4ebf038d626d8995ba7df08978ff43210
git submodule update --init --recursive
use_bazel.sh 5.1.1
sudo ./kokoro/common/setup_kokoro_environment.sh
./regenerate_stale_files.sh
gcloud components update --quiet
gcloud auth configure-docker us-docker.pkg.dev --quiet
docker run \
"$@" \
-v $GIT_REPO_ROOT:/workspace \
$CONTAINER_IMAGE \
bash -l "/workspace/kokoro/linux/32-bit/test_php.sh"

@ -1,11 +0,0 @@
# Config file for running tests in Kokoro
# Location of the build script in repository
build_file: "protobuf/kokoro/linux/32-bit/build.sh"
timeout_mins: 120
action {
define_artifacts {
regex: "**/sponge_log.xml"
}
}

@ -1 +0,0 @@
# Keep this file empty! Use common.cfg instead.

@ -1 +0,0 @@
# Keep this file empty! Use common.cfg instead.

@ -1,57 +0,0 @@
#!/bin/bash
set -eux
# Change to repo root
cd $(dirname $0)/../../..
use_php() {
VERSION=$1
export PATH=/usr/local/php-${VERSION}/bin:$PATH
}
build_php() {
use_php $1
pushd php
rm -rf vendor
php -v
php -m
composer update
composer test
popd
}
test_php_c() {
pushd php
rm -rf vendor
php -v
php -m
composer update
composer test_c
popd
}
build_php_c() {
use_php $1
test_php_c
}
mkdir -p build
pushd build
cmake .. -DCMAKE_CXX_STANDARD=14
cmake --build . -- -j20
ctest --verbose --parallel 20
export PROTOC=$(pwd)/protoc
popd
git config --global --add safe.directory "*"
build_php 7.4
build_php 8.0
build_php_c 7.4
build_php_c 8.0
build_php_c 7.4-zts
build_php_c 8.0-zts
# Cleanup after CMake build
rm -rf build

@ -1,27 +0,0 @@
#!/bin/bash
set -ex
# go to the repo root
cd $(dirname $0)/../../../..
GIT_REPO_ROOT=`pwd`
if [[ -t 0 ]]; then
DOCKER_TTY_ARGS="-it"
else
# The input device on kokoro is not a TTY, so -it does not work.
DOCKER_TTY_ARGS=
fi
# Pin the dockcross image since newer versions of the image break the build
# We use an older version of dockcross image that has gcc4.9.4 because it was built
# before https://github.com/dockcross/dockcross/pull/449
# Thanks to that, wheel build with this image aren't actually
# compliant with manylinux2014, but only with manylinux_2_24
PINNED_DOCKCROSS_IMAGE_VERSION=quay.io/pypa/manylinux2014_aarch64:2022-12-10-a8f854a
# running dockcross image without any arguments generates a wrapper
# scripts that can be used to run commands under the dockcross image
# easily.
# See https://github.com/dockcross/dockcross#usage for details
docker run -v $GIT_REPO_ROOT:/workspace --rm $PINNED_DOCKCROSS_IMAGE_VERSION /bin/bash -c "cd /workspace; git config --global --add safe.directory '*'; $@"

@ -1,18 +0,0 @@
#!/bin/bash
set -ex
# Install composer
curl -sS https://getcomposer.org/installer | php
mkdir -p "$HOME/bin"
mv composer.phar "$HOME/bin/composer"
PATH="$HOME/bin:$PATH"
# go to the repo root
cd $(dirname $0)/../../..
cd php
composer install
composer test
composer test_c

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save