/* * Copyright (C) 2019 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.managedprovisioning.analytics; import static com.google.common.truth.Truth.assertThat; import android.annotation.NonNull; import android.app.admin.DevicePolicyEventLogger; import android.text.TextUtils; import java.util.Arrays; import java.util.Objects; class AnalyticsRoboTestUtils { static void assertDevicePolicyEventLoggerEqual( @NonNull DevicePolicyEventLogger logger1, @NonNull DevicePolicyEventLogger logger2) { assertThat(logger1).isNotNull(); assertThat(logger2).isNotNull(); assertAdminPackageNamesEqual(logger1, logger2); assertThat(logger1.getBoolean()).isEqualTo(logger2.getBoolean()); assertThat(logger1.getInt()).isEqualTo(logger2.getInt()); assertThat(logger1.getEventId()).isEqualTo(logger2.getEventId()); assertThat(logger1.getTimePeriod()).isEqualTo(logger2.getTimePeriod()); assertStringArraysEqual(logger1, logger2); } /** * For string types, protos write an empty string instead of nulls. */ private static void assertAdminPackageNamesEqual( DevicePolicyEventLogger logger1, DevicePolicyEventLogger logger2) { if (logger1.getAdminPackageName() == null || logger2.getAdminPackageName() == null) { assertThat(TextUtils.isEmpty(logger1.getAdminPackageName())).isTrue(); assertThat(TextUtils.isEmpty(logger2.getAdminPackageName())).isTrue(); } else { assertThat(logger1.getAdminPackageName()).isEqualTo(logger2.getAdminPackageName()); } } /** * Since protos drop null values when writing string arrays, we ignore them. * *

If the string array is, for example [null, null, "abc", null], * when it gets written to the proto, it's then read as ["abc"], because protos drop null * values. Since we are comparing the array we've written and the array we've read, we must * account for that. * *

Note that if the array is [null, null, null], it's never * written to the proto, so the expected read value is a null array. */ private static void assertStringArraysEqual( DevicePolicyEventLogger logger1, DevicePolicyEventLogger logger2) { final String[] strings1 = sanitize(logger1.getStringArray()); final String[] strings2 = sanitize(logger2.getStringArray()); if (strings1 == null || strings2 == null) { assertThat(strings1).isNull(); assertThat(strings2).isNull(); return; } assertThat(strings1.length).isEqualTo(strings2.length); for (int i = 0; i < strings1.length; i++) { assertThat(strings1[i]).isEqualTo(strings2[i]); } } /** * Strips the array of null values. * *

Examples: *

If array1 is ["abc", "def"] and array2 is ["abc", "def"], * we return true. * *

If array1 is [null, "abc", null] and array2 is ["abc"] (or vice * versa), we return true. * *

If array1 is [null, null, null] and array2 is null (or vice * versa), we return true. */ private static String[] sanitize(String[] stringArray) { if (stringArray == null) { return null; } final String[] strippedArray = Arrays.stream(stringArray).filter(Objects::nonNull).toArray(String[]::new); if (strippedArray.length == 0) { return null; } return strippedArray; } static void assertDevicePolicyEventLoggersEqual( DevicePolicyEventLogger[] loggers1, DevicePolicyEventLogger[] loggers2) { assertThat(loggers1).isNotNull(); assertThat(loggers2).isNotNull(); assertThat(loggers1.length).isEqualTo(loggers2.length); for (int i = 0; i < loggers1.length; i++) { assertDevicePolicyEventLoggerEqual(loggers1[i], loggers2[i]); } } }