blob: 98a0925d714cef3788eb49d5f11e0974b1ba541c [file] [log] [blame]
/*
* Copyright (C) 2021 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.car.telemetry.publisher.statsconverters;
import static com.android.car.telemetry.AtomsProto.ActivityForegroundStateChanged.CLASS_NAME_FIELD_NUMBER;
import static com.android.car.telemetry.AtomsProto.ActivityForegroundStateChanged.PKG_NAME_FIELD_NUMBER;
import static com.android.car.telemetry.AtomsProto.ActivityForegroundStateChanged.STATE_FIELD_NUMBER;
import static com.android.car.telemetry.AtomsProto.ActivityForegroundStateChanged.UID_FIELD_NUMBER;
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertThrows;
import android.os.PersistableBundle;
import android.util.SparseArray;
import com.android.car.telemetry.AtomsProto.ActivityForegroundStateChanged;
import com.android.car.telemetry.AtomsProto.ActivityForegroundStateChanged.State;
import com.android.car.telemetry.AtomsProto.Atom;
import com.android.car.telemetry.StatsLogProto.DimensionsValue;
import com.android.car.telemetry.publisher.HashUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
@RunWith(JUnit4.class)
public class ActivityForegroundStateChangedConverterTest {
private static final Atom ATOM_A =
Atom.newBuilder()
.setActivityForegroundStateChanged(ActivityForegroundStateChanged.newBuilder()
.setClassName("className1")
.setState(State.BACKGROUND))
.build();
private static final Atom ATOM_B =
Atom.newBuilder()
.setActivityForegroundStateChanged(ActivityForegroundStateChanged.newBuilder()
.setClassName("className2")
.setState(State.FOREGROUND))
.build();
private static final Atom ATOM_MISMATCH =
Atom.newBuilder()
.setActivityForegroundStateChanged(ActivityForegroundStateChanged.newBuilder()
// Some fields are not set, creating mismatch with above atoms
.setClassName("className2"))
.build();
private static final List<Integer> DIM_FIELDS_IDS = Arrays.asList(1, 2);
private static final Long HASH_1 = HashUtils.murmur2Hash64("package.name.1");
private static final Long HASH_2 = HashUtils.murmur2Hash64("package.name.2");
private static final Map<Long, String> HASH_STR_MAP = Map.of(
HASH_1, "package.name.1",
HASH_2, "package.name.2");
private static final List<DimensionsValue> DV_PAIR_A =
Arrays.asList(
DimensionsValue.newBuilder().setValueInt(1000).build(),
DimensionsValue.newBuilder().setValueStrHash(HASH_1).build());
private static final List<DimensionsValue> DV_PAIR_B =
Arrays.asList(
DimensionsValue.newBuilder().setValueInt(2000).build(),
DimensionsValue.newBuilder().setValueStrHash(HASH_2).build());
private static final List<DimensionsValue> DV_PAIR_MALFORMED =
Arrays.asList(
DimensionsValue.newBuilder().setValueInt(3000).build(),
// Wrong format since leaf level dimension value should set value, not field
DimensionsValue.newBuilder().setField(3).build());
// Subject of the test.
private ActivityForegroundStateChangedConverter mConverter =
new ActivityForegroundStateChangedConverter();
@Test
public void testConvertAtomsListWithDimensionValues_putsCorrectDataToPersistableBundle()
throws StatsConversionException {
List<Atom> atomsList = Arrays.asList(ATOM_A, ATOM_B);
List<List<DimensionsValue>> dimensionsValuesList = Arrays.asList(DV_PAIR_A, DV_PAIR_B);
SparseArray<AtomFieldAccessor<ActivityForegroundStateChanged>> accessorMap =
mConverter.getAtomFieldAccessorMap();
PersistableBundle bundle = mConverter.convert(atomsList, DIM_FIELDS_IDS,
dimensionsValuesList, HASH_STR_MAP);
assertThat(bundle.size()).isEqualTo(4);
assertThat(bundle.getIntArray(accessorMap.get(UID_FIELD_NUMBER).getFieldName()))
.asList().containsExactly(1000, 2000).inOrder();
assertThat(Arrays.asList(
bundle.getStringArray(accessorMap.get(PKG_NAME_FIELD_NUMBER).getFieldName())))
.containsExactly("package.name.1", "package.name.2").inOrder();
assertThat(Arrays.asList(
bundle.getStringArray(accessorMap.get(CLASS_NAME_FIELD_NUMBER).getFieldName())))
.containsExactly("className1", "className2").inOrder();
assertThat(bundle.getIntArray(accessorMap.get(STATE_FIELD_NUMBER).getFieldName()))
.asList().containsExactly(0, 1).inOrder(); // States background=0 and foreground=1
}
@Test
public void testAtomSetFieldInconsistency_throwsException() {
List<Atom> atomsList = Arrays.asList(ATOM_A, ATOM_MISMATCH);
List<List<DimensionsValue>> dimensionsValuesList = Arrays.asList(DV_PAIR_A, DV_PAIR_B);
assertThrows(
StatsConversionException.class,
() -> mConverter.convert(
atomsList,
DIM_FIELDS_IDS,
dimensionsValuesList,
HASH_STR_MAP));
}
@Test
public void testMalformedDimensionValue_throwsException() {
List<Atom> atomsList = Arrays.asList(ATOM_A, ATOM_B);
List<List<DimensionsValue>> dimensionsValuesList =
Arrays.asList(DV_PAIR_A, DV_PAIR_MALFORMED);
assertThrows(
StatsConversionException.class,
() -> mConverter.convert(
atomsList,
DIM_FIELDS_IDS,
dimensionsValuesList,
HASH_STR_MAP));
}
}