blob: f7fea3b7a6d0b30275e24a41e17a5c450f50b9d1 [file] [log] [blame]
/*
* Copyright (C) 2016 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 com.android.internal.app.procstats;
import android.os.Parcel;
import android.util.Log;
import androidx.test.filters.SmallTest;
import junit.framework.Assert;
import junit.framework.TestCase;
/**
* Provides test cases for SparseMappingTable.
*/
public class SparseMappingTableTest extends TestCase {
private static final String TAG = "SparseMappingTableTest";
final byte ID1 = 1;
final byte ID2 = 2;
final long VALUE1 = 100;
final long VALUE2 = 10000000000L;
/**
* Test the parceling and unparceling logic when there is no data.
*/
@SmallTest
public void testParcelingEmpty() throws Exception {
final SparseMappingTable data = new SparseMappingTable();
final SparseMappingTable.Table table = new SparseMappingTable.Table(data);
final Parcel dataParcel = Parcel.obtain();
data.writeToParcel(dataParcel);
final Parcel tableParcel = Parcel.obtain();
table.writeToParcel(tableParcel);
dataParcel.setDataPosition(0);
final SparseMappingTable data1 = new SparseMappingTable();
data1.readFromParcel(dataParcel);
Assert.assertEquals(0, dataParcel.dataAvail());
dataParcel.recycle();
tableParcel.setDataPosition(0);
final SparseMappingTable.Table table1 = new SparseMappingTable.Table(data1);
table1.readFromParcel(tableParcel);
Assert.assertEquals(0, tableParcel.dataAvail());
tableParcel.recycle();
}
/**
* Test the parceling and unparceling logic.
*/
@SmallTest
public void testParceling() throws Exception {
int key;
final SparseMappingTable data = new SparseMappingTable();
final SparseMappingTable.Table table = new SparseMappingTable.Table(data);
key = table.getOrAddKey(ID1, 1);
table.setValue(key, VALUE1);
key = table.getOrAddKey(ID2, 1);
table.setValue(key, VALUE2);
final Parcel dataParcel = Parcel.obtain();
data.writeToParcel(dataParcel);
final Parcel tableParcel = Parcel.obtain();
table.writeToParcel(tableParcel);
dataParcel.setDataPosition(0);
final SparseMappingTable data1 = new SparseMappingTable();
data1.readFromParcel(dataParcel);
Assert.assertEquals(0, dataParcel.dataAvail());
dataParcel.recycle();
tableParcel.setDataPosition(0);
final SparseMappingTable.Table table1 = new SparseMappingTable.Table(data1);
table1.readFromParcel(tableParcel);
Assert.assertEquals(0, tableParcel.dataAvail());
tableParcel.recycle();
key = table1.getKey(ID1);
Assert.assertEquals(VALUE1, table1.getValue(key));
key = table1.getKey(ID2);
Assert.assertEquals(VALUE2, table1.getValue(key));
}
/**
* Test that after resetting you can still read data, you just get no values.
*/
@SmallTest
public void testParcelingWithReset() throws Exception {
int key;
final SparseMappingTable data = new SparseMappingTable();
final SparseMappingTable.Table table = new SparseMappingTable.Table(data);
key = table.getOrAddKey(ID1, 1);
table.setValue(key, VALUE1);
data.reset();
table.resetTable();
key = table.getOrAddKey(ID2, 1);
table.setValue(key, VALUE2);
Log.d(TAG, "before: " + data.dumpInternalState(true));
Log.d(TAG, "before: " + table.dumpInternalState());
final Parcel dataParcel = Parcel.obtain();
data.writeToParcel(dataParcel);
final Parcel tableParcel = Parcel.obtain();
table.writeToParcel(tableParcel);
dataParcel.setDataPosition(0);
final SparseMappingTable data1 = new SparseMappingTable();
data1.readFromParcel(dataParcel);
Assert.assertEquals(0, dataParcel.dataAvail());
dataParcel.recycle();
tableParcel.setDataPosition(0);
final SparseMappingTable.Table table1 = new SparseMappingTable.Table(data1);
table1.readFromParcel(tableParcel);
Assert.assertEquals(0, tableParcel.dataAvail());
tableParcel.recycle();
key = table1.getKey(ID1);
Assert.assertEquals(SparseMappingTable.INVALID_KEY, key);
key = table1.getKey(ID2);
Assert.assertEquals(VALUE2, table1.getValue(key));
Log.d(TAG, " after: " + data1.dumpInternalState(true));
Log.d(TAG, " after: " + table1.dumpInternalState());
}
/**
* Test that it fails if you reset the data and not the table.
*
* Resetting the table and not the data is basically okay. The data in the
* SparseMappingTable will be leaked.
*/
@SmallTest
public void testResetDataOnlyFails() throws Exception {
int key;
final SparseMappingTable data = new SparseMappingTable();
final SparseMappingTable.Table table = new SparseMappingTable.Table(data);
key = table.getOrAddKey(ID1, 1);
table.setValue(key, VALUE1);
Assert.assertEquals(VALUE1, table.getValue(key));
data.reset();
try {
table.getValue(key);
// Turn off this assertion because the check in SparseMappingTable.assertConsistency
// is also turned off.
//throw new Exception("Exception not thrown after mismatched reset calls.");
} catch (RuntimeException ex) {
// Good
}
}
/**
* Test that trying to get data that you didn't add fails correctly.
*/
@SmallTest
public void testInvalidKey() throws Exception {
int key;
final SparseMappingTable data = new SparseMappingTable();
final SparseMappingTable.Table table = new SparseMappingTable.Table(data);
key = table.getKey(ID1);
// The key should be INVALID_KEY
Assert.assertEquals(SparseMappingTable.INVALID_KEY, key);
// If you get the value with getValueForId you get 0.
Assert.assertEquals(0, table.getValueForId(ID1));
}
}