Skip to content

Commit 7df5790

Browse files
torquestompronshapiro
authored andcommitted
Check only the descriptor identity before comparing messages, not the class identity.
RELNOTES=Check only the descriptor identity before comparing messages in ProtoSubject. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=186061377
1 parent 3bd6736 commit 7df5790

File tree

2 files changed

+25
-7
lines changed

2 files changed

+25
-7
lines changed

extensions/proto/src/main/java/com/google/common/truth/extensions/proto/ProtoSubject.java

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import static com.google.common.collect.Lists.asList;
2121
import static com.google.common.truth.extensions.proto.FieldScopeUtil.asList;
2222

23+
import com.google.common.base.Objects;
2324
import com.google.common.truth.FailureMetadata;
2425
import com.google.common.truth.Subject;
2526
import com.google.protobuf.Descriptors.FieldDescriptor;
@@ -117,9 +118,17 @@ public ProtoFluentAssertion reportingMismatchesOnly() {
117118
return usingConfig(config.reportingMismatchesOnly());
118119
}
119120

121+
private static boolean notMessagesWithSameDescriptor(
122+
@Nullable Message actual, @Nullable Object expected) {
123+
if (actual != null && expected instanceof Message) {
124+
return actual.getDescriptorForType() != ((Message) expected).getDescriptorForType();
125+
}
126+
return true;
127+
}
128+
120129
@Override
121130
public void isEqualTo(@Nullable Object expected) {
122-
if (actual() == null || expected == null || actual().getClass() != expected.getClass()) {
131+
if (notMessagesWithSameDescriptor(actual(), expected)) {
123132
super.isEqualTo(expected);
124133
} else {
125134
DiffResult diffResult = makeDifferencer().diffMessages(actual(), (Message) expected);
@@ -137,24 +146,22 @@ public void isEqualTo(@Nullable Object expected) {
137146
* without throwing any exceptions.
138147
*/
139148
boolean testIsEqualTo(@Nullable Object expected) {
140-
if (actual() == null || expected == null) {
141-
return actual() == expected; // Only true if both null.
142-
} else if (actual().getClass() != expected.getClass()) {
143-
return false;
149+
if (notMessagesWithSameDescriptor(actual(), expected)) {
150+
return Objects.equal(actual(), expected);
144151
} else {
145152
return makeDifferencer().diffMessages(actual(), (Message) expected).isMatched();
146153
}
147154
}
148155

149156
@Override
150157
public void isNotEqualTo(@Nullable Object expected) {
151-
if (actual() == null || expected == null || actual().getClass() != expected.getClass()) {
158+
if (notMessagesWithSameDescriptor(actual(), expected)) {
152159
super.isNotEqualTo(expected);
153160
} else {
154161
DiffResult diffResult = makeDifferencer().diffMessages(actual(), (Message) expected);
155162
if (diffResult.isMatched()) {
156163
failWithRawMessage(
157-
failureMessage(/* expectedEqual = */ false)
164+
failureMessage(/* expectedEqual= */ false)
158165
+ "\n"
159166
+ diffResult.printToString(config.reportMismatchesOnly()));
160167
}

extensions/proto/src/test/java/com/google/common/truth/extensions/proto/ProtoSubjectTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package com.google.common.truth.extensions.proto;
1717

18+
import com.google.protobuf.DynamicMessage;
1819
import com.google.protobuf.InvalidProtocolBufferException;
1920
import com.google.protobuf.Message;
2021
import com.google.protobuf.UnknownFieldSet;
@@ -37,6 +38,16 @@ public ProtoSubjectTest(TestType testType) {
3738
super(testType);
3839
}
3940

41+
@Test
42+
public void testDifferentClasses() throws InvalidProtocolBufferException {
43+
Message message = parse("o_int: 3");
44+
DynamicMessage dynamicMessage =
45+
DynamicMessage.parseFrom(message.getDescriptorForType(), message.toByteString());
46+
47+
expectThat(message).isEqualTo(dynamicMessage);
48+
expectThat(dynamicMessage).isEqualTo(message);
49+
}
50+
4051
@Test
4152
public void testIgnoringFieldAbsence() {
4253
Message message = parse("o_int: 3");

0 commit comments

Comments
 (0)