Move DisplayDataSizeTest to AndroidJunitTest

**Root cause**
- When DisplayDataSizeTest was created, it was ignored already due to
b/214161063. That means the test never passed in the beginning.

- The default display's type in Robolectric is TYPE_UNKNOWN. However, in
the constructor of DisplayDensityUtils, we check all the display that is
not TYPE_INTERNAL can't be a default display. Hence the test failed.

- Even if we shadow the DisplayInfo to have TYPE_INTERNAL for default
  display, the test still failed, because whenever we tried to get the
  default display density we always get 0, and doens't have other diplay
  density values. Hence we can't test increasing the display size in
  Robolectric Test.

Note: the solution here is a workaround for waiting AsyncTask to finish.
If we ever change the implementation in DisplayDensityUtils to not use
AsyncTask, we'll need to update the test.

Bug: 279082331
Test: atest DisplaySizeDataTest --iterations 20

Change-Id: I3ccee5e7ba4d9399a8b715d84a9d53e106f88762
This commit is contained in:
Chun-Ku Lin
2023-06-06 22:10:09 +00:00
parent 7dd9e05701
commit 24b045c987
2 changed files with 81 additions and 52 deletions

View File

@@ -1,52 +0,0 @@
/*
* Copyright (C) 2022 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.accessibility;
import static com.google.common.truth.Truth.assertThat;
import android.content.Context;
import androidx.test.core.app.ApplicationProvider;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
/**
* Tests for {@link DisplaySizeData}.
*/
@RunWith(RobolectricTestRunner.class)
public class DisplaySizeDataTest {
private final Context mContext = ApplicationProvider.getApplicationContext();
private DisplaySizeData mDisplaySizeData;
@Before
public void setUp() {
mDisplaySizeData = new DisplaySizeData(mContext);
}
@Test
public void commit_success() {
final int progress = 4;
mDisplaySizeData.commit(progress);
final float density = mContext.getResources().getDisplayMetrics().density;
assertThat(density).isEqualTo(mDisplaySizeData.getValues().get(progress));
}
}

View File

@@ -0,0 +1,81 @@
/*
* Copyright (C) 2023 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.accessibility;
import static com.google.common.truth.Truth.assertThat;
import android.content.Context;
import android.os.AsyncTask;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.After;
import org.junit.Assume;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
@RunWith(AndroidJUnit4.class)
public class DisplaySizeDataTest {
private final Context mContext = ApplicationProvider.getApplicationContext();
private DisplaySizeData mDisplaySizeData;
private int mInitialIndex;
@Before
public void setUp() {
mDisplaySizeData = new DisplaySizeData(mContext);
mInitialIndex = mDisplaySizeData.getInitialIndex();
}
@After
public void cleanUp() throws InterruptedException {
mDisplaySizeData.commit(mInitialIndex);
waitForDisplayChangesSynchronously();
}
@Test
public void commit_success() throws InterruptedException {
final int progress = mDisplaySizeData.getValues().size() - 1;
Assume.assumeTrue("We need more default display size to make the test effective",
mInitialIndex != progress && progress > 0);
mDisplaySizeData.commit(progress);
waitForDisplayChangesSynchronously();
final int density = mContext.getResources().getDisplayMetrics().densityDpi;
assertThat(density).isEqualTo(mDisplaySizeData.getValues().get(progress));
}
/**
* Wait for the display change propagated synchronously.
* <p/>
* Note: Currently, DisplayDensityUtils uses AsyncTask to change the display density
* asynchronously. If in the future we stop using the deprecated AsyncTask, we will need to
* update the wait mechanism in the test.
*/
private void waitForDisplayChangesSynchronously() throws InterruptedException {
// The default AsyncTask.execute run tasks in serial order.
// Posting a new runnable and wait for it to finish means the previous tasks are all done.
CountDownLatch latch = new CountDownLatch(1);
AsyncTask.execute(latch::countDown);
latch.await(5, TimeUnit.SECONDS);
}
}