Files
app_Settings/tests/unit/src/com/android/settings/deviceinfo/VolumeOptionMenuControllerTest.java
Arc Wang 87212cf504 Storage Settings crash
Storage settings will crash because there is no emulated primary volume found after private internal volume is Ejected.

Below change in Settings impacted Storage dashboard screen behavior as
it Query storage size instead of calculate size of installed APP. Due to
this design change now MediaProvider is queried for file sizes, but due
to unmounting of primary emulated volume it crashes.

We should not show Eject option for private Internal volume.

Author: ramneek.kalra@mediatek.com
Bug: 230689829
Test: atest com.android.settings.deviceinfo.VolumeOptionMenuControllerTest
      manual
      1. Insert sdcard or generate virtual disk using command : adb shell "sm set-virtual-disk true"
      2. Go to Settings -> Storage -> Sdcard/virtual disk -> Format as Internal -> do migrate data
      3. After above process completed, go to Settings-> Storage -> sd card/virtual disk and chose Eject menu option.
      4. Eject page gets open, Click on Eject button.

Change-Id: I98d09f75ee7c2cd5aae10808bd0e0cdf10da7582
2022-05-11 13:57:33 +08:00

224 lines
9.7 KiB
Java

/*
* 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.settings.deviceinfo;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.storage.DiskInfo;
import android.os.storage.StorageManager;
import android.os.storage.VolumeInfo;
import android.os.storage.VolumeRecord;
import android.view.Menu;
import androidx.fragment.app.Fragment;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.settings.deviceinfo.storage.StorageEntry;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@RunWith(AndroidJUnit4.class)
public class VolumeOptionMenuControllerTest {
private static final String INTERNAL_VOLUME_ID = "1";
private static final String EXTERNAL_VOLUME_ID = "2";
private static final String DISK_ID = "3";
private static final String VOLUME_RECORD_FSUUID = "volume_record_fsuuid";
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private Menu mMenu;
@Mock private PackageManager mPackageManager;
@Mock private StorageManager mStorageManager;
@Mock private VolumeInfo mExternalVolumeInfo;
@Mock private VolumeInfo mInternalVolumeInfo;
private Context mContext;
private VolumeOptionMenuController mController;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = spy(ApplicationProvider.getApplicationContext());
when(mContext.getPackageManager()).thenReturn(mPackageManager);
when(mContext.getSystemService(StorageManager.class)).thenReturn(mStorageManager);
when(mInternalVolumeInfo.getId()).thenReturn(INTERNAL_VOLUME_ID);
when(mInternalVolumeInfo.getType()).thenReturn(VolumeInfo.TYPE_PRIVATE);
when(mInternalVolumeInfo.getState()).thenReturn(VolumeInfo.STATE_MOUNTED);
when(mInternalVolumeInfo.isMountedWritable()).thenReturn(true);
when(mExternalVolumeInfo.getId()).thenReturn(EXTERNAL_VOLUME_ID);
final StorageEntry selectedStorageEntry = new StorageEntry(mContext, mInternalVolumeInfo);
mController = new VolumeOptionMenuController(mContext, mock(Fragment.class),
selectedStorageEntry);
}
@Test
public void onPrepareOptionsMenu_unSupportedDiskInfo_formatIsVisible() {
final StorageEntry unsupportedStorageEntry =
new StorageEntry(new DiskInfo(DISK_ID, 0 /* flags */));
mController.setSelectedStorageEntry(unsupportedStorageEntry);
mController.onPrepareOptionsMenu(mMenu);
verify(mController.mFormat, atLeastOnce()).setVisible(true);
verify(mController.mRename, never()).setVisible(true);
verify(mController.mMount, never()).setVisible(true);
verify(mController.mUnmount, never()).setVisible(true);
verify(mController.mFormatAsPortable, never()).setVisible(true);
verify(mController.mFormatAsInternal, never()).setVisible(true);
verify(mController.mMigrate, never()).setVisible(true);
verify(mController.mFree, never()).setVisible(true);
verify(mController.mForget, never()).setVisible(true);
}
@Test
public void onPrepareOptionsMenu_missingVolumeRecord_forgetIsVisible() {
final StorageEntry missingStorageEntry =
new StorageEntry(new VolumeRecord(0 /* type */, VOLUME_RECORD_FSUUID));
mController.setSelectedStorageEntry(missingStorageEntry);
mController.onPrepareOptionsMenu(mMenu);
verify(mController.mForget, atLeastOnce()).setVisible(true);
verify(mController.mRename, never()).setVisible(true);
verify(mController.mMount, never()).setVisible(true);
verify(mController.mUnmount, never()).setVisible(true);
verify(mController.mFormat, never()).setVisible(true);
verify(mController.mFormatAsPortable, never()).setVisible(true);
verify(mController.mFormatAsInternal, never()).setVisible(true);
verify(mController.mMigrate, never()).setVisible(true);
verify(mController.mFree, never()).setVisible(true);
}
@Test
public void onPrepareOptionsMenu_unmountedStorage_mountIsVisible() {
when(mInternalVolumeInfo.getState()).thenReturn(VolumeInfo.STATE_UNMOUNTED);
mController.setSelectedStorageEntry(new StorageEntry(mContext, mInternalVolumeInfo));
mController.onPrepareOptionsMenu(mMenu);
verify(mController.mMount, atLeastOnce()).setVisible(true);
verify(mController.mRename, never()).setVisible(true);
verify(mController.mUnmount, never()).setVisible(true);
verify(mController.mFormat, never()).setVisible(true);
verify(mController.mFormatAsPortable, never()).setVisible(true);
verify(mController.mFormatAsInternal, never()).setVisible(true);
verify(mController.mMigrate, never()).setVisible(true);
verify(mController.mFree, never()).setVisible(true);
verify(mController.mForget, never()).setVisible(true);
}
@Test
public void onPrepareOptionsMenu_privateNotDefaultInternal_someMenusAreVisible() {
mController.onPrepareOptionsMenu(mMenu);
verify(mController.mRename, atLeastOnce()).setVisible(true);
verify(mController.mFormatAsPortable, atLeastOnce()).setVisible(true);
verify(mController.mMount, never()).setVisible(true);
verify(mController.mFormat, never()).setVisible(true);
verify(mController.mFormatAsInternal, never()).setVisible(true);
verify(mController.mFree, never()).setVisible(true);
verify(mController.mForget, never()).setVisible(true);
}
@Test
public void onPrepareOptionsMenu_privateDefaultInternal_mostMenusAreNotVisible() {
when(mInternalVolumeInfo.getId()).thenReturn(VolumeInfo.ID_PRIVATE_INTERNAL);
when(mPackageManager.getPrimaryStorageCurrentVolume()).thenReturn(mInternalVolumeInfo);
mController.onPrepareOptionsMenu(mMenu);
verify(mController.mRename, never()).setVisible(true);
verify(mController.mUnmount, never()).setVisible(true);
verify(mController.mFormatAsPortable, never()).setVisible(true);
verify(mController.mMount, never()).setVisible(true);
verify(mController.mFormat, never()).setVisible(true);
verify(mController.mFormatAsInternal, never()).setVisible(true);
verify(mController.mFree, never()).setVisible(true);
verify(mController.mForget, never()).setVisible(true);
}
@Test
public void onPrepareOptionsMenu_publicStorage_someMenusArcVisible() {
when(mExternalVolumeInfo.getType()).thenReturn(VolumeInfo.TYPE_PUBLIC);
when(mExternalVolumeInfo.getState()).thenReturn(VolumeInfo.STATE_MOUNTED);
when(mExternalVolumeInfo.getDiskId()).thenReturn(DISK_ID);
final DiskInfo externalDiskInfo = mock(DiskInfo.class);
when(mStorageManager.findDiskById(DISK_ID)).thenReturn(externalDiskInfo);
mController.setSelectedStorageEntry(new StorageEntry(mContext, mExternalVolumeInfo));
mController.onPrepareOptionsMenu(mMenu);
verify(mController.mRename, atLeastOnce()).setVisible(true);
verify(mController.mUnmount, atLeastOnce()).setVisible(true);
verify(mController.mFormat, atLeastOnce()).setVisible(true);
verify(mController.mMount, never()).setVisible(true);
verify(mController.mFormatAsPortable, never()).setVisible(true);
verify(mController.mFormatAsInternal, never()).setVisible(true);
verify(mController.mFree, never()).setVisible(true);
verify(mController.mForget, never()).setVisible(true);
}
@Test
public void onPrepareOptionsMenu_noExternalStorage_migrateNotVisible() {
when(mPackageManager.getPrimaryStorageCurrentVolume()).thenReturn(mInternalVolumeInfo);
mController.onPrepareOptionsMenu(mMenu);
verify(mController.mMigrate, atLeastOnce()).setVisible(false);
verify(mController.mMigrate, never()).setVisible(true);
}
@Test
public void onPrepareOptionsMenu_externalPrimaryStorageAvailable_migrateIsVisible() {
when(mExternalVolumeInfo.getType()).thenReturn(VolumeInfo.TYPE_PRIVATE);
when(mExternalVolumeInfo.isMountedWritable()).thenReturn(true);
when(mPackageManager.getPrimaryStorageCurrentVolume()).thenReturn(mExternalVolumeInfo);
mController.onPrepareOptionsMenu(mMenu);
verify(mController.mMigrate, atLeastOnce()).setVisible(true);
}
@Test
public void onPrepareOptionsMenu_externalUnmounted_migrateIsVisible() {
when(mExternalVolumeInfo.getType()).thenReturn(VolumeInfo.TYPE_PRIVATE);
when(mExternalVolumeInfo.isMountedWritable()).thenReturn(false);
when(mPackageManager.getPrimaryStorageCurrentVolume()).thenReturn(mExternalVolumeInfo);
mController.onPrepareOptionsMenu(mMenu);
verify(mController.mMigrate, atLeastOnce()).setVisible(false);
verify(mController.mMigrate, never()).setVisible(true);
}
}