OLD | NEW |
(Empty) | |
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 package org.chromium.components.gcm_driver; |
| 6 |
| 7 import static org.junit.Assert.assertArrayEquals; |
| 8 import static org.junit.Assert.assertEquals; |
| 9 |
| 10 import android.os.Build; |
| 11 import android.os.Bundle; |
| 12 |
| 13 import org.junit.Test; |
| 14 import org.junit.runner.RunWith; |
| 15 |
| 16 import org.robolectric.annotation.Config; |
| 17 |
| 18 import org.chromium.base.test.util.MinAndroidSdkLevel; |
| 19 import org.chromium.testing.local.LocalRobolectricTestRunner; |
| 20 |
| 21 /** |
| 22 * Unit tests for GCMMessage. |
| 23 */ |
| 24 @RunWith(LocalRobolectricTestRunner.class) |
| 25 @Config(manifest = Config.NONE) |
| 26 public class GCMMessageTest { |
| 27 /** |
| 28 * Tests that a message object can be created based on data received from GC
M. Note that the raw |
| 29 * data field is tested separately. |
| 30 */ |
| 31 @Test |
| 32 public void testCreateMessageFromGCM() { |
| 33 Bundle extras = new Bundle(); |
| 34 |
| 35 // Compose a simple message that lacks all optional fields. |
| 36 extras.putString("subtype", "MyAppId"); |
| 37 |
| 38 { |
| 39 GCMMessage message = new GCMMessage("MySenderId", extras); |
| 40 |
| 41 assertEquals("MySenderId", message.getSenderId()); |
| 42 assertEquals("MyAppId", message.getAppId()); |
| 43 assertEquals(null, message.getCollapseKey()); |
| 44 assertArrayEquals(new String[] {}, message.getDataKeysAndValuesArray
()); |
| 45 } |
| 46 |
| 47 // Add the optional fields: collapse key, raw binary data and a custom p
roperty. |
| 48 extras.putString("collapse_key", "MyCollapseKey"); |
| 49 extras.putByteArray("rawData", new byte[] {0x00, 0x15, 0x30, 0x45}); |
| 50 extras.putString("property", "value"); |
| 51 |
| 52 { |
| 53 GCMMessage message = new GCMMessage("MySenderId", extras); |
| 54 |
| 55 assertEquals("MySenderId", message.getSenderId()); |
| 56 assertEquals("MyAppId", message.getAppId()); |
| 57 assertEquals("MyCollapseKey", message.getCollapseKey()); |
| 58 assertArrayEquals( |
| 59 new String[] {"property", "value"}, message.getDataKeysAndVa
luesArray()); |
| 60 } |
| 61 } |
| 62 |
| 63 /** |
| 64 * Tests that the bundle containing extras from GCM will be filtered for val
ues that we either |
| 65 * pass through by other means, or that we know to be irrelevant to regular
GCM messages. |
| 66 */ |
| 67 @Test |
| 68 public void testFiltersExtraBundle() { |
| 69 Bundle extras = new Bundle(); |
| 70 |
| 71 // These should be filtered by full key. |
| 72 extras.putString("collapse_key", "collapseKey"); |
| 73 extras.putString("rawData", "rawData"); |
| 74 extras.putString("from", "from"); |
| 75 extras.putString("subtype", "subtype"); |
| 76 |
| 77 // These should be filtered by prefix matching. |
| 78 extras.putString("com.google.ipc.invalidation.gcmmplex.foo", "bar"); |
| 79 extras.putString("com.google.ipc.invalidation.gcmmplex.bar", "baz"); |
| 80 |
| 81 // These should be filtered because they're not strings. |
| 82 extras.putBoolean("myBoolean", true); |
| 83 extras.putInt("myInteger", 42); |
| 84 |
| 85 // These should not be filtered. |
| 86 extras.putString("collapse_key2", "secondCollapseKey"); |
| 87 extras.putString("myString", "foobar"); |
| 88 |
| 89 GCMMessage message = new GCMMessage("senderId", extras); |
| 90 |
| 91 assertArrayEquals(new String[] {"collapse_key2", "secondCollapseKey", "m
yString", "foobar"}, |
| 92 message.getDataKeysAndValuesArray()); |
| 93 } |
| 94 |
| 95 /** |
| 96 * Tests that a GCMMessage object can be serialized to and deserialized from
a persistable |
| 97 * bundle. Note that the raw data field is tested separately. Only run on An
droid L and beyond |
| 98 * because it depends on PersistableBundle. |
| 99 */ |
| 100 @Test |
| 101 @MinAndroidSdkLevel(Build.VERSION_CODES.LOLLIPOP) |
| 102 public void testSerializationToPersistableBundle() { |
| 103 Bundle extras = new Bundle(); |
| 104 |
| 105 // Compose a simple message that lacks all optional fields. |
| 106 extras.putString("subtype", "MyAppId"); |
| 107 |
| 108 { |
| 109 GCMMessage message = new GCMMessage("MySenderId", extras); |
| 110 GCMMessage copiedMessage = new GCMMessage(message.toPersistableBundl
e()); |
| 111 |
| 112 assertEquals(message.getSenderId(), copiedMessage.getSenderId()); |
| 113 assertEquals(message.getAppId(), copiedMessage.getAppId()); |
| 114 assertEquals(message.getCollapseKey(), copiedMessage.getCollapseKey(
)); |
| 115 assertArrayEquals( |
| 116 message.getDataKeysAndValuesArray(), copiedMessage.getDataKe
ysAndValuesArray()); |
| 117 } |
| 118 |
| 119 // Add the optional fields: collapse key, raw binary data and a custom p
roperty. |
| 120 extras.putString("collapse_key", "MyCollapseKey"); |
| 121 extras.putString("property", "value"); |
| 122 |
| 123 { |
| 124 GCMMessage message = new GCMMessage("MySenderId", extras); |
| 125 GCMMessage copiedMessage = new GCMMessage(message.toPersistableBundl
e()); |
| 126 |
| 127 assertEquals(message.getSenderId(), copiedMessage.getSenderId()); |
| 128 assertEquals(message.getAppId(), copiedMessage.getAppId()); |
| 129 assertEquals(message.getCollapseKey(), copiedMessage.getCollapseKey(
)); |
| 130 assertArrayEquals( |
| 131 message.getDataKeysAndValuesArray(), copiedMessage.getDataKe
ysAndValuesArray()); |
| 132 } |
| 133 } |
| 134 |
| 135 /** |
| 136 * Tests that the raw data field can be serialized and deserialized as expec
ted. It should be |
| 137 * NULL when undefined, an empty byte array when defined but empty, and a re
gular, filled |
| 138 * byte array when data has been provided. Only run on Android L and beyond
because it depends |
| 139 * on PersistableBundle. |
| 140 */ |
| 141 @Test |
| 142 @MinAndroidSdkLevel(Build.VERSION_CODES.LOLLIPOP) |
| 143 public void testRawDataSerializationBehaviour() { |
| 144 Bundle extras = new Bundle(); |
| 145 extras.putString("subtype", "MyAppId"); |
| 146 |
| 147 // Case 1: No raw data supplied. Should be NULL. |
| 148 { |
| 149 GCMMessage message = new GCMMessage("MySenderId", extras); |
| 150 GCMMessage copiedMessage = new GCMMessage(message.toPersistableBundl
e()); |
| 151 |
| 152 assertArrayEquals(null, message.getRawData()); |
| 153 assertArrayEquals(null, copiedMessage.getRawData()); |
| 154 } |
| 155 |
| 156 extras.putByteArray("rawData", new byte[] {}); |
| 157 |
| 158 // Case 2: Empty byte array of raw data supplied. Should be just that. |
| 159 { |
| 160 GCMMessage message = new GCMMessage("MySenderId", extras); |
| 161 GCMMessage copiedMessage = new GCMMessage(message.toPersistableBundl
e()); |
| 162 |
| 163 assertArrayEquals(new byte[] {}, message.getRawData()); |
| 164 assertArrayEquals(new byte[] {}, copiedMessage.getRawData()); |
| 165 } |
| 166 |
| 167 extras.putByteArray("rawData", new byte[] {0x00, 0x15, 0x30, 0x45}); |
| 168 |
| 169 // Case 3: Byte array with data supplied. |
| 170 { |
| 171 GCMMessage message = new GCMMessage("MySenderId", extras); |
| 172 GCMMessage copiedMessage = new GCMMessage(message.toPersistableBundl
e()); |
| 173 |
| 174 assertArrayEquals(new byte[] {0x00, 0x15, 0x30, 0x45}, message.getRa
wData()); |
| 175 assertArrayEquals(new byte[] {0x00, 0x15, 0x30, 0x45}, copiedMessage
.getRawData()); |
| 176 } |
| 177 } |
| 178 } |
OLD | NEW |