/* * Copyright (C) 2025 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.privatespace.logging import android.multiuser.Flags import android.platform.test.annotations.RequiresFlagsEnabled import android.platform.test.flag.junit.CheckFlagsRule import android.platform.test.flag.junit.DeviceFlagsValueProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import com.google.common.truth.Truth.assertThat import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @RequiresFlagsEnabled(Flags.FLAG_ENABLE_MOVING_CONTENT_INTO_PRIVATE_SPACE) @RunWith(AndroidJUnit4::class) class FilesLoggingDetailsTest { @get:Rule val checkFlagsRule: CheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule() private lateinit var loggingDetails: FilesLoggingDetails @Before fun setUp() { loggingDetails = FilesLoggingDetails() } @Test fun constructor_onInitialization_allPropertiesAreEmpty() { assertThat(loggingDetails.totalSuccessFilesSize).isEqualTo(0L) assertThat(loggingDetails.totalFailedFilesSize).isEqualTo(0L) assertThat(loggingDetails.successFileMimeTypes).isEmpty() assertThat(loggingDetails.failedFileDetails).isEmpty() } @Test fun addSuccessFileDetails_withSingleFile_updatesOnlySuccessState() { loggingDetails.addSuccessFileDetails(sizeBytes = 123L, mimeType = "image/jpeg") assertThat(loggingDetails.totalSuccessFilesSize).isEqualTo(123L) assertThat(loggingDetails.successFileMimeTypes).containsExactly("image/jpeg") assertThat(loggingDetails.totalFailedFilesSize).isEqualTo(0L) assertThat(loggingDetails.failedFileDetails).isEmpty() } @Test fun addSuccessFileDetails_withMultipleFiles_accumulatesOnlySuccessTotals() { loggingDetails.addSuccessFileDetails(sizeBytes = 123L, mimeType = "image/png") loggingDetails.addSuccessFileDetails(sizeBytes = 111L, mimeType = "video/mp4") assertThat(loggingDetails.totalSuccessFilesSize).isEqualTo(234L) assertThat(loggingDetails.successFileMimeTypes).containsExactly("image/png", "video/mp4") assertThat(loggingDetails.totalFailedFilesSize).isEqualTo(0L) assertThat(loggingDetails.failedFileDetails).isEmpty() } @Test fun addFailedFileDetails_withSingleFile_updatesOnlyFailedState() { val expectedDetails = FilesLoggingDetails.FailedFileDetails(errorCode = 3, mimeType = "application/pdf") loggingDetails.addFailedFileDetails( errorCode = 3, sizeBytes = 512L, mimeType = "application/pdf", ) assertThat(loggingDetails.totalFailedFilesSize).isEqualTo(512L) assertThat(loggingDetails.failedFileDetails).containsExactly(expectedDetails) assertThat(loggingDetails.totalSuccessFilesSize).isEqualTo(0L) assertThat(loggingDetails.successFileMimeTypes).isEmpty() } @Test fun addFailedFileDetails_withMultipleFiles_accumulatesOnlyFailedTotals() { val expectedDetails1 = FilesLoggingDetails.FailedFileDetails(errorCode = 2, mimeType = "text/plain") val expectedDetails2 = FilesLoggingDetails.FailedFileDetails(errorCode = 1, mimeType = "audio/mpeg") loggingDetails.addFailedFileDetails( errorCode = 2, sizeBytes = 100L, mimeType = "text/plain", ) loggingDetails.addFailedFileDetails( errorCode = 1, sizeBytes = 300L, mimeType = "audio/mpeg", ) assertThat(loggingDetails.totalFailedFilesSize).isEqualTo(400L) assertThat(loggingDetails.failedFileDetails) .containsExactly(expectedDetails1, expectedDetails2) assertThat(loggingDetails.totalSuccessFilesSize).isEqualTo(0L) assertThat(loggingDetails.successFileMimeTypes).isEmpty() } @Test fun addSuccessAndFailedDetails_mixedCalls_updatesStatesCorrectly() { val expectedFailedDetails = FilesLoggingDetails.FailedFileDetails(errorCode = 99, mimeType = "application/zip") loggingDetails.addSuccessFileDetails(sizeBytes = 1000L, mimeType = "image/gif") loggingDetails.addFailedFileDetails( errorCode = 99, sizeBytes = 200L, mimeType = "application/zip", ) loggingDetails.addSuccessFileDetails(sizeBytes = 1500L, mimeType = "image/webp") assertThat(loggingDetails.totalSuccessFilesSize).isEqualTo(2500L) assertThat(loggingDetails.successFileMimeTypes).containsExactly("image/gif", "image/webp") assertThat(loggingDetails.totalFailedFilesSize).isEqualTo(200L) assertThat(loggingDetails.failedFileDetails).containsExactly(expectedFailedDetails) } }