Skip to content
Closed
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
1 change: 1 addition & 0 deletions common/src/main/java/dev/cel/common/values/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -345,6 +345,7 @@ java_library(
"//protobuf:cel_lite_descriptor",
"@maven//:com_google_errorprone_error_prone_annotations",
"@maven//:com_google_guava_guava",
"@maven//:com_google_protobuf_protobuf_java",
"@maven//:org_jspecify_jspecify",
"@maven_android//:com_google_protobuf_protobuf_javalite",
],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import com.google.common.collect.Iterables;
import com.google.common.primitives.UnsignedLong;
import com.google.errorprone.annotations.Immutable;
import com.google.protobuf.Any;
import com.google.protobuf.ByteString;
import com.google.protobuf.CodedInputStream;
import com.google.protobuf.ExtensionRegistryLite;
Expand Down Expand Up @@ -215,6 +216,11 @@ private Object toRuntimeValue(MessageLite msg, MessageLiteDescriptor descriptor)
return ProtoMessageLiteValue.create(msg, descriptor, this);
}

if (wellKnownProto == WellKnownProto.ANY_VALUE) {
Any any = (Any) msg;
return RawProtoMessageLiteValue.create(any.getValue(), this);
}

return fromWellKnownProto(msg, checkNotNull(wellKnownProto));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,12 @@ public WireMessageLite value() {

@Override
public final boolean equals(Object other) {
// TODO: Support message equality
throw new UnsupportedOperationException("Message equality is not supported");
if (other instanceof RawProtoMessageLiteValue) {
RawProtoMessageLiteValue that = (RawProtoMessageLiteValue) other;
return protoTypeName().equals(that.protoTypeName())
&& this.toByteString().equals(that.toByteString());
}
return false;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,20 +101,20 @@ public void create_emptyTypeName_normalizesToUnknownMessageTypeName() {
}

@Test
@SuppressWarnings("SelfEquals") // Testing that equals throws even on self-comparison
public void equals_throwsUnsupportedOperationException() {
public void equals_returnsExpectedResult() {
RawProtoMessageLiteValue value1 =
RawProtoMessageLiteValue.create(ByteString.EMPTY, "custom.Message", EMPTY_CONVERTER);
RawProtoMessageLiteValue value2 =
RawProtoMessageLiteValue.create(ByteString.EMPTY, "custom.Message", EMPTY_CONVERTER);
RawProtoMessageLiteValue value3 =
RawProtoMessageLiteValue.create(
ByteString.copyFromUtf8("test"), "custom.Message", EMPTY_CONVERTER);
RawProtoMessageLiteValue value4 =
RawProtoMessageLiteValue.create(ByteString.EMPTY, "custom.Message2", EMPTY_CONVERTER);

UnsupportedOperationException selfThrown =
assertThrows(UnsupportedOperationException.class, () -> value1.equals(value1));
UnsupportedOperationException otherThrown =
assertThrows(UnsupportedOperationException.class, () -> value1.equals(value2));

assertThat(selfThrown).hasMessageThat().isEqualTo("Message equality is not supported");
assertThat(otherThrown).hasMessageThat().isEqualTo("Message equality is not supported");
assertThat(value1).isEqualTo(value2);
assertThat(value1).isNotEqualTo(value3);
assertThat(value1).isNotEqualTo(value4);
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1273,7 +1273,7 @@ public void submessageEquality_withKnownSubmessageDescriptor_throwsUnsupportedOp
}

@Test
public void submessageEquality_withoutSubmessageDescriptor_throwsUnsupportedOperationException(
public void submessageEquality_withoutSubmessageDescriptor_evaluatesCorrectly(
@TestParameter({
"msg.single_nested_message == msg.single_nested_message",
"msg.repeated_nested_message == msg.repeated_nested_message"
Expand All @@ -1285,16 +1285,9 @@ public void submessageEquality_withoutSubmessageDescriptor_throwsUnsupportedOper
serverOptimizer.optimize(serverCompiler.compile(expr).getAst());
Program program = runtimeWithoutNestedDesc.createProgram(optimizedAst);

CelEvaluationException thrown =
assertThrows(
CelEvaluationException.class,
() -> program.eval(ImmutableMap.of("msg", POPULATED_SERVER_MESSAGE)));
Object result = program.eval(ImmutableMap.of("msg", POPULATED_SERVER_MESSAGE));

assertThat(thrown).hasCauseThat().isInstanceOf(UnsupportedOperationException.class);
assertThat(thrown)
.hasCauseThat()
.hasMessageThat()
.contains("Message equality is not supported");
assertThat(result).isEqualTo(true);
}

@Test
Expand Down
21 changes: 9 additions & 12 deletions runtime/src/test/java/dev/cel/runtime/RuntimeEqualityTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ public void objectEquals_messageLite_throws() {
}

@Test
public void objectEquals_wireMessageLite_throws() {
public void objectEquals_wireMessageLite_returnsExpectedResult() {
RuntimeEquality runtimeEquality =
RuntimeEquality.create(RuntimeHelpers.create(), CelOptions.DEFAULT);
Object wireMsg1 =
Expand All @@ -86,18 +86,15 @@ public void objectEquals_wireMessageLite_throws() {
ProtoMessageLiteValueProvider.newInstance()
.protoCelValueConverter()
.toRuntimeValue(TestAllTypes.newBuilder().setSingleInt32(1).build());
Object wireMsg3 =
ProtoMessageLiteValueProvider.newInstance()
.protoCelValueConverter()
.toRuntimeValue(TestAllTypes.newBuilder().setSingleInt32(1).build());
assertThat(wireMsg1).isNotEqualTo(wireMsg2);
assertThat(wireMsg2).isEqualTo(wireMsg3);

UnsupportedOperationException messagesThrown =
assertThrows(
UnsupportedOperationException.class,
() -> runtimeEquality.objectEquals(wireMsg1, wireMsg2));
UnsupportedOperationException stringThrown =
assertThrows(
UnsupportedOperationException.class,
() -> runtimeEquality.objectEquals("not_a_message", wireMsg1));

assertThat(messagesThrown).hasMessageThat().isEqualTo("Message equality is not supported");
assertThat(stringThrown).hasMessageThat().isEqualTo("Message equality is not supported");
assertThat(runtimeEquality.objectEquals(wireMsg2, wireMsg3)).isTrue();
assertThat(runtimeEquality.objectEquals(wireMsg1, wireMsg3)).isFalse();
}

@Test
Expand Down
Loading