Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions compatibility/smoke/Proto2StaleGencodeSmokeTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package smoke;

import static com.google.common.truth.Truth.assertThat;

import legacy_gencode_test.proto2.Proto2GencodeTestProto;
import legacy_gencode_test.proto2.Proto2GencodeTestProto.TestMostTypesProto2;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;

@RunWith(JUnit4.class)
public class Proto2StaleGencodeSmokeTest {
@Test
public void testProto2Extensions() throws Exception {
com.google.protobuf.ExtensionRegistry registry = com.google.protobuf.ExtensionRegistry.newInstance();
Proto2GencodeTestProto.registerAllExtensions(registry);

TestMostTypesProto2.Builder b = TestMostTypesProto2.newBuilder();
b.setExtension(Proto2GencodeTestProto.extensionInt32, 123);

Proto2GencodeTestProto.ForeignMessage.Builder fb = Proto2GencodeTestProto.ForeignMessage.newBuilder();
fb.setC(456);
b.setExtension(Proto2GencodeTestProto.extensionMessage, fb.build());

TestMostTypesProto2 msg = b.build();

assertThat(msg.hasExtension(Proto2GencodeTestProto.extensionInt32)).isTrue();
assertThat(msg.getExtension(Proto2GencodeTestProto.extensionInt32)).isEqualTo(123);
assertThat(msg.hasExtension(Proto2GencodeTestProto.extensionMessage)).isTrue();
assertThat(msg.getExtension(Proto2GencodeTestProto.extensionMessage).getC()).isEqualTo(456);

byte[] bytes = msg.toByteArray();
TestMostTypesProto2 parsed = TestMostTypesProto2.parseFrom(bytes, registry);

assertThat(parsed.hasExtension(Proto2GencodeTestProto.extensionInt32)).isTrue();
assertThat(parsed.getExtension(Proto2GencodeTestProto.extensionInt32)).isEqualTo(123);
assertThat(parsed.hasExtension(Proto2GencodeTestProto.extensionMessage)).isTrue();
assertThat(parsed.getExtension(Proto2GencodeTestProto.extensionMessage).getC()).isEqualTo(456);
}
}
18 changes: 16 additions & 2 deletions compatibility/smoke/add_gencode.sh
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,11 @@ VER="$1"
TMP_DIR="/tmp/protoc-$VER/"

# Cleanup the tmp dir on either clean or dirty exit
trap "rm -r \"$TMP_DIR\"" EXIT
trap "rm -rf \"$TMP_DIR\"" EXIT

cd /tmp/
wget -O protoc-$VER.zip "https://github.com/protocolbuffers/protobuf/releases/download/v$VER/protoc-$VER-linux-x86_64.zip"
unzip protoc-$VER.zip -d "protoc-$VER/"
unzip -o protoc-$VER.zip -d "protoc-$VER/"
cd -

PROTOC="/tmp/protoc-$VER/bin/protoc"
Expand All @@ -23,6 +23,20 @@ $PROTOC --version

mkdir -p v$VER
$PROTOC proto3_gencode_test.proto --java_out=v$VER
# Extract the first segment of the version. Note that up to 3.20.0 the release versioning was
# 3.x (major.minor.point), and after that it transitioned to 21.x (which corresponds to the
# Java runtime's minor version, e.g. release 21.0 is Java 3.21.0).
MAJOR="${VER%%.*}"

# Proto2 extendable messages generated before 3.25.8 are not source compatible with the 4.x runtime
# due to a generic typing conflict.
if (( MAJOR < 25 )); then
echo "Skipping proto2 for $VER"
else
$PROTOC proto2_gencode_test.proto --java_out=v$VER
fi



cp CHECKED_IN_GENCODE_BUILD.bazel.template v$VER/BUILD.bazel

Expand Down
171 changes: 171 additions & 0 deletions compatibility/smoke/proto2_gencode_test.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
syntax = "proto2";

package legacy_gencode_test.proto2;

option java_outer_classname = "Proto2GencodeTestProto";

message TestMessage {
optional string x = 2;
optional NestedTestMessage y = 3;
}

message NestedTestMessage {
repeated int32 z = 1;
}

// Proto2 version of TestMostTypesProto3
message TestMostTypesProto2 {
message NestedMessage {
optional int32 a = 1;
optional TestMostTypesProto2 corecursive = 2;
}

enum NestedEnum {
FOO = 0;
BAR = 1;
BAZ = 2;
NEG = -1;
}

enum AliasedEnum {
option allow_alias = true;

ALIAS_FOO = 0;
ALIAS_BAR = 1;
ALIAS_BAZ = 2;
MOO = 2;
moo = 2;
bAz = 2;
}

optional int32 optional_int32 = 1;
optional int64 optional_int64 = 2;
optional uint32 optional_uint32 = 3;
optional uint64 optional_uint64 = 4;
optional sint32 optional_sint32 = 5;
optional sint64 optional_sint64 = 6;
optional fixed32 optional_fixed32 = 7;
optional fixed64 optional_fixed64 = 8;
optional sfixed32 optional_sfixed32 = 9;
optional sfixed64 optional_sfixed64 = 10;
optional float optional_float = 11;
optional double optional_double = 12;
optional bool optional_bool = 13;
optional string optional_string = 14;
optional bytes optional_bytes = 15;

optional NestedMessage optional_nested_message = 18;
optional ForeignMessage optional_foreign_message = 19;

optional NestedEnum optional_nested_enum = 21;
optional ForeignEnum optional_foreign_enum = 22;
optional AliasedEnum optional_aliased_enum = 23;

optional TestMostTypesProto2 recursive_message = 27;

// Repeated
repeated int32 repeated_int32 = 31;
repeated int64 repeated_int64 = 32;
repeated uint32 repeated_uint32 = 33;
repeated uint64 repeated_uint64 = 34;
repeated sint32 repeated_sint32 = 35;
repeated sint64 repeated_sint64 = 36;
repeated fixed32 repeated_fixed32 = 37;
repeated fixed64 repeated_fixed64 = 38;
repeated sfixed32 repeated_sfixed32 = 39;
repeated sfixed64 repeated_sfixed64 = 40;
repeated float repeated_float = 41;
repeated double repeated_double = 42;
repeated bool repeated_bool = 43;
repeated string repeated_string = 44;
repeated bytes repeated_bytes = 45;

repeated NestedMessage repeated_nested_message = 48;
repeated ForeignMessage repeated_foreign_message = 49;

repeated NestedEnum repeated_nested_enum = 51;
repeated ForeignEnum repeated_foreign_enum = 52;

// Packed
repeated int32 packed_int32 = 75 [packed = true];
repeated int64 packed_int64 = 76 [packed = true];
repeated uint32 packed_uint32 = 77 [packed = true];
repeated uint64 packed_uint64 = 78 [packed = true];
repeated sint32 packed_sint32 = 79 [packed = true];
repeated sint64 packed_sint64 = 80 [packed = true];
repeated fixed32 packed_fixed32 = 81 [packed = true];
repeated fixed64 packed_fixed64 = 82 [packed = true];
repeated sfixed32 packed_sfixed32 = 83 [packed = true];
repeated sfixed64 packed_sfixed64 = 84 [packed = true];
repeated float packed_float = 85 [packed = true];
repeated double packed_double = 86 [packed = true];
repeated bool packed_bool = 87 [packed = true];
repeated NestedEnum packed_nested_enum = 88 [packed = true];

// Unpacked
repeated int32 unpacked_int32 = 89 [packed = false];
repeated int64 unpacked_int64 = 90 [packed = false];
repeated uint32 unpacked_uint32 = 91 [packed = false];
repeated uint64 unpacked_uint64 = 92 [packed = false];
repeated sint32 unpacked_sint32 = 93 [packed = false];
repeated sint64 unpacked_sint64 = 94 [packed = false];
repeated fixed32 unpacked_fixed32 = 95 [packed = false];
repeated fixed64 unpacked_fixed64 = 96 [packed = false];
repeated sfixed32 unpacked_sfixed32 = 97 [packed = false];
repeated sfixed64 unpacked_sfixed64 = 98 [packed = false];
repeated float unpacked_float = 99 [packed = false];
repeated double unpacked_double = 100 [packed = false];
repeated bool unpacked_bool = 101 [packed = false];
repeated NestedEnum unpacked_nested_enum = 102 [packed = false];

// Map
map<int32, int32> map_int32_int32 = 56;
map<int64, int64> map_int64_int64 = 57;
map<uint32, uint32> map_uint32_uint32 = 58;
map<uint64, uint64> map_uint64_uint64 = 59;
map<sint32, sint32> map_sint32_sint32 = 60;
map<sint64, sint64> map_sint64_sint64 = 61;
map<fixed32, fixed32> map_fixed32_fixed32 = 62;
map<fixed64, fixed64> map_fixed64_fixed64 = 63;
map<sfixed32, sfixed32> map_sfixed32_sfixed32 = 64;
map<sfixed64, sfixed64> map_sfixed64_sfixed64 = 65;
map<int32, float> map_int32_float = 66;
map<int32, double> map_int32_double = 67;
map<bool, bool> map_bool_bool = 68;
map<string, string> map_string_string = 69;
map<string, bytes> map_string_bytes = 70;
map<string, NestedMessage> map_string_nested_message = 71;
map<string, ForeignMessage> map_string_foreign_message = 72;
map<string, NestedEnum> map_string_nested_enum = 73;
map<string, ForeignEnum> map_string_foreign_enum = 74;

oneof oneof_field {
uint32 oneof_uint32 = 111;
NestedMessage oneof_nested_message = 112;
string oneof_string = 113;
bytes oneof_bytes = 114;
bool oneof_bool = 115;
uint64 oneof_uint64 = 116;
float oneof_float = 117;
double oneof_double = 118;
NestedEnum oneof_enum = 119;
}

extensions 1000 to max;
}

message ForeignMessage {
optional int32 c = 1;
}

enum ForeignEnum {
FOREIGN_FOO = 0;
FOREIGN_BAR = 1;
FOREIGN_BAZ = 2;
}

// Extensions for TestMostTypesProto2
extend TestMostTypesProto2 {
optional int32 extension_int32 = 1001;
optional ForeignMessage extension_message = 1002;
}
2 changes: 1 addition & 1 deletion compatibility/smoke/refresh_gencode.sh
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,5 @@ trap "mv ${build}.original ${build}" EXIT

# Update the subdirs.
for file in v*; do
add_gencode.sh "${file:1}"
./add_gencode.sh "${file:1}"
done
20 changes: 20 additions & 0 deletions compatibility/smoke/stale_gencode_smoke_test.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,23 @@ def stale_gencode_smoke_test(version):
"@protobuf_maven_dev//:junit_junit",
],
)

# Proto2 extendable messages generated before 3.25.8 (release version 25.8) are not source
# compatible with the 4.x runtime due to a generic typing conflict. We skip versions with
# release major version < 25 (which covers 3.x and 21.x).
if int(version.split(".")[0]) >= 25:
java_test(
name = "stale_gencode_proto2_smoke_test_v%s" % version,
srcs = ["Proto2StaleGencodeSmokeTest.java"],
test_class = "smoke.Proto2StaleGencodeSmokeTest",
deps = [
"//java/core",
"//:protobuf_java",
"//:protobuf_java_util",
"//compatibility/smoke/v%s:checked_in_gencode" % version,
"@protobuf_maven_dev//:com_google_truth_truth",
"@protobuf_maven_dev//:junit_junit",
],
)


8 changes: 4 additions & 4 deletions compatibility/smoke/v25.8/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
load("@rules_java//java:java_library.bzl", "java_library")

java_library(
name = "checked_in_gencode",
srcs = glob(["**/*.java"]),
visibility = ["//compatibility:__subpackages__"],
deps = ["//:protobuf_java"],
name = "checked_in_gencode",
srcs = glob(["**/*.java"]),
deps = ["//:protobuf_java"],
visibility = ["//compatibility:__subpackages__"],
)
Loading
Loading