blob: e31ffbc85600e6af396293035a12ffa8eab10d70 [file] [log] [blame]
/*
* Copyright 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package androidx.work;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.hamcrest.MatcherAssert.assertThat;
import androidx.annotation.NonNull;
import org.junit.Test;
import java.util.HashMap;
import java.util.Map;
public class DataTest {
private static final String KEY1 = "key1";
private static final String KEY2 = "key2";
@Test
public void testSize_noArguments() {
Data data = new Data.Builder().build();
assertThat(data.size(), is(0));
}
@Test
public void testSize_hasArguments() {
Data data = new Data.Builder().putBoolean(KEY1, true).build();
assertThat(data.size(), is(1));
}
@Test
public void testSerializeEmpty() {
Data data = Data.EMPTY;
byte[] byteArray = data.toByteArray();
Data restoredData = Data.fromByteArray(byteArray);
assertThat(restoredData, is(data));
}
@Test
public void testSerializeString() {
String expectedValue1 = "value1";
String expectedValue2 = "value2";
Data data = new Data.Builder()
.putString(KEY1, expectedValue1)
.putString(KEY2, expectedValue2)
.build();
byte[] byteArray = data.toByteArray();
Data restoredData = Data.fromByteArray(byteArray);
assertThat(restoredData, is(data));
}
@Test
public void testSerializeIntArray() {
int[] expectedValue1 = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int[] expectedValue2 = new int[]{10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
Data data = new Data.Builder()
.putIntArray(KEY1, expectedValue1)
.putIntArray(KEY2, expectedValue2)
.build();
byte[] byteArray = Data.toByteArrayInternal(data);
Data restoredData = Data.fromByteArray(byteArray);
assertThat(restoredData, is(notNullValue()));
assertThat(restoredData.size(), is(2));
assertThat(restoredData.getIntArray(KEY1), is(equalTo(expectedValue1)));
assertThat(restoredData.getIntArray(KEY2), is(equalTo(expectedValue2)));
}
@Test
public void testSerializePastMaxSize() {
int[] payload = new int[Data.MAX_DATA_BYTES + 1];
boolean caughtIllegalStateException = false;
try {
new Data.Builder().putIntArray("payload", payload).build();
} catch (IllegalStateException e) {
caughtIllegalStateException = true;
} finally {
assertThat(caughtIllegalStateException, is(true));
}
}
@Test
public void testDeserializePastMaxSize() {
byte[] payload = new byte[Data.MAX_DATA_BYTES + 1];
boolean caughtIllegalStateException = false;
try {
Data.fromByteArray(payload);
} catch (IllegalStateException e) {
caughtIllegalStateException = true;
} finally {
assertThat(caughtIllegalStateException, is(true));
}
}
@Test
public void testToString() {
Data data = createData();
String result = data.toString();
for (String key : data.mValues.keySet()) {
assertThat(result, containsString(key));
}
}
@Test
@SuppressWarnings("ConstantConditions")
public void testEquals_nullValues() {
Data first = createData();
Data second = null;
assertThat(first.equals(second), is(false));
}
@Test
public void testEquals_sameKeysDifferentValues() {
Data first = createData();
Data second = new Data.Builder()
.putAll(first)
.put("byte", (byte) 100)
.build();
assertThat(first.equals(second), is(false));
}
@Test
public void testEquals_sameKeysNullValues() {
Data first = createData();
Data second = new Data.Builder()
.putAll(first)
.put("byte array", null)
.build();
assertThat(first.equals(second), is(false));
}
@Test
public void testEquals_sameKeysDifferentArrayValues() {
Data first = createData();
Data second = new Data.Builder()
.putAll(first)
.put("byte array", new byte[] { 11, 12, 13 })
.build();
assertThat(first.equals(second), is(false));
}
@Test
public void testEquals_sameKeysDifferentlyTypedArrayValues() {
Data first = createData();
Data second = new Data.Builder()
.putAll(first)
.put("byte array", new int[] { 11, 12, 13 })
.build();
assertThat(first.equals(second), is(false));
}
@Test
public void testEquals_sameKeysDifferentTypes() {
Data first = createData();
Data second = new Data.Builder()
.putAll(first)
.put("byte array", 11) // storing an int
.build();
assertThat(first.equals(second), is(false));
}
@Test
public void testEquals_deepEquals() {
Data first = createData();
Data second = createData();
assertThat(first.equals(second), is(true));
}
@Test
public void testPutAll() {
Data data = createData();
assertThat(data.getByte("byte", (byte) 0), is((byte) 1));
assertThat(data.getInt("int", 0), is(1));
assertThat(data.getFloat("float", 0f), is(99f));
assertThat(data.getString("String"), is("two"));
byte[] byteArray = data.getByteArray("byte array");
long[] longArray = data.getLongArray("long array");
assertThat(byteArray, is(notNullValue()));
assertThat(byteArray.length, is(3));
assertThat(longArray, is(notNullValue()));
assertThat(longArray.length, is(3));
assertThat(byteArray[0], is((byte) 1));
assertThat(byteArray[1], is((byte) 2));
assertThat(byteArray[2], is((byte) 3));
assertThat(longArray[0], is(1L));
assertThat(longArray[1], is(2L));
assertThat(longArray[2], is(3L));
assertThat(data.getString("null"), is(nullValue()));
}
@Test
public void testPutAllWithInvalidTypes() {
Map<String, Object> map = new HashMap<>();
map.put("key", new Object());
boolean caughtIllegalArgumentException = false;
try {
new Data.Builder().putAll(map);
} catch (IllegalArgumentException e) {
caughtIllegalArgumentException = true;
}
assertThat(caughtIllegalArgumentException, is(true));
}
@NonNull
private Data createData() {
Map<String, Object> map = new HashMap<>();
map.put("byte", (byte) 1);
map.put("int", 1);
map.put("float", 99f);
map.put("String", "two");
map.put("byte array", new byte[] { 1, 2, 3 });
map.put("long array", new long[] { 1L, 2L, 3L });
map.put("null", null);
Data.Builder dataBuilder = new Data.Builder();
dataBuilder.putAll(map);
return dataBuilder.build();
}
}