Commit b31b5e58 authored by Jan Krcal's avatar Jan Krcal Committed by Commit Bot

Reland "[protobuf] Convert serialized_invalidation from nano to lite"

Compared to the original CL, this one fixes (in the second patch set) a
bug in PendingIvalidation.encodeToString() that caused frequent
NullPointerException crashes on canary. A corresponding unit-test is
added.

Bug: 782237
Change-Id: Ia2eacd4bc71122e4b3ca721b44f2b4472530861a
Reviewed-on: https://chromium-review.googlesource.com/970341Reviewed-by: default avatarTommy Nyquist <nyquist@chromium.org>
Commit-Queue: Jan Krcal <jkrcal@chromium.org>
Cr-Commit-Position: refs/heads/master@{#547691}
parent 407b3437
......@@ -207,10 +207,10 @@ if (is_android) {
"//base:base_java",
"//components/signin/core/browser/android:java",
"//components/sync/android:sync_java",
"//third_party/android_protobuf:protobuf_nano_javalib",
"//third_party/cacheinvalidation:cacheinvalidation_javalib",
"//third_party/cacheinvalidation:cacheinvalidation_proto_java",
"//third_party/jsr-305:jsr_305_javalib",
"//third_party/protobuf:protobuf_lite_javalib",
]
java_files = [
"android/java/src/org/chromium/components/invalidation/InvalidationClientService.java",
......@@ -223,6 +223,7 @@ if (is_android) {
sources = [
"$proto_path/serialized_invalidation.proto",
]
generate_lite = true
}
android_library("javatests") {
testonly = true
......
......@@ -7,8 +7,6 @@ package org.chromium.components.invalidation;
import android.os.Bundle;
import android.util.Base64;
import com.google.protobuf.nano.MessageNano;
import org.chromium.base.Log;
import org.chromium.base.VisibleForTesting;
import org.chromium.components.invalidation.SerializedInvalidation.Invalidation;
......@@ -79,12 +77,13 @@ public class PendingInvalidation {
*/
public String encodeToString() {
assert mObjectSource != 0;
Invalidation invalidation = new Invalidation();
invalidation.objectSource = mObjectSource;
invalidation.objectId = mObjectId;
invalidation.version = mVersion;
invalidation.payload = mPayload;
return Base64.encodeToString(MessageNano.toByteArray(invalidation), Base64.DEFAULT);
Invalidation.Builder invalidationBuilder =
Invalidation.newBuilder().setObjectSource(mObjectSource);
// The following setters update internal state of |invalidationBuilder|.
if (mObjectId != null) invalidationBuilder.setObjectId(mObjectId);
if (mVersion != 0L) invalidationBuilder.setVersion(mVersion);
if (mPayload != null) invalidationBuilder.setPayload(mPayload);
return Base64.encodeToString(invalidationBuilder.build().toByteArray(), Base64.DEFAULT);
}
/**
......@@ -95,8 +94,10 @@ public class PendingInvalidation {
public static Bundle decodeToBundle(String encoded) {
Invalidation invalidation = decodeToInvalidation(encoded);
if (invalidation == null) return null;
return createBundle(invalidation.objectId, invalidation.objectSource,
invalidation.version != null ? invalidation.version : 0L, invalidation.payload);
return createBundle(invalidation.hasObjectId() ? invalidation.getObjectId() : null,
invalidation.getObjectSource(),
invalidation.hasVersion() ? invalidation.getVersion() : 0L,
invalidation.hasPayload() ? invalidation.getPayload() : null);
}
/**
......@@ -107,8 +108,10 @@ public class PendingInvalidation {
public static PendingInvalidation decodeToPendingInvalidation(String encoded) {
Invalidation invalidation = decodeToInvalidation(encoded);
if (invalidation == null) return null;
return new PendingInvalidation(invalidation.objectId, invalidation.objectSource,
invalidation.version, invalidation.payload);
return new PendingInvalidation(
invalidation.hasObjectId() ? invalidation.getObjectId() : null,
invalidation.getObjectSource(), invalidation.getVersion(),
invalidation.hasPayload() ? invalidation.getPayload() : null);
}
@Nullable
......@@ -117,13 +120,13 @@ public class PendingInvalidation {
byte[] decoded = Base64.decode(encoded, Base64.DEFAULT);
Invalidation invalidation;
try {
invalidation = MessageNano.mergeFrom(new Invalidation(), decoded);
invalidation = Invalidation.parseFrom(decoded);
} catch (IOException e) {
Log.e(TAG, "Could not parse the serialized invalidations.", e);
return null;
}
assert invalidation != null;
if (invalidation.objectSource == null || invalidation.objectSource == 0) return null;
if (!invalidation.hasObjectSource() || invalidation.getObjectSource() == 0) return null;
return invalidation;
}
......
......@@ -20,48 +20,64 @@ import org.chromium.base.test.BaseRobolectricTestRunner;
@RunWith(BaseRobolectricTestRunner.class)
@Config(manifest = Config.NONE)
public class PendingInvalidationTest {
private static String sObjecId = "ObjectId";
private static int sObjectSource = 4;
private static long sVersion = 5;
private static String sPayload = "Payload";
@Test
public void testFullData() {
String objectId = "ObjectId";
int objectSource = 4;
long version = 5;
String payload = "Payload";
doTestParseFromBundle(objectId, objectSource, version, payload);
doTestParseToAndFromProtocolBuffer(objectId, objectSource, version, payload);
doTestParseToAndFromProtocolBufferThroughBundle(objectId, objectSource, version, payload);
}
@Test
public void testParseFromBundle() {
public void testNoData() {
String objectId = null;
int objectSource = 4;
long version = 0L;
String payload = null;
doTestParseFromBundle(objectId, objectSource, version, payload);
doTestParseToAndFromProtocolBuffer(objectId, objectSource, version, payload);
doTestParseToAndFromProtocolBufferThroughBundle(objectId, objectSource, version, payload);
}
public void doTestParseFromBundle(
String objectId, int objectSource, long version, String payload) {
PendingInvalidation invalidation =
new PendingInvalidation(sObjecId, sObjectSource, sVersion, sPayload);
Bundle bundle =
PendingInvalidation.createBundle(sObjecId, sObjectSource, sVersion, sPayload);
new PendingInvalidation(objectId, objectSource, version, payload);
Bundle bundle = PendingInvalidation.createBundle(objectId, objectSource, version, payload);
PendingInvalidation parsedInvalidation = new PendingInvalidation(bundle);
assertEquals(sObjecId, parsedInvalidation.mObjectId);
assertEquals(sObjectSource, parsedInvalidation.mObjectSource);
assertEquals(sVersion, parsedInvalidation.mVersion);
assertEquals(sPayload, parsedInvalidation.mPayload);
assertEquals(objectId, parsedInvalidation.mObjectId);
assertEquals(objectSource, parsedInvalidation.mObjectSource);
assertEquals(version, parsedInvalidation.mVersion);
assertEquals(payload, parsedInvalidation.mPayload);
assertEquals(invalidation, parsedInvalidation);
}
@Test
public void testParseToAndFromProtocolBuffer() {
public void doTestParseToAndFromProtocolBuffer(
String objectId, int objectSource, long version, String payload) {
PendingInvalidation invalidation =
new PendingInvalidation(sObjecId, sObjectSource, sVersion, sPayload);
new PendingInvalidation(objectId, objectSource, version, payload);
PendingInvalidation parsedInvalidation =
PendingInvalidation.decodeToPendingInvalidation(invalidation.encodeToString());
assertEquals(sObjecId, parsedInvalidation.mObjectId);
assertEquals(sObjectSource, parsedInvalidation.mObjectSource);
assertEquals(sVersion, parsedInvalidation.mVersion);
assertEquals(sPayload, parsedInvalidation.mPayload);
assertEquals(objectId, parsedInvalidation.mObjectId);
assertEquals(objectSource, parsedInvalidation.mObjectSource);
assertEquals(version, parsedInvalidation.mVersion);
assertEquals(payload, parsedInvalidation.mPayload);
assertEquals(invalidation, parsedInvalidation);
}
@Test
public void testParseToAndFromProtocolBufferThroughBundle() {
public void doTestParseToAndFromProtocolBufferThroughBundle(
String objectId, int objectSource, long version, String payload) {
PendingInvalidation invalidation =
new PendingInvalidation(sObjecId, sObjectSource, sVersion, sPayload);
new PendingInvalidation(objectId, objectSource, version, payload);
Bundle bundle = PendingInvalidation.decodeToBundle(invalidation.encodeToString());
PendingInvalidation parsedInvalidation = new PendingInvalidation(bundle);
assertEquals(sObjecId, parsedInvalidation.mObjectId);
assertEquals(sObjectSource, parsedInvalidation.mObjectSource);
assertEquals(sVersion, parsedInvalidation.mVersion);
assertEquals(sPayload, parsedInvalidation.mPayload);
assertEquals(objectId, parsedInvalidation.mObjectId);
assertEquals(objectSource, parsedInvalidation.mObjectSource);
assertEquals(version, parsedInvalidation.mVersion);
assertEquals(payload, parsedInvalidation.mPayload);
assertEquals(invalidation, parsedInvalidation);
}
}
......@@ -7,6 +7,8 @@
//
syntax = "proto2";
package org.chromium.components.invalidation;
// TODO(jkrcal): Remove when protobuf 4.0 is out, https://crbug.com/800281.
option optimize_for = LITE_RUNTIME;
message Invalidation {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment